@wordrhyme/plugin 0.1.0-alpha.12 → 0.1.0-alpha.14

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.
@@ -1,4 +1,4 @@
1
- import { P as PluginManifest } from './manifest-DtNk_ILK.js';
1
+ import { P as PluginManifest } from './manifest-DeCaPHoR.js';
2
2
  import { P as PluginRelease } from './release-BDJeO54k.js';
3
3
  import 'zod';
4
4
 
package/dist/artifact.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-DY44Q4CK.js";
5
5
  import {
6
6
  pluginManifestSchema
7
- } from "./chunk-C7BZITSY.js";
7
+ } from "./chunk-QUUDT6V5.js";
8
8
  import "./chunk-BI7E5CVM.js";
9
9
 
10
10
  // src/artifact.ts
@@ -0,0 +1,12 @@
1
+ interface PluginBuildManifest {
2
+ pluginId: string;
3
+ }
4
+ interface PluginBuildEnvironment extends Record<string, string | undefined> {
5
+ WR_PLUGIN_ID?: string;
6
+ }
7
+ declare function readPluginBuildManifest(pluginDir: string): PluginBuildManifest;
8
+ declare function readPluginId(pluginDir: string): string;
9
+ declare function pluginBuildDefines(pluginDir: string): Record<"__WR_PLUGIN_ID__", string>;
10
+ declare function setPluginIdEnv(pluginDir: string, env?: PluginBuildEnvironment): string;
11
+
12
+ export { type PluginBuildEnvironment, type PluginBuildManifest, pluginBuildDefines, readPluginBuildManifest, readPluginId, setPluginIdEnv };
package/dist/build.js ADDED
@@ -0,0 +1,31 @@
1
+ // src/build.ts
2
+ import { readFileSync } from "fs";
3
+ import { resolve } from "path";
4
+ function readPluginBuildManifest(pluginDir) {
5
+ const manifestPath = resolve(pluginDir, "manifest.json");
6
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
7
+ if (typeof manifest.pluginId !== "string" || manifest.pluginId.trim().length === 0) {
8
+ throw new Error(`Missing pluginId in ${manifestPath}`);
9
+ }
10
+ return { pluginId: manifest.pluginId };
11
+ }
12
+ function readPluginId(pluginDir) {
13
+ return readPluginBuildManifest(pluginDir).pluginId;
14
+ }
15
+ function pluginBuildDefines(pluginDir) {
16
+ return {
17
+ __WR_PLUGIN_ID__: JSON.stringify(readPluginId(pluginDir))
18
+ };
19
+ }
20
+ function setPluginIdEnv(pluginDir, env = process.env) {
21
+ const pluginId = readPluginId(pluginDir);
22
+ env.WR_PLUGIN_ID = pluginId;
23
+ return pluginId;
24
+ }
25
+ export {
26
+ pluginBuildDefines,
27
+ readPluginBuildManifest,
28
+ readPluginId,
29
+ setPluginIdEnv
30
+ };
31
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/build.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nexport interface PluginBuildManifest {\n pluginId: string;\n}\n\nexport interface PluginBuildEnvironment extends Record<string, string | undefined> {\n WR_PLUGIN_ID?: string;\n}\n\nexport function readPluginBuildManifest(pluginDir: string): PluginBuildManifest {\n const manifestPath = resolve(pluginDir, \"manifest.json\");\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf8\")) as { pluginId?: unknown };\n\n if (typeof manifest.pluginId !== \"string\" || manifest.pluginId.trim().length === 0) {\n throw new Error(`Missing pluginId in ${manifestPath}`);\n }\n\n return { pluginId: manifest.pluginId };\n}\n\nexport function readPluginId(pluginDir: string): string {\n return readPluginBuildManifest(pluginDir).pluginId;\n}\n\nexport function pluginBuildDefines(pluginDir: string): Record<\"__WR_PLUGIN_ID__\", string> {\n return {\n __WR_PLUGIN_ID__: JSON.stringify(readPluginId(pluginDir)),\n };\n}\n\nexport function setPluginIdEnv(pluginDir: string, env: PluginBuildEnvironment = process.env): string {\n const pluginId = readPluginId(pluginDir);\n env.WR_PLUGIN_ID = pluginId;\n return pluginId;\n}\n"],"mappings":";AAAA,SAAS,oBAAoB;AAC7B,SAAS,eAAe;AAUjB,SAAS,wBAAwB,WAAwC;AAC5E,QAAM,eAAe,QAAQ,WAAW,eAAe;AACvD,QAAM,WAAW,KAAK,MAAM,aAAa,cAAc,MAAM,CAAC;AAE9D,MAAI,OAAO,SAAS,aAAa,YAAY,SAAS,SAAS,KAAK,EAAE,WAAW,GAAG;AAChF,UAAM,IAAI,MAAM,uBAAuB,YAAY,EAAE;AAAA,EACzD;AAEA,SAAO,EAAE,UAAU,SAAS,SAAS;AACzC;AAEO,SAAS,aAAa,WAA2B;AACpD,SAAO,wBAAwB,SAAS,EAAE;AAC9C;AAEO,SAAS,mBAAmB,WAAuD;AACtF,SAAO;AAAA,IACH,kBAAkB,KAAK,UAAU,aAAa,SAAS,CAAC;AAAA,EAC5D;AACJ;AAEO,SAAS,eAAe,WAAmB,MAA8B,QAAQ,KAAa;AACjG,QAAM,WAAW,aAAa,SAAS;AACvC,MAAI,eAAe;AACnB,SAAO;AACX;","names":[]}
@@ -36,7 +36,7 @@ function pluginReactShared(requiredVersion = ">=18.0.0 <20.0.0") {
36
36
  "react/jsx-runtime": { ...shared }
37
37
  };
38
38
  }
39
- function pluginPublicWebShared(reactRequiredVersion = ">=18.0.0 <20.0.0") {
39
+ function pluginRemoteShared(reactRequiredVersion = ">=18.0.0 <20.0.0") {
40
40
  const hostShared = {
41
41
  singleton: true,
42
42
  eager: true,
@@ -51,6 +51,9 @@ function pluginPublicWebShared(reactRequiredVersion = ">=18.0.0 <20.0.0") {
51
51
  "@tanstack/react-query": { ...hostShared }
52
52
  };
53
53
  }
54
+ function pluginPublicWebShared(reactRequiredVersion = ">=18.0.0 <20.0.0") {
55
+ return pluginRemoteShared(reactRequiredVersion);
56
+ }
54
57
  function getPluginDevPort(pluginId) {
55
58
  const BASE_PORT = 3010;
56
59
  const PORT_RANGE = 100;
@@ -316,6 +319,7 @@ function appendRemoteEntryCacheBust(remoteEntry, value) {
316
319
  export {
317
320
  pluginReactOptions,
318
321
  pluginReactShared,
322
+ pluginRemoteShared,
319
323
  pluginPublicWebShared,
320
324
  getPluginDevPort,
321
325
  getPluginDevRemoteEntry,
@@ -330,4 +334,4 @@ export {
330
334
  resolvePluginRemoteEntry,
331
335
  appendRemoteEntryCacheBust
332
336
  };
333
- //# sourceMappingURL=chunk-7EM22QYB.js.map
337
+ //# sourceMappingURL=chunk-7U4PL5TX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dev-utils.ts"],"sourcesContent":["/**\n * Plugin Development Utilities\n * \n * Shared utilities for plugin development, including automatic port assignment.\n */\n\nexport type PluginRemoteSurface = 'admin' | 'web';\n\nexport interface PluginDevRuntimeConfig {\n enabled: boolean;\n remotePlugins: string[];\n}\n\nexport interface PluginReactOptions {\n swcReactOptions: {\n development: boolean;\n };\n}\n\nexport interface PluginReactSharedOptions {\n singleton: true;\n eager: true;\n import: false;\n requiredVersion: string;\n}\n\nexport type PluginRemoteSharedName =\n | 'react'\n | 'react-dom'\n | 'react/jsx-runtime'\n | '@wordrhyme/plugin/react'\n | '@trpc/client'\n | '@trpc/react-query'\n | '@tanstack/react-query';\n\n/** @deprecated Use PluginRemoteSharedName. */\nexport type PluginPublicWebSharedName = PluginRemoteSharedName;\n\nexport interface ResolvedPluginRemoteEntry {\n remoteEntry: string;\n source: 'dev' | 'manifest';\n}\n\nexport interface ResolvePluginRemoteEntryOptions {\n pluginId: string;\n manifestRemoteEntry: string;\n devRemoteEntry?: string | undefined;\n surface?: PluginRemoteSurface | undefined;\n isDev?: boolean | undefined;\n devRemoteEnabled?: boolean | undefined;\n probeTimeoutMs?: number | undefined;\n probeAttempts?: number | undefined;\n probeRetryDelayMs?: number | undefined;\n entryChunkPaths?: readonly string[] | undefined;\n}\n\ninterface DevProbeCacheEntry {\n result: ResolvedPluginRemoteEntry;\n expiresAt: number;\n}\n\ninterface StorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\ninterface RuntimeLike {\n __WORDRHYME_PLUGIN_DEV__?: unknown;\n location?: { search?: string | undefined } | undefined;\n sessionStorage?: StorageLike | undefined;\n localStorage?: StorageLike | undefined;\n fetch?: ((url: string, init: { method: 'HEAD' | 'GET'; signal?: unknown }) => Promise<{ ok: boolean; status: number }>) | undefined;\n AbortSignal?: { timeout?: (ms: number) => unknown } | undefined;\n AbortController?: (new () => { signal: unknown; abort: () => void }) | undefined;\n setTimeout?: ((handler: () => void, timeoutMs: number) => unknown) | undefined;\n clearTimeout?: ((handle: unknown) => void) | undefined;\n}\n\nconst DEV_ADMIN_ENTRY_CHUNK_PATHS = [\n '/static/js/admin.js',\n '/static/js/src_admin_index_tsx.js',\n] as const;\n\nconst DEV_WEB_ENTRY_CHUNK_PATHS = [\n '/static/js/web.js',\n '/static/js/client.js',\n '/static/js/src_web_index_tsx.js',\n '/static/js/src_web_client_tsx.js',\n] as const;\n\nconst DEV_REMOTE_FAILURE_TTL_MS = 30_000;\nconst ACTIVE_DEV_REMOTE_PROBE_ATTEMPTS = 20;\nconst ACTIVE_DEV_REMOTE_RETRY_DELAY_MS = 250;\nconst DEV_PROBE_CACHE_STORAGE_KEY = 'wr.plugin-dev-probe-cache';\nconst DEV_REMOTE_OPT_IN_QUERY_KEY = 'pluginDevRemote';\nconst DEV_REMOTE_OPT_IN_STORAGE_KEY = 'wr.plugin-dev-remote';\nconst devProbeCache = new Map<string, DevProbeCacheEntry>();\n\n/**\n * Keep plugin remotes on the production-compatible JSX runtime even while the\n * remote dev server and React Fast Refresh are active. A prebuilt Dev Host uses\n * production React, which cannot execute react-jsx-dev-runtime safely.\n */\nexport function pluginReactOptions(): PluginReactOptions {\n return {\n swcReactOptions: {\n development: false,\n },\n };\n}\n\nexport function pluginReactShared(\n requiredVersion = '>=18.0.0 <20.0.0',\n): Record<'react' | 'react-dom' | 'react/jsx-runtime', PluginReactSharedOptions> {\n const shared = {\n singleton: true,\n eager: true,\n import: false,\n requiredVersion,\n } as const;\n\n return {\n react: { ...shared },\n 'react-dom': { ...shared },\n 'react/jsx-runtime': { ...shared },\n };\n}\n\n/**\n * Complete Module Federation shared contract for WordRhyme React remotes.\n *\n * Admin and Web Hosts inject their tRPC client into @wordrhyme/plugin/react,\n * so every React remote must consume the Host copy of the SDK and its query\n * dependencies.\n */\nexport function pluginRemoteShared(\n reactRequiredVersion = '>=18.0.0 <20.0.0',\n): Record<PluginRemoteSharedName, PluginReactSharedOptions> {\n const hostShared = {\n singleton: true,\n eager: true,\n import: false,\n requiredVersion: '*',\n } as const;\n\n return {\n ...pluginReactShared(reactRequiredVersion),\n '@wordrhyme/plugin/react': { ...hostShared },\n '@trpc/client': { ...hostShared },\n '@trpc/react-query': { ...hostShared },\n '@tanstack/react-query': { ...hostShared },\n };\n}\n\n/**\n * @deprecated Admin and Web React remotes now use pluginRemoteShared().\n */\nexport function pluginPublicWebShared(\n reactRequiredVersion = '>=18.0.0 <20.0.0',\n): Record<PluginRemoteSharedName, PluginReactSharedOptions> {\n return pluginRemoteShared(reactRequiredVersion);\n}\n\n/**\n * Calculate a deterministic dev port for a plugin based on its ID.\n * \n * This allows multiple plugins to run simultaneously without port conflicts,\n * while keeping the port assignment automatic and predictable.\n * \n * Port range: 3010-3109 (100 possible ports)\n * \n * @param pluginId - Full plugin ID (e.g., \"com.wordrhyme.hello-world\")\n * @returns Port number for the plugin's dev server\n * \n * @example\n * getPluginDevPort('com.wordrhyme.hello-world') // e.g., 3042\n * getPluginDevPort('com.wordrhyme.analytics') // e.g., 3015\n */\nexport function getPluginDevPort(pluginId: string): number {\n const BASE_PORT = 3010;\n const PORT_RANGE = 100;\n\n // Simple hash based on character codes\n const hash = pluginId.split('').reduce((acc, char) => {\n return acc + char.charCodeAt(0);\n }, 0);\n\n return BASE_PORT + (hash % PORT_RANGE);\n}\n\n/**\n * Get the dev remote entry URL for a plugin.\n * \n * @param pluginId - Full plugin ID\n * @returns Full URL to the plugin's remoteEntry.js in dev mode\n */\nexport function getPluginDevRemoteEntry(pluginId: string): string {\n const port = getPluginDevPort(pluginId);\n return `http://localhost:${port}/remoteEntry.js`;\n}\n\n/**\n * Calculate a deterministic public web dev port for a plugin.\n *\n * Public web remotes run beside admin remotes, so they use the same stable\n * plugin hash with a +100 offset.\n */\nexport function getPluginWebDevPort(pluginId: string): number {\n return getPluginDevPort(pluginId) + 100;\n}\n\n/**\n * Get the public web dev remote entry URL for a plugin.\n */\nexport function getPluginWebDevRemoteEntry(pluginId: string): string {\n return `http://localhost:${getPluginWebDevPort(pluginId)}/remoteEntry.js`;\n}\n\n/**\n * Normalize plugin ID to a valid Module Federation name.\n * \n * MF names must be valid JavaScript identifiers.\n * \"com.wordrhyme.hello-world\" → \"plugin_hello_world\"\n * \n * @param pluginId - Full plugin ID\n * @returns Valid MF module name\n */\nexport function getPluginMfName(pluginId: string): string {\n // Keep the established short name for official plugins, while accepting\n // every valid reverse-domain plugin id from the public Plugin Contract.\n const shortId = pluginId.replace(/^com\\.wordrhyme\\./, '');\n const normalized = shortId.replace(/[^a-zA-Z0-9_$]/g, '_');\n return `plugin_${normalized}`;\n}\n\nfunction runtime(): RuntimeLike {\n return globalThis as unknown as RuntimeLike;\n}\n\nfunction readQueryValue(search: string | undefined, key: string): string | null {\n const query = search?.replace(/^\\?/, '');\n if (!query) return null;\n\n for (const part of query.split('&')) {\n const [rawKey, rawValue = ''] = part.split('=');\n if (!rawKey) continue;\n try {\n if (decodeURIComponent(rawKey.replace(/\\+/g, ' ')) === key) {\n return decodeURIComponent(rawValue.replace(/\\+/g, ' '));\n }\n } catch {\n if (rawKey === key) return rawValue;\n }\n }\n\n return null;\n}\n\nfunction matchesPluginOptIn(rawValue: string | null, pluginId: string): boolean {\n const value = rawValue?.trim();\n if (!value) return false;\n\n return value === '1'\n || value.toLowerCase() === 'true'\n || value.toLowerCase() === 'all'\n || value === pluginId;\n}\n\nexport function isPluginListed(pluginId: string, rawValue: unknown): boolean {\n return parsePluginList(rawValue).includes(pluginId);\n}\n\nexport function parsePluginList(rawValue: unknown): string[] {\n if (typeof rawValue !== 'string') return [];\n\n return Array.from(new Set(\n rawValue\n .split(',')\n .map((value) => value.trim())\n .filter(Boolean),\n ));\n}\n\nexport function getPluginDevRuntimeConfig(): PluginDevRuntimeConfig {\n const value = runtime().__WORDRHYME_PLUGIN_DEV__;\n if (!value || typeof value !== 'object') {\n return { enabled: false, remotePlugins: [] };\n }\n\n const config = value as { enabled?: unknown; remotePlugins?: unknown };\n const remotePlugins = Array.isArray(config.remotePlugins)\n ? Array.from(new Set(config.remotePlugins.filter((pluginId): pluginId is string => (\n typeof pluginId === 'string' && pluginId.trim().length > 0\n )).map((pluginId) => pluginId.trim())))\n : parsePluginList(config.remotePlugins);\n\n return {\n enabled: config.enabled === true,\n remotePlugins,\n };\n}\n\nexport function isPluginDevRemoteSelected(pluginId: string): boolean {\n const config = getPluginDevRuntimeConfig();\n return config.enabled && config.remotePlugins.includes(pluginId);\n}\n\nexport function isPluginDevRemoteEnabled(pluginId: string): boolean {\n const host = runtime();\n if (matchesPluginOptIn(readQueryValue(host.location?.search, DEV_REMOTE_OPT_IN_QUERY_KEY), pluginId)) {\n return true;\n }\n\n try {\n if (matchesPluginOptIn(host.sessionStorage?.getItem(DEV_REMOTE_OPT_IN_STORAGE_KEY) ?? null, pluginId)) {\n return true;\n }\n } catch {\n // Ignore storage access failures.\n }\n\n try {\n if (matchesPluginOptIn(host.localStorage?.getItem(DEV_REMOTE_OPT_IN_STORAGE_KEY) ?? null, pluginId)) {\n return true;\n }\n } catch {\n // Ignore storage access failures.\n }\n\n return false;\n}\n\nfunction readStoredProbeCache(): Record<string, DevProbeCacheEntry> {\n try {\n const raw = runtime().sessionStorage?.getItem(DEV_PROBE_CACHE_STORAGE_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw) as Record<string, DevProbeCacheEntry> | null;\n return parsed && typeof parsed === 'object' ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction writeStoredProbeCache(cache: Record<string, DevProbeCacheEntry>) {\n try {\n runtime().sessionStorage?.setItem(DEV_PROBE_CACHE_STORAGE_KEY, JSON.stringify(cache));\n } catch {\n // Ignore storage failures and rely on in-memory cache.\n }\n}\n\nfunction probeCacheKey(surface: PluginRemoteSurface, pluginId: string, devRemoteEntry: string): string {\n return `${surface}:${pluginId}:${devRemoteEntry}`;\n}\n\nfunction getCachedProbeResult(key: string, now: number): ResolvedPluginRemoteEntry | null {\n const cached = devProbeCache.get(key);\n if (cached) {\n if (cached.expiresAt <= now) {\n devProbeCache.delete(key);\n } else {\n return cached.result;\n }\n }\n\n const storedCache = readStoredProbeCache();\n const stored = storedCache[key];\n if (!stored) return null;\n if (stored.expiresAt <= now) {\n delete storedCache[key];\n writeStoredProbeCache(storedCache);\n devProbeCache.delete(key);\n return null;\n }\n devProbeCache.set(key, stored);\n return stored.result;\n}\n\nfunction cacheProbeResult(key: string, result: ResolvedPluginRemoteEntry, ttlMs: number) {\n const entry = {\n result,\n expiresAt: Date.now() + ttlMs,\n };\n devProbeCache.set(key, entry);\n\n const storedCache = readStoredProbeCache();\n storedCache[key] = entry;\n writeStoredProbeCache(storedCache);\n}\n\nfunction createTimeoutSignal(timeoutMs: number): { signal?: unknown; cleanup: () => void } {\n const host = runtime();\n const timeout = host.AbortSignal?.timeout;\n if (timeout) {\n return { signal: timeout(timeoutMs), cleanup: () => {} };\n }\n\n const Controller = host.AbortController;\n if (!Controller || !host.setTimeout || !host.clearTimeout) {\n return { cleanup: () => {} };\n }\n\n const probeController = new Controller();\n const timeoutId = host.setTimeout(() => probeController.abort(), timeoutMs);\n return {\n signal: probeController.signal,\n cleanup: () => host.clearTimeout?.(timeoutId),\n };\n}\n\nfunction waitForRetry(delayMs: number): Promise<void> {\n const schedule = runtime().setTimeout;\n if (!schedule || delayMs <= 0) return Promise.resolve();\n\n return new Promise((resolve) => {\n schedule(() => resolve(), delayMs);\n });\n}\n\nfunction resolveChunkUrl(path: string, devRemoteEntry: string): string {\n const originMatch = devRemoteEntry.match(/^(https?:\\/\\/[^/?#]+)(?:[/?#]|$)/);\n if (originMatch?.[1] && path.startsWith('/')) {\n return `${originMatch[1]}${path}`;\n }\n\n const base = devRemoteEntry.replace(/[?#].*$/, '').replace(/\\/[^/]*$/, '/');\n return `${base}${path.replace(/^\\//, '')}`;\n}\n\nasync function requestOk(url: string, signal: unknown): Promise<boolean> {\n const fetcher = runtime().fetch;\n if (!fetcher) return false;\n\n const response = await fetcher(url, {\n method: 'HEAD',\n ...(signal ? { signal } : {}),\n });\n\n if (response.ok) return true;\n if (response.status !== 405) return false;\n\n const fallbackResponse = await fetcher(url, {\n method: 'GET',\n ...(signal ? { signal } : {}),\n });\n return fallbackResponse.ok;\n}\n\nasync function canLoadDevRemote(\n devRemoteEntry: string,\n surface: PluginRemoteSurface,\n signal: unknown,\n entryChunkPaths?: readonly string[] | undefined,\n): Promise<boolean> {\n if (!await requestOk(devRemoteEntry, signal)) {\n return false;\n }\n\n const chunkPaths = entryChunkPaths\n ?? (surface === 'web' ? DEV_WEB_ENTRY_CHUNK_PATHS : DEV_ADMIN_ENTRY_CHUNK_PATHS);\n for (const path of chunkPaths) {\n if (await requestOk(resolveChunkUrl(path, devRemoteEntry), signal)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction defaultDevRemoteEntry(pluginId: string, surface: PluginRemoteSurface): string {\n return surface === 'web'\n ? getPluginWebDevRemoteEntry(pluginId)\n : getPluginDevRemoteEntry(pluginId);\n}\n\nexport async function resolvePluginRemoteEntry({\n pluginId,\n manifestRemoteEntry,\n devRemoteEntry,\n surface = 'admin',\n isDev = false,\n devRemoteEnabled = false,\n probeTimeoutMs = 1500,\n probeAttempts,\n probeRetryDelayMs = ACTIVE_DEV_REMOTE_RETRY_DELAY_MS,\n entryChunkPaths,\n}: ResolvePluginRemoteEntryOptions): Promise<ResolvedPluginRemoteEntry> {\n const manifestResult = {\n remoteEntry: manifestRemoteEntry,\n source: 'manifest',\n } as const;\n\n if (!isDev || (!devRemoteEnabled && !isPluginDevRemoteEnabled(pluginId))) {\n return manifestResult;\n }\n\n const devUrl = devRemoteEntry?.trim() || defaultDevRemoteEntry(pluginId, surface);\n const cacheKey = probeCacheKey(surface, pluginId, devUrl);\n const cachedResult = getCachedProbeResult(cacheKey, Date.now());\n if (cachedResult && !(devRemoteEnabled && cachedResult.source === 'manifest')) {\n return cachedResult;\n }\n\n const attempts = Math.max(\n 1,\n Math.trunc(probeAttempts ?? (devRemoteEnabled ? ACTIVE_DEV_REMOTE_PROBE_ATTEMPTS : 1)),\n );\n\n for (let attempt = 0; attempt < attempts; attempt += 1) {\n const { signal, cleanup } = createTimeoutSignal(probeTimeoutMs);\n\n try {\n if (await canLoadDevRemote(devUrl, surface, signal, entryChunkPaths)) {\n return {\n remoteEntry: devUrl,\n source: 'dev',\n };\n }\n } catch {\n // The selected dev process may still be starting. Retry below when explicitly active.\n } finally {\n cleanup();\n }\n\n if (attempt + 1 < attempts) {\n await waitForRetry(probeRetryDelayMs);\n }\n }\n\n console.info(`[Plugin] ${pluginId}: ${surface} dev server 不在线,使用预构建静态文件`);\n if (!devRemoteEnabled) {\n cacheProbeResult(cacheKey, manifestResult, DEV_REMOTE_FAILURE_TTL_MS);\n }\n return manifestResult;\n}\n\nexport function appendRemoteEntryCacheBust(remoteEntry: string, value: string | number): string {\n const separator = remoteEntry.includes('?') ? '&' : '?';\n return `${remoteEntry}${separator}t=${encodeURIComponent(String(value))}`;\n}\n"],"mappings":"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","names":[]}
@@ -557,22 +557,6 @@ var permissionDeclarationSchema = z4.union([
557
557
  anonymous: z4.boolean().optional()
558
558
  })
559
559
  ]);
560
- var pluginExecutionGrantSchema = z4.object({
561
- action: z4.string().min(1),
562
- subject: z4.string().min(1),
563
- targetPluginId: z4.string().regex(/^[a-z0-9-]+(\.[a-z0-9-]+)+$/, "targetPluginId must be reverse-domain format").optional()
564
- });
565
- var pluginFastifyRoutesSchema = z4.union([
566
- z4.string(),
567
- z4.object({
568
- entry: z4.string(),
569
- grants: z4.array(pluginExecutionGrantSchema).optional(),
570
- queueProcedures: z4.record(
571
- z4.string().min(1),
572
- z4.array(pluginExecutionGrantSchema).min(1)
573
- ).optional()
574
- })
575
- ]);
576
560
  var navTargetSchema = z4.object({
577
561
  slot: z4.literal("nav.sidebar"),
578
562
  path: z4.string(),
@@ -1185,6 +1169,13 @@ var pluginManifestSchema = z4.object({
1185
1169
  storage: z4.object({
1186
1170
  provider: z4.boolean().optional()
1187
1171
  }).optional(),
1172
+ sms: z4.object({
1173
+ provider: z4.boolean().optional()
1174
+ }).optional(),
1175
+ organizations: z4.object({
1176
+ /** Request Host-mediated Core organization provisioning. */
1177
+ provision: z4.boolean().optional()
1178
+ }).optional(),
1188
1179
  artifacts: z4.object({
1189
1180
  write: z4.boolean().optional()
1190
1181
  }).optional(),
@@ -1288,26 +1279,9 @@ var pluginManifestSchema = z4.object({
1288
1279
  }).optional(),
1289
1280
  // === Server Entry ===
1290
1281
  server: z4.object({
1291
- entry: z4.string(),
1292
- // e.g., "./dist/server/index.js"
1293
- router: z4.boolean().optional(),
1294
- // Exports tRPC router
1295
- nestModule: z4.string().optional(),
1296
- // NestJS module for advanced plugins, e.g., "./dist/server/hello.module.js"
1297
- fastifyRoutes: pluginFastifyRoutesSchema.optional(),
1298
- publicServices: z4.array(z4.object({
1299
- name: z4.string().min(1).max(80).regex(/^[a-z0-9-]+$/),
1300
- mountPath: z4.string().regex(/^\/api\/[a-z0-9/-]+$/),
1301
- methods: z4.array(z4.enum(["GET", "POST", "PUT", "PATCH", "DELETE"])).min(1),
1302
- auth: z4.enum(["public", "bearer", "session", "user"]).default("public"),
1303
- maxBodyBytes: z4.number().int().positive().max(100 * 1024 * 1024).default(1024 * 1024)
1304
- })).optional(),
1305
- trustedApiTokenProxy: z4.object({
1306
- invoker: z4.string().min(1),
1307
- paths: z4.array(z4.string().min(1)).min(1)
1308
- }).optional(),
1309
- hooks: z4.array(z4.enum(["onInstall", "onEnable", "onDisable", "onUninstall"])).optional()
1310
- }).optional(),
1282
+ /** Override for plugins that do not use ./dist/server/index.js. */
1283
+ entry: z4.string().min(1).optional()
1284
+ }).strict().optional(),
1311
1285
  // === Admin UI Entry ===
1312
1286
  admin: z4.object({
1313
1287
  remoteEntry: z4.string(),
@@ -1363,28 +1337,6 @@ var pluginManifestSchema = z4.object({
1363
1337
  // === Notifications ===
1364
1338
  notifications: notificationsConfigSchema
1365
1339
  }).superRefine((manifest, ctx) => {
1366
- const fastifyRoutes = manifest.server?.fastifyRoutes;
1367
- if (fastifyRoutes && typeof fastifyRoutes !== "string") {
1368
- const validateOwnedGrants = (grants, path) => {
1369
- for (const [index, grant] of (grants ?? []).entries()) {
1370
- const targetPluginId = grant.targetPluginId ?? manifest.pluginId;
1371
- if (targetPluginId === manifest.pluginId && !grant.subject.startsWith(`plugin:${manifest.pluginId}:`)) {
1372
- ctx.addIssue({
1373
- code: "custom",
1374
- path: [...path, index, "subject"],
1375
- message: `same-plugin execution grants must use the plugin:${manifest.pluginId}: permission subject namespace`
1376
- });
1377
- }
1378
- }
1379
- };
1380
- validateOwnedGrants(fastifyRoutes.grants, ["server", "fastifyRoutes", "grants"]);
1381
- for (const [procedurePath, grants] of Object.entries(fastifyRoutes.queueProcedures ?? {})) {
1382
- validateOwnedGrants(
1383
- grants,
1384
- ["server", "fastifyRoutes", "queueProcedures", procedurePath]
1385
- );
1386
- }
1387
- }
1388
1340
  const declaresThemeCapability = manifest.capabilities?.ui?.webTheme === true;
1389
1341
  const hasPresentation = manifest.web?.presentation !== void 0;
1390
1342
  if (declaresThemeCapability && !hasPresentation) {
@@ -1504,4 +1456,4 @@ export {
1504
1456
  webSurfaceSchema,
1505
1457
  pluginManifestSchema
1506
1458
  };
1507
- //# sourceMappingURL=chunk-C7BZITSY.js.map
1459
+ //# sourceMappingURL=chunk-QUUDT6V5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/presentation.ts","../src/storefront.ts","../src/web-design.ts","../src/manifest.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type {\n WebJsonValue,\n WebPluginHead,\n WebSlotRemoteExtension,\n} from \"./types\";\n\n// Presentation regions can reference existing plugin-owned Slot and design IDs.\n// Those public IDs predate this contract and may contain camelCase segments, so\n// keep the shared identifier grammar URL-safe without forcing a breaking rename.\nconst presentationIdPattern = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;\nconst pluginIdPattern = /^[a-z0-9-]+(\\.[a-z0-9-]+)+$/;\nconst contractVersionPattern = /^\\d+(?:\\.\\d+){0,2}(?:-[0-9A-Za-z.-]+)?$/;\nconst contractRangePattern =\n /^(?:\\^|~|>=|<=|>|<)?\\d+(?:\\.\\d+){0,2}(?:-[0-9A-Za-z.-]+)?$|^\\d+(?:\\.\\d+)?\\.(?:x|\\*)$|^\\d+\\.(?:x|\\*)$/;\n\nexport const presentationIdSchema = z\n .string()\n .min(1)\n .max(160)\n .regex(presentationIdPattern, \"presentation id must be URL-safe\");\n\nexport const presentationPluginIdSchema = z.string().regex(pluginIdPattern, \"pluginId must be reverse-domain format\");\n\nexport const presentationContractVersionSchema = z\n .string()\n .regex(contractVersionPattern, \"contract version must contain one to three numeric semver components\");\n\nexport const presentationContractRangeSchema = z\n .string()\n .regex(contractRangePattern, \"contract range must be an exact, comparator, caret, tilde, or wildcard range\");\n\nexport const presentationSchemaRefSchema = z.union([z.string().min(1), z.record(z.string(), z.json())]);\nexport const presentationModelSchema = z.json();\n\nexport const presentationRenderModeSchema = z.enum([\"ssr\", \"react\", \"island\"]);\n\nexport const presentationRegionSchema = z\n .object({\n id: presentationIdSchema,\n label: z.string().min(1).optional(),\n required: z.boolean().optional(),\n accepts: z.array(presentationIdSchema).optional(),\n contextSchema: presentationSchemaRefSchema.optional(),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().positive().optional(),\n order: z.number().optional(),\n })\n .superRefine((region, ctx) => {\n if (region.min !== undefined && region.max !== undefined && region.min > region.max) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"min\"],\n message: \"presentation region min must not exceed max\",\n });\n }\n });\n\nexport const presentationActionSchema = z\n .object({\n id: presentationIdSchema,\n inputSchema: presentationSchemaRefSchema.optional(),\n outputSchema: presentationSchemaRefSchema.optional(),\n permission: z.string().min(1).optional(),\n })\n .passthrough();\n\nexport const presentationSurfaceSchema = z\n .object({\n id: presentationIdSchema,\n contractVersion: presentationContractVersionSchema,\n modelSchema: presentationSchemaRefSchema,\n defaultRenderer: z.string().min(1),\n clientComponent: z.string().min(1).optional(),\n renderModes: z.array(presentationRenderModeSchema).min(1),\n actions: z.array(presentationActionSchema).optional(),\n regions: z.array(presentationRegionSchema).optional(),\n })\n .superRefine((surface, ctx) => {\n addDuplicateIdIssues(surface.actions, [\"actions\"], ctx);\n addDuplicateIdIssues(surface.regions, [\"regions\"], ctx);\n });\n\nexport const presentationAdapterSchema = z\n .object({\n id: presentationIdSchema.optional(),\n label: z.string().min(1).optional(),\n labelKey: z.string().min(1).optional(),\n ownerPluginId: presentationPluginIdSchema,\n surfaceId: presentationIdSchema,\n accepts: presentationContractRangeSchema,\n serverRenderer: z.string().min(1).optional(),\n clientComponent: z.string().min(1).optional(),\n expose: z.string().min(1).optional(),\n required: z.boolean().optional(),\n regions: z.array(presentationIdSchema).optional(),\n })\n .superRefine((adapter, ctx) => {\n if (!adapter.serverRenderer && !adapter.clientComponent) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"serverRenderer\"],\n message: \"presentation adapter requires serverRenderer or clientComponent\",\n });\n }\n });\n\nexport const themeAssetPathSchema = z\n .string()\n .min(1)\n .max(512)\n .refine((value) => !value.startsWith(\"/\") && !value.includes(\"\\\\\"), {\n message: \"theme asset paths must be relative POSIX paths\",\n })\n .refine((value) => value.split(\"/\").every((segment) => segment !== \"\" && segment !== \".\" && segment !== \"..\"), {\n message: \"theme asset paths must not contain empty, dot, or parent segments\",\n });\n\nexport const themeAssetSchema = z\n .object({\n path: themeAssetPathSchema,\n kind: z.enum([\"stylesheet\", \"script\", \"font\", \"image\", \"other\"]),\n integrity: z.string().min(1).optional(),\n media: z.string().min(1).optional(),\n preload: z.boolean().optional(),\n order: z.number().optional(),\n })\n .passthrough();\n\nexport const themeHeadSchema = z.object({\n title: z.string().min(1).max(300).optional(),\n description: z.string().max(1000).optional(),\n meta: z.record(z.string().min(1).max(120), z.string().max(2048)).optional(),\n links: z.array(z.object({\n rel: z.string().min(1).max(80),\n href: z.string().min(1).max(2048),\n as: z.string().min(1).max(80).optional(),\n type: z.string().min(1).max(160).optional(),\n })).optional(),\n});\n\nexport const themeTokenTypeSchema = z.enum([\"color\", \"length\", \"font-family\", \"number\", \"shadow\", \"enum\", \"image\"]);\n\nexport const themeTokenSchema = z\n .object({\n id: presentationIdSchema,\n cssVariable: z\n .string()\n .regex(/^--[a-z0-9][a-z0-9-]*$/, \"theme token cssVariable must be a CSS custom property\"),\n type: themeTokenTypeSchema,\n default: z.json(),\n enumValues: z.array(z.string().min(1)).optional(),\n label: z.string().min(1).optional(),\n labelKey: z.string().min(1).optional(),\n description: z.string().optional(),\n descriptionKey: z.string().min(1).optional(),\n })\n .superRefine((token, ctx) => {\n if (token.type === \"enum\" && !token.enumValues?.length) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"enumValues\"],\n message: \"enum theme tokens require enumValues\",\n });\n }\n });\n\nexport const themeTokenPresetSchema = z.object({\n id: presentationIdSchema,\n label: z.string().min(1).optional(),\n labelKey: z.string().min(1).optional(),\n description: z.string().optional(),\n descriptionKey: z.string().min(1).optional(),\n extends: presentationIdSchema.optional(),\n values: z.record(presentationIdSchema, z.json()),\n});\n\nexport const themeSiteShellSchema = z.union([\n z.string().min(1),\n z.object({\n serverRenderer: z.string().min(1),\n clientComponent: z.string().min(1).optional(),\n expose: z.string().min(1).optional(),\n }),\n]);\n\nexport const themeHomeTargetSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"theme-route\"),\n routeId: presentationIdSchema,\n }),\n z.object({\n type: z.literal(\"plugin-route\"),\n pluginId: presentationPluginIdSchema,\n routeId: presentationIdSchema,\n }),\n z.object({\n type: z.literal(\"designer-page\"),\n pageId: z.string().min(1).max(160),\n }),\n z.object({\n type: z.literal(\"default\"),\n }),\n]);\n\nexport const themeIntegrationSchema = z.object({\n pluginId: presentationPluginIdSchema,\n required: z.boolean().optional(),\n surfaces: z\n .array(\n z.object({\n id: presentationIdSchema,\n accepts: presentationContractRangeSchema,\n required: z.boolean().optional(),\n }),\n )\n .optional(),\n storefrontApis: z\n .array(\n z.object({\n id: presentationIdSchema,\n accepts: presentationContractRangeSchema,\n required: z.boolean().optional(),\n }),\n )\n .optional(),\n});\n\nexport const webPresentationSchema = z\n .object({\n contractVersion: z.literal(1),\n shell: themeSiteShellSchema.optional(),\n defaultHomeRouteId: presentationIdSchema.optional(),\n head: themeHeadSchema.optional(),\n assets: z.array(themeAssetSchema).optional(),\n tokens: z.array(themeTokenSchema).optional(),\n presets: z.array(themeTokenPresetSchema).optional(),\n settingsSchema: themeAssetPathSchema.optional(),\n settingsVersion: z.number().int().positive().optional(),\n adapters: z.array(presentationAdapterSchema).optional(),\n integrations: z.array(themeIntegrationSchema).optional(),\n })\n .superRefine((presentation, ctx) => {\n const hasDeclaration = Boolean(\n presentation.shell ||\n presentation.defaultHomeRouteId ||\n presentation.head ||\n presentation.assets?.length ||\n presentation.tokens?.length ||\n presentation.presets?.length ||\n presentation.settingsSchema ||\n presentation.adapters?.length ||\n presentation.integrations?.length,\n );\n if (!hasDeclaration) {\n ctx.addIssue({\n code: \"custom\",\n path: [],\n message: \"web.presentation must declare at least one presentation resource\",\n });\n }\n\n addDuplicateIdIssues(presentation.tokens, [\"tokens\"], ctx);\n addDuplicateIdIssues(presentation.presets, [\"presets\"], ctx);\n\n const adapterKeys = new Set<string>();\n for (const [index, adapter] of (presentation.adapters ?? []).entries()) {\n const key = `${adapter.ownerPluginId}:${adapter.surfaceId}`;\n if (adapterKeys.has(key)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"adapters\", index, \"surfaceId\"],\n message: `duplicate presentation adapter target: ${key}`,\n });\n }\n adapterKeys.add(key);\n }\n\n validatePresetGraph(presentation.presets ?? [], ctx);\n });\n\nexport const presentationDiagnosticSeveritySchema = z.enum([\"info\", \"warning\", \"error\"]);\nexport const presentationCompatibilityStatusSchema = z.enum([\"compatible\", \"incompatible\", \"missing\"]);\n\nexport const presentationDiagnosticSchema = z.object({\n code: z.string().min(1),\n severity: presentationDiagnosticSeveritySchema,\n ownerPluginId: presentationPluginIdSchema,\n contractId: presentationIdSchema,\n expectedRange: presentationContractRangeSchema.optional(),\n actualVersion: presentationContractVersionSchema.optional(),\n required: z.boolean(),\n remediation: z.enum([\"install\", \"enable\", \"upgrade-owner\", \"upgrade-theme\", \"disable-integration\", \"fallback\"]),\n message: z.string().min(1),\n});\n\nexport const presentationCompatibilityResultSchema = z.object({\n status: presentationCompatibilityStatusSchema,\n diagnostic: presentationDiagnosticSchema.optional(),\n});\n\nexport const PRESENTATION_OBSERVABILITY = {\n spans: {\n resolve: \"site.presentation.resolve\",\n shell: \"site.presentation.shell.render\",\n adapter: \"site.presentation.adapter.render\",\n storefront: \"site.presentation.storefront.call\",\n designNode: \"site.presentation.design-node.render\",\n embed: \"site.presentation.embed.load\",\n },\n metrics: {\n resolution: \"site_presentation_resolution_total\",\n fallback: \"site_presentation_fallback_total\",\n renderDuration: \"site_presentation_render_duration_ms\",\n compatibility: \"site_presentation_compatibility_total\",\n },\n auditEvents: {\n previewIssued: \"site.theme.preview.issued\",\n published: \"site.theme.published\",\n rolledBack: \"site.theme.rolled_back\",\n safeModeEntered: \"site.theme.safe_mode.entered\",\n safeModeRecovered: \"site.theme.safe_mode.recovered\",\n },\n fields: [\n \"organizationId\",\n \"themePluginId\",\n \"themeVersion\",\n \"revisionId\",\n \"presentationMode\",\n \"routeId\",\n \"surfaceId\",\n \"contractVersion\",\n \"fallbackReason\",\n \"pluginLoadGeneration\",\n ],\n} as const;\n\nexport interface PresentationCompatibilityCheck {\n ownerPluginId: string;\n contractId: string;\n expectedRange: string;\n actualVersion?: string | undefined;\n required: boolean;\n kind?: \"surface\" | \"storefront\" | \"theme\" | \"design\" | undefined;\n}\n\nexport interface SitePresentationRenderContext {\n organizationId: string;\n pluginId: string;\n pluginVersion: string;\n revisionId: string | null;\n mode: \"published\" | \"preview\" | \"fallback\" | \"safe-mode\";\n publicPath: string;\n matchedRouteId?: string | undefined;\n locale?: string | undefined;\n currency?: string | undefined;\n timezone?: string | undefined;\n basePath: string;\n publicOrigin?: string | undefined;\n tokens: Readonly<Record<string, string>>;\n}\n\nexport interface PresentationAdapterContext<TModel = unknown> extends SitePresentationRenderContext {\n ownerPluginId: string;\n surfaceId: string;\n surfaceVersion: string;\n model: TModel;\n actions: readonly PresentationAction[];\n regions: readonly PresentationRegion[];\n settings: Readonly<Record<string, WebJsonValue>>;\n}\n\nexport interface PresentationAdapterRenderResult {\n html: string;\n head?: WebPluginHead | undefined;\n initialData?: WebJsonValue | undefined;\n clientEntries?: readonly string[] | undefined;\n slotExtensions?: readonly WebSlotRemoteExtension[] | undefined;\n}\n\nexport type PresentationAdapterRenderer<TModel = unknown> = (\n context: PresentationAdapterContext<TModel>,\n) => PresentationAdapterRenderResult | Promise<PresentationAdapterRenderResult>;\n\n/** Owner-side default renderer for a declared presentation surface. */\nexport type PresentationSurfaceRenderer<TModel = unknown> = PresentationAdapterRenderer<TModel>;\n\nexport function defineWebPresentation<const T extends WebPresentation>(presentation: T): T {\n return presentation;\n}\n\nexport function defineThemeHomeTarget<const T extends ThemeHomeTarget>(target: T): T {\n return target;\n}\n\nexport function definePresentationSurface<const T extends PresentationSurface>(surface: T): T {\n return surface;\n}\n\nexport function definePresentationAdapter<const T extends PresentationAdapter>(adapter: T): T {\n return adapter;\n}\n\nexport function parsePresentationModel(value: unknown): PresentationModel {\n return presentationModelSchema.parse(value);\n}\n\nexport function evaluatePresentationCompatibility(\n check: PresentationCompatibilityCheck,\n): PresentationCompatibilityResult {\n if (!check.actualVersion) {\n return {\n status: \"missing\",\n diagnostic: {\n code: `presentation.${check.kind ?? \"surface\"}.missing`,\n severity: check.required ? \"error\" : \"warning\",\n ownerPluginId: check.ownerPluginId,\n contractId: check.contractId,\n expectedRange: check.expectedRange,\n required: check.required,\n remediation: \"install\",\n message: `Missing ${check.ownerPluginId}:${check.contractId} ${check.expectedRange}`,\n },\n };\n }\n\n if (satisfiesPresentationRange(check.actualVersion, check.expectedRange)) {\n return { status: \"compatible\" };\n }\n\n return {\n status: \"incompatible\",\n diagnostic: {\n code: `presentation.${check.kind ?? \"surface\"}.version_mismatch`,\n severity: check.required ? \"error\" : \"warning\",\n ownerPluginId: check.ownerPluginId,\n contractId: check.contractId,\n expectedRange: check.expectedRange,\n actualVersion: check.actualVersion,\n required: check.required,\n remediation: check.required ? \"upgrade-theme\" : \"fallback\",\n message: `Expected ${check.expectedRange}, received ${check.actualVersion}`,\n },\n };\n}\n\nexport function satisfiesPresentationRange(version: string, range: string): boolean {\n const parsedVersion = parseVersion(version);\n if (!parsedVersion) return false;\n\n if (range.endsWith(\".x\") || range.endsWith(\".*\")) {\n const prefix = range.slice(0, -2).split(\".\").map(Number);\n if (prefix.some(Number.isNaN)) return false;\n return prefix.every((part, index) => parsedVersion[index] === part);\n }\n\n const comparator = range.match(/^(\\^|~|>=|<=|>|<)?(.+)$/);\n if (!comparator) return false;\n const operator = comparator[1] ?? \"=\";\n const base = parseVersion(comparator[2] ?? \"\");\n if (!base) return false;\n\n const comparison = compareVersion(parsedVersion, base);\n if (operator === \"=\") return comparison === 0;\n if (operator === \">=\") return comparison >= 0;\n if (operator === \"<=\") return comparison <= 0;\n if (operator === \">\") return comparison > 0;\n if (operator === \"<\") return comparison < 0;\n if (comparison < 0) return false;\n\n if (operator === \"~\") {\n return parsedVersion[0] === base[0] && parsedVersion[1] === base[1];\n }\n\n if (base[0] > 0) return parsedVersion[0] === base[0];\n if (base[1] > 0) return parsedVersion[0] === 0 && parsedVersion[1] === base[1];\n return parsedVersion[0] === 0 && parsedVersion[1] === 0 && parsedVersion[2] === base[2];\n}\n\nfunction addDuplicateIdIssues(\n values: readonly { id: string }[] | undefined,\n path: [string],\n ctx: z.RefinementCtx,\n): void {\n const ids = new Set<string>();\n for (const [index, value] of (values ?? []).entries()) {\n if (ids.has(value.id)) {\n ctx.addIssue({\n code: \"custom\",\n path: [...path, index, \"id\"],\n message: `duplicate presentation id: ${value.id}`,\n });\n }\n ids.add(value.id);\n }\n}\n\nfunction validatePresetGraph(presets: readonly ThemeTokenPreset[], ctx: z.RefinementCtx): void {\n const byId = new Map(presets.map((preset) => [preset.id, preset]));\n for (const [index, preset] of presets.entries()) {\n if (preset.extends && !byId.has(preset.extends)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"presets\", index, \"extends\"],\n message: `unknown theme token preset: ${preset.extends}`,\n });\n continue;\n }\n\n const visited = new Set<string>();\n let current: ThemeTokenPreset | undefined = preset;\n while (current?.extends) {\n if (visited.has(current.id)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"presets\", index, \"extends\"],\n message: `cyclic theme token preset inheritance: ${preset.id}`,\n });\n break;\n }\n visited.add(current.id);\n current = byId.get(current.extends);\n }\n }\n}\n\ntype ParsedVersion = readonly [number, number, number];\n\nfunction parseVersion(value: string): ParsedVersion | null {\n const core = value.split(\"-\")[0];\n if (!core) return null;\n const parts = core.split(\".\");\n if (parts.length < 1 || parts.length > 3) return null;\n const numbers = parts.map(Number);\n if (numbers.some((part) => !Number.isInteger(part) || part < 0)) return null;\n return [numbers[0] ?? 0, numbers[1] ?? 0, numbers[2] ?? 0];\n}\n\nfunction compareVersion(left: ParsedVersion, right: ParsedVersion): number {\n for (let index = 0; index < 3; index += 1) {\n const difference = (left[index] ?? 0) - (right[index] ?? 0);\n if (difference !== 0) return difference;\n }\n return 0;\n}\n\nexport type PresentationRegion = z.infer<typeof presentationRegionSchema>;\nexport type PresentationModel = z.infer<typeof presentationModelSchema>;\nexport type PresentationAction = z.infer<typeof presentationActionSchema>;\nexport type PresentationSurface = z.infer<typeof presentationSurfaceSchema>;\nexport type PresentationAdapter = z.infer<typeof presentationAdapterSchema>;\nexport type ThemeAsset = z.infer<typeof themeAssetSchema>;\nexport type ThemeHead = z.infer<typeof themeHeadSchema>;\nexport type ThemeTokenType = z.infer<typeof themeTokenTypeSchema>;\nexport type ThemeToken = z.infer<typeof themeTokenSchema>;\nexport type ThemeTokenPreset = z.infer<typeof themeTokenPresetSchema>;\nexport type ThemeSiteShell = z.infer<typeof themeSiteShellSchema>;\nexport type ThemeHomeTarget = z.infer<typeof themeHomeTargetSchema>;\nexport type ThemeIntegration = z.infer<typeof themeIntegrationSchema>;\nexport type WebPresentation = z.infer<typeof webPresentationSchema>;\nexport type PresentationDiagnostic = z.infer<typeof presentationDiagnosticSchema>;\nexport type PresentationCompatibilityResult = z.infer<typeof presentationCompatibilityResultSchema>;\n","import { z } from \"zod\";\nimport { presentationContractVersionSchema, presentationIdSchema, presentationSchemaRefSchema } from \"./presentation\";\n\nexport const storefrontOperationKindSchema = z.enum([\"query\", \"command\"]);\n\nexport const storefrontOperationSchema = z\n .object({\n id: presentationIdSchema,\n kind: storefrontOperationKindSchema,\n inputSchema: presentationSchemaRefSchema,\n outputSchema: presentationSchemaRefSchema,\n anonymous: z.boolean().optional(),\n permission: z.string().min(1).optional(),\n })\n .passthrough();\n\nexport const storefrontApiSchema = z\n .object({\n id: presentationIdSchema,\n version: presentationContractVersionSchema,\n serverExport: z.string().min(1),\n browserExport: z.string().min(1).optional(),\n operations: z.array(storefrontOperationSchema).min(1),\n openapi: z\n .object({\n basePath: z.string().regex(/^\\/v\\d+(?:\\/[a-z0-9-]+)*$/),\n cors: z.enum([\"site-origin\", \"allowlist\", \"disabled\"]).optional(),\n })\n .optional(),\n })\n .superRefine((api, ctx) => {\n const ids = new Set<string>();\n for (const [index, operation] of api.operations.entries()) {\n if (ids.has(operation.id)) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"operations\", index, \"id\"],\n message: `duplicate Storefront operation: ${operation.id}`,\n });\n }\n ids.add(operation.id);\n }\n });\n\nexport interface StorefrontRequest<TInput = unknown> {\n apiId: string;\n version: string;\n operation: string;\n input: TInput;\n}\n\nexport interface StorefrontResponse<TOutput = unknown> {\n data: TOutput;\n version: string;\n requestId?: string | undefined;\n}\n\nexport interface StorefrontServerBroker {\n call<TInput = unknown, TOutput = unknown>(request: StorefrontRequest<TInput>): Promise<StorefrontResponse<TOutput>>;\n}\n\nexport interface StorefrontBrowserClient extends StorefrontServerBroker {\n discover(): Promise<readonly StorefrontApi[]>;\n}\n\nexport function defineStorefrontApi<const T extends StorefrontApi>(api: T): T {\n return api;\n}\n\nexport type StorefrontOperationKind = z.infer<typeof storefrontOperationKindSchema>;\nexport type StorefrontOperation = z.infer<typeof storefrontOperationSchema>;\nexport type StorefrontApi = z.infer<typeof storefrontApiSchema>;\n","import { z } from \"zod\";\nimport { presentationContractVersionSchema, presentationIdSchema, presentationSchemaRefSchema } from \"./presentation\";\n\nexport const webDesignNodeKindSchema = z.enum([\"content\", \"container\", \"app-block\"]);\n\nexport const webDesignRegionSchema = z\n .object({\n id: presentationIdSchema,\n label: z.string().min(1).optional(),\n accepts: z.array(presentationIdSchema).optional(),\n min: z.number().int().nonnegative().optional(),\n max: z.number().int().positive().optional(),\n required: z.boolean().optional(),\n })\n .superRefine((region, ctx) => {\n if (region.min !== undefined && region.max !== undefined && region.min > region.max) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"min\"],\n message: \"Web Designer region min must not exceed max\",\n });\n }\n });\n\nexport const webDesignBindingSchema = z.object({\n id: presentationIdSchema,\n source: presentationIdSchema,\n inputSchema: presentationSchemaRefSchema.optional(),\n outputSchema: presentationSchemaRefSchema.optional(),\n});\n\nexport const webDesignMigrationSchema = z.object({\n from: presentationContractVersionSchema,\n to: presentationContractVersionSchema,\n handler: z.string().min(1),\n});\n\nexport const webDesignNodeDefinitionSchema = z\n .object({\n id: presentationIdSchema,\n version: presentationContractVersionSchema,\n kind: webDesignNodeKindSchema,\n title: z.string().min(1),\n category: z.string().min(1).optional(),\n icon: z.string().min(1).optional(),\n settingsSchema: presentationSchemaRefSchema.optional(),\n contextSchema: presentationSchemaRefSchema.optional(),\n editorComponent: z.string().min(1),\n serverRenderer: z.string().min(1),\n clientComponent: z.string().min(1).optional(),\n regions: z.array(webDesignRegionSchema).optional(),\n bindings: z.array(webDesignBindingSchema).optional(),\n actions: z.array(presentationIdSchema).optional(),\n migrations: z.array(webDesignMigrationSchema).optional(),\n })\n .superRefine((node, ctx) => {\n if (node.kind === \"container\" && !node.regions?.length) {\n ctx.addIssue({\n code: \"custom\",\n path: [\"regions\"],\n message: \"container Web Designer nodes require at least one region\",\n });\n }\n });\n\nexport const webAppEmbedTargetSchema = z.enum([\"head\", \"body-start\", \"body-end\", \"floating-layer\"]);\nexport const webAppEmbedConsentSchema = z.enum([\"necessary\", \"functional\", \"analytics\", \"marketing\"]);\n\nexport const webAppEmbedSchema = z.object({\n id: presentationIdSchema,\n version: presentationContractVersionSchema,\n title: z.string().min(1),\n target: webAppEmbedTargetSchema,\n clientComponent: z.string().min(1),\n settingsSchema: presentationSchemaRefSchema.optional(),\n consent: webAppEmbedConsentSchema.optional(),\n csp: z\n .object({\n scriptSrc: z.array(z.string().min(1)).optional(),\n connectSrc: z.array(z.string().min(1)).optional(),\n frameSrc: z.array(z.string().min(1)).optional(),\n imgSrc: z.array(z.string().min(1)).optional(),\n })\n .optional(),\n order: z.number().optional(),\n});\n\nexport function defineWebDesignNode<const T extends WebDesignNodeDefinition>(node: T): T {\n return node;\n}\n\nexport function defineAppEmbed<const T extends WebAppEmbed>(embed: T): T {\n return embed;\n}\n\nexport type WebDesignNodeKind = z.infer<typeof webDesignNodeKindSchema>;\nexport type WebDesignRegion = z.infer<typeof webDesignRegionSchema>;\nexport type WebDesignBinding = z.infer<typeof webDesignBindingSchema>;\nexport type WebDesignMigration = z.infer<typeof webDesignMigrationSchema>;\nexport type WebDesignNodeDefinition = z.infer<typeof webDesignNodeDefinitionSchema>;\nexport type WebAppEmbedTarget = z.infer<typeof webAppEmbedTargetSchema>;\nexport type WebAppEmbedConsent = z.infer<typeof webAppEmbedConsentSchema>;\nexport type WebAppEmbed = z.infer<typeof webAppEmbedSchema>;\n","import { z } from 'zod';\nimport { canonicalizeLocale } from './locale';\nimport {\n presentationAdapterSchema,\n presentationSurfaceSchema,\n webPresentationSchema,\n} from './presentation';\nimport { storefrontApiSchema } from './storefront';\nimport {\n webAppEmbedSchema,\n webDesignNodeDefinitionSchema,\n} from './web-design';\n\n// ========== Notification Schema Components ==========\n\n/**\n * Aggregation Strategy - how to group notifications from plugins\n */\nexport const aggregationStrategySchema = z.enum(['none', 'by_target', 'by_actor', 'by_type']);\nexport type AggregationStrategy = z.infer<typeof aggregationStrategySchema>;\n\n/**\n * Notification Category - determines retention policy and view strategy\n */\nexport const notificationCategorySchema = z.enum(['system', 'collaboration', 'social']);\nexport type NotificationCategory = z.infer<typeof notificationCategorySchema>;\n\n/**\n * Plugin Notification Type - declares a type of notification the plugin can send\n */\nexport const notificationTypeSchema = z.object({\n id: z.string().min(1).regex(/^[a-z0-9_]+$/, 'type id must be lowercase alphanumeric with underscores'),\n category: notificationCategorySchema,\n aggregation: aggregationStrategySchema.default('none'),\n i18n: z.record(\n z.string(), // locale key (e.g., 'en-US', 'zh-CN')\n z.object({\n title: z.string().min(1),\n description: z.string().optional(),\n })\n ),\n});\nexport type PluginNotificationType = z.infer<typeof notificationTypeSchema>;\n\n/**\n * Notification Webhooks - async callbacks for notification events\n */\nexport const notificationWebhooksSchema = z.object({\n onClicked: z.string().url().optional(),\n onArchived: z.string().url().optional(),\n}).optional();\n\n/**\n * Notification Rate Limit - plugin-declared limits (platform may enforce lower)\n */\nexport const notificationRateLimitSchema = z.object({\n maxPerMinute: z.number().int().positive().max(10000).default(100),\n maxPerHour: z.number().int().positive().max(20000).default(1000),\n maxPerDay: z.number().int().positive().max(100000).default(10000),\n}).partial();\n\n/**\n * Notification Permission Types\n */\nexport const notificationPermissionSchema = z.enum([\n 'notification:send',\n 'notification:send:batch',\n 'notification:read:own',\n]);\n\n/**\n * Plugin Notifications Configuration\n */\nexport const notificationsConfigSchema = z.object({\n types: z.array(notificationTypeSchema).min(1),\n permissions: z.array(notificationPermissionSchema).optional(),\n rateLimit: notificationRateLimitSchema.optional(),\n webhooks: notificationWebhooksSchema,\n}).optional();\n\n// ========== Admin Extension Schema (Slot & Fill) ==========\n\nexport const permissionDeclarationSchema = z.union([\n z.string().min(1),\n z.object({\n action: z.string().min(1),\n subject: z.string().min(1),\n anonymous: z.boolean().optional(),\n }),\n]);\n\nexport const navTargetSchema = z.object({\n slot: z.literal('nav.sidebar'),\n path: z.string(),\n icon: z.string().optional(),\n order: z.number().optional(),\n permission: permissionDeclarationSchema.optional(),\n /** @deprecated Use permission instead. */\n requiredPermission: z.string().optional(),\n parent: z.string().optional(),\n});\n\nexport const navGroupTargetSchema = z.object({\n slot: z.literal('nav.sidebar.group'),\n path: z.string().optional(),\n icon: z.string().optional(),\n order: z.number().optional(),\n});\n\nexport const routeTargetSchema = z.object({\n slot: z.literal('plugin.route'),\n path: z.string(),\n order: z.number().optional(),\n params: z.record(z.string(), z.string()).optional(),\n});\n\nexport const marketplaceTabTargetSchema = z.object({\n slot: z.literal('marketplace.tabs'),\n value: z.string().min(1).regex(/^[a-z0-9][a-z0-9._-]*$/, 'marketplace tab value must be URL-safe'),\n order: z.number().optional(),\n visibility: z.enum(['platform', 'all']).optional(),\n});\n\nexport const settingsTargetSchema = z.object({\n slot: z.literal('settings.plugin'),\n category: z.string().optional(),\n order: z.number().optional(),\n visibility: z.enum(['platform', 'all']).optional(),\n});\n\nexport const dashboardTargetSchema = z.object({\n slot: z.enum(['dashboard.widgets', 'dashboard.overview']),\n order: z.number().optional(),\n colSpan: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]).optional(),\n});\n\nexport const genericTargetSchema = z.object({\n slot: z.string(),\n order: z.number().optional(),\n});\n\nexport const targetSchema = z.union([\n navTargetSchema,\n navGroupTargetSchema,\n routeTargetSchema,\n marketplaceTabTargetSchema,\n settingsTargetSchema,\n dashboardTargetSchema,\n genericTargetSchema,\n]);\n\nexport const adminExtensionSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1),\n icon: z.string().optional(),\n hidden: z.boolean().optional(),\n targets: z.array(targetSchema).min(1),\n});\n\nexport const adminSlotPropSchema = z.union([\n z.string().min(1),\n z.object({\n name: z.string().min(1),\n type: z.string().optional(),\n required: z.boolean().optional(),\n description: z.string().optional(),\n }).passthrough(),\n]);\n\nexport const adminSlotSchema = z.object({\n slot: z.string().min(1),\n description: z.string().optional(),\n props: z.array(adminSlotPropSchema).optional(),\n}).passthrough();\n\nexport const adminTourPlacementSchema = z.enum([\n 'top',\n 'top-start',\n 'top-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end',\n 'auto',\n 'center',\n]);\nexport type AdminTourPlacement = z.infer<typeof adminTourPlacementSchema>;\n\nexport const adminTourStepSchema = z.object({\n target: z.string().min(1),\n title: z.string().min(1).optional(),\n titleKey: z.string().min(1).optional(),\n content: z.string().min(1).optional(),\n contentKey: z.string().min(1).optional(),\n placement: adminTourPlacementSchema.optional(),\n}).refine((step) => Boolean(step.content || step.contentKey), {\n message: 'admin tour step must define content or contentKey',\n path: ['content'],\n});\nexport type AdminTourStep = z.infer<typeof adminTourStepSchema>;\n\nexport const adminTourSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1).optional(),\n labelKey: z.string().min(1).optional(),\n routePatterns: z.array(z.string().min(1)).optional(),\n order: z.number().optional(),\n steps: z.array(adminTourStepSchema).min(1),\n});\nexport type AdminTour = z.infer<typeof adminTourSchema>;\n\nconst pluginTranslationRecordSchema = z.record(z.string().min(1), z.string());\n\nfunction normalizeLocaleRecord(\n value: Record<string, string>,\n ctx: { addIssue: (issue: { code: 'custom'; path?: PropertyKey[]; message: string }) => void },\n): Record<string, string> {\n const normalized: Record<string, string> = {};\n\n for (const [rawLocale, message] of Object.entries(value)) {\n const locale = canonicalizeLocale(rawLocale);\n if (!locale) {\n ctx.addIssue({\n code: 'custom',\n path: [rawLocale],\n message: `Invalid BCP 47 locale: ${rawLocale}`,\n });\n continue;\n }\n if (locale in normalized && normalized[locale] !== message) {\n ctx.addIssue({\n code: 'custom',\n path: [rawLocale],\n message: `Duplicate canonical locale: ${locale}`,\n });\n continue;\n }\n normalized[locale] = message;\n }\n\n return normalized;\n}\n\nconst pluginKeyFirstMessagesSchema = z.record(\n z.string().min(1),\n pluginTranslationRecordSchema.transform(normalizeLocaleRecord),\n);\n\nconst pluginLocaleFirstMessagesSchema = z.record(\n z.string(),\n pluginTranslationRecordSchema,\n).transform((value, ctx) => {\n const normalized: Record<string, Record<string, string>> = {};\n\n for (const [rawLocale, messages] of Object.entries(value)) {\n const locale = canonicalizeLocale(rawLocale);\n if (!locale) {\n ctx.addIssue({\n code: 'custom',\n path: [rawLocale],\n message: `Invalid BCP 47 locale: ${rawLocale}`,\n });\n continue;\n }\n if (locale in normalized) {\n ctx.addIssue({\n code: 'custom',\n path: [rawLocale],\n message: `Duplicate canonical locale: ${locale}`,\n });\n continue;\n }\n normalized[locale] = messages;\n }\n\n return normalized;\n});\n\nconst pluginI18nConfigSchema = z.object({\n namespace: z.string().min(1).optional(),\n messages: pluginKeyFirstMessagesSchema.optional(),\n localesFile: z.string().min(1).optional(),\n onUninstall: z.enum(['delete', 'archive', 'retain']).optional(),\n}).strict();\n\nexport const pluginI18nSchema = z.union([\n pluginLocaleFirstMessagesSchema,\n pluginI18nConfigSchema,\n]);\n\n// ========== Entity Extension Schema ==========\n\nconst extensionTargetPluginIdSchema = z.string()\n .min(1)\n .max(160)\n .regex(/^[a-z0-9-]+(\\.[a-z0-9-]+)+$/, 'target pluginId must be reverse-domain format');\n\nconst crudIdSchema = z.string()\n .min(1)\n .max(80)\n .regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/, 'crud id must be an identifier');\n\nconst entityNameSchema = z.string()\n .min(1)\n .max(160)\n .regex(/^[a-z0-9-]+(\\.[a-z0-9-]+)+$/, 'entity must be dot-separated (e.g., \"shop.store\")');\n\nconst extensionFieldNameSchema = z.string()\n .min(1)\n .max(80)\n .regex(/^[a-zA-Z][a-zA-Z0-9_]*$/, 'field must be an identifier');\n\nexport const entityExtensionFieldTypeSchema = z.enum([\n 'text',\n 'number',\n 'boolean',\n 'date',\n 'datetime',\n 'select',\n 'ref',\n 'json',\n]);\n\nexport const entityExtensionRefSchema = z.object({\n entity: entityNameSchema,\n display: z.string().min(1).optional(),\n changed: z.string().min(1).optional(),\n}).passthrough();\n\nexport const autoCrudFieldOptionSchema = z.object({\n label: z.string().min(1),\n value: z.string().min(1),\n searchText: z.union([\n z.string().min(1),\n z.array(z.string().min(1)),\n ]).optional(),\n count: z.number().optional(),\n disabled: z.boolean().optional(),\n}).passthrough();\n\nexport const autoCrudDataSourceSchema = z.string().min(1);\n\nexport const autoCrudFieldConfigSchema = z.object({\n label: z.string().min(1).optional(),\n enum: z.array(autoCrudFieldOptionSchema).optional(),\n dataSource: autoCrudDataSourceSchema.optional(),\n hidden: z.boolean().optional(),\n table: z.union([z.literal(false), z.record(z.string(), z.unknown())]).optional(),\n filter: z.union([z.literal(false), z.record(z.string(), z.unknown())]).optional(),\n form: z.union([z.literal(false), z.record(z.string(), z.unknown())]).optional(),\n search: z.boolean().optional(),\n}).passthrough();\n\nexport const entityExtensionOwnedFieldSchema = autoCrudFieldConfigSchema.extend({\n label: z.string().min(1),\n type: entityExtensionFieldTypeSchema,\n ref: entityExtensionRefSchema.optional(),\n});\n\nexport const entityExtensionFieldSchema = z.union([\n entityExtensionOwnedFieldSchema,\n autoCrudFieldConfigSchema,\n]);\n\nexport const autoCrudActionZoneSchema = z.enum(['toolbar', 'row', 'batch']);\n\nexport const autoCrudActionSchema = z.object({\n type: z.enum([\n 'create',\n 'import',\n 'export',\n 'view',\n 'edit',\n 'copy',\n 'delete',\n 'batchUpdate',\n 'custom',\n ]),\n id: z.string().min(1).optional(),\n label: z.string().min(1).optional(),\n component: z.string().min(1).optional(),\n onClick: z.string().min(1).optional(),\n order: z.number().optional(),\n hidden: z.boolean().optional(),\n position: z.enum(['start', 'end']).optional(),\n variant: z.enum(['default', 'destructive']).optional(),\n}).passthrough();\n\nexport const autoCrudActionsSchema = z.object({\n toolbar: z.array(autoCrudActionSchema).optional(),\n row: z.array(autoCrudActionSchema).optional(),\n batch: z.array(autoCrudActionSchema).optional(),\n}).passthrough();\n\nexport const entityExtensionCrudConfigSchema = z.object({\n fields: z.record(extensionFieldNameSchema, entityExtensionFieldSchema).optional(),\n actions: autoCrudActionsSchema.optional(),\n}).passthrough();\n\nexport const entityExtensionSlotSchema = z.object({\n slot: z.string().min(1),\n component: z.string().min(1),\n order: z.number().optional(),\n label: z.string().optional(),\n}).passthrough();\n\nconst entityExtensionBaseSchema = z.object({\n fields: z.record(\n crudIdSchema,\n z.record(extensionFieldNameSchema, entityExtensionFieldSchema),\n ).optional(),\n slots: z.array(entityExtensionSlotSchema).optional(),\n hide: z.record(crudIdSchema, z.array(extensionFieldNameSchema)).optional(),\n}).passthrough();\n\nexport const entityExtensionSchema = entityExtensionBaseSchema.superRefine((extension, ctx) => {\n const reservedKeys = new Set(['fields', 'slots', 'hide']);\n for (const [key, value] of Object.entries(extension)) {\n if (reservedKeys.has(key)) continue;\n if (typeof value !== 'object' || value === null || Array.isArray(value)) continue;\n\n const record = value as Record<string, unknown>;\n if (!('fields' in record) && !('actions' in record)) continue;\n\n const parsed = entityExtensionCrudConfigSchema.safeParse(value);\n if (!parsed.success) {\n for (const issue of parsed.error.issues) {\n ctx.addIssue({\n ...issue,\n path: [key, ...issue.path],\n });\n }\n }\n }\n});\n\nexport const entityExtensionUseSchema = z.object({\n pluginId: z.string().regex(/^[a-z0-9-]+(\\.[a-z0-9-]+)+$/, 'pluginId must be reverse-domain format'),\n targetId: z.string().min(1).max(240),\n field: extensionFieldNameSchema,\n required: z.boolean().optional(),\n}).passthrough();\n\nexport const pluginUsesSchema = z.object({\n extensions: z.array(entityExtensionUseSchema).optional(),\n}).passthrough();\n\n// ========== Web Surface Schema ==========\n\nexport const webSsrContractVersionSchema = z.union([z.literal(1), z.literal('1')]);\n\nexport const webPluginRouteSchema = z.object({\n id: z.string().min(1).optional(),\n path: z.string().min(1).regex(/^\\//, 'web route path must start with /'),\n handler: z.string().min(1).optional(),\n component: z.string().min(1),\n permission: permissionDeclarationSchema.optional(),\n order: z.number().optional(),\n}).passthrough();\n\nexport const webExtensionTargetSchema = z.object({\n pluginId: extensionTargetPluginIdSchema,\n slot: z.string().min(1),\n permission: permissionDeclarationSchema.optional(),\n order: z.number().optional(),\n}).passthrough();\n\nexport const webExtensionQuerySchema = z.object({\n id: z.string().min(1),\n procedure: z.string().min(1),\n inputFrom: z.enum(['slotProps', 'static']).optional(),\n staticInput: z.record(z.string(), z.unknown()).optional(),\n}).passthrough();\n\nexport const webExtensionSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1).optional(),\n component: z.string().min(1),\n expose: z.string().min(1).optional(),\n permission: permissionDeclarationSchema.optional(),\n targets: z.array(webExtensionTargetSchema).min(1),\n queries: z.array(webExtensionQuerySchema).optional(),\n}).passthrough();\n\nexport const webDesignBlockSchema = z.object({\n id: z.string().min(1),\n component: z.string().min(1),\n title: z.string().min(1).optional(),\n /** @deprecated Use title instead. */\n label: z.string().min(1).optional(),\n category: z.string().min(1).optional(),\n icon: z.string().min(1).optional(),\n defaultProps: z.record(z.string(), z.unknown()).optional(),\n previewProps: z.record(z.string(), z.unknown()).optional(),\n propsSchema: z.record(z.string(), z.unknown()).optional(),\n settingsSchema: z.record(z.string(), z.unknown()).optional(),\n designable: z.object({\n resource: z.record(z.string(), z.unknown()).optional(),\n behavior: z.record(z.string(), z.unknown()).optional(),\n }).optional(),\n previewImage: z.string().min(1).optional(),\n order: z.number().optional(),\n}).passthrough().superRefine((block, ctx) => {\n if ('schema' in block) {\n ctx.addIssue({\n code: 'custom',\n path: ['schema'],\n message: 'web.design.blocks[] must not declare platform schema; use propsSchema/settingsSchema for configuration metadata',\n });\n }\n\n if (!block.title && !block.label) {\n ctx.addIssue({\n code: 'custom',\n path: ['title'],\n message: 'web.design.blocks[] must define title or label',\n });\n }\n});\n\nexport const webDesignSlotSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1).optional(),\n renderMode: z.enum(['island', 'react']).optional(),\n scope: z.enum(['site', 'route', 'template', 'entity']).optional(),\n routeId: z.string().min(1).optional(),\n templateId: z.string().min(1).optional(),\n acceptedBlocks: z.array(z.string().min(1)).optional(),\n order: z.number().optional(),\n}).passthrough();\n\nexport const webDesignTemplateSchema = z.object({\n id: z.string().min(1),\n label: z.string().min(1).optional(),\n routeId: z.string().min(1).optional(),\n entityType: z.string().min(1).optional(),\n component: z.string().min(1),\n slots: z.array(z.string().min(1)).optional(),\n order: z.number().optional(),\n}).passthrough();\n\nexport const webDesignDataSourceSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1).optional(),\n /** @deprecated Use title instead. */\n label: z.string().min(1).optional(),\n permission: permissionDeclarationSchema.optional(),\n inputSchema: z.record(z.string(), z.unknown()).optional(),\n outputSchema: z.record(z.string(), z.unknown()).optional(),\n order: z.number().optional(),\n}).passthrough().superRefine((dataSource, ctx) => {\n if (!dataSource.title && !dataSource.label) {\n ctx.addIssue({\n code: 'custom',\n path: ['title'],\n message: 'web.design.dataSources[] must define title or label',\n });\n }\n});\n\nexport const webDesignActionSchema = z.object({\n id: z.string().min(1),\n title: z.string().min(1).optional(),\n /** @deprecated Use title instead. */\n label: z.string().min(1).optional(),\n permission: permissionDeclarationSchema.optional(),\n inputSchema: z.record(z.string(), z.unknown()).optional(),\n order: z.number().optional(),\n}).passthrough().superRefine((action, ctx) => {\n if (!action.title && !action.label) {\n ctx.addIssue({\n code: 'custom',\n path: ['title'],\n message: 'web.design.actions[] must define title or label',\n });\n }\n});\n\nexport const webDesignSurfaceSchema = z.object({\n editorEntry: z.string().min(1).optional(),\n previewEntry: z.string().min(1).optional(),\n blocks: z.array(webDesignBlockSchema).optional(),\n nodes: z.array(webDesignNodeDefinitionSchema).optional(),\n slots: z.array(webDesignSlotSchema).optional(),\n templates: z.array(webDesignTemplateSchema).optional(),\n dataSources: z.array(webDesignDataSourceSchema).optional(),\n actions: z.array(webDesignActionSchema).optional(),\n embeds: z.array(webAppEmbedSchema).optional(),\n}).superRefine((design, ctx) => {\n const hasDesignSurface = Boolean(\n design.blocks?.length\n || design.nodes?.length\n || design.slots?.length\n || design.templates?.length\n || design.dataSources?.length\n || design.actions?.length\n || design.embeds?.length\n );\n if (!hasDesignSurface) {\n ctx.addIssue({\n code: 'custom',\n path: [],\n message: 'web.design must declare at least one block, slot, template, dataSource, or action',\n });\n }\n\n for (const [field, values] of [\n ['blocks', design.blocks],\n ['nodes', design.nodes],\n ['slots', design.slots],\n ['templates', design.templates],\n ['dataSources', design.dataSources],\n ['actions', design.actions],\n ['embeds', design.embeds],\n ] as const) {\n const ids = new Set<string>();\n for (const [index, value] of (values ?? []).entries()) {\n if (ids.has(value.id)) {\n ctx.addIssue({\n code: 'custom',\n path: [field, index, 'id'],\n message: `duplicate web.design.${field} id: ${value.id}`,\n });\n }\n ids.add(value.id);\n }\n }\n});\n\nexport const webSurfaceSchema = z.object({\n ssrContractVersion: webSsrContractVersionSchema.optional(),\n serverEntry: z.string().min(1).optional(),\n clientEntry: z.string().min(1).optional(),\n remoteEntry: z.string().min(1).optional(),\n devRemoteEntry: z.string().min(1).optional(),\n moduleName: z.string().min(1).optional(),\n exposes: z.record(z.string(), z.string()).optional(),\n routes: z.array(webPluginRouteSchema).optional(),\n fills: z.never().optional(),\n extensions: z.array(webExtensionSchema).optional(),\n design: webDesignSurfaceSchema.optional(),\n /** Standalone feature presentation adapters supplied by a Presentation Pack. */\n adapters: z.array(presentationAdapterSchema).optional(),\n surfaces: z.array(presentationSurfaceSchema).optional(),\n storefrontApis: z.array(storefrontApiSchema).optional(),\n presentation: webPresentationSchema.optional(),\n /** @deprecated Use serverEntry/clientEntry plus routes[].handler/component. */\n entry: z.string().optional(),\n /** @deprecated Use routes[].component. */\n components: z.array(z.string()).optional(),\n}).superRefine((web, ctx) => {\n const hasRoutes = Boolean(web.routes?.length);\n const hasExtensions = Boolean(web.extensions?.length);\n const hasSurfaceServerRenderers = Boolean(web.surfaces?.some((surface) => surface.defaultRenderer));\n const hasStorefrontServerExports = Boolean(web.storefrontApis?.some((api) => api.serverExport));\n const hasPresentationServerRenderers = Boolean(\n (typeof web.presentation?.shell === 'string' || web.presentation?.shell?.serverRenderer)\n || web.presentation?.adapters?.some((adapter) => adapter.serverRenderer)\n || web.adapters?.some((adapter) => adapter.serverRenderer),\n );\n const hasPresentationClientComponents = Boolean(\n (typeof web.presentation?.shell === 'object' && web.presentation.shell.clientComponent)\n || web.presentation?.adapters?.some((adapter) => adapter.clientComponent)\n || web.adapters?.some((adapter) => adapter.clientComponent),\n );\n const usesSsrSurface = Boolean(\n web.ssrContractVersion\n || web.serverEntry\n || web.clientEntry\n || hasRoutes\n || hasSurfaceServerRenderers\n || hasStorefrontServerExports\n || hasPresentationServerRenderers\n );\n const usesRemoteSurface = Boolean(\n web.remoteEntry\n || web.devRemoteEntry\n || web.moduleName\n || web.exposes\n || hasExtensions\n || hasPresentationClientComponents\n || web.storefrontApis?.some((api) => api.browserExport)\n );\n if (!usesSsrSurface && !usesRemoteSurface) return;\n\n if (hasRoutes && !web.ssrContractVersion) {\n ctx.addIssue({\n code: 'custom',\n path: ['ssrContractVersion'],\n message: 'web.ssrContractVersion is required for SSR web surface',\n });\n }\n if ((hasRoutes || hasSurfaceServerRenderers || hasStorefrontServerExports || hasPresentationServerRenderers) && !web.serverEntry) {\n ctx.addIssue({\n code: 'custom',\n path: ['serverEntry'],\n message: 'web.serverEntry is required for server-rendered web declarations',\n });\n }\n if ((hasExtensions || hasPresentationClientComponents || web.storefrontApis?.some((api) => api.browserExport)) && !web.remoteEntry) {\n ctx.addIssue({\n code: 'custom',\n path: ['remoteEntry'],\n message: 'web.remoteEntry is required for public Web remote components or clients',\n });\n }\n for (const [index, route] of (web.routes ?? []).entries()) {\n if (!route.id) {\n ctx.addIssue({\n code: 'custom',\n path: ['routes', index, 'id'],\n message: 'web.routes[].id is required for SSR web surface',\n });\n }\n if (!route.handler) {\n ctx.addIssue({\n code: 'custom',\n path: ['routes', index, 'handler'],\n message: 'web.routes[].handler is required for SSR web surface',\n });\n }\n if (!route.permission) {\n ctx.addIssue({\n code: 'custom',\n path: ['routes', index, 'permission'],\n message: 'web.routes[].permission is required for SSR web surface',\n });\n }\n }\n\n for (const [field, values] of [\n ['adapters', web.adapters],\n ['surfaces', web.surfaces],\n ['storefrontApis', web.storefrontApis],\n ] as const) {\n const ids = new Set<string>();\n for (const [index, value] of (values ?? []).entries()) {\n const id = value.id;\n if (!id) continue;\n if (ids.has(id)) {\n ctx.addIssue({\n code: 'custom',\n path: [field, index, 'id'],\n message: `duplicate web.${field} id: ${id}`,\n });\n }\n ids.add(id);\n }\n }\n\n const adapterTargets = new Set<string>();\n for (const [field, adapters] of [\n ['presentation.adapters', web.presentation?.adapters],\n ['adapters', web.adapters],\n ] as const) {\n for (const [index, adapter] of (adapters ?? []).entries()) {\n const key = `${adapter.ownerPluginId}:${adapter.surfaceId}`;\n if (adapterTargets.has(key)) {\n ctx.addIssue({\n code: 'custom',\n path: [field, index, 'surfaceId'],\n message: `duplicate presentation adapter target across theme and pack declarations: ${key}`,\n });\n }\n adapterTargets.add(key);\n }\n }\n});\n\n// ========== Main Plugin Manifest Schema ==========\n\n/**\n * Plugin Manifest Schema - Validated at plugin load time\n *\n * This is the authoritative schema for manifest.json files.\n */\nexport const pluginManifestSchema = z.object({\n // === Identity ===\n pluginId: z.string().regex(/^[a-z0-9-]+(\\.[a-z0-9-]+)+$/, 'pluginId must be reverse-domain format (e.g., com.vendor.plugin-name)'),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/, 'version must be semver format'),\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n vendor: z.string().min(1).max(100),\n private: z.boolean().optional(),\n type: z.enum(['backend', 'frontend', 'full', 'extension', 'integration', 'feature']).optional(),\n\n // === UI Translations ===\n // Locale -> { key: translated text }. Stored under namespace `plugin.{pluginId}`.\n i18n: pluginI18nSchema.optional(),\n\n // === Runtime ===\n runtime: z.enum(['node']).default('node'),\n\n // Note: surfaces is auto-generated from server/admin/web presence\n // Used by plugin marketplace for filtering\n\n // === Compatibility ===\n engines: z.object({\n wordrhyme: z.string(), // semver range, e.g., \"^0.1.0\"\n node: z.string().optional(), // e.g., \">=20.0.0\"\n }),\n\n // === Capabilities Declared ===\n capabilities: z.object({\n ui: z.object({\n adminPage: z.boolean().optional(),\n webPage: z.boolean().optional(),\n webTheme: z.boolean().optional(),\n webPresentationPack: z.boolean().optional(),\n webDesigner: z.boolean().optional(),\n settingsTab: z.boolean().optional(),\n }).optional(),\n storage: z.object({\n provider: z.boolean().optional(),\n }).optional(),\n sms: z.object({\n provider: z.boolean().optional(),\n }).optional(),\n organizations: z.object({\n /** Request Host-mediated Core organization provisioning. */\n provision: z.boolean().optional(),\n }).optional(),\n artifacts: z.object({\n write: z.boolean().optional(),\n }).optional(),\n /**\n * Agent capability (AI Action Gateway, Phase 0 spike).\n * Static whitelist declarations reconciled by the Host at load time:\n * - `runtime: true` — this plugin hosts the agent runtime and may read\n * the Core agent tool registry (gated capability injection).\n * - `tools` — tools this plugin contributes to the AI Tool Catalog.\n * Declaration only; undeclared tools never become visible.\n */\n agent: z.object({\n runtime: z.boolean().optional(),\n /** Governed action invoker access (ActionInvokerCapability, ctx.actions). */\n invoker: z.boolean().optional(),\n tools: z.array(z.object({\n id: z.string().min(1).regex(\n /^[a-z0-9-]+(\\.[a-z0-9-]+)*$/,\n 'tool id must be lowercase dot-separated (e.g., \"canvas.add-node\")'\n ),\n title: z.string().min(1),\n summary: z.string().optional(),\n })).optional(),\n }).optional(),\n /** Governed AI generation metadata and the reserved official Runtime boundary. */\n ai: z.object({\n aliases: z.array(z.object({\n id: z.string().min(1).max(80).regex(\n /^[a-z0-9][a-z0-9._-]{0,79}$/,\n 'AI alias must be lowercase and may contain dots, underscores, or hyphens'\n ),\n name: z.string().min(1).max(80),\n description: z.string().max(240).optional(),\n })).superRefine((aliases, ctx) => {\n const seen = new Set<string>();\n for (const [index, alias] of aliases.entries()) {\n if (seen.has(alias.id)) {\n ctx.addIssue({\n code: 'custom',\n message: `duplicate AI alias: ${alias.id}`,\n path: [index, 'id'],\n });\n }\n seen.add(alias.id);\n }\n }).optional(),\n provider: z.boolean().optional(),\n }).optional(),\n provides: z.array(z.string()).optional(), // e.g., [\"logger-adapter\", \"cache-adapter\"]\n billing: z.object({\n subjects: z.array(z.object({\n subject: z.string().min(1).regex(\n /^[a-z0-9-]+(\\.[a-z0-9-]+)+\\.[a-zA-Z0-9_]+$/,\n 'subject must be dot-separated (e.g., \"com.vendor.plugin.apiCalls\")'\n ),\n type: z.enum(['boolean', 'metered']),\n unit: z.string().optional(),\n description: z.string().optional(),\n })).optional(),\n procedures: z.record(z.string(), z.string()).optional(),\n }).optional(),\n }).optional(),\n\n // === Exports ===\n exports: z.object({\n loggerAdapter: z.string().optional(), // e.g., \"./dist/logger-adapter.js\"\n cacheAdapter: z.string().optional(),\n }).optional(),\n\n // === Permissions Defined ===\n permissions: z.object({\n definitions: z.array(z.object({\n key: z.string().regex(/^[a-z0-9_.]+$/, 'Permission key must be lowercase with dots/underscores'),\n description: z.string().optional(),\n })).optional(),\n required: z.array(z.string()).optional(),\n /**\n * Quick-select action groups for the permission configuration UI.\n * Keyed by CASL subject name. Each subject can have multiple groups,\n * and groups may overlap (same action in multiple groups).\n *\n * @example\n * ```json\n * {\n * \"Article\": [\n * { \"key\": \"editor\", \"label\": \"Editor\", \"actions\": [\"create\", \"update\"] },\n * { \"key\": \"full\", \"label\": \"Full Access\", \"actions\": [\"create\", \"update\", \"delete\", \"publish\"] }\n * ]\n * }\n * ```\n */\n actionGroups: z.record(\n z.string(), // subject name\n z.array(z.object({\n key: z.string().min(1),\n label: z.string().min(1),\n actions: z.array(z.string().min(1)).min(1),\n })),\n ).optional(),\n }).optional(),\n\n // === Server Entry ===\n server: z.object({\n /** Override for plugins that do not use ./dist/server/index.js. */\n entry: z.string().min(1).optional(),\n }).strict().optional(),\n\n // === Admin UI Entry ===\n admin: z.object({\n remoteEntry: z.string(), // e.g., \"./dist/admin/remoteEntry.js\"\n devRemoteEntry: z.string().optional(), // Dev mode: e.g., \"http://localhost:3010/remoteEntry.js\"\n moduleName: z.string().optional(), // MF2.0 module name\n exposes: z.record(z.string(), z.string()).optional(),\n extensions: z.array(adminExtensionSchema).optional(),\n slots: z.array(adminSlotSchema).optional(),\n tours: z.array(adminTourSchema).optional(),\n /** @deprecated Use slots instead. */\n extensionSlots: z.array(adminSlotSchema).optional(),\n /** @deprecated Use extensions[] instead */\n menus: z.array(z.object({\n label: z.string(),\n icon: z.string().optional(),\n path: z.string(),\n order: z.number().optional(),\n parentId: z.string().optional(),\n permission: permissionDeclarationSchema.optional(),\n /** @deprecated Use permission instead. */\n requiredPermission: z.string().optional(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n })).optional(),\n }).optional(),\n\n // === Web UI Entry ===\n web: webSurfaceSchema.optional(),\n\n // === Dependencies ===\n dependencies: z.array(z.string()).optional(), // Other plugin IDs\n conflicts: z.array(z.string()).optional(), // Conflicting plugin IDs\n peerDependencies: z.record(z.string(), z.string()).optional(), // e.g., { react: \"^18.0.0\" }\n compatibilityMode: z.enum(['strict', 'lenient', 'fallback']).optional(),\n\n // === Entity Extensions ===\n extends: z.record(extensionTargetPluginIdSchema, entityExtensionSchema).optional(),\n uses: pluginUsesSchema.optional(),\n\n // === Data Retention ===\n dataRetention: z.object({\n onDisable: z.enum(['retain']).optional(),\n onUninstall: z.enum(['delete', 'archive', 'retain']).optional(),\n tables: z.array(z.string()).optional(),\n }).optional(),\n\n // === Infrastructure (Tenant Config Delegation) ===\n infrastructure: z.object({\n tenantOverride: z.boolean(),\n riskLevel: z.enum(['high', 'medium', 'low']),\n sensitiveFields: z.array(z.string()).default([]),\n }).optional(),\n\n // === Notifications ===\n notifications: notificationsConfigSchema,\n}).superRefine((manifest, ctx) => {\n const declaresThemeCapability = manifest.capabilities?.ui?.webTheme === true;\n const hasPresentation = manifest.web?.presentation !== undefined;\n if (declaresThemeCapability && !hasPresentation) {\n ctx.addIssue({\n code: 'custom',\n path: ['web', 'presentation'],\n message: 'capabilities.ui.webTheme requires web.presentation',\n });\n }\n if (hasPresentation && !declaresThemeCapability) {\n ctx.addIssue({\n code: 'custom',\n path: ['capabilities', 'ui', 'webTheme'],\n message: 'web.presentation requires capabilities.ui.webTheme = true',\n });\n }\n const declaresPresentationPack = manifest.capabilities?.ui?.webPresentationPack === true;\n const hasStandaloneAdapters = (manifest.web?.adapters?.length ?? 0) > 0;\n if (declaresPresentationPack && !hasStandaloneAdapters) {\n ctx.addIssue({\n code: 'custom',\n path: ['web', 'adapters'],\n message: 'capabilities.ui.webPresentationPack requires web.adapters',\n });\n }\n if (hasStandaloneAdapters && !declaresPresentationPack) {\n ctx.addIssue({\n code: 'custom',\n path: ['capabilities', 'ui', 'webPresentationPack'],\n message: 'web.adapters requires capabilities.ui.webPresentationPack = true',\n });\n }\n});\n\nexport type PluginManifest = z.infer<typeof pluginManifestSchema>;\nexport type AdminSlotProp = z.infer<typeof adminSlotPropSchema>;\nexport type AdminSlot = z.infer<typeof adminSlotSchema>;\nexport type EntityExtensionFieldType = z.infer<typeof entityExtensionFieldTypeSchema>;\nexport type EntityExtensionField = z.infer<typeof entityExtensionFieldSchema>;\nexport type AutoCrudActionZone = z.infer<typeof autoCrudActionZoneSchema>;\nexport type AutoCrudAction = z.infer<typeof autoCrudActionSchema>;\nexport type AutoCrudActions = z.infer<typeof autoCrudActionsSchema>;\nexport type EntityExtensionCrudConfig = z.infer<typeof entityExtensionCrudConfigSchema>;\nexport type EntityExtensionSlot = z.infer<typeof entityExtensionSlotSchema>;\nexport type EntityExtension = z.infer<typeof entityExtensionSchema>;\nexport type EntityExtensionUse = z.infer<typeof entityExtensionUseSchema>;\nexport type WebSsrContractVersion = z.infer<typeof webSsrContractVersionSchema>;\nexport type WebPluginRoute = z.infer<typeof webPluginRouteSchema>;\nexport type WebExtensionTarget = z.infer<typeof webExtensionTargetSchema>;\nexport type WebExtensionQuery = z.infer<typeof webExtensionQuerySchema>;\nexport type WebExtension = z.infer<typeof webExtensionSchema>;\nexport type WebDesignBlock = z.infer<typeof webDesignBlockSchema>;\nexport type WebDesignSlot = z.infer<typeof webDesignSlotSchema>;\nexport type WebDesignTemplate = z.infer<typeof webDesignTemplateSchema>;\nexport type WebDesignDataSource = z.infer<typeof webDesignDataSourceSchema>;\nexport type WebDesignAction = z.infer<typeof webDesignActionSchema>;\nexport type WebDesignSurface = z.infer<typeof webDesignSurfaceSchema>;\nexport type WebSurface = z.infer<typeof webSurfaceSchema>;\n\n/**\n * Plugin Surface Type - Auto-generated from manifest configuration\n *\n * Indicates on which surfaces this plugin runs:\n * - 'server': Has server-side logic (backend API, database, queue jobs, etc.)\n * - 'admin': Has admin UI components (management dashboard)\n * - 'web': Has frontend/customer-facing UI (public website, user portal)\n */\nexport type PluginSurface = 'server' | 'admin' | 'web';\n\n/**\n * Get plugin surfaces from manifest\n *\n * Auto-generates surfaces array based on which sections are present.\n * Used by plugin marketplace for filtering and display.\n *\n * @param manifest - Plugin manifest\n * @returns Array of surfaces, e.g., ['server', 'admin']\n *\n * @example\n * // Full-stack plugin\n * getPluginSurfaces(manifest) // ['server', 'admin', 'web']\n *\n * // Backend-only plugin (e.g., LBAC, payment gateway)\n * getPluginSurfaces(manifest) // ['server']\n *\n * // Frontend-only plugin (e.g., theme, widget)\n * getPluginSurfaces(manifest) // ['admin', 'web']\n */\nexport function getPluginSurfaces(manifest: PluginManifest): PluginSurface[] {\n const surfaces: PluginSurface[] = [];\n\n if (manifest.server) {\n surfaces.push('server');\n }\n\n if (manifest.admin) {\n surfaces.push('admin');\n }\n\n if (manifest.web) {\n surfaces.push('web');\n }\n\n return surfaces;\n}\n\n/**\n * Check if plugin has specific surface\n *\n * @param manifest - Plugin manifest\n * @param surface - Surface to check\n * @returns true if plugin has this surface\n */\nexport function hasSurface(manifest: PluginManifest, surface: PluginSurface): boolean {\n return getPluginSurfaces(manifest).includes(surface);\n}\n\n/**\n * Get plugin type for backwards compatibility\n *\n * @deprecated Use getPluginSurfaces() instead for more granular control\n * @param manifest - Plugin manifest\n * @returns Plugin type classification\n */\nexport function getPluginType(manifest: PluginManifest): 'backend' | 'frontend' | 'full' {\n const surfaces = getPluginSurfaces(manifest);\n const hasServer = surfaces.includes('server');\n const hasUI = surfaces.includes('admin') || surfaces.includes('web');\n\n if (hasServer && hasUI) return 'full';\n if (hasServer) return 'backend';\n return 'frontend';\n}\n\n/**\n * Plugin Status - Runtime state of a plugin\n */\nexport type PluginStatus = 'enabled' | 'disabled' | 'crashed' | 'invalid' | 'archived' | 'uninstalled';\n\n/**\n * Plugin Capabilities - What the plugin declared it needs\n */\nexport interface PluginCapabilities {\n ui?: {\n adminPage?: boolean;\n webPage?: boolean;\n webTheme?: boolean;\n webPresentationPack?: boolean;\n webDesigner?: boolean;\n settingsTab?: boolean;\n };\n organizations?: {\n provision?: boolean;\n };\n}\n"],"mappings":"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","names":["z","z","z","z","z","z"]}
@@ -19,10 +19,6 @@ function allowsAnonymousAccess(meta) {
19
19
  }
20
20
  return false;
21
21
  }
22
- function hasHostExecutionSource(ctxRecord) {
23
- const sourcePluginId = ctxRecord["__hostExecutionSourcePluginId"];
24
- return ctxRecord["actorType"] === "plugin" && typeof sourcePluginId === "string";
25
- }
26
22
  function injectAnonymousRole(target) {
27
23
  const roles = Array.isArray(target["userRoles"]) ? [...target["userRoles"]] : [];
28
24
  if (!roles.includes(ANONYMOUS_ROLE)) {
@@ -48,19 +44,16 @@ var pluginProcedureBase = t.procedure.use(async (opts) => {
48
44
  const shouldEnforcePluginAccess = ctxRecord["__enforcePluginAccess"] === true;
49
45
  const isAnonymousRequest = !ctxRecord["userId"];
50
46
  if (shouldEnforcePluginAccess && isAnonymousRequest && !isTrustedSystemContext(ctxRecord)) {
51
- const hostExecutionAllowed = hasHostExecutionSource(ctxRecord);
52
- if (!hostExecutionAllowed && !allowsAnonymousAccess(opts.meta)) {
47
+ if (!allowsAnonymousAccess(opts.meta)) {
53
48
  throw new TRPCError({
54
49
  code: "UNAUTHORIZED",
55
50
  message: "Authentication required"
56
51
  });
57
52
  }
58
- if (!hostExecutionAllowed) {
59
- injectAnonymousRole(ctxRecord);
60
- const requestContextRef = ctxRecord["__requestContextRef"];
61
- if (requestContextRef && typeof requestContextRef === "object") {
62
- injectAnonymousRole(requestContextRef);
63
- }
53
+ injectAnonymousRole(ctxRecord);
54
+ const requestContextRef = ctxRecord["__requestContextRef"];
55
+ if (requestContextRef && typeof requestContextRef === "object") {
56
+ injectAnonymousRole(requestContextRef);
64
57
  }
65
58
  }
66
59
  const pluginProcedureMiddlewares = opts.ctx?.["__pluginProcedureMiddlewares"] ?? [];
@@ -137,6 +130,7 @@ function createPluginContext(partial) {
137
130
  plugins: partial.plugins,
138
131
  db: partial.db ?? defaultDb,
139
132
  organizationProvisioning: partial.organizationProvisioning,
133
+ organizationMembers: partial.organizationMembers,
140
134
  tx: partial.tx,
141
135
  settings: partial.settings ?? defaultSettings,
142
136
  currency: partial.currency,
@@ -160,4 +154,4 @@ export {
160
154
  pluginProcedure,
161
155
  createPluginContext
162
156
  };
163
- //# sourceMappingURL=chunk-DNM4FUUP.js.map
157
+ //# sourceMappingURL=chunk-V7IAPFUE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/trpc.ts"],"sourcesContent":["import { initTRPC, TRPCError } from \"@trpc/server\";\nimport type { PluginContext, PluginPermissionCapability, PluginScopedDb, PluginSettingsCapability } from \"./types\";\n\n/**\n * tRPC builders for plugins\n *\n * Plugins use these to define their API routes, just like a normal tRPC project.\n */\nconst t = initTRPC.context<PluginContext>().meta<Record<string, unknown>>().create();\n\nconst ANONYMOUS_ROLE = \"anonymous\";\n\nfunction allowsAnonymousAccess(meta: unknown): boolean {\n if (!meta || typeof meta !== \"object\") return false;\n\n const metaRecord = meta as Record<string, unknown>;\n const permission = metaRecord[\"permission\"];\n if (permission && typeof permission === \"object\") {\n const permissionRecord = permission as Record<string, unknown>;\n if (permissionRecord[\"anonymous\"] === true) return true;\n }\n\n if (metaRecord[\"anonymous\"] === true) return true;\n\n const access = metaRecord[\"access\"];\n if (access === \"anonymous\") return true;\n\n if (access && typeof access === \"object\") {\n const accessRecord = access as Record<string, unknown>;\n return (\n accessRecord[\"anonymous\"] === true ||\n accessRecord[\"allowAnonymous\"] === true ||\n accessRecord[\"mode\"] === \"anonymous\"\n );\n }\n\n return false;\n}\n\nfunction injectAnonymousRole(target: Record<string, unknown>) {\n const roles = Array.isArray(target[\"userRoles\"]) ? [...(target[\"userRoles\"] as string[])] : [];\n if (!roles.includes(ANONYMOUS_ROLE)) {\n roles.push(ANONYMOUS_ROLE);\n }\n target[\"userRoles\"] = roles;\n if (!target[\"userRole\"]) {\n target[\"userRole\"] = ANONYMOUS_ROLE;\n }\n}\n\nfunction isTrustedSystemContext(ctxRecord: Record<string, unknown>): boolean {\n if (ctxRecord[\"isSystemContext\"] === true || ctxRecord[\"actorType\"] === \"system\") {\n return true;\n }\n\n if (ctxRecord[\"invoker\"] === \"scheduler\") {\n return true;\n }\n\n const principal = ctxRecord[\"principal\"];\n return (\n principal !== null &&\n typeof principal === \"object\" &&\n (principal as Record<string, unknown>)[\"kind\"] === \"system\"\n );\n}\n\ntype PluginProcedureMiddleware = (opts: any) => Promise<any>;\n\nconst pluginProcedureBase = t.procedure.use(async (opts) => {\n const ctxRecord = (opts.ctx as Record<string, unknown> | undefined) ?? {};\n const shouldEnforcePluginAccess = ctxRecord[\"__enforcePluginAccess\"] === true;\n const isAnonymousRequest = !ctxRecord[\"userId\"];\n\n if (shouldEnforcePluginAccess && isAnonymousRequest && !isTrustedSystemContext(ctxRecord)) {\n if (!allowsAnonymousAccess(opts.meta)) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Authentication required\",\n });\n }\n\n injectAnonymousRole(ctxRecord);\n\n const requestContextRef = ctxRecord[\"__requestContextRef\"];\n if (requestContextRef && typeof requestContextRef === \"object\") {\n injectAnonymousRole(requestContextRef as Record<string, unknown>);\n }\n }\n\n const pluginProcedureMiddlewares = ((opts.ctx as Record<string, unknown> | undefined)?.[\n \"__pluginProcedureMiddlewares\"\n ] ?? []) as PluginProcedureMiddleware[];\n\n const run = (index: number, accumulatedOverrides: Record<string, unknown>) => {\n if (index >= pluginProcedureMiddlewares.length) {\n return opts.next(accumulatedOverrides as any);\n }\n\n const middleware = pluginProcedureMiddlewares[index]!;\n return middleware({\n ...opts,\n ...accumulatedOverrides,\n next: (nextOverrides?: Record<string, unknown>) =>\n run(index + 1, {\n ...accumulatedOverrides,\n ...(nextOverrides ?? {}),\n }),\n });\n };\n\n return run(0, {});\n});\n\n/**\n * Plugin router builder\n *\n * @example\n * ```ts\n * import { pluginRouter, pluginProcedure } from '@wordrhyme/plugin';\n *\n * export const router = pluginRouter({\n * hello: pluginProcedure.query(() => 'Hello from plugin!'),\n * });\n * ```\n */\nexport const pluginRouter = t.router;\n\n/**\n * Plugin procedure builder (with context)\n *\n * Use this to define procedures that have access to PluginContext.\n */\nexport const pluginProcedure = pluginProcedureBase;\n\n/**\n * Default no-op permission capability (for standalone plugin development)\n */\nconst defaultPermissions: PluginPermissionCapability = {\n can: async () => false,\n require: async () => {\n throw new Error(\"Permission capability not available\");\n },\n hasDeclared: () => false,\n};\n\n/**\n * Default no-op settings capability (for standalone plugin development)\n */\nconst defaultSettings: PluginSettingsCapability = {\n get: async () => null,\n has: async () => false,\n set: async () => {\n throw new Error(\"Settings capability not available\");\n },\n delete: async () => {\n throw new Error(\"Settings capability not available\");\n },\n list: async () => [],\n isFeatureEnabled: async () => false,\n};\n\nconst defaultDb = new Proxy({} as PluginScopedDb, {\n get() {\n throw new Error(\"Database capability not available in this standalone plugin context\");\n },\n});\n\n/**\n * Create plugin context (used by Core to inject context)\n *\n * This is called by PluginManager when invoking plugin handlers.\n */\nexport function createPluginContext(partial: Partial<PluginContext> & { pluginId: string }): PluginContext {\n return {\n pluginId: partial.pluginId,\n organizationId: partial.organizationId,\n originalOrganizationId: partial.originalOrganizationId,\n userId: partial.userId,\n user: partial.user,\n requestId: partial.requestId,\n userRole: partial.userRole,\n userRoles: partial.userRoles,\n currentTeamId: partial.currentTeamId,\n locale: partial.locale,\n timezone: partial.timezone,\n clientTimeZone: partial.clientTimeZone,\n resolveDateRange: partial.resolveDateRange,\n actorType: partial.actorType,\n apiTokenId: partial.apiTokenId,\n apiTokenScopes: partial.apiTokenScopes,\n isSystemContext: partial.isSystemContext,\n principal: partial.principal,\n invoker: partial.invoker,\n logger: partial.logger ?? {\n info: (msg, meta) => console.log(`[${partial.pluginId}]`, msg, meta),\n warn: (msg, meta) => console.warn(`[${partial.pluginId}]`, msg, meta),\n error: (msg, meta) => console.error(`[${partial.pluginId}]`, msg, meta),\n debug: (msg, meta) => console.debug(`[${partial.pluginId}]`, msg, meta),\n },\n permissions: partial.permissions ?? defaultPermissions,\n plugins: partial.plugins,\n db: partial.db ?? defaultDb,\n organizationProvisioning: partial.organizationProvisioning,\n organizationMembers: partial.organizationMembers,\n tx: partial.tx,\n settings: partial.settings ?? defaultSettings,\n currency: partial.currency,\n hooks: partial.hooks,\n metrics: partial.metrics,\n trace: partial.trace,\n media: partial.media,\n storage: partial.storage,\n notifications: partial.notifications,\n queue: partial.queue,\n usage: partial.usage,\n entityExtensions: partial.entityExtensions,\n crudExtensions: partial.crudExtensions,\n ai: partial.ai,\n aiRuntime: partial.aiRuntime,\n };\n}\n\n// Re-export tRPC types for convenience\nexport type { inferRouterInputs, inferRouterOutputs } from \"@trpc/server\";\n"],"mappings":"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","names":[]}