@wordrhyme/plugin 0.1.0-alpha.5 → 0.1.0-alpha.6

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.
@@ -109,6 +109,14 @@ interface PluginContext {
109
109
  crudExtensions?: PluginCrudExtensionsCapability | undefined;
110
110
  /** Public web surface capability injected for plugin-owned web route handlers. */
111
111
  web?: PluginWebCapability | undefined;
112
+ /** Agent runtime capability; injected only for plugins declaring `capabilities.agent.runtime`. */
113
+ agent?: PluginAgentCapability | undefined;
114
+ /** Governed action invoker; injected only for plugins declaring `capabilities.agent.invoker`. */
115
+ actions?: PluginActionInvokerCapability | undefined;
116
+ /** Governed AI generation; available to plugins and resolved through the official Runtime. */
117
+ ai?: PluginAiCapability | undefined;
118
+ /** Host registration boundary; injected only for the declared official AI Runtime provider. */
119
+ aiRuntime?: PluginAiRuntimeCapability | undefined;
112
120
  }
113
121
  /**
114
122
  * Public SDK shape for the Host-provided Drizzle-compatible database.
@@ -396,6 +404,210 @@ interface PluginPermissionCheckContext {
396
404
  apiTokenScopes?: string[] | undefined;
397
405
  }
398
406
  type PluginApisCapability = Record<string, any>;
407
+ /** A tool statically declared by a plugin manifest and reconciled into the Core agent tool registry. */
408
+ interface AgentToolDescriptor {
409
+ /** Tool id as declared in the manifest (unique within the plugin). */
410
+ id: string;
411
+ /** Declaring plugin id (reverse-domain). */
412
+ pluginId: string;
413
+ title: string;
414
+ summary?: string | undefined;
415
+ }
416
+ /**
417
+ * Read surface over the Core agent tool registry.
418
+ * Injected only for plugins with `capabilities.agent.runtime === true`.
419
+ * Listing is declaration-scoped: only tools from loaded plugins appear, and
420
+ * tenant-disabled contributors are filtered when an organization is in scope.
421
+ */
422
+ interface PluginAgentCapability {
423
+ listTools(): Promise<AgentToolDescriptor[]>;
424
+ }
425
+ interface AiUsage {
426
+ inputTokens: number;
427
+ outputTokens: number;
428
+ totalTokens: number;
429
+ costUsd: number;
430
+ }
431
+ interface AiBudget {
432
+ /** Per-request ceiling supplied by the caller; the effective deployment may lower it. */
433
+ maxCostUsd?: number | undefined;
434
+ maxOutputTokens?: number | undefined;
435
+ }
436
+ interface AiModelHint {
437
+ provider: string;
438
+ model: string;
439
+ }
440
+ interface AiTextRequest {
441
+ prompt: string;
442
+ system?: string | undefined;
443
+ /** Optional plugin-local alias declared in the manifest for administrator binding. */
444
+ alias?: string | undefined;
445
+ /** Explicit deployment selected from listModels(). */
446
+ model?: string | undefined;
447
+ /** Revision returned with the explicit model selection. */
448
+ revision?: string | undefined;
449
+ /** Developer fallback hint; the effective policy default wins when unavailable. */
450
+ defaultModel?: AiModelHint | undefined;
451
+ budget?: AiBudget | undefined;
452
+ signal?: AbortSignal | undefined;
453
+ }
454
+ interface AiTextResult {
455
+ text: string;
456
+ provider: string;
457
+ model: string;
458
+ responseModel?: string | undefined;
459
+ modelId: string;
460
+ revision: string;
461
+ alias?: string | undefined;
462
+ usage: AiUsage;
463
+ }
464
+ /** Structural on purpose: Zod and other validators can be passed without coupling the SDK to one library. */
465
+ interface AiObjectSchema<T> {
466
+ parse(value: unknown): T;
467
+ }
468
+ interface AiObjectRequest<T> extends AiTextRequest {
469
+ schema: AiObjectSchema<T>;
470
+ }
471
+ interface AiObjectResult<T> {
472
+ object: T;
473
+ provider: string;
474
+ model: string;
475
+ responseModel?: string | undefined;
476
+ modelId: string;
477
+ revision: string;
478
+ alias?: string | undefined;
479
+ usage: AiUsage;
480
+ }
481
+ interface AiModelOption {
482
+ id: string;
483
+ name: string;
484
+ provider: string;
485
+ model: string;
486
+ reasoning: boolean;
487
+ input: Array<'text' | 'image'>;
488
+ contextWindow: number;
489
+ maxOutputTokens: number;
490
+ }
491
+ interface AiModelCatalog {
492
+ revision: string;
493
+ defaultModel: string | null;
494
+ models: AiModelOption[];
495
+ }
496
+ interface AiModelListRequest {
497
+ alias?: string | undefined;
498
+ }
499
+ type AiStreamEvent = {
500
+ type: 'text-delta';
501
+ delta: string;
502
+ } | {
503
+ type: 'usage';
504
+ usage: AiUsage;
505
+ provider: string;
506
+ model: string;
507
+ responseModel?: string | undefined;
508
+ modelId: string;
509
+ revision: string;
510
+ alias?: string | undefined;
511
+ } | {
512
+ type: 'done';
513
+ };
514
+ interface PluginAiCapability {
515
+ listModels(request?: AiModelListRequest): Promise<AiModelCatalog>;
516
+ generateText(request: AiTextRequest): Promise<AiTextResult>;
517
+ generateObject<T>(request: AiObjectRequest<T>): Promise<AiObjectResult<T>>;
518
+ stream(request: AiTextRequest): AsyncIterable<AiStreamEvent>;
519
+ }
520
+ interface AiRuntimeInvocation {
521
+ invocationId: string;
522
+ organizationId: string;
523
+ userId: string;
524
+ pluginId: string;
525
+ alias?: string | undefined;
526
+ }
527
+ interface AiUsageAuthorization {
528
+ units: number;
529
+ deploymentId: string;
530
+ revision: string;
531
+ alias?: string | undefined;
532
+ provider: string;
533
+ model: string;
534
+ estimatedCostUsd: number;
535
+ }
536
+ interface AiUsageObservation {
537
+ status: 'succeeded' | 'failed' | 'aborted';
538
+ deploymentId: string;
539
+ revision: string;
540
+ alias?: string | undefined;
541
+ provider: string;
542
+ model: string;
543
+ responseModel?: string | undefined;
544
+ usage?: AiUsage | undefined;
545
+ errorCode?: string | undefined;
546
+ }
547
+ /** Narrow Host services offered to the AI Runtime handler at invocation time. */
548
+ interface AiRuntimeHost {
549
+ getSetting<T = unknown>(key: string): Promise<T | null>;
550
+ getSecret<T = unknown>(key: string): Promise<T>;
551
+ authorizeUsage(input: AiUsageAuthorization): Promise<void>;
552
+ recordUsage(input: AiUsageObservation): Promise<void>;
553
+ }
554
+ interface AiRuntimeHandler {
555
+ listModels(invocation: AiRuntimeInvocation, request: AiModelListRequest, host: AiRuntimeHost): Promise<AiModelCatalog>;
556
+ generateText(invocation: AiRuntimeInvocation, request: AiTextRequest, host: AiRuntimeHost): Promise<AiTextResult>;
557
+ generateObject<T>(invocation: AiRuntimeInvocation, request: AiObjectRequest<T>, host: AiRuntimeHost): Promise<AiObjectResult<T>>;
558
+ stream(invocation: AiRuntimeInvocation, request: AiTextRequest, host: AiRuntimeHost): AsyncIterable<AiStreamEvent>;
559
+ }
560
+ interface PluginAiRuntimeCapability {
561
+ register(handler: AiRuntimeHandler): () => void;
562
+ listAliases(): Promise<AiAliasDescriptor[]>;
563
+ }
564
+ interface AiAliasDescriptor {
565
+ id: string;
566
+ pluginId: string;
567
+ alias: string;
568
+ name: string;
569
+ description?: string | undefined;
570
+ }
571
+ /**
572
+ * Action Contract declared on a tRPC procedure via `.meta({ action: {...} })`.
573
+ * `actionId` is a stable identifier decoupled from the procedure path
574
+ * (renames are a rebinding, detected by drift tooling — plan decision 10).
575
+ */
576
+ interface ActionContractMeta {
577
+ /** Stable id, lowercase dot-separated (e.g. "spike-studio.greeting.create"). */
578
+ actionId: string;
579
+ /** Contract revision; approval tokens and callers bind to it. */
580
+ revision: number;
581
+ kind: "query" | "command";
582
+ risk: "low" | "medium" | "high";
583
+ summary?: string | undefined;
584
+ }
585
+ /** Catalog entry exposed to invoker plugins. Procedure paths are not exposed. */
586
+ interface ActionDescriptor extends ActionContractMeta {
587
+ /** Owning plugin id, or null for core-owned actions. */
588
+ pluginId: string | null;
589
+ permission: {
590
+ action: string;
591
+ subject: string;
592
+ };
593
+ }
594
+ interface ActionInvokeRequest {
595
+ actionId: string;
596
+ revision: number;
597
+ args?: unknown;
598
+ /** Required for actions the contract marks `risk: 'high'`. */
599
+ approvalToken?: string;
600
+ }
601
+ /**
602
+ * Governed action invocation surface (AI Action Gateway, Phase 0 spike).
603
+ * Injected only for plugins with `capabilities.agent.invoker === true`.
604
+ * The Host resolves `actionId` to a procedure binding itself — callers never
605
+ * choose paths — and derives principal identity from the live request context.
606
+ */
607
+ interface PluginActionInvokerCapability {
608
+ list(): Promise<ActionDescriptor[]>;
609
+ invoke(request: ActionInvokeRequest): Promise<unknown>;
610
+ }
399
611
  type EAuthModel = "oauth_refresh" | "api_key" | "hmac" | "token" | "amazon_spapi";
400
612
  type EAuthStatus = "ok" | "reauth" | "retry";
401
613
  type EAuthUse = "products" | "orders" | "fulfillment" | "test" | string;
@@ -880,6 +1092,14 @@ interface PluginSettingsCapability {
880
1092
  * @returns The setting value or default
881
1093
  */
882
1094
  get<T = unknown>(key: string, defaultValue?: T): Promise<T | null>;
1095
+ /**
1096
+ * Check whether an exact scoped setting exists without reading its value.
1097
+ * Use encrypted=true for credential status probes that must not decrypt secrets.
1098
+ */
1099
+ has(key: string, options?: {
1100
+ global?: boolean;
1101
+ encrypted?: boolean;
1102
+ }): Promise<boolean>;
883
1103
  /**
884
1104
  * Set a setting value
885
1105
  *
@@ -1596,4 +1816,4 @@ type ApiPayload<T> = {
1596
1816
  [K in keyof T]: T[K] extends Date ? string : T[K] extends Date | null ? string | null : T[K] extends Date | undefined ? string | undefined : T[K];
1597
1817
  };
1598
1818
 
1599
- export { type PluginMetricsAllowedLabels as $, type ApiPayload as A, type PluginAssetCreateOptions as B, type PluginAssetInfo as C, type PluginAssetQuery as D, type EAuthModel as E, type PluginAssetUpdateData as F, type PluginAssetVariant as G, type HookContext as H, type PluginCurrencyCapability as I, type PluginEAuthCapability as J, type PluginEntityExtensionCapability as K, type PluginEntityExtensionFilter as L, MARKETPLACE_PUBLISH_AUTH_METHODS as M, type PluginFileCapability as N, type OpaquePublisherCandidateV1 as O, type PluginMediaInfo as P, type PluginFileInfo as Q, type PluginFileQuery as R, type PluginFileUploadInput as S, type PluginHookCapability as T, type PluginJobOptions as U, type PluginJobStatus as V, type PluginMediaCapability as W, type PluginMediaQuery as X, type PluginMediaUpdateData as Y, type PluginMediaUploadInput as Z, type PluginMediaVariant as _, type PluginContext as a, type PluginMetricsCapability as a0, type PluginNotificationActor as a1, type PluginNotificationCapability as a2, type PluginNotificationChannel as a3, type PluginNotificationEvent as a4, type PluginNotificationInput as a5, type PluginNotificationResult as a6, type PluginNotificationSendParams as a7, type PluginNotificationSendResult as a8, type PluginNotificationTarget as a9, type WebPluginSiteInfo as aA, type WebPluginTenantInfo as aB, type WebSlotExtensionQuery as aC, type WebSlotQueryResult as aD, type WebSlotRemoteExtension as aE, type WebSlotRenderOptions as aF, type WebSlotRenderRequest as aG, type WebSlotRenderResult as aH, type WebSlotRenderer as aI, type PluginNotificationTemplate as aa, type PluginOrganizationProvisioningCapability as ab, type PluginPaginatedResult as ac, type PluginPermissionCapability as ad, type PluginPermissionCheckContext as ae, type PluginPermissionDef as af, type PluginQueueCapability as ag, type PluginScopedDb as ah, type PluginSettingEntry as ai, type PluginSettingOptions as aj, type PluginSettingsCapability as ak, type PluginStorageCapability as al, type PluginStorageProvider as am, type PluginStorageProviderConfig as an, type PluginStorageProviderInfo as ao, type PluginStorageUploadInput as ap, type PluginStorageUploadResult as aq, type PluginTraceCapability as ar, type PluginUsageCapability as as, type PluginWebCapability as at, type ReadonlyPluginScopedDb as au, type WebPluginHead as av, type WebPluginHeadLink as aw, type WebPluginRouteHandler as ax, type WebPluginRouteRequest as ay, type WebPluginRouteResult as az, type HookHandlerOptions as b, type PluginLogger as c, type EAuthProvider as d, type EAuthRefreshInput as e, type EAuthRefreshResult as f, type EAuthStatus as g, type EAuthTokenResult as h, type EAuthUpsertInput as i, type EAuthUse as j, HookAbortError as k, type HookEmitOptions as l, HookPriority as m, type HookTransaction as n, type MarketplaceAttestationTargetV1 as o, type MarketplaceExecutionErrorCode as p, type MarketplaceExecutionFailureCode as q, type MarketplaceOrganizationExecutionV1 as r, type MarketplacePlatformReadAction as s, type MarketplacePublishActor as t, type MarketplacePublishAuthMethod as u, type MarketplacePublisherAction as v, type MarketplaceRegistrySigningCapability as w, type PluginApisCapability as x, type PluginArtifactCapability as y, type PluginAssetCapability as z };
1819
+ export { type PluginAgentCapability as $, type ActionContractMeta as A, type EAuthProvider as B, type EAuthRefreshInput as C, type EAuthRefreshResult as D, type EAuthModel as E, type EAuthStatus as F, type EAuthTokenResult as G, type HookContext as H, type EAuthUpsertInput as I, type EAuthUse as J, HookAbortError as K, type HookEmitOptions as L, HookPriority as M, MARKETPLACE_PUBLISH_AUTH_METHODS as N, type MarketplaceAttestationTargetV1 as O, type PluginMediaInfo as P, type MarketplaceExecutionErrorCode as Q, type MarketplaceExecutionFailureCode as R, type MarketplaceOrganizationExecutionV1 as S, type MarketplacePlatformReadAction as T, type MarketplacePublishActor as U, type MarketplacePublishAuthMethod as V, type WebPluginSiteInfo as W, type MarketplacePublisherAction as X, type MarketplaceRegistrySigningCapability as Y, type OpaquePublisherCandidateV1 as Z, type PluginActionInvokerCapability as _, type PluginContext as a, type WebPluginTenantInfo as a$, type PluginAiCapability as a0, type PluginAiRuntimeCapability as a1, type PluginApisCapability as a2, type PluginArtifactCapability as a3, type PluginAssetCapability as a4, type PluginAssetCreateOptions as a5, type PluginAssetInfo as a6, type PluginAssetQuery as a7, type PluginAssetUpdateData as a8, type PluginAssetVariant as a9, type PluginNotificationTarget as aA, type PluginNotificationTemplate as aB, type PluginOrganizationProvisioningCapability as aC, type PluginPaginatedResult as aD, type PluginPermissionCapability as aE, type PluginPermissionCheckContext as aF, type PluginPermissionDef as aG, type PluginQueueCapability as aH, type PluginScopedDb as aI, type PluginSettingEntry as aJ, type PluginSettingOptions as aK, type PluginSettingsCapability as aL, type PluginStorageCapability as aM, type PluginStorageProvider as aN, type PluginStorageProviderConfig as aO, type PluginStorageProviderInfo as aP, type PluginStorageUploadInput as aQ, type PluginStorageUploadResult as aR, type PluginTraceCapability as aS, type PluginUsageCapability as aT, type PluginWebCapability as aU, type ReadonlyPluginScopedDb as aV, type WebPluginHead as aW, type WebPluginHeadLink as aX, type WebPluginRouteHandler as aY, type WebPluginRouteRequest as aZ, type WebPluginRouteResult as a_, type PluginCurrencyCapability as aa, type PluginEAuthCapability as ab, type PluginEntityExtensionCapability as ac, type PluginEntityExtensionFilter as ad, type PluginFileCapability as ae, type PluginFileInfo as af, type PluginFileQuery as ag, type PluginFileUploadInput as ah, type PluginHookCapability as ai, type PluginJobOptions as aj, type PluginJobStatus as ak, type PluginMediaCapability as al, type PluginMediaQuery as am, type PluginMediaUpdateData as an, type PluginMediaUploadInput as ao, type PluginMediaVariant as ap, type PluginMetricsAllowedLabels as aq, type PluginMetricsCapability as ar, type PluginNotificationActor as as, type PluginNotificationCapability as at, type PluginNotificationChannel as au, type PluginNotificationEvent as av, type PluginNotificationInput as aw, type PluginNotificationResult as ax, type PluginNotificationSendParams as ay, type PluginNotificationSendResult as az, type HookHandlerOptions as b, type WebSlotExtensionQuery as b0, type WebSlotQueryResult as b1, type WebSlotRemoteExtension as b2, type WebSlotRenderOptions as b3, type WebSlotRenderRequest as b4, type WebSlotRenderResult as b5, type WebSlotRenderer as b6, type HookTransaction as c, type PluginLogger as d, type ActionDescriptor as e, type ActionInvokeRequest as f, type AgentToolDescriptor as g, type AiAliasDescriptor as h, type AiBudget as i, type AiModelCatalog as j, type AiModelHint as k, type AiModelListRequest as l, type AiModelOption as m, type AiObjectRequest as n, type AiObjectResult as o, type AiObjectSchema as p, type AiRuntimeHandler as q, type AiRuntimeHost as r, type AiRuntimeInvocation as s, type AiStreamEvent as t, type AiTextRequest as u, type AiTextResult as v, type AiUsage as w, type AiUsageAuthorization as x, type AiUsageObservation as y, type ApiPayload as z };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordrhyme/plugin",
3
- "version": "0.1.0-alpha.5",
3
+ "version": "0.1.0-alpha.6",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/manifest.ts"],"sourcesContent":["import { z } from 'zod';\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 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 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 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\nexport const pluginI18nSchema = z.record(\n z.string().min(1),\n z.record(z.string().min(1), z.string())\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 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 slots: z.array(webDesignSlotSchema).optional(),\n templates: z.array(webDesignTemplateSchema).optional(),\n dataSources: z.array(webDesignDataSourceSchema).optional(),\n actions: z.array(webDesignActionSchema).optional(),\n}).superRefine((design, ctx) => {\n const hasDesignSurface = Boolean(\n design.blocks?.length\n || design.slots?.length\n || design.templates?.length\n || design.dataSources?.length\n || design.actions?.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\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 /** @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 usesSsrSurface = Boolean(\n web.ssrContractVersion\n || web.serverEntry\n || web.clientEntry\n || hasRoutes\n );\n const usesRemoteSurface = Boolean(\n web.remoteEntry\n || web.devRemoteEntry\n || web.moduleName\n || web.exposes\n || hasExtensions\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 && !web.serverEntry) {\n ctx.addIssue({\n code: 'custom',\n path: ['serverEntry'],\n message: 'web.serverEntry is required for SSR web surface',\n });\n }\n if (hasRoutes && !web.clientEntry) {\n ctx.addIssue({\n code: 'custom',\n path: ['clientEntry'],\n message: 'web.clientEntry is required for SSR web surface',\n });\n }\n if (hasExtensions && !web.remoteEntry) {\n ctx.addIssue({\n code: 'custom',\n path: ['remoteEntry'],\n message: 'web.remoteEntry is required when web.extensions are declared',\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\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 webDesigner: z.boolean().optional(),\n settingsTab: z.boolean().optional(),\n }).optional(),\n storage: z.object({\n provider: z.boolean().optional(),\n }).optional(),\n artifacts: z.object({\n write: 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 entry: z.string(), // e.g., \"./dist/server/index.js\"\n router: z.boolean().optional(), // Exports tRPC router\n nestModule: z.string().optional(), // NestJS module for advanced plugins, e.g., \"./dist/server/hello.module.js\"\n fastifyRoutes: z.string().optional(), // Fastify route registrar, e.g., \"./dist/server/http/routes.js\"\n publicServices: z.array(z.object({\n name: z.string().min(1).max(80).regex(/^[a-z0-9-]+$/),\n mountPath: z.string().regex(/^\\/api\\/[a-z0-9/-]+$/),\n methods: z.array(z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE'])).min(1),\n auth: z.enum(['public', 'bearer', 'session', 'user']).default('public'),\n maxBodyBytes: z.number().int().positive().max(100 * 1024 * 1024).default(1024 * 1024),\n })).optional(),\n trustedApiTokenProxy: z.object({\n invoker: z.string().min(1),\n paths: z.array(z.string().min(1)).min(1),\n }).optional(),\n hooks: z.array(z.enum(['onInstall', 'onEnable', 'onDisable', 'onUninstall'])).optional(),\n }).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});\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 webDesigner?: boolean;\n settingsTab?: boolean;\n };\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
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 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 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 };\n}\n\n// Re-export tRPC types for convenience\nexport type { inferRouterInputs, inferRouterOutputs } from \"@trpc/server\";\n"],"mappings":"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","names":[]}