@salesforce/vite-plugin-lwc-ui-bundle 10.7.0 → 10.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -58,6 +58,16 @@ const GRAPHQL_TOOL = "graphqlQuery";
58
58
  function isStateManagerSpecifier(moduleAdapters) {
59
59
  return Object.values(moduleAdapters).some((entry) => entry.type === "state-manager");
60
60
  }
61
+ const STATE_MANAGER_FLAG_PROLOGUE_BODY = [
62
+ `if (!lwcRuntimeFlags.ENABLE_EXPERIMENTAL_SIGNALS) {`,
63
+ ` setFeatureFlag("ENABLE_EXPERIMENTAL_SIGNALS", true);`,
64
+ `}`
65
+ ].join("\n");
66
+ const STATE_MANAGER_FLAG_PROLOGUE = [
67
+ `import { setFeatureFlag } from "lwc";`,
68
+ `import { lwcRuntimeFlags } from "@lwc/features";`,
69
+ STATE_MANAGER_FLAG_PROLOGUE_BODY
70
+ ].join("\n");
61
71
  function isGraphqlStateManagerSpecifier(specifier) {
62
72
  return specifier === "lightning/stateManagerGraphQL";
63
73
  }
@@ -65,6 +75,7 @@ function buildStateManagerCompositionBody(name, cfg, specifier) {
65
75
  if (isGraphqlStateManagerSpecifier(specifier)) {
66
76
  const graphqlCfg = { mcp: { toolName: cfg.mcp?.toolName } };
67
77
  return [
78
+ STATE_MANAGER_FLAG_PROLOGUE,
68
79
  `import { ${cfg.factoryName} } from ${JSON.stringify(cfg.factoryModule)};`,
69
80
  `const __getCommand_${name} = createGraphqlStateManagerCommand(${JSON.stringify(name)}, ${JSON.stringify(graphqlCfg)});`,
70
81
  `export default ${cfg.factoryName}(__getCommand_${name});`
@@ -77,6 +88,7 @@ function buildStateManagerCompositionBody(name, cfg, specifier) {
77
88
  configJsonSchema: cfg.configJsonSchema
78
89
  };
79
90
  return [
91
+ STATE_MANAGER_FLAG_PROLOGUE,
80
92
  `import { ${cfg.factoryName} } from ${JSON.stringify(cfg.factoryModule)};`,
81
93
  `const __cfg_${name} = ${JSON.stringify(synthesizedCfg)};`,
82
94
  `const __imperativeAdapter_${name} = createReadAdapter(${JSON.stringify(name)}, __cfg_${name});`,
@@ -163,7 +175,7 @@ const DEFAULT_REGISTRY = {
163
175
  },
164
176
  // `lightning/stateManagerGraphQL` — externalized graphql state manager.
165
177
  // The load hook imports `createSmGraphQL` from the upstream
166
- // `@salesforce/lds-adapters-onestore-graphql/factory` barrel — a thin
178
+ // `@salesforce/state-managers-uiapi/factory` barrel — a thin
167
179
  // per-state-manager wrapper around `createStateManager` that bakes in
168
180
  // the required (`['query']`) / optional (`['variables', 'operationName']`)
169
181
  // config keys, mirroring `createSmRecord` / `createSmObjectInfo`. The
@@ -183,7 +195,7 @@ const DEFAULT_REGISTRY = {
183
195
  "lightning/stateManagerGraphQL": {
184
196
  default: {
185
197
  type: "state-manager",
186
- factoryModule: "@salesforce/lds-adapters-onestore-graphql/factory",
198
+ factoryModule: "@salesforce/state-managers-uiapi/factory",
187
199
  factoryName: "createSmGraphQL",
188
200
  mcp: { toolName: GRAPHQL_TOOL }
189
201
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/providers/lds/adapters.ts","../../../src/providers/lds/common-mcp-tooling.ts","../../../src/providers/lds/state-managers.ts","../../../src/providers/lds/util.ts","../../../src/providers/lds/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type {\n\tLdsRegistryEntry,\n\tLdsRegistryEntryBase,\n\tLdsSchemaValidatedEntry,\n} from \"./common-mcp-tooling\";\nimport type { ReadInvokerShape } from \"./types\";\n\n// ─── Wire + imperative adapter configs ───────────────────────────────────────\n\nexport interface LdsWireAdapterConfig extends LdsSchemaValidatedEntry {\n\ttype: \"wire\";\n}\n\n/**\n * Imperative **mutation** adapter. Always an async\n * `(config) => Promise<Data>` that throws on validation or tool error —\n * matching OneStore's `DefaultImperativeBindingsService`, the only service a\n * mutation ever uses on platform. Mutations do not carry an `invokerShape`:\n * `subscribe`/`refresh` make no sense on write, and allowing them here\n * would drift off-platform from on-platform semantics.\n */\nexport interface LdsImperativeMutationAdapterConfig extends LdsSchemaValidatedEntry {\n\ttype: \"imperative-mutation\";\n}\n\n/**\n * Public alias for the read-shape union defined in `runtime.ts`. Re-exported\n * from this module so consumers don't have to import from the runtime entry\n * point, while keeping the union pinned to one source of truth.\n *\n * Off-platform there is no store, so `subscribe` is a deliberate no-op\n * (callback never fires, returned unsubscribe is idempotent) and `refresh`\n * re-executes the underlying MCP tool. This preserves the OneStore API\n * surface for code ported verbatim.\n */\nexport type LdsImperativeReadInvokerShape = ReadInvokerShape;\n\nexport interface LdsImperativeReadAdapterConfig extends LdsSchemaValidatedEntry {\n\ttype: \"imperative-read\";\n\tinvokerShape: LdsImperativeReadInvokerShape;\n}\n\n// ─── GraphQL adapter configs ─────────────────────────────────────────────────\n\n/**\n * GraphQL wire adapter. Emits `{ data, errors, refresh }` (distinct from the\n * base wire `{ data, error }`). No `configJsonSchema` — the adapter passes\n * `{ query, variables }` through to the configured MCP tool.\n */\nexport interface LdsGraphqlWireAdapterConfig extends LdsRegistryEntryBase {\n\ttype: \"graphql-wire\";\n}\n\n/**\n * Imperative GraphQL mutation — `(config) => Promise<{ data, errors }>`.\n * Errors are routed in-band to the `errors[]` envelope rather than thrown,\n * matching on-platform `toGraphQLResponseFromFailure`.\n */\nexport interface LdsGraphqlMutationAdapterConfig extends LdsRegistryEntryBase {\n\ttype: \"graphql-mutation\";\n}\n\n/**\n * Read-shape discriminator for imperative GraphQL adapters. Mirrors the\n * `imperative-read` `invokerShape` field so the two families share a pattern:\n * one `type` discriminator + a shape field that selects the return surface.\n *\n * - `query` — `Promise<{ data, errors, subscribe }>` (on-platform\n * `GraphQLImperativeBindingsService` without `exposeRefresh`).\n * - `query-refreshable` — `Promise<{ data, errors, subscribe, refresh }>`\n * (same service with `exposeRefresh: true`).\n * - `legacy` — `{ invoke(config, context, callback),\n * subscribe(config, context, callback): Unsubscribe }`, the older callback\n * surface served by `GraphQLLegacyImperativeBindingsService`.\n *\n * `subscribe` is a deliberate no-op off-platform (no reactive store).\n */\nexport type LdsGraphqlImperativeReadInvokerShape = \"query\" | \"query-refreshable\" | \"legacy\";\n\n/**\n * Imperative GraphQL read adapter. The `invokerShape` picks the return\n * surface — see {@link LdsGraphqlImperativeReadInvokerShape}. Errors are\n * routed in-band to `errors[]` (for `query`/`query-refreshable`) or into the\n * callback payload (for `legacy`); no shape throws on tool errors.\n */\nexport interface LdsGraphqlImperativeReadAdapterConfig extends LdsRegistryEntryBase {\n\ttype: \"graphql-imperative-read\";\n\tinvokerShape: LdsGraphqlImperativeReadInvokerShape;\n}\n\n// ─── Load-hook helpers (non-state-manager paths) ─────────────────────────────\n\n/** True when any entry in a module's registry map is a `graphql-*` type. */\nexport function isGraphqlSpecifier(moduleAdapters: Record<string, LdsRegistryEntry>): boolean {\n\treturn Object.values(moduleAdapters).some(\n\t\t(entry) =>\n\t\t\tentry.type === \"graphql-wire\" ||\n\t\t\tentry.type === \"graphql-mutation\" ||\n\t\t\tentry.type === \"graphql-imperative-read\",\n\t);\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type { JSONSchema } from \"@conduit-client/jsonschema-validate\";\nimport type {\n\tLdsGraphqlImperativeReadAdapterConfig,\n\tLdsGraphqlMutationAdapterConfig,\n\tLdsGraphqlWireAdapterConfig,\n\tLdsImperativeMutationAdapterConfig,\n\tLdsImperativeReadAdapterConfig,\n\tLdsWireAdapterConfig,\n} from \"./adapters\";\nimport type { LdsStateManagerConfig } from \"./state-managers\";\n\n// ─── Base shapes shared by every MCP-backed registry entry ───────────────────\n\n/**\n * MCP dispatch descriptor. Nested under `mcp` on every registry entry so\n * additional MCP-specific fields (auth, transport, retry policy) can join\n * later without reshaping every consumer entry.\n */\nexport interface LdsMcpDispatch {\n\ttoolName: string;\n}\n\n/**\n * Base shape every LDS registry entry extends. Holds the dispatch surface in\n * one place so new backings (e.g. `http`) can land as sibling optional fields\n * without forking each entry interface. Dual registration is supported at\n * the type level — runtime execution still targets a single backing per call.\n */\nexport interface LdsRegistryEntryBase {\n\tmcp?: LdsMcpDispatch;\n}\n\n/**\n * LDS registry entries whose input is validated against a JSON Schema at\n * invoke time — wire, imperative-mutation, imperative-read. GraphQL variants\n * skip this base because they pass `{ query, variables }` through to the\n * configured MCP tool with no schema check.\n */\nexport interface LdsSchemaValidatedEntry extends LdsRegistryEntryBase {\n\tconfigJsonSchema: JSONSchema;\n}\n\n// ─── Public union + registry surface ─────────────────────────────────────────\n// Lives in `common-mcp-tooling` because the union is the \"what kinds of\n// MCP-backed things exist\" summary every consumer reaches for. The union\n// spans both adapter variants (wire / imperative / graphql) and the\n// state-manager variant since they share the same registry slot — even\n// though state managers aren't technically adapters.\n\nexport type LdsRegistryEntry =\n\t| LdsWireAdapterConfig\n\t| LdsImperativeMutationAdapterConfig\n\t| LdsImperativeReadAdapterConfig\n\t| LdsGraphqlWireAdapterConfig\n\t| LdsGraphqlMutationAdapterConfig\n\t| LdsGraphqlImperativeReadAdapterConfig\n\t| LdsStateManagerConfig;\n\nexport type LdsRegistry = Record<string, Record<string, LdsRegistryEntry>>;\n\n// ─── Per-resource shared MCP-tool constants ──────────────────────────────────\n// Tool names and JSON Schemas extracted from the registry so wire / imperative\n// siblings backed by the same MCP tool reference one source of truth. Mutation\n// adapters keep their own dedicated tools and schemas because their dispatch\n// surface is distinct (different tool name, different validated input).\n\nexport const RECORD_TOOL = \"getRecordMcpTool\";\nexport const RECORD_SCHEMA: JSONSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\trecordId: { type: \"string\" },\n\t\tlayoutTypes: {\n\t\t\tanyOf: [{ type: \"array\", items: { type: \"string\" } }, { type: \"null\" }],\n\t\t},\n\t\tfields: {\n\t\t\tanyOf: [{ type: \"array\", items: { type: \"string\" } }, { type: \"null\" }],\n\t\t},\n\t},\n\trequired: [\"recordId\"],\n\tadditionalProperties: false,\n\tanyOf: [\n\t\t{\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tfields: { type: \"array\", items: { type: \"string\" }, minItems: 1 },\n\t\t\t},\n\t\t\trequired: [\"fields\"],\n\t\t\tadditionalProperties: true,\n\t\t},\n\t\t{\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tlayoutTypes: {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems: { type: \"string\" },\n\t\t\t\t\tminItems: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t\trequired: [\"layoutTypes\"],\n\t\t\tadditionalProperties: true,\n\t\t},\n\t],\n};\n\nexport const OBJECT_INFO_TOOL = \"getObjectInfoMcpTool\";\nexport const OBJECT_INFO_SCHEMA: JSONSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tobjectApiName: { type: \"string\" },\n\t},\n\trequired: [\"objectApiName\"],\n\tadditionalProperties: false,\n};\n\nexport const GRAPHQL_TOOL = \"graphqlQuery\";\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type { JSONSchema } from \"@conduit-client/jsonschema-validate\";\nimport type { LdsRegistryEntry, LdsRegistryEntryBase } from \"./common-mcp-tooling\";\n\n/**\n * State-manager registry entry. The lds plugin's load hook emits a\n * factory-composition body for each state-manager entry — see\n * `buildStateManagerCompositionBody` below. Two emit shapes:\n *\n * - **UIAPI** (`lightning/stateManagerRecord`, `…ObjectInfo`) — synthesizes\n * a legacy-shape imperative-read adapter inline via `createReadAdapter`\n * and feeds it into the upstream per-state-manager factory\n * (`createSmRecord` / `createSmObjectInfo`) re-exported from\n * `@salesforce/state-managers-uiapi/factory`.\n *\n * - **GraphQL** (`lightning/stateManagerGraphQL`) — calls the upstream\n * per-state-manager factory `createSmGraphQL` re-exported from\n * `@salesforce/lds-adapters-onestore-graphql/factory` with an MCP-backed\n * `getCommand` synthesized via `createGraphqlStateManagerCommand`\n * (a `runtime.ts` helper). The required / optional config keys\n * (`['query']`, `['variables', 'operationName']`) live in the upstream\n * factory — a fixed contract of `lightning/stateManagerGraphQL` — so the\n * load-hook emit doesn't pass them. Mirrors the UIAPI shape (one\n * factory call, adapter argument only).\n *\n * Per-state-manager metadata (definedBy, requiredKeys, optionalKeys,\n * predicate) lives in the upstream factory — not here. See spec §8.4 / §10.4.\n *\n * `configJsonSchema` is optional: UIAPI state managers supply it (the\n * load hook embeds it in the synthesized imperative-read adapter), but\n * the graphql state-manager path doesn't read it (off-core graphql\n * forgoes the on-core `assertIsValid` / `resolveAndValidateGraphQLConfig`\n * validation layer; spec §4 Non-goal 9 — malformed configs surface as\n * MCP tool errors at execute time instead).\n */\nexport interface LdsStateManagerConfig extends LdsRegistryEntryBase {\n\ttype: \"state-manager\";\n\t/** Upstream factory specifier — e.g. '@salesforce/state-managers-uiapi/factory'. */\n\tfactoryModule: string;\n\t/** Named export within `factoryModule` — e.g. 'createSmRecord' (UIAPI), 'createSmGraphQL' (graphql). */\n\tfactoryName: string;\n\t/** JSON Schema for the config object — required for UIAPI state managers, omitted for graphql. */\n\tconfigJsonSchema?: JSONSchema;\n}\n\n/** True when any entry in a module's registry map is a `state-manager` type. */\nexport function isStateManagerSpecifier(moduleAdapters: Record<string, LdsRegistryEntry>): boolean {\n\treturn Object.values(moduleAdapters).some((entry) => entry.type === \"state-manager\");\n}\n\n/**\n * True when a state-manager specifier resolves to the graphql state manager\n * (`lightning/stateManagerGraphQL`). Used by `buildStateManagerCompositionBody`\n * to pick which emit shape to use:\n *\n * - GraphQL — call upstream `createSmGraphQL` with an MCP-backed\n * `getCommand` from `createGraphqlStateManagerCommand`. Required/optional\n * key sets (`['query']` / `['variables', 'operationName']`) live in the\n * upstream factory; the load-hook emit doesn't pass them.\n * - UIAPI — synthesize a legacy-shape imperative-read adapter inline via\n * `createReadAdapter` and feed it into the per-state-manager wrapper\n * (`createSmRecord` / `createSmObjectInfo`).\n *\n * Selecting on the specifier (rather than the registry entry's `type`)\n * mirrors §8.4 of the spec and keeps the `LdsStateManagerConfig` surface\n * free of an inner discriminator — consumers add a state-manager registry\n * entry once and the plugin picks the right emit shape.\n */\nfunction isGraphqlStateManagerSpecifier(specifier: string): boolean {\n\treturn specifier === \"lightning/stateManagerGraphQL\";\n}\n\n/**\n * Builds the §8.4 factory-composition body for a single `state-manager`\n * registry entry. Two emit shapes, gated by `isGraphqlStateManagerSpecifier`:\n *\n * **UIAPI shape** — `lightning/stateManagerRecord`, `…ObjectInfo`:\n * 1. Imports `<factoryName>` (e.g. `createSmRecord`) from the registry's\n * `factoryModule` (e.g. `@salesforce/state-managers-uiapi/factory`).\n * 2. Builds a legacy-shape imperative-read config and synthesizes the\n * adapter inline via `createReadAdapter` — a private binding pulled\n * into scope by `adapterBaseSource`.\n * 3. Default-exports `<factoryName>(synthesizedAdapter)`.\n *\n * **GraphQL shape** — `lightning/stateManagerGraphQL`:\n * 1. Imports `<factoryName>` (`createSmGraphQL`) from the registry's\n * `factoryModule` (`@salesforce/lds-adapters-onestore-graphql/factory`).\n * 2. Synthesizes an MCP-backed `getCommand` via `createGraphqlStateManagerCommand`\n * (a `runtime.ts` helper, in scope as a private binding).\n * 3. Default-exports `<factoryName>(getCommand)`. The required / optional\n * config keys are baked into the upstream factory, not passed here.\n *\n * Only `default` is exported in either shape. The upstream `<name>_internal`\n * named export (used internally by `state-managers-uiapi` for\n * cross-state-manager wiring and tests) is deliberately not re-exported —\n * uplifted customer LWCs only consume the default. See spec §8.4 / §10.4.\n */\nexport function buildStateManagerCompositionBody(\n\tname: string,\n\tcfg: LdsStateManagerConfig,\n\tspecifier: string,\n): string {\n\tif (isGraphqlStateManagerSpecifier(specifier)) {\n\t\tconst graphqlCfg = { mcp: { toolName: cfg.mcp?.toolName } };\n\t\treturn [\n\t\t\t`import { ${cfg.factoryName} } from ${JSON.stringify(cfg.factoryModule)};`,\n\t\t\t`const __getCommand_${name} = createGraphqlStateManagerCommand(${JSON.stringify(name)}, ${JSON.stringify(graphqlCfg)});`,\n\t\t\t`export default ${cfg.factoryName}(__getCommand_${name});`,\n\t\t].join(\"\\n\");\n\t}\n\tconst synthesizedCfg = {\n\t\ttype: \"imperative-read\" as const,\n\t\tinvokerShape: \"legacy\" as const,\n\t\tmcp: { toolName: cfg.mcp?.toolName },\n\t\tconfigJsonSchema: cfg.configJsonSchema,\n\t};\n\treturn [\n\t\t`import { ${cfg.factoryName} } from ${JSON.stringify(cfg.factoryModule)};`,\n\t\t`const __cfg_${name} = ${JSON.stringify(synthesizedCfg)};`,\n\t\t`const __imperativeAdapter_${name} = createReadAdapter(${JSON.stringify(name)}, __cfg_${name});`,\n\t\t`export default ${cfg.factoryName}(__imperativeAdapter_${name});`,\n\t].join(\"\\n\");\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Splits the brace-content of a named-import statement into its individual\n * specifiers, surfacing both the original (pre-`as`) name and the full\n * `<original> as <local>` form. Used by the lds plugin's transform hook to\n * decide which names to rewrite to the virtual module.\n */\nexport function parseImportSpecifiers(bracesContent: string): { original: string; full: string }[] {\n\treturn bracesContent\n\t\t.split(\",\")\n\t\t.map((s) => s.trim())\n\t\t.filter(Boolean)\n\t\t.map((entry) => {\n\t\t\tconst asIdx = entry.indexOf(\" as \");\n\t\t\tconst original = asIdx !== -1 ? entry.slice(0, asIdx).trim() : entry.trim();\n\t\t\treturn { original, full: entry };\n\t\t});\n}\n\n/**\n * Removes top-level ES-module `export` keywords from the embedded runtime\n * source so its declarations survive as private bindings inside the virtual\n * module. Handles two shapes:\n * 1. Per-declaration: `export function foo …` / `export async function foo`\n * → the `export ` prefix is dropped.\n * 2. Trailing re-export clause: `export { foo, bar };` → deleted entirely.\n * Inner occurrences (inside function bodies, comments, strings) are not\n * affected because the source is a flat module with exports only at column 0.\n *\n * Internal: only `adapterBaseSource` is on the public deep-import surface;\n * the strip itself is an implementation detail.\n */\nfunction stripTopLevelExports(source: string): string {\n\treturn source\n\t\t.replace(/^export\\s+(?=(?:async\\s+)?function\\s)/gm, \"\")\n\t\t.replace(/^export\\s*\\{[^}]*};?\\s*$/gm, \"\");\n}\n\n// the source of the adapter base module — reused across virtual modules so\n// each generated specifier emits the factories once.\n//\n// Top-level exports from the runtime module are stripped so every factory and\n// `gql` becomes a private binding inside the virtual module. The load hook\n// then controls exactly which names are exported per specifier: adapter\n// entries from the registry, plus `gql` for graphql specifiers. Without this,\n// the built `runtime.js` (trailing `export { …, gql, createWireAdapter, … }`)\n// and the source `runtime.ts` (per-declaration `export function gql …`) both\n// produce a `SyntaxError: Duplicate export of 'gql'` when the load hook also\n// appends `export { gql };`. They also leak the factory names as exports on\n// every LDS virtual module, which isn't a public contract we want.\nexport const adapterBaseSource = stripTopLevelExports(\n\treadFileSync(join(dirname(fileURLToPath(import.meta.url)), \"runtime.js\"), \"utf-8\"),\n);\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { init, parse } from \"es-module-lexer\";\nimport MagicString from \"magic-string\";\nimport type { Plugin } from \"vite\";\nimport { isGraphqlSpecifier } from \"./adapters\";\nimport {\n\tGRAPHQL_TOOL,\n\ttype LdsRegistry,\n\ttype LdsRegistryEntry,\n\tOBJECT_INFO_SCHEMA,\n\tOBJECT_INFO_TOOL,\n\tRECORD_SCHEMA,\n\tRECORD_TOOL,\n} from \"./common-mcp-tooling\";\nimport { buildStateManagerCompositionBody, isStateManagerSpecifier } from \"./state-managers\";\nimport { adapterBaseSource, parseImportSpecifiers } from \"./util\";\nimport type { PassthroughRule } from \"../../types\";\n\n// Re-export the public type surface. Consumers (and `providers/index.ts`)\n// continue to import every registry-entry type from `./lds/index`.\nexport type {\n\tLdsMcpDispatch,\n\tLdsRegistry,\n\tLdsRegistryEntry,\n\tLdsRegistryEntryBase,\n\tLdsSchemaValidatedEntry,\n} from \"./common-mcp-tooling\";\nexport type {\n\tLdsGraphqlImperativeReadAdapterConfig,\n\tLdsGraphqlImperativeReadInvokerShape,\n\tLdsGraphqlMutationAdapterConfig,\n\tLdsGraphqlWireAdapterConfig,\n\tLdsImperativeMutationAdapterConfig,\n\tLdsImperativeReadAdapterConfig,\n\tLdsImperativeReadInvokerShape,\n\tLdsWireAdapterConfig,\n} from \"./adapters\";\nexport type { LdsStateManagerConfig } from \"./state-managers\";\n\n// prefix to write into transformed source code\nconst ADAPTER_PREFIX = \"sf-lds-adapter:\";\n// prefix used to ID the adapter when loading the virtual module\nconst ADAPTER_ID_PREFIX = \"\\0\" + ADAPTER_PREFIX;\n\n/**\n * Default registry.\n * Maps LDS module specifiers to MCP tool-backed implementations. Entries can be\n * wire adapters (`type: 'wire'`), imperative mutations (`type: 'imperative-mutation'`),\n * imperative reads (`type: 'imperative-read'` + `invokerShape`), GraphQL variants,\n * or state managers. Add entries here to support additional lightning/* exports.\n */\nconst DEFAULT_REGISTRY: LdsRegistry = {\n\t\"lightning/uiRecordApi\": {\n\t\tgetRecord: {\n\t\t\ttype: \"wire\",\n\t\t\tmcp: { toolName: RECORD_TOOL },\n\t\t\tconfigJsonSchema: RECORD_SCHEMA,\n\t\t},\n\t\tcreateRecord: {\n\t\t\ttype: \"imperative-mutation\",\n\t\t\tmcp: { toolName: \"createRecordMcpTool\" },\n\t\t\tconfigJsonSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\tapiName: { type: \"string\" },\n\t\t\t\t\tfields: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {},\n\t\t\t\t\t\trequired: [],\n\t\t\t\t\t\tadditionalProperties: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [\"apiName\", \"fields\"],\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t},\n\t\tupdateRecord: {\n\t\t\ttype: \"imperative-mutation\",\n\t\t\tmcp: { toolName: \"updateRecordMcpTool\" },\n\t\t\tconfigJsonSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\trecordId: { type: \"string\" },\n\t\t\t\t\tfields: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {},\n\t\t\t\t\t\trequired: [],\n\t\t\t\t\t\tadditionalProperties: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [\"recordId\", \"fields\"],\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t},\n\t},\n\t\"lightning/uiObjectInfoApi\": {\n\t\t// On-platform this is a `{ invoke, subscribe }` callback surface\n\t\t// emitting `{ data, error }`. The legacy invoker shape preserves that\n\t\t// contract verbatim, so ported consumers keep their call sites.\n\t\tgetObjectInfo_imperative: {\n\t\t\ttype: \"imperative-read\",\n\t\t\tinvokerShape: \"legacy\",\n\t\t\tmcp: { toolName: OBJECT_INFO_TOOL },\n\t\t\tconfigJsonSchema: OBJECT_INFO_SCHEMA,\n\t\t},\n\t},\n\t// `lightning/graphql` — on-platform exports `gql`, the `graphql` wire\n\t// adapter, and `executeMutation`. Only `graphql` and `executeMutation`\n\t// are registry entries; `gql` rides along automatically for any specifier\n\t// that has at least one graphql-typed entry (emitted by the load hook).\n\t\"lightning/graphql\": {\n\t\tgraphql: { type: \"graphql-wire\", mcp: { toolName: GRAPHQL_TOOL } },\n\t\texecuteMutation: { type: \"graphql-mutation\", mcp: { toolName: GRAPHQL_TOOL } },\n\t},\n\t// `lightning/stateManagerGraphQL` — externalized graphql state manager.\n\t// The load hook imports `createSmGraphQL` from the upstream\n\t// `@salesforce/lds-adapters-onestore-graphql/factory` barrel — a thin\n\t// per-state-manager wrapper around `createStateManager` that bakes in\n\t// the required (`['query']`) / optional (`['variables', 'operationName']`)\n\t// config keys, mirroring `createSmRecord` / `createSmObjectInfo`. The\n\t// same factory wraps the call site on-core via `bindings/bindings.ts`,\n\t// so off-core composition fidelity is preserved without on-core service\n\t// plumbing leaking into this side.\n\t//\n\t// Per §10.3 the registry only ever has `default` as its key — the\n\t// `createSmGraphQL` return value is itself the `default` export of\n\t// the virtual module.\n\t//\n\t// `configJsonSchema` is omitted: off-core graphql forgoes the on-core\n\t// `assertIsValid` / `resolveAndValidateGraphQLConfig` validation layer\n\t// (§4 Non-goal 9), and the load-hook graphql path doesn't read the\n\t// field anyway — malformed configs surface as MCP tool errors at\n\t// execute time instead.\n\t\"lightning/stateManagerGraphQL\": {\n\t\tdefault: {\n\t\t\ttype: \"state-manager\",\n\t\t\tfactoryModule: \"@salesforce/lds-adapters-onestore-graphql/factory\",\n\t\t\tfactoryName: \"createSmGraphQL\",\n\t\t\tmcp: { toolName: GRAPHQL_TOOL },\n\t\t},\n\t},\n\t// State-manager specifier for ObjectInfo (spec §8.3 / §10.3). The load hook\n\t// synthesizes a legacy-shape imperative-read adapter inline from\n\t// (mcp.toolName, configJsonSchema) and feeds it to the upstream\n\t// `createSmObjectInfo` factory. Reuses the shared `OBJECT_INFO_TOOL` /\n\t// `OBJECT_INFO_SCHEMA` so this entry stays in lock-step with the\n\t// `lightning/uiObjectInfoApi.getObjectInfo_imperative` entry above —\n\t// both back the same UIAPI ObjectInfo MCP tool.\n\t\"lightning/stateManagerObjectInfo\": {\n\t\tdefault: {\n\t\t\ttype: \"state-manager\",\n\t\t\tfactoryModule: \"@salesforce/state-managers-uiapi/factory\",\n\t\t\tfactoryName: \"createSmObjectInfo\",\n\t\t\tmcp: { toolName: OBJECT_INFO_TOOL },\n\t\t\tconfigJsonSchema: OBJECT_INFO_SCHEMA,\n\t\t},\n\t},\n\t// `lightning/stateManagerRecord` — UIAPI Record state-manager. Per spec\n\t// §10.3 the registry only ever has a single `default` key; the load hook\n\t// synthesizes a legacy-shape imperative-read adapter from\n\t// (mcp.toolName, configJsonSchema) and feeds it into the upstream\n\t// `createSmRecord` factory to produce the externalized state manager.\n\t// Reuses the shared `RECORD_TOOL` / `RECORD_SCHEMA` so the wire and\n\t// state-manager paths stay anchored to a single MCP-tool / config\n\t// contract.\n\t\"lightning/stateManagerRecord\": {\n\t\tdefault: {\n\t\t\ttype: \"state-manager\",\n\t\t\tfactoryModule: \"@salesforce/state-managers-uiapi/factory\",\n\t\t\tfactoryName: \"createSmRecord\",\n\t\t\tmcp: { toolName: RECORD_TOOL },\n\t\t\tconfigJsonSchema: RECORD_SCHEMA,\n\t\t},\n\t},\n};\n\n/** Maps an entry discriminator to the factory name emitted in the virtual module. */\nfunction factoryFor(type: LdsRegistryEntry[\"type\"]): string {\n\tswitch (type) {\n\t\tcase \"wire\":\n\t\t\treturn \"createWireAdapter\";\n\t\tcase \"imperative-mutation\":\n\t\t\treturn \"createMutationAdapter\";\n\t\tcase \"imperative-read\":\n\t\t\treturn \"createReadAdapter\";\n\t\tcase \"graphql-wire\":\n\t\t\treturn \"createGraphQLWireAdapter\";\n\t\tcase \"graphql-mutation\":\n\t\t\treturn \"createGraphQLMutationAdapter\";\n\t\tcase \"graphql-imperative-read\":\n\t\t\treturn \"createGraphQLImperativeReadAdapter\";\n\t\tcase \"state-manager\":\n\t\t\t// Load-hook directive name (consumed in W-05), not a runtime-import\n\t\t\t// factory: the load hook synthesizes an adapter inline and calls\n\t\t\t// the upstream factoryModule/factoryName to compose the state manager.\n\t\t\treturn \"createStateManagerComposition\";\n\t}\n}\n\n/**\n * Deep-merges user overrides onto the default registry: every specifier from\n * both sides is preserved, and per-specifier entries are merged so a consumer\n * can override `getRecord` without losing `createRecord`, or register a new\n * entry on `lightning/graphql` without losing `graphql` / `executeMutation`.\n * Pass an empty object to get just the defaults. To opt out of a default\n * entry, pass the same specifier with a different entry of the same key.\n */\nfunction mergeWithDefaults(overrides: LdsRegistry): LdsRegistry {\n\tconst merged: LdsRegistry = { ...DEFAULT_REGISTRY };\n\tfor (const [specifier, entries] of Object.entries(overrides)) {\n\t\tmerged[specifier] = { ...(DEFAULT_REGISTRY[specifier] ?? {}), ...entries };\n\t}\n\treturn merged;\n}\n\n/**\n * LDS provider — rewrites registered `lightning/*` imports (e.g.\n * `lightning/uiRecordApi`) to MCP-tool-backed virtual modules. Unregistered\n * exports pass through to the normal `lightning/*` resolution.\n *\n * Three Vite hooks do the work:\n *\n * - **`transform`** — parses each `.js` / `.ts` file with `es-module-lexer`,\n * finds named imports from registered specifiers, and rewrites them to pull\n * registered names from `sf-lds-adapter:<specifier>` while leaving\n * unregistered names pointing at the original specifier.\n *\n * - **`resolveId`** — maps `sf-lds-adapter:<specifier>` to a `\\0`-prefixed\n * virtual module ID, preventing Rollup from attempting a filesystem lookup.\n *\n * - **`load`** — generates the virtual module, emitting an MCP-backed\n * `createWireAdapter(...)` class for every `type: 'wire'` entry,\n * `createMutationAdapter(...)` for every `type: 'imperative-mutation'` entry,\n * and `createReadAdapter(...)` for every `type: 'imperative-read'` entry.\n *\n * Only specifiers present in the `adapters` registry are intercepted; imports from\n * unregistered specifiers pass through unchanged.\n */\nexport function lds(overrides: LdsRegistry = {}): Plugin & { passthroughRules: PassthroughRule[] } {\n\tconst adapters = mergeWithDefaults(overrides);\n\t// Graphql specifiers are owned whole by the virtual module — every export\n\t// (adapters + `gql`) lives there, so the transform hook should not split\n\t// their imports. Non-graphql specifiers still go through transform so\n\t// unregistered names pass through to the real `lightning/*` module.\n\tconst graphqlSpecifiers = new Set<string>(\n\t\tObject.entries(adapters)\n\t\t\t.filter(([, moduleAdapters]) => isGraphqlSpecifier(moduleAdapters))\n\t\t\t.map(([specifier]) => specifier),\n\t);\n\t// State-manager specifiers (`lightning/stateManager*`) are also owned\n\t// whole by the virtual module: their load-hook body emits `export default\n\t// <factory>(...)` per §10.4, so the public consumer surface is a default\n\t// import. The transform hook only rewrites brace-style named imports, so\n\t// state-manager specifiers are excluded from `transformSpecifiers` and\n\t// claimed in `resolveId` directly — same pattern as graphql specifiers.\n\tconst stateManagerSpecifiers = new Set<string>(\n\t\tObject.entries(adapters)\n\t\t\t.filter(([, moduleAdapters]) => isStateManagerSpecifier(moduleAdapters))\n\t\t\t.map(([specifier]) => specifier),\n\t);\n\tconst transformSpecifiers = Object.keys(adapters).filter(\n\t\t(s) => !graphqlSpecifiers.has(s) && !stateManagerSpecifiers.has(s),\n\t);\n\tconst specifierSnippets = transformSpecifiers.flatMap((s) => [`'${s}'`, `\"${s}\"`]);\n\n\t// State-manager `factoryModule` specifiers (e.g.\n\t// `@salesforce/state-managers-uiapi/factory`) are imported from inside the\n\t// emitted virtual module and must reach their real npm package — not the\n\t// scoped-providers fallback. The fallback would otherwise claim them via\n\t// any broad `@salesforce/` interceptPrefix derived from co-installed\n\t// providers (i18n / label / gate). Surface them as passthroughRules so the\n\t// main plugin can hand them to scopedProviders, which short-circuits when\n\t// the importer is one of our `sf-lds-adapter:` virtual modules.\n\tconst factoryModuleSpecifiers = new Set<string>();\n\tfor (const moduleAdapters of Object.values(adapters)) {\n\t\tfor (const entry of Object.values(moduleAdapters)) {\n\t\t\tif (entry.type === \"state-manager\") {\n\t\t\t\tfactoryModuleSpecifiers.add(entry.factoryModule);\n\t\t\t}\n\t\t}\n\t}\n\tconst passthroughRules: PassthroughRule[] = [...factoryModuleSpecifiers].map((specifier) => ({\n\t\tspecifierPrefix: specifier,\n\t\timporterPattern: ADAPTER_PREFIX,\n\t}));\n\n\tconst plugin: Plugin = {\n\t\tname: \"vite-plugin-lds\",\n\t\tenforce: \"pre\",\n\n\t\tasync transform(code, id) {\n\t\t\tconst cleanId = id.split(\"?\")[0] ?? id;\n\t\t\tif (!cleanId.endsWith(\".js\") && !cleanId.endsWith(\".ts\")) return null;\n\t\t\tif (cleanId.includes(\"/node_modules/\")) return null;\n\t\t\tif (!specifierSnippets.some((snippet) => code.includes(snippet))) return null;\n\n\t\t\tawait init;\n\n\t\t\tlet imports: ReturnType<typeof parse>[0];\n\t\t\ttry {\n\t\t\t\t[imports] = parse(code);\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst relevant = imports.filter(\n\t\t\t\t(imp) =>\n\t\t\t\t\timp.d === -1 && imp.n !== undefined && imp.n in adapters && !graphqlSpecifiers.has(imp.n),\n\t\t\t);\n\t\t\tif (relevant.length === 0) return null;\n\n\t\t\tconst s = new MagicString(code);\n\t\t\tlet changed = false;\n\n\t\t\tfor (const imp of relevant) {\n\t\t\t\tconst { ss: start, se: end, n: specifier } = imp;\n\t\t\t\tconst statement = code.slice(start, end);\n\n\t\t\t\tconst openBrace = statement.indexOf(\"{\");\n\t\t\t\tconst closeBrace = statement.indexOf(\"}\");\n\t\t\t\tif (openBrace === -1 || closeBrace === -1) continue;\n\n\t\t\t\tconst bracesContent = statement.slice(openBrace + 1, closeBrace);\n\t\t\t\tconst moduleAdapters = adapters[specifier!]!;\n\t\t\t\tconst parsedImport = parseImportSpecifiers(bracesContent);\n\t\t\t\tconst registered = parsedImport.filter((p) => p.original in moduleAdapters);\n\t\t\t\tconst unregistered = parsedImport.filter((p) => !(p.original in moduleAdapters));\n\n\t\t\t\tif (registered.length === 0) continue;\n\n\t\t\t\tconst parts: string[] = [\n\t\t\t\t\t`import { ${registered.map((p) => p.full).join(\", \")} } from '${ADAPTER_PREFIX}${specifier}';`,\n\t\t\t\t];\n\n\t\t\t\tif (unregistered.length > 0) {\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t`import { ${unregistered.map((p) => p.full).join(\", \")} } from '${specifier}';`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\ts.overwrite(start, end, parts.join(\"\\n\"));\n\t\t\t\tchanged = true;\n\t\t\t}\n\n\t\t\tif (!changed) return null;\n\t\t\treturn { code: s.toString(), map: s.generateMap({ hires: true }) };\n\t\t},\n\n\t\tresolveId(id) {\n\t\t\t// Graphql + state-manager specifiers are intercepted raw — no\n\t\t\t// transform hook split — and mapped into the same\n\t\t\t// `\\0sf-lds-adapter:` virtual namespace so the load hook emits one\n\t\t\t// module per specifier. State-manager modules expose `default` as\n\t\t\t// their only public export (§10.4), so default imports of\n\t\t\t// `lightning/stateManager*` need this interception to reach the\n\t\t\t// virtual module body.\n\t\t\tif (graphqlSpecifiers.has(id) || stateManagerSpecifiers.has(id)) {\n\t\t\t\treturn ADAPTER_ID_PREFIX + id;\n\t\t\t}\n\t\t\tif (id.startsWith(ADAPTER_PREFIX)) return ADAPTER_ID_PREFIX + id.slice(ADAPTER_PREFIX.length);\n\t\t\treturn null;\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (!id.startsWith(ADAPTER_ID_PREFIX)) return null;\n\n\t\t\tconst specifier = id.slice(ADAPTER_ID_PREFIX.length);\n\t\t\tconst moduleAdapters = adapters[specifier];\n\t\t\tif (!moduleAdapters) return null;\n\n\t\t\t// create lines of code used to create MCP tool based adapters\n\t\t\tconst lines: string[] = [adapterBaseSource];\n\t\t\tfor (const [name, entry] of Object.entries(moduleAdapters)) {\n\t\t\t\tif (entry.type === \"state-manager\") {\n\t\t\t\t\t// State-manager entries do not call a runtime factory like\n\t\t\t\t\t// the other types. Per spec §8.4 / §10.4, the load hook\n\t\t\t\t\t// emits a small composition block that synthesizes a\n\t\t\t\t\t// legacy-shape imperative adapter inline and feeds it into\n\t\t\t\t\t// the upstream `<factoryName>` from `<factoryModule>`.\n\t\t\t\t\tlines.push(buildStateManagerCompositionBody(name, entry, specifier));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst { type, ...cfg } = entry;\n\t\t\t\tlines.push(\n\t\t\t\t\t`export const ${name} = ${factoryFor(type)}(${JSON.stringify(name)}, ${JSON.stringify(cfg)});`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// `gql` rides along with any specifier that declares a graphql\n\t\t\t// adapter, so `import { gql } from 'lightning/graphql'` (or any\n\t\t\t// aliased form) keeps resolving even when no adapters are\n\t\t\t// imported alongside it. The binding itself is a private function\n\t\t\t// inside `adapterBaseSource` after `stripTopLevelExports`.\n\t\t\tif (graphqlSpecifiers.has(specifier)) {\n\t\t\t\tlines.push(\"export { gql };\");\n\t\t\t}\n\t\t\treturn lines.join(\"\\n\");\n\t\t},\n\t};\n\treturn Object.assign(plugin, { passthroughRules });\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/providers/lds/adapters.ts","../../../src/providers/lds/common-mcp-tooling.ts","../../../src/providers/lds/state-managers.ts","../../../src/providers/lds/util.ts","../../../src/providers/lds/index.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type {\n\tLdsRegistryEntry,\n\tLdsRegistryEntryBase,\n\tLdsSchemaValidatedEntry,\n} from \"./common-mcp-tooling\";\nimport type { ReadInvokerShape } from \"./types\";\n\n// ─── Wire + imperative adapter configs ───────────────────────────────────────\n\nexport interface LdsWireAdapterConfig extends LdsSchemaValidatedEntry {\n\ttype: \"wire\";\n}\n\n/**\n * Imperative **mutation** adapter. Always an async\n * `(config) => Promise<Data>` that throws on validation or tool error —\n * matching OneStore's `DefaultImperativeBindingsService`, the only service a\n * mutation ever uses on platform. Mutations do not carry an `invokerShape`:\n * `subscribe`/`refresh` make no sense on write, and allowing them here\n * would drift off-platform from on-platform semantics.\n */\nexport interface LdsImperativeMutationAdapterConfig extends LdsSchemaValidatedEntry {\n\ttype: \"imperative-mutation\";\n}\n\n/**\n * Public alias for the read-shape union defined in `runtime.ts`. Re-exported\n * from this module so consumers don't have to import from the runtime entry\n * point, while keeping the union pinned to one source of truth.\n *\n * Off-platform there is no store, so `subscribe` is a deliberate no-op\n * (callback never fires, returned unsubscribe is idempotent) and `refresh`\n * re-executes the underlying MCP tool. This preserves the OneStore API\n * surface for code ported verbatim.\n */\nexport type LdsImperativeReadInvokerShape = ReadInvokerShape;\n\nexport interface LdsImperativeReadAdapterConfig extends LdsSchemaValidatedEntry {\n\ttype: \"imperative-read\";\n\tinvokerShape: LdsImperativeReadInvokerShape;\n}\n\n// ─── GraphQL adapter configs ─────────────────────────────────────────────────\n\n/**\n * GraphQL wire adapter. Emits `{ data, errors, refresh }` (distinct from the\n * base wire `{ data, error }`). No `configJsonSchema` — the adapter passes\n * `{ query, variables }` through to the configured MCP tool.\n */\nexport interface LdsGraphqlWireAdapterConfig extends LdsRegistryEntryBase {\n\ttype: \"graphql-wire\";\n}\n\n/**\n * Imperative GraphQL mutation — `(config) => Promise<{ data, errors }>`.\n * Errors are routed in-band to the `errors[]` envelope rather than thrown,\n * matching on-platform `toGraphQLResponseFromFailure`.\n */\nexport interface LdsGraphqlMutationAdapterConfig extends LdsRegistryEntryBase {\n\ttype: \"graphql-mutation\";\n}\n\n/**\n * Read-shape discriminator for imperative GraphQL adapters. Mirrors the\n * `imperative-read` `invokerShape` field so the two families share a pattern:\n * one `type` discriminator + a shape field that selects the return surface.\n *\n * - `query` — `Promise<{ data, errors, subscribe }>` (on-platform\n * `GraphQLImperativeBindingsService` without `exposeRefresh`).\n * - `query-refreshable` — `Promise<{ data, errors, subscribe, refresh }>`\n * (same service with `exposeRefresh: true`).\n * - `legacy` — `{ invoke(config, context, callback),\n * subscribe(config, context, callback): Unsubscribe }`, the older callback\n * surface served by `GraphQLLegacyImperativeBindingsService`.\n *\n * `subscribe` is a deliberate no-op off-platform (no reactive store).\n */\nexport type LdsGraphqlImperativeReadInvokerShape = \"query\" | \"query-refreshable\" | \"legacy\";\n\n/**\n * Imperative GraphQL read adapter. The `invokerShape` picks the return\n * surface — see {@link LdsGraphqlImperativeReadInvokerShape}. Errors are\n * routed in-band to `errors[]` (for `query`/`query-refreshable`) or into the\n * callback payload (for `legacy`); no shape throws on tool errors.\n */\nexport interface LdsGraphqlImperativeReadAdapterConfig extends LdsRegistryEntryBase {\n\ttype: \"graphql-imperative-read\";\n\tinvokerShape: LdsGraphqlImperativeReadInvokerShape;\n}\n\n// ─── Load-hook helpers (non-state-manager paths) ─────────────────────────────\n\n/** True when any entry in a module's registry map is a `graphql-*` type. */\nexport function isGraphqlSpecifier(moduleAdapters: Record<string, LdsRegistryEntry>): boolean {\n\treturn Object.values(moduleAdapters).some(\n\t\t(entry) =>\n\t\t\tentry.type === \"graphql-wire\" ||\n\t\t\tentry.type === \"graphql-mutation\" ||\n\t\t\tentry.type === \"graphql-imperative-read\",\n\t);\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type { JSONSchema } from \"@conduit-client/jsonschema-validate\";\nimport type {\n\tLdsGraphqlImperativeReadAdapterConfig,\n\tLdsGraphqlMutationAdapterConfig,\n\tLdsGraphqlWireAdapterConfig,\n\tLdsImperativeMutationAdapterConfig,\n\tLdsImperativeReadAdapterConfig,\n\tLdsWireAdapterConfig,\n} from \"./adapters\";\nimport type { LdsStateManagerConfig } from \"./state-managers\";\n\n// ─── Base shapes shared by every MCP-backed registry entry ───────────────────\n\n/**\n * MCP dispatch descriptor. Nested under `mcp` on every registry entry so\n * additional MCP-specific fields (auth, transport, retry policy) can join\n * later without reshaping every consumer entry.\n */\nexport interface LdsMcpDispatch {\n\ttoolName: string;\n}\n\n/**\n * Base shape every LDS registry entry extends. Holds the dispatch surface in\n * one place so new backings (e.g. `http`) can land as sibling optional fields\n * without forking each entry interface. Dual registration is supported at\n * the type level — runtime execution still targets a single backing per call.\n */\nexport interface LdsRegistryEntryBase {\n\tmcp?: LdsMcpDispatch;\n}\n\n/**\n * LDS registry entries whose input is validated against a JSON Schema at\n * invoke time — wire, imperative-mutation, imperative-read. GraphQL variants\n * skip this base because they pass `{ query, variables }` through to the\n * configured MCP tool with no schema check.\n */\nexport interface LdsSchemaValidatedEntry extends LdsRegistryEntryBase {\n\tconfigJsonSchema: JSONSchema;\n}\n\n// ─── Public union + registry surface ─────────────────────────────────────────\n// Lives in `common-mcp-tooling` because the union is the \"what kinds of\n// MCP-backed things exist\" summary every consumer reaches for. The union\n// spans both adapter variants (wire / imperative / graphql) and the\n// state-manager variant since they share the same registry slot — even\n// though state managers aren't technically adapters.\n\nexport type LdsRegistryEntry =\n\t| LdsWireAdapterConfig\n\t| LdsImperativeMutationAdapterConfig\n\t| LdsImperativeReadAdapterConfig\n\t| LdsGraphqlWireAdapterConfig\n\t| LdsGraphqlMutationAdapterConfig\n\t| LdsGraphqlImperativeReadAdapterConfig\n\t| LdsStateManagerConfig;\n\nexport type LdsRegistry = Record<string, Record<string, LdsRegistryEntry>>;\n\n// ─── Per-resource shared MCP-tool constants ──────────────────────────────────\n// Tool names and JSON Schemas extracted from the registry so wire / imperative\n// siblings backed by the same MCP tool reference one source of truth. Mutation\n// adapters keep their own dedicated tools and schemas because their dispatch\n// surface is distinct (different tool name, different validated input).\n\nexport const RECORD_TOOL = \"getRecordMcpTool\";\nexport const RECORD_SCHEMA: JSONSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\trecordId: { type: \"string\" },\n\t\tlayoutTypes: {\n\t\t\tanyOf: [{ type: \"array\", items: { type: \"string\" } }, { type: \"null\" }],\n\t\t},\n\t\tfields: {\n\t\t\tanyOf: [{ type: \"array\", items: { type: \"string\" } }, { type: \"null\" }],\n\t\t},\n\t},\n\trequired: [\"recordId\"],\n\tadditionalProperties: false,\n\tanyOf: [\n\t\t{\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tfields: { type: \"array\", items: { type: \"string\" }, minItems: 1 },\n\t\t\t},\n\t\t\trequired: [\"fields\"],\n\t\t\tadditionalProperties: true,\n\t\t},\n\t\t{\n\t\t\ttype: \"object\",\n\t\t\tproperties: {\n\t\t\t\tlayoutTypes: {\n\t\t\t\t\ttype: \"array\",\n\t\t\t\t\titems: { type: \"string\" },\n\t\t\t\t\tminItems: 1,\n\t\t\t\t},\n\t\t\t},\n\t\t\trequired: [\"layoutTypes\"],\n\t\t\tadditionalProperties: true,\n\t\t},\n\t],\n};\n\nexport const OBJECT_INFO_TOOL = \"getObjectInfoMcpTool\";\nexport const OBJECT_INFO_SCHEMA: JSONSchema = {\n\ttype: \"object\",\n\tproperties: {\n\t\tobjectApiName: { type: \"string\" },\n\t},\n\trequired: [\"objectApiName\"],\n\tadditionalProperties: false,\n};\n\nexport const GRAPHQL_TOOL = \"graphqlQuery\";\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type { JSONSchema } from \"@conduit-client/jsonschema-validate\";\nimport type { LdsRegistryEntry, LdsRegistryEntryBase } from \"./common-mcp-tooling\";\n\n/**\n * State-manager registry entry. The lds plugin's load hook emits a\n * factory-composition body for each state-manager entry — see\n * `buildStateManagerCompositionBody` below. Two emit shapes:\n *\n * - **UIAPI** (`lightning/stateManagerRecord`, `…ObjectInfo`) — synthesizes\n * a legacy-shape imperative-read adapter inline via `createReadAdapter`\n * and feeds it into the upstream per-state-manager factory\n * (`createSmRecord` / `createSmObjectInfo`) re-exported from\n * `@salesforce/state-managers-uiapi/factory`.\n *\n * - **GraphQL** (`lightning/stateManagerGraphQL`) — calls the upstream\n * per-state-manager factory `createSmGraphQL` re-exported from\n * `@salesforce/state-managers-uiapi/factory` with an MCP-backed\n * `getCommand` synthesized via `createGraphqlStateManagerCommand`\n * (a `runtime.ts` helper). The required / optional config keys\n * (`['query']`, `['variables', 'operationName']`) live in the upstream\n * factory — a fixed contract of `lightning/stateManagerGraphQL` — so the\n * load-hook emit doesn't pass them. Mirrors the UIAPI shape (one\n * factory call, adapter argument only).\n *\n * Per-state-manager metadata (definedBy, requiredKeys, optionalKeys,\n * predicate) lives in the upstream factory — not here. See spec §8.4 / §10.4.\n *\n * `configJsonSchema` is optional: UIAPI state managers supply it (the\n * load hook embeds it in the synthesized imperative-read adapter), but\n * the graphql state-manager path doesn't read it (off-core graphql\n * forgoes the on-core `assertIsValid` / `resolveAndValidateGraphQLConfig`\n * validation layer; spec §4 Non-goal 9 — malformed configs surface as\n * MCP tool errors at execute time instead).\n */\nexport interface LdsStateManagerConfig extends LdsRegistryEntryBase {\n\ttype: \"state-manager\";\n\t/** Upstream factory specifier — e.g. '@salesforce/state-managers-uiapi/factory'. */\n\tfactoryModule: string;\n\t/** Named export within `factoryModule` — e.g. 'createSmRecord' (UIAPI), 'createSmGraphQL' (graphql). */\n\tfactoryName: string;\n\t/** JSON Schema for the config object — required for UIAPI state managers, omitted for graphql. */\n\tconfigJsonSchema?: JSONSchema;\n}\n\n/** True when any entry in a module's registry map is a `state-manager` type. */\nexport function isStateManagerSpecifier(moduleAdapters: Record<string, LdsRegistryEntry>): boolean {\n\treturn Object.values(moduleAdapters).some((entry) => entry.type === \"state-manager\");\n}\n\n/**\n * Runtime body of the state-manager flag prologue — the executable `if` /\n * `setFeatureFlag` block, *without* the ESM `import` lines. Exported for\n * tests that prove idempotency by running the body twice in a `new Function`\n * sandbox (the eval helper can't use ESM imports).\n *\n * Kept in lock-step with `STATE_MANAGER_FLAG_PROLOGUE` below — the imports\n * are concatenated on top of this body to form the full prologue.\n */\nexport const STATE_MANAGER_FLAG_PROLOGUE_BODY = [\n\t`if (!lwcRuntimeFlags.ENABLE_EXPERIMENTAL_SIGNALS) {`,\n\t` setFeatureFlag(\"ENABLE_EXPERIMENTAL_SIGNALS\", true);`,\n\t`}`,\n].join(\"\\n\");\n\n/**\n * Prologue prepended to every state-manager virtual module's body.\n *\n * State managers from `@salesforce/state-managers-uiapi/factory` are LWC\n * `Signal`s. Their inner atoms (`status`, `data`, `error/errors`) only drive\n * template re-renders when the LWC engine's `ENABLE_EXPERIMENTAL_SIGNALS`\n * runtime flag is on — the engine gates the auto-track-on-getter-access\n * path behind it (see `@lwc/engine-dom` `lwcRuntimeFlags.ENABLE_EXPERIMENTAL_SIGNALS`\n * checks). Without the flag, consumers must manually `subscribe()` to the\n * Signal and mirror values into `@track` fields to get re-renders.\n *\n * Emitted only when a state-manager specifier is loaded — non-state-manager\n * consumers are untouched, so this is opt-in via uplift, not a global runtime\n * change.\n *\n * Idempotent across multiple state-manager virtual modules: the\n * `lwcRuntimeFlags` check short-circuits the second-and-later setFeatureFlag\n * call, avoiding the \"set twice\" error in production.\n */\nconst STATE_MANAGER_FLAG_PROLOGUE = [\n\t`import { setFeatureFlag } from \"lwc\";`,\n\t`import { lwcRuntimeFlags } from \"@lwc/features\";`,\n\tSTATE_MANAGER_FLAG_PROLOGUE_BODY,\n].join(\"\\n\");\n\n/**\n * True when a state-manager specifier resolves to the graphql state manager\n * (`lightning/stateManagerGraphQL`). Used by `buildStateManagerCompositionBody`\n * to pick which emit shape to use:\n *\n * - GraphQL — call upstream `createSmGraphQL` with an MCP-backed\n * `getCommand` from `createGraphqlStateManagerCommand`. Required/optional\n * key sets (`['query']` / `['variables', 'operationName']`) live in the\n * upstream factory; the load-hook emit doesn't pass them.\n * - UIAPI — synthesize a legacy-shape imperative-read adapter inline via\n * `createReadAdapter` and feed it into the per-state-manager wrapper\n * (`createSmRecord` / `createSmObjectInfo`).\n *\n * Selecting on the specifier (rather than the registry entry's `type`)\n * mirrors §8.4 of the spec and keeps the `LdsStateManagerConfig` surface\n * free of an inner discriminator — consumers add a state-manager registry\n * entry once and the plugin picks the right emit shape.\n */\nfunction isGraphqlStateManagerSpecifier(specifier: string): boolean {\n\treturn specifier === \"lightning/stateManagerGraphQL\";\n}\n\n/**\n * Builds the §8.4 factory-composition body for a single `state-manager`\n * registry entry. Two emit shapes, gated by `isGraphqlStateManagerSpecifier`:\n *\n * **UIAPI shape** — `lightning/stateManagerRecord`, `…ObjectInfo`:\n * 1. Imports `<factoryName>` (e.g. `createSmRecord`) from the registry's\n * `factoryModule` (e.g. `@salesforce/state-managers-uiapi/factory`).\n * 2. Builds a legacy-shape imperative-read config and synthesizes the\n * adapter inline via `createReadAdapter` — a private binding pulled\n * into scope by `adapterBaseSource`.\n * 3. Default-exports `<factoryName>(synthesizedAdapter)`.\n *\n * **GraphQL shape** — `lightning/stateManagerGraphQL`:\n * 1. Imports `<factoryName>` (`createSmGraphQL`) from the registry's\n * `factoryModule` (`@salesforce/state-managers-uiapi/factory`).\n * 2. Synthesizes an MCP-backed `getCommand` via `createGraphqlStateManagerCommand`\n * (a `runtime.ts` helper, in scope as a private binding).\n * 3. Default-exports `<factoryName>(getCommand)`. The required / optional\n * config keys are baked into the upstream factory, not passed here.\n *\n * Only `default` is exported in either shape. The upstream `<name>_internal`\n * named export (used internally by `state-managers-uiapi` for\n * cross-state-manager wiring and tests) is deliberately not re-exported —\n * uplifted customer LWCs only consume the default. See spec §8.4 / §10.4.\n */\nexport function buildStateManagerCompositionBody(\n\tname: string,\n\tcfg: LdsStateManagerConfig,\n\tspecifier: string,\n): string {\n\tif (isGraphqlStateManagerSpecifier(specifier)) {\n\t\tconst graphqlCfg = { mcp: { toolName: cfg.mcp?.toolName } };\n\t\treturn [\n\t\t\tSTATE_MANAGER_FLAG_PROLOGUE,\n\t\t\t`import { ${cfg.factoryName} } from ${JSON.stringify(cfg.factoryModule)};`,\n\t\t\t`const __getCommand_${name} = createGraphqlStateManagerCommand(${JSON.stringify(name)}, ${JSON.stringify(graphqlCfg)});`,\n\t\t\t`export default ${cfg.factoryName}(__getCommand_${name});`,\n\t\t].join(\"\\n\");\n\t}\n\tconst synthesizedCfg = {\n\t\ttype: \"imperative-read\" as const,\n\t\tinvokerShape: \"legacy\" as const,\n\t\tmcp: { toolName: cfg.mcp?.toolName },\n\t\tconfigJsonSchema: cfg.configJsonSchema,\n\t};\n\treturn [\n\t\tSTATE_MANAGER_FLAG_PROLOGUE,\n\t\t`import { ${cfg.factoryName} } from ${JSON.stringify(cfg.factoryModule)};`,\n\t\t`const __cfg_${name} = ${JSON.stringify(synthesizedCfg)};`,\n\t\t`const __imperativeAdapter_${name} = createReadAdapter(${JSON.stringify(name)}, __cfg_${name});`,\n\t\t`export default ${cfg.factoryName}(__imperativeAdapter_${name});`,\n\t].join(\"\\n\");\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Splits the brace-content of a named-import statement into its individual\n * specifiers, surfacing both the original (pre-`as`) name and the full\n * `<original> as <local>` form. Used by the lds plugin's transform hook to\n * decide which names to rewrite to the virtual module.\n */\nexport function parseImportSpecifiers(bracesContent: string): { original: string; full: string }[] {\n\treturn bracesContent\n\t\t.split(\",\")\n\t\t.map((s) => s.trim())\n\t\t.filter(Boolean)\n\t\t.map((entry) => {\n\t\t\tconst asIdx = entry.indexOf(\" as \");\n\t\t\tconst original = asIdx !== -1 ? entry.slice(0, asIdx).trim() : entry.trim();\n\t\t\treturn { original, full: entry };\n\t\t});\n}\n\n/**\n * Removes top-level ES-module `export` keywords from the embedded runtime\n * source so its declarations survive as private bindings inside the virtual\n * module. Handles two shapes:\n * 1. Per-declaration: `export function foo …` / `export async function foo`\n * → the `export ` prefix is dropped.\n * 2. Trailing re-export clause: `export { foo, bar };` → deleted entirely.\n * Inner occurrences (inside function bodies, comments, strings) are not\n * affected because the source is a flat module with exports only at column 0.\n *\n * Internal: only `adapterBaseSource` is on the public deep-import surface;\n * the strip itself is an implementation detail.\n */\nfunction stripTopLevelExports(source: string): string {\n\treturn source\n\t\t.replace(/^export\\s+(?=(?:async\\s+)?function\\s)/gm, \"\")\n\t\t.replace(/^export\\s*\\{[^}]*};?\\s*$/gm, \"\");\n}\n\n// the source of the adapter base module — reused across virtual modules so\n// each generated specifier emits the factories once.\n//\n// Top-level exports from the runtime module are stripped so every factory and\n// `gql` becomes a private binding inside the virtual module. The load hook\n// then controls exactly which names are exported per specifier: adapter\n// entries from the registry, plus `gql` for graphql specifiers. Without this,\n// the built `runtime.js` (trailing `export { …, gql, createWireAdapter, … }`)\n// and the source `runtime.ts` (per-declaration `export function gql …`) both\n// produce a `SyntaxError: Duplicate export of 'gql'` when the load hook also\n// appends `export { gql };`. They also leak the factory names as exports on\n// every LDS virtual module, which isn't a public contract we want.\nexport const adapterBaseSource = stripTopLevelExports(\n\treadFileSync(join(dirname(fileURLToPath(import.meta.url)), \"runtime.js\"), \"utf-8\"),\n);\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport { init, parse } from \"es-module-lexer\";\nimport MagicString from \"magic-string\";\nimport type { Plugin } from \"vite\";\nimport { isGraphqlSpecifier } from \"./adapters\";\nimport {\n\tGRAPHQL_TOOL,\n\ttype LdsRegistry,\n\ttype LdsRegistryEntry,\n\tOBJECT_INFO_SCHEMA,\n\tOBJECT_INFO_TOOL,\n\tRECORD_SCHEMA,\n\tRECORD_TOOL,\n} from \"./common-mcp-tooling\";\nimport { buildStateManagerCompositionBody, isStateManagerSpecifier } from \"./state-managers\";\nimport { adapterBaseSource, parseImportSpecifiers } from \"./util\";\nimport type { PassthroughRule } from \"../../types\";\n\n// Re-export the public type surface. Consumers (and `providers/index.ts`)\n// continue to import every registry-entry type from `./lds/index`.\nexport type {\n\tLdsMcpDispatch,\n\tLdsRegistry,\n\tLdsRegistryEntry,\n\tLdsRegistryEntryBase,\n\tLdsSchemaValidatedEntry,\n} from \"./common-mcp-tooling\";\nexport type {\n\tLdsGraphqlImperativeReadAdapterConfig,\n\tLdsGraphqlImperativeReadInvokerShape,\n\tLdsGraphqlMutationAdapterConfig,\n\tLdsGraphqlWireAdapterConfig,\n\tLdsImperativeMutationAdapterConfig,\n\tLdsImperativeReadAdapterConfig,\n\tLdsImperativeReadInvokerShape,\n\tLdsWireAdapterConfig,\n} from \"./adapters\";\nexport type { LdsStateManagerConfig } from \"./state-managers\";\n\n// prefix to write into transformed source code\nconst ADAPTER_PREFIX = \"sf-lds-adapter:\";\n// prefix used to ID the adapter when loading the virtual module\nconst ADAPTER_ID_PREFIX = \"\\0\" + ADAPTER_PREFIX;\n\n/**\n * Default registry.\n * Maps LDS module specifiers to MCP tool-backed implementations. Entries can be\n * wire adapters (`type: 'wire'`), imperative mutations (`type: 'imperative-mutation'`),\n * imperative reads (`type: 'imperative-read'` + `invokerShape`), GraphQL variants,\n * or state managers. Add entries here to support additional lightning/* exports.\n */\nconst DEFAULT_REGISTRY: LdsRegistry = {\n\t\"lightning/uiRecordApi\": {\n\t\tgetRecord: {\n\t\t\ttype: \"wire\",\n\t\t\tmcp: { toolName: RECORD_TOOL },\n\t\t\tconfigJsonSchema: RECORD_SCHEMA,\n\t\t},\n\t\tcreateRecord: {\n\t\t\ttype: \"imperative-mutation\",\n\t\t\tmcp: { toolName: \"createRecordMcpTool\" },\n\t\t\tconfigJsonSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\tapiName: { type: \"string\" },\n\t\t\t\t\tfields: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {},\n\t\t\t\t\t\trequired: [],\n\t\t\t\t\t\tadditionalProperties: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [\"apiName\", \"fields\"],\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t},\n\t\tupdateRecord: {\n\t\t\ttype: \"imperative-mutation\",\n\t\t\tmcp: { toolName: \"updateRecordMcpTool\" },\n\t\t\tconfigJsonSchema: {\n\t\t\t\ttype: \"object\",\n\t\t\t\tproperties: {\n\t\t\t\t\trecordId: { type: \"string\" },\n\t\t\t\t\tfields: {\n\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\tproperties: {},\n\t\t\t\t\t\trequired: [],\n\t\t\t\t\t\tadditionalProperties: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\trequired: [\"recordId\", \"fields\"],\n\t\t\t\tadditionalProperties: false,\n\t\t\t},\n\t\t},\n\t},\n\t\"lightning/uiObjectInfoApi\": {\n\t\t// On-platform this is a `{ invoke, subscribe }` callback surface\n\t\t// emitting `{ data, error }`. The legacy invoker shape preserves that\n\t\t// contract verbatim, so ported consumers keep their call sites.\n\t\tgetObjectInfo_imperative: {\n\t\t\ttype: \"imperative-read\",\n\t\t\tinvokerShape: \"legacy\",\n\t\t\tmcp: { toolName: OBJECT_INFO_TOOL },\n\t\t\tconfigJsonSchema: OBJECT_INFO_SCHEMA,\n\t\t},\n\t},\n\t// `lightning/graphql` — on-platform exports `gql`, the `graphql` wire\n\t// adapter, and `executeMutation`. Only `graphql` and `executeMutation`\n\t// are registry entries; `gql` rides along automatically for any specifier\n\t// that has at least one graphql-typed entry (emitted by the load hook).\n\t\"lightning/graphql\": {\n\t\tgraphql: { type: \"graphql-wire\", mcp: { toolName: GRAPHQL_TOOL } },\n\t\texecuteMutation: { type: \"graphql-mutation\", mcp: { toolName: GRAPHQL_TOOL } },\n\t},\n\t// `lightning/stateManagerGraphQL` — externalized graphql state manager.\n\t// The load hook imports `createSmGraphQL` from the upstream\n\t// `@salesforce/state-managers-uiapi/factory` barrel — a thin\n\t// per-state-manager wrapper around `createStateManager` that bakes in\n\t// the required (`['query']`) / optional (`['variables', 'operationName']`)\n\t// config keys, mirroring `createSmRecord` / `createSmObjectInfo`. The\n\t// same factory wraps the call site on-core via `bindings/bindings.ts`,\n\t// so off-core composition fidelity is preserved without on-core service\n\t// plumbing leaking into this side.\n\t//\n\t// Per §10.3 the registry only ever has `default` as its key — the\n\t// `createSmGraphQL` return value is itself the `default` export of\n\t// the virtual module.\n\t//\n\t// `configJsonSchema` is omitted: off-core graphql forgoes the on-core\n\t// `assertIsValid` / `resolveAndValidateGraphQLConfig` validation layer\n\t// (§4 Non-goal 9), and the load-hook graphql path doesn't read the\n\t// field anyway — malformed configs surface as MCP tool errors at\n\t// execute time instead.\n\t\"lightning/stateManagerGraphQL\": {\n\t\tdefault: {\n\t\t\ttype: \"state-manager\",\n\t\t\tfactoryModule: \"@salesforce/state-managers-uiapi/factory\",\n\t\t\tfactoryName: \"createSmGraphQL\",\n\t\t\tmcp: { toolName: GRAPHQL_TOOL },\n\t\t},\n\t},\n\t// State-manager specifier for ObjectInfo (spec §8.3 / §10.3). The load hook\n\t// synthesizes a legacy-shape imperative-read adapter inline from\n\t// (mcp.toolName, configJsonSchema) and feeds it to the upstream\n\t// `createSmObjectInfo` factory. Reuses the shared `OBJECT_INFO_TOOL` /\n\t// `OBJECT_INFO_SCHEMA` so this entry stays in lock-step with the\n\t// `lightning/uiObjectInfoApi.getObjectInfo_imperative` entry above —\n\t// both back the same UIAPI ObjectInfo MCP tool.\n\t\"lightning/stateManagerObjectInfo\": {\n\t\tdefault: {\n\t\t\ttype: \"state-manager\",\n\t\t\tfactoryModule: \"@salesforce/state-managers-uiapi/factory\",\n\t\t\tfactoryName: \"createSmObjectInfo\",\n\t\t\tmcp: { toolName: OBJECT_INFO_TOOL },\n\t\t\tconfigJsonSchema: OBJECT_INFO_SCHEMA,\n\t\t},\n\t},\n\t// `lightning/stateManagerRecord` — UIAPI Record state-manager. Per spec\n\t// §10.3 the registry only ever has a single `default` key; the load hook\n\t// synthesizes a legacy-shape imperative-read adapter from\n\t// (mcp.toolName, configJsonSchema) and feeds it into the upstream\n\t// `createSmRecord` factory to produce the externalized state manager.\n\t// Reuses the shared `RECORD_TOOL` / `RECORD_SCHEMA` so the wire and\n\t// state-manager paths stay anchored to a single MCP-tool / config\n\t// contract.\n\t\"lightning/stateManagerRecord\": {\n\t\tdefault: {\n\t\t\ttype: \"state-manager\",\n\t\t\tfactoryModule: \"@salesforce/state-managers-uiapi/factory\",\n\t\t\tfactoryName: \"createSmRecord\",\n\t\t\tmcp: { toolName: RECORD_TOOL },\n\t\t\tconfigJsonSchema: RECORD_SCHEMA,\n\t\t},\n\t},\n};\n\n/** Maps an entry discriminator to the factory name emitted in the virtual module. */\nfunction factoryFor(type: LdsRegistryEntry[\"type\"]): string {\n\tswitch (type) {\n\t\tcase \"wire\":\n\t\t\treturn \"createWireAdapter\";\n\t\tcase \"imperative-mutation\":\n\t\t\treturn \"createMutationAdapter\";\n\t\tcase \"imperative-read\":\n\t\t\treturn \"createReadAdapter\";\n\t\tcase \"graphql-wire\":\n\t\t\treturn \"createGraphQLWireAdapter\";\n\t\tcase \"graphql-mutation\":\n\t\t\treturn \"createGraphQLMutationAdapter\";\n\t\tcase \"graphql-imperative-read\":\n\t\t\treturn \"createGraphQLImperativeReadAdapter\";\n\t\tcase \"state-manager\":\n\t\t\t// Load-hook directive name (consumed in W-05), not a runtime-import\n\t\t\t// factory: the load hook synthesizes an adapter inline and calls\n\t\t\t// the upstream factoryModule/factoryName to compose the state manager.\n\t\t\treturn \"createStateManagerComposition\";\n\t}\n}\n\n/**\n * Deep-merges user overrides onto the default registry: every specifier from\n * both sides is preserved, and per-specifier entries are merged so a consumer\n * can override `getRecord` without losing `createRecord`, or register a new\n * entry on `lightning/graphql` without losing `graphql` / `executeMutation`.\n * Pass an empty object to get just the defaults. To opt out of a default\n * entry, pass the same specifier with a different entry of the same key.\n */\nfunction mergeWithDefaults(overrides: LdsRegistry): LdsRegistry {\n\tconst merged: LdsRegistry = { ...DEFAULT_REGISTRY };\n\tfor (const [specifier, entries] of Object.entries(overrides)) {\n\t\tmerged[specifier] = { ...(DEFAULT_REGISTRY[specifier] ?? {}), ...entries };\n\t}\n\treturn merged;\n}\n\n/**\n * LDS provider — rewrites registered `lightning/*` imports (e.g.\n * `lightning/uiRecordApi`) to MCP-tool-backed virtual modules. Unregistered\n * exports pass through to the normal `lightning/*` resolution.\n *\n * Three Vite hooks do the work:\n *\n * - **`transform`** — parses each `.js` / `.ts` file with `es-module-lexer`,\n * finds named imports from registered specifiers, and rewrites them to pull\n * registered names from `sf-lds-adapter:<specifier>` while leaving\n * unregistered names pointing at the original specifier.\n *\n * - **`resolveId`** — maps `sf-lds-adapter:<specifier>` to a `\\0`-prefixed\n * virtual module ID, preventing Rollup from attempting a filesystem lookup.\n *\n * - **`load`** — generates the virtual module, emitting an MCP-backed\n * `createWireAdapter(...)` class for every `type: 'wire'` entry,\n * `createMutationAdapter(...)` for every `type: 'imperative-mutation'` entry,\n * and `createReadAdapter(...)` for every `type: 'imperative-read'` entry.\n *\n * Only specifiers present in the `adapters` registry are intercepted; imports from\n * unregistered specifiers pass through unchanged.\n */\nexport function lds(overrides: LdsRegistry = {}): Plugin & { passthroughRules: PassthroughRule[] } {\n\tconst adapters = mergeWithDefaults(overrides);\n\t// Graphql specifiers are owned whole by the virtual module — every export\n\t// (adapters + `gql`) lives there, so the transform hook should not split\n\t// their imports. Non-graphql specifiers still go through transform so\n\t// unregistered names pass through to the real `lightning/*` module.\n\tconst graphqlSpecifiers = new Set<string>(\n\t\tObject.entries(adapters)\n\t\t\t.filter(([, moduleAdapters]) => isGraphqlSpecifier(moduleAdapters))\n\t\t\t.map(([specifier]) => specifier),\n\t);\n\t// State-manager specifiers (`lightning/stateManager*`) are also owned\n\t// whole by the virtual module: their load-hook body emits `export default\n\t// <factory>(...)` per §10.4, so the public consumer surface is a default\n\t// import. The transform hook only rewrites brace-style named imports, so\n\t// state-manager specifiers are excluded from `transformSpecifiers` and\n\t// claimed in `resolveId` directly — same pattern as graphql specifiers.\n\tconst stateManagerSpecifiers = new Set<string>(\n\t\tObject.entries(adapters)\n\t\t\t.filter(([, moduleAdapters]) => isStateManagerSpecifier(moduleAdapters))\n\t\t\t.map(([specifier]) => specifier),\n\t);\n\tconst transformSpecifiers = Object.keys(adapters).filter(\n\t\t(s) => !graphqlSpecifiers.has(s) && !stateManagerSpecifiers.has(s),\n\t);\n\tconst specifierSnippets = transformSpecifiers.flatMap((s) => [`'${s}'`, `\"${s}\"`]);\n\n\t// State-manager `factoryModule` specifiers (e.g.\n\t// `@salesforce/state-managers-uiapi/factory`) are imported from inside the\n\t// emitted virtual module and must reach their real npm package — not the\n\t// scoped-providers fallback. The fallback would otherwise claim them via\n\t// any broad `@salesforce/` interceptPrefix derived from co-installed\n\t// providers (i18n / label / gate). Surface them as passthroughRules so the\n\t// main plugin can hand them to scopedProviders, which short-circuits when\n\t// the importer is one of our `sf-lds-adapter:` virtual modules.\n\tconst factoryModuleSpecifiers = new Set<string>();\n\tfor (const moduleAdapters of Object.values(adapters)) {\n\t\tfor (const entry of Object.values(moduleAdapters)) {\n\t\t\tif (entry.type === \"state-manager\") {\n\t\t\t\tfactoryModuleSpecifiers.add(entry.factoryModule);\n\t\t\t}\n\t\t}\n\t}\n\tconst passthroughRules: PassthroughRule[] = [...factoryModuleSpecifiers].map((specifier) => ({\n\t\tspecifierPrefix: specifier,\n\t\timporterPattern: ADAPTER_PREFIX,\n\t}));\n\n\tconst plugin: Plugin = {\n\t\tname: \"vite-plugin-lds\",\n\t\tenforce: \"pre\",\n\n\t\tasync transform(code, id) {\n\t\t\tconst cleanId = id.split(\"?\")[0] ?? id;\n\t\t\tif (!cleanId.endsWith(\".js\") && !cleanId.endsWith(\".ts\")) return null;\n\t\t\tif (cleanId.includes(\"/node_modules/\")) return null;\n\t\t\tif (!specifierSnippets.some((snippet) => code.includes(snippet))) return null;\n\n\t\t\tawait init;\n\n\t\t\tlet imports: ReturnType<typeof parse>[0];\n\t\t\ttry {\n\t\t\t\t[imports] = parse(code);\n\t\t\t} catch {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst relevant = imports.filter(\n\t\t\t\t(imp) =>\n\t\t\t\t\timp.d === -1 && imp.n !== undefined && imp.n in adapters && !graphqlSpecifiers.has(imp.n),\n\t\t\t);\n\t\t\tif (relevant.length === 0) return null;\n\n\t\t\tconst s = new MagicString(code);\n\t\t\tlet changed = false;\n\n\t\t\tfor (const imp of relevant) {\n\t\t\t\tconst { ss: start, se: end, n: specifier } = imp;\n\t\t\t\tconst statement = code.slice(start, end);\n\n\t\t\t\tconst openBrace = statement.indexOf(\"{\");\n\t\t\t\tconst closeBrace = statement.indexOf(\"}\");\n\t\t\t\tif (openBrace === -1 || closeBrace === -1) continue;\n\n\t\t\t\tconst bracesContent = statement.slice(openBrace + 1, closeBrace);\n\t\t\t\tconst moduleAdapters = adapters[specifier!]!;\n\t\t\t\tconst parsedImport = parseImportSpecifiers(bracesContent);\n\t\t\t\tconst registered = parsedImport.filter((p) => p.original in moduleAdapters);\n\t\t\t\tconst unregistered = parsedImport.filter((p) => !(p.original in moduleAdapters));\n\n\t\t\t\tif (registered.length === 0) continue;\n\n\t\t\t\tconst parts: string[] = [\n\t\t\t\t\t`import { ${registered.map((p) => p.full).join(\", \")} } from '${ADAPTER_PREFIX}${specifier}';`,\n\t\t\t\t];\n\n\t\t\t\tif (unregistered.length > 0) {\n\t\t\t\t\tparts.push(\n\t\t\t\t\t\t`import { ${unregistered.map((p) => p.full).join(\", \")} } from '${specifier}';`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\ts.overwrite(start, end, parts.join(\"\\n\"));\n\t\t\t\tchanged = true;\n\t\t\t}\n\n\t\t\tif (!changed) return null;\n\t\t\treturn { code: s.toString(), map: s.generateMap({ hires: true }) };\n\t\t},\n\n\t\tresolveId(id) {\n\t\t\t// Graphql + state-manager specifiers are intercepted raw — no\n\t\t\t// transform hook split — and mapped into the same\n\t\t\t// `\\0sf-lds-adapter:` virtual namespace so the load hook emits one\n\t\t\t// module per specifier. State-manager modules expose `default` as\n\t\t\t// their only public export (§10.4), so default imports of\n\t\t\t// `lightning/stateManager*` need this interception to reach the\n\t\t\t// virtual module body.\n\t\t\tif (graphqlSpecifiers.has(id) || stateManagerSpecifiers.has(id)) {\n\t\t\t\treturn ADAPTER_ID_PREFIX + id;\n\t\t\t}\n\t\t\tif (id.startsWith(ADAPTER_PREFIX)) return ADAPTER_ID_PREFIX + id.slice(ADAPTER_PREFIX.length);\n\t\t\treturn null;\n\t\t},\n\n\t\tload(id) {\n\t\t\tif (!id.startsWith(ADAPTER_ID_PREFIX)) return null;\n\n\t\t\tconst specifier = id.slice(ADAPTER_ID_PREFIX.length);\n\t\t\tconst moduleAdapters = adapters[specifier];\n\t\t\tif (!moduleAdapters) return null;\n\n\t\t\t// create lines of code used to create MCP tool based adapters\n\t\t\tconst lines: string[] = [adapterBaseSource];\n\t\t\tfor (const [name, entry] of Object.entries(moduleAdapters)) {\n\t\t\t\tif (entry.type === \"state-manager\") {\n\t\t\t\t\t// State-manager entries do not call a runtime factory like\n\t\t\t\t\t// the other types. Per spec §8.4 / §10.4, the load hook\n\t\t\t\t\t// emits a small composition block that synthesizes a\n\t\t\t\t\t// legacy-shape imperative adapter inline and feeds it into\n\t\t\t\t\t// the upstream `<factoryName>` from `<factoryModule>`.\n\t\t\t\t\tlines.push(buildStateManagerCompositionBody(name, entry, specifier));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst { type, ...cfg } = entry;\n\t\t\t\tlines.push(\n\t\t\t\t\t`export const ${name} = ${factoryFor(type)}(${JSON.stringify(name)}, ${JSON.stringify(cfg)});`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t// `gql` rides along with any specifier that declares a graphql\n\t\t\t// adapter, so `import { gql } from 'lightning/graphql'` (or any\n\t\t\t// aliased form) keeps resolving even when no adapters are\n\t\t\t// imported alongside it. The binding itself is a private function\n\t\t\t// inside `adapterBaseSource` after `stripTopLevelExports`.\n\t\t\tif (graphqlSpecifiers.has(specifier)) {\n\t\t\t\tlines.push(\"export { gql };\");\n\t\t\t}\n\t\t\treturn lines.join(\"\\n\");\n\t\t},\n\t};\n\treturn Object.assign(plugin, { passthroughRules });\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sources":["../../../src/providers/shared/normalize-mcp-response.ts","../../../src/providers/lds/runtime.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\n\n/**\n * Unwraps the MCP tool transport envelope and returns the tool's payload as-is.\n *\n * Handles the three surface shapes `sdk.callTool()` can resolve with:\n * - MCP Apps surface: `{ structuredContent, content }`\n * - OpenAI surface: `{ result: \"<JSON string>\" }`, where the JSON may itself be\n * an MCP content array (`[{ type: 'text', text: \"<JSON string>\" }, ...]`)\n * - Fallback: the raw value returned by `callTool`\n *\n * The shape of the unwrapped payload is the tool's responsibility — this helper\n * does not project out `data` / `error` / `errors`. Callers read whichever keys\n * their tool contract defines.\n */\nexport function normalizeMcpResponse(raw: unknown): unknown {\n\tif (raw && typeof raw === \"object\" && \"structuredContent\" in raw) {\n\t\treturn (raw as { structuredContent: unknown }).structuredContent;\n\t}\n\n\tif (raw && typeof raw === \"object\" && typeof (raw as { result?: unknown }).result === \"string\") {\n\t\tconst parsed = JSON.parse((raw as { result: string }).result);\n\t\tif (Array.isArray(parsed)) {\n\t\t\tconst textBlock = parsed.find(\n\t\t\t\t(b: { type?: string; text?: string }) =>\n\t\t\t\t\tb && b.type === \"text\" && typeof b.text === \"string\",\n\t\t\t);\n\t\t\tconst text = textBlock ? textBlock.text : null;\n\t\t\tif (text) {\n\t\t\t\treturn JSON.parse(text);\n\t\t\t}\n\t\t\treturn {};\n\t\t}\n\t\treturn parsed;\n\t}\n\n\treturn raw ?? {};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type { ResultCommand, SubscribableResultCommand } from \"@conduit-client/bindings-utils/v1\";\nimport type { assertIsValid, JSONSchema } from \"@conduit-client/jsonschema-validate\";\nimport {\n\tbuildDefaultImperativeBindingsServiceDescriptor,\n\tbuildLegacyImperativeBindingsServiceDescriptor,\n\tbuildQueryImperativeBindingsServiceDescriptor,\n\tbuildSubscribableImperativeBindingsServiceDescriptor,\n} from \"@conduit-client/service-bindings-imperative/v1\";\nimport { buildLWCWireBindingsServiceDescriptor } from \"@conduit-client/service-bindings-lwc/v1\";\nimport {\n\tbuildSubscribableResult,\n\terr,\n\tok,\n\ttoError,\n\tUserVisibleError,\n\ttype Callback,\n\ttype Result,\n\ttype Unsubscribe,\n} from \"@conduit-client/utils\";\nimport { getChatSDK } from \"@salesforce/platform-sdk\";\nimport type { ReadInvokerShape } from \"./types\";\nimport { normalizeMcpResponse } from \"../shared/normalize-mcp-response\";\n\n/**\n * Runtime mirror of the public `LdsRegistryEntryBase` — adapters dispatch\n * through `cfg.mcp?.toolName`. Kept nominal-free so the virtual module can\n * cheaply deserialize the JSON-stringified config written by the load hook.\n */\ninterface McpBackedAdapterConfig {\n\tmcp?: { toolName: string };\n}\n\n/**\n * LDS adapter configs whose input is validated against a JSON Schema at\n * invoke time. Wire, mutation, and read factories all consume this shape;\n * graphql factories skip the schema layer entirely.\n */\ninterface SchemaValidatedAdapterConfig extends McpBackedAdapterConfig {\n\tconfigJsonSchema: JSONSchema;\n}\n\ntype WireAdapterConfig = SchemaValidatedAdapterConfig;\n\ntype MutationAdapterConfig = SchemaValidatedAdapterConfig;\n\ninterface ReadAdapterConfig extends SchemaValidatedAdapterConfig {\n\tinvokerShape: ReadInvokerShape;\n}\n\n/**\n * Resolves the MCP tool name for an adapter config, or throws if none of the\n * supported backings are set. Today only `mcp` is wired up; future backings\n * (e.g. `http`) will be resolved in the same choke point.\n */\nfunction resolveMcpToolName(adapterName: string, cfg: McpBackedAdapterConfig): string {\n\tconst toolName = cfg.mcp?.toolName;\n\tif (!toolName) {\n\t\tthrow new Error(`[${adapterName}] no dispatch backing configured — expected \\`mcp.toolName\\`.`);\n\t}\n\treturn toolName;\n}\n\n/**\n * Optional envelope splitter. Converts the normalized MCP payload into a\n * `Result<Data, Error>` — used by the wire adapter so tools that return\n * `{ data, error }` land on OneStore's Err branch when `error` is set.\n * Imperative callers leave this unset and get the raw payload wrapped in\n * `ok(...)`.\n */\ntype UnwrapEnvelope<Data> = (payload: unknown) => Result<Data, Error>;\n\n/**\n * Resolves the MCP chat SDK and returns its `callTool` function, or throws a\n * consistent \"[adapter] sdk.callTool is not available\" error. Shared by the\n * LDS `McpToolCommand` and the graphql `runGraphqlQuery` — the check and\n * message are identical on both paths.\n */\nasync function getCallTool(\n\tadapterName: string,\n): Promise<(args: { toolName: string; params?: Record<string, unknown> }) => Promise<unknown>> {\n\tconst sdk = await getChatSDK();\n\tif (typeof sdk.callTool !== \"function\") {\n\t\tthrow new Error(\n\t\t\t`[${adapterName}] sdk.callTool is not available on this surface. ` +\n\t\t\t\t\"Make sure window.openai is configured or the component is running \" +\n\t\t\t\t\"in an MCP Apps / OpenAI chat context.\",\n\t\t);\n\t}\n\treturn sdk.callTool.bind(sdk);\n}\n\n/**\n * Pulls a human-readable message out of an MCP error response\n * (`{ isError: true, content: [{ type: 'text', text: ... }, ...] }`).\n * Returns an empty string if no text content is present so the caller can\n * supply a fallback.\n */\nfunction extractToolErrorText(raw: unknown): string {\n\tconst content = (raw as { content?: unknown }).content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.map((c) => {\n\t\t\tif (c && typeof c === \"object\" && (c as { type?: string }).type === \"text\") {\n\t\t\t\treturn (c as { text?: string }).text ?? \"\";\n\t\t\t}\n\t\t\treturn \"\";\n\t\t})\n\t\t.join(\" \")\n\t\t.trim();\n}\n\n/**\n * `Command` implementation that calls the configured MCP tool. One class,\n * reused across imperative and wire adapters.\n *\n * `execute()` returns a `Result<Data, unknown>`:\n * - `ok(data)` when the tool resolves — `data` is the unwrapped payload from\n * `normalizeMcpResponse` (or the result of the optional `unwrap` hook).\n * - `err(error)` when the tool rejects, when `sdk.callTool` is unavailable,\n * or when the `unwrap` hook returns `err(...)`.\n *\n * OneStore's `DefaultImperativeBindingsService` wraps this: on `ok(v)` it\n * deep-freezes and returns `v`; on `err(e)` it re-throws via `toError`. Sync\n * throws from `assertIsValid` in the `getCommand` factory are funneled through\n * `throwUserlandError`. `LWCWireBindingsService` wraps the same command\n * differently — it emits `{ data, error }` to the wire callback and attaches\n * freeze / race-guard / incomplete-config behavior.\n */\nclass McpToolCommand<Data> implements ResultCommand<Data, Error> {\n\tconstructor(\n\t\tprivate readonly adapterName: string,\n\t\tprivate readonly toolName: string,\n\t\tprivate readonly params: unknown,\n\t\tprivate readonly unwrap?: UnwrapEnvelope<Data>,\n\t) {}\n\n\tasync execute(): Promise<Result<Data, Error>> {\n\t\ttry {\n\t\t\tconst callTool = await getCallTool(this.adapterName);\n\t\t\tconst raw = await callTool({\n\t\t\t\ttoolName: this.toolName,\n\t\t\t\tparams: (this.params as Record<string, unknown>) ?? undefined,\n\t\t\t});\n\t\t\t// The MCP SDK converts handler throws into a resolved tool response\n\t\t\t// with `{ isError: true, content: [...] }` — not a transport\n\t\t\t// rejection. Surface it as an Err here so the default invoker\n\t\t\t// re-throws and the wire/legacy adapters route it through their\n\t\t\t// error channel.\n\t\t\tif (raw && typeof raw === \"object\" && (raw as { isError?: boolean }).isError) {\n\t\t\t\treturn err(new Error(extractToolErrorText(raw) || \"MCP tool error\"));\n\t\t\t}\n\t\t\tconst payload = normalizeMcpResponse(raw);\n\t\t\treturn this.unwrap ? this.unwrap(payload) : ok(payload as Data);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e : new Error(String(e)));\n\t\t}\n\t}\n}\n\n// Off-platform has no store to observe. For shapes that have no `refresh`,\n// nothing can ever trigger a post-initial update, so `subscribe` is a\n// deliberate no-op: the callback never fires and the returned unsubscribe is\n// idempotent. Shapes that *do* expose `refresh` wire subscribers into the\n// refresh path instead (see `McpToolSubscribableCommand` and the\n// `query-refreshable` graphql shape).\nconst noopUnsubscribe: Unsubscribe = () => {\n\t// no store to unsubscribe from off-platform\n};\nconst noopSubscribe = (_cb: unknown): Unsubscribe => noopUnsubscribe;\n\n/**\n * Adapts `McpToolCommand` into a `SubscribableResultCommand`. Wraps the\n * command's `Result` with `buildSubscribableResult`, supplying:\n * - `subscribe`: per-execution subscriber set. Each `execute()` call has\n * its own set so sibling invocations don't cross-pollinate. Returned\n * unsubscribe removes the callback and is idempotent.\n * - `refresh`: builds a fresh `McpToolCommand`, re-executes it, and\n * broadcasts the fresh `Result` to every registered subscriber before\n * resolving. Returns `Result<void, Error>` (ok → undefined; err → the\n * error from the fresh execute).\n *\n * Wiring subscribers into refresh mirrors on-platform behavior, where the\n * reactive store fans `refresh` results out to every listener. Off-platform\n * there is no store, so the subscriber set lives on the command itself. This\n * shim is what lets OneStore's Subscribable and Legacy services run verbatim\n * against MCP: their invokers gate on `isSubscribableResult`, which requires\n * the command's `execute()` to resolve a `SubscribableResult` (not a plain\n * `Result`).\n */\nclass McpToolSubscribableCommand<Data> implements SubscribableResultCommand<Data, Error> {\n\tconstructor(\n\t\tprivate readonly adapterName: string,\n\t\tprivate readonly toolName: string,\n\t\tprivate readonly params: unknown,\n\t\tprivate readonly unwrap?: UnwrapEnvelope<Data>,\n\t) {}\n\n\tasync execute() {\n\t\tconst base = new McpToolCommand<Data>(\n\t\t\tthis.adapterName,\n\t\t\tthis.toolName,\n\t\t\tthis.params,\n\t\t\tthis.unwrap,\n\t\t);\n\t\tconst result = await base.execute();\n\t\tconst subscribers = new Set<Callback<Result<Data, Error>>>();\n\t\tconst subscribe = (cb: Callback<Result<Data, Error>>): Unsubscribe => {\n\t\t\tsubscribers.add(cb);\n\t\t\treturn () => {\n\t\t\t\tsubscribers.delete(cb);\n\t\t\t};\n\t\t};\n\t\tconst refresh = async () => {\n\t\t\tconst next = await new McpToolCommand<Data>(\n\t\t\t\tthis.adapterName,\n\t\t\t\tthis.toolName,\n\t\t\t\tthis.params,\n\t\t\t\tthis.unwrap,\n\t\t\t).execute();\n\t\t\tsubscribers.forEach((cb) => cb(next));\n\t\t\treturn next.isOk() ? ok<void, Error>(undefined) : err(next.error);\n\t\t};\n\t\treturn buildSubscribableResult(result, subscribe, refresh);\n\t}\n}\n\n/**\n * Off-core graphql state-manager command factory. Returned function feeds\n * `createSmGraphQL(getCommand)` from\n * `@salesforce/lds-adapters-onestore-graphql/factory` — i.e. it intentionally\n * bypasses on-core's `_conduit_client_service_provisioner_v1` services\n * pipeline (instrumentation, normalized cache control, type registry,\n * `assertIsValid`, `resolveAndValidateGraphQLConfig`) and dispatches the\n * graphql query as a plain MCP tool call.\n *\n * The returned per-config command's `execute()` resolves a `Result` whose\n * shape matches what `createStateManager`'s `processQueuedConfig` expects\n * (the upstream `createSmGraphQL` wraps `createStateManager`):\n *\n * - `ok({ data: { data: <payload> }, subscribe, refresh })` — `processQueuedConfig`\n * reads `result.value.data.data` (the payload) and binds\n * `result.value.refresh` for the outer `refresh()` action.\n * - `err({ failure: UserVisibleError-with-{data: GraphQLResponse} })` —\n * `processQueuedConfig` calls `toGraphQLResponseFromFailure(result.error.failure)`\n * which extracts `.data.errors` from the `UserVisibleError`'s data field.\n *\n * `subscribe` and `refresh` are inherited verbatim from\n * `McpToolSubscribableCommand` (per-execution subscriber set, refresh\n * re-executes the tool and broadcasts to subscribers — matches the\n * on-platform contract from a state-manager-consumer perspective).\n *\n * @param name - State-manager name (`'default'` for `lightning/stateManagerGraphQL`).\n * @param cfg - Carries `mcp.toolName`. No `configJsonSchema`: this path\n * deliberately forgoes the on-core schema/`assertIsValid`/\n * `resolveAndValidateGraphQLConfig` validation layer for now;\n * malformed configs surface as MCP tool errors at execute time.\n */\nexport function createGraphqlStateManagerCommand(name: string, cfg: McpBackedAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn (config: GraphqlConfig) => ({\n\t\tasync execute() {\n\t\t\tconst base = new McpToolSubscribableCommand<GraphqlResult>(name, toolName, {\n\t\t\t\tquery: config.query,\n\t\t\t\tvariables: config.variables ?? {},\n\t\t\t\t...(config.operationName !== undefined && { operationName: config.operationName }),\n\t\t\t});\n\t\t\tconst subscribable = await base.execute();\n\t\t\tif (subscribable.isOk()) {\n\t\t\t\treturn ok(subscribable.value);\n\t\t\t}\n\t\t\t// Reshape inner `failure: Error` → `failure: UserVisibleError-with-data`\n\t\t\t// so upstream `toGraphQLResponseFromFailure(result.error.failure)`\n\t\t\t// pulls the MCP error message into `errors[0].message`. Keep the\n\t\t\t// surrounding subscribe/refresh envelope intact so the error value\n\t\t\t// is still a valid `SubscribableBase & { failure }`.\n\t\t\tconst innerError = subscribable.error.failure;\n\t\t\tconst message = innerError.message;\n\t\t\tconst userVisible = new UserVisibleError<GraphqlResult>({\n\t\t\t\tdata: undefined,\n\t\t\t\terrors: [{ message }],\n\t\t\t});\n\t\t\tuserVisible.message = message;\n\t\t\treturn err({ ...subscribable.error, failure: userVisible });\n\t\t},\n\t});\n}\n\nconst defaultImperativeService = buildDefaultImperativeBindingsServiceDescriptor().service;\nconst queryImperativeService = buildQueryImperativeBindingsServiceDescriptor().service;\nconst subscribableImperativeService =\n\tbuildSubscribableImperativeBindingsServiceDescriptor().service;\nconst legacyImperativeService = buildLegacyImperativeBindingsServiceDescriptor().service;\n\n/**\n * Mutation-shape factory. Builds an async `(config) => Promise<Data>` via\n * OneStore's `DefaultImperativeBindingsService`. Throws on validation error\n * (`throwUserlandError`) or tool error (`toError`). This is the only shape a\n * mutation ever takes on platform — mutation adapters do not carry an\n * `invokerShape` at all.\n */\nexport function createMutationAdapter(name: string, cfg: MutationAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tconst getCommand = (options: { params: unknown[]; assertIsValid: typeof assertIsValid }) => {\n\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\treturn new McpToolCommand<unknown>(name, toolName, options.params[0]);\n\t};\n\tconst invoker = defaultImperativeService.bind<unknown[], unknown>(getCommand);\n\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n}\n\n/**\n * Read-shape factory. Dispatches on `cfg.invokerShape`:\n *\n * - `legacy` — `{ invoke, subscribe }` callback surface with `{ data, error }`.\n * `subscribe` fires the callback once from the initial execute's `data`,\n * returns a no-op unsubscribe, and never fires again off-platform.\n * - `query` — `(config) => Promise<{ data }>`; one-shot read.\n * - `subscribable` — `(config) => Promise<{ data, subscribe }>`. Callback\n * passed to `subscribe` never fires; unsubscribe is a no-op.\n * - `subscribable-refreshable` — `(config) => Promise<{ data, subscribe, refresh }>`.\n * `refresh()` re-executes the MCP tool; `subscribe` is still a no-op.\n *\n * All four delegate to an OneStore service (Query / Subscribable / Legacy)\n * over `McpToolSubscribableCommand`, which preserves OneStore's deep-freeze\n * and error-funnel semantics end-to-end.\n */\nexport function createReadAdapter(name: string, cfg: ReadAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tconst getSubscribableCommand = (options: {\n\t\tparams: unknown[];\n\t\tassertIsValid: typeof assertIsValid;\n\t}) => {\n\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\treturn new McpToolSubscribableCommand<unknown>(name, toolName, options.params[0]);\n\t};\n\n\tswitch (cfg.invokerShape) {\n\t\tcase \"query\": {\n\t\t\tconst getCommand = (options: { params: unknown[]; assertIsValid: typeof assertIsValid }) => {\n\t\t\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\t\t\treturn new McpToolCommand<unknown>(name, toolName, options.params[0]);\n\t\t\t};\n\t\t\tconst invoker = queryImperativeService.bind<unknown[], unknown>(getCommand);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"subscribable\": {\n\t\t\tconst invoker = subscribableImperativeService.bind<unknown[], unknown>(\n\t\t\t\tgetSubscribableCommand,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"subscribable-refreshable\": {\n\t\t\tconst invoker = subscribableImperativeService.bind<unknown[], unknown>(\n\t\t\t\tgetSubscribableCommand,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"legacy\": {\n\t\t\t// Legacy service passes `{ config, assertIsValid }`, not `{ params, ... }`.\n\t\t\tconst getLegacyCommand = (options: {\n\t\t\t\tconfig: unknown;\n\t\t\t\tassertIsValid: typeof assertIsValid;\n\t\t\t}) => {\n\t\t\t\toptions.assertIsValid(options.config, cfg.configJsonSchema);\n\t\t\t\treturn new McpToolSubscribableCommand<unknown>(name, toolName, options.config);\n\t\t\t};\n\t\t\treturn legacyImperativeService.bind<unknown, unknown>(getLegacyCommand);\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(\n\t\t\t\t`[${name}] unsupported invokerShape: ${String((cfg as { invokerShape: unknown }).invokerShape)}. ` +\n\t\t\t\t\t`Expected 'legacy' | 'query' | 'subscribable' | 'subscribable-refreshable'.`,\n\t\t\t);\n\t}\n}\n\nconst lwcWireBindingsService = buildLWCWireBindingsServiceDescriptor().service;\n\n/**\n * Splits the MCP tool's `{ data, error }` envelope into a `Result`. Used as\n * the `unwrap` hook on `McpToolCommand` so OneStore's wire invoker sees the\n * error branch directly instead of receiving an envelope wrapped in `ok(...)`.\n *\n * Tools that don't emit the envelope (e.g. imperative) never go through this\n * path — the default imperative invoker doesn't pass `unwrap`.\n */\nfunction unwrapWireEnvelope<Data>(payload: unknown): Result<Data, Error> {\n\tconst envelope = payload as { data?: unknown; error?: unknown } | null | undefined;\n\tif (envelope && envelope.error !== undefined && envelope.error !== null) {\n\t\treturn err(toError(envelope.error));\n\t}\n\treturn ok(envelope?.data as Data);\n}\n\n/**\n * Creates an LWC wire adapter class that calls an MCP tool. Delegates to\n * OneStore's `LWCWireBindingsService`, so the returned class inherits the\n * full `CommandWireAdapterConstructor` contract: initial empty emit, config\n * `sanitize()`, `MissingRequiredPropertyError` → wait-for-next-config gating,\n * deep-freeze on success, race guard on stale resolves, and unsubscriber\n * management on disconnect.\n *\n * The `McpToolCommand` class is reused verbatim — the wire call-site only\n * supplies an `unwrap` hook so the tool's `{ data, error }` envelope lands\n * on OneStore's Err branch rather than being leaked through as an `ok(...)`\n * envelope.\n *\n * @param name - Wire adapter export name, used in MCP error messages.\n * @param cfg - MCP tool name and JSON Schema for valid wire configs.\n */\nexport function createWireAdapter(name: string, cfg: WireAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn lwcWireBindingsService.bind<unknown>(\n\t\t(config) => new McpToolCommand(name, toolName, config, unwrapWireEnvelope),\n\t\tcfg.configJsonSchema,\n\t);\n}\n\n// ─── GraphQL adapters ─────────────────────────────────────────────────────────\n\n/**\n * GraphQL adapters diverge from the base wire / mutation shapes in two ways:\n *\n * 1. Envelope is `{ data, errors[] }` instead of `{ data, error }`. Errors\n * are collected; an empty array collapses to `undefined`.\n * 2. The `_fetch` path routes thrown errors **into** the `errors[]`\n * envelope on the wire callback (never throws to the LWC host). Mutation\n * likewise resolves with `{ data, errors }` rather than rejecting.\n *\n * Dispatch is MCP-only: `getChatSDK().callTool({ toolName, params })` with\n * `normalizeMcpResponse` unwrapping. No `globalThis.__sfdc_sdk__` shortcut —\n * the on-platform behaviour is already covered by real `lightning/graphql`,\n * and every off-platform caller routes through an MCP tool like every other\n * LDS adapter.\n */\ntype GraphqlAdapterConfig = McpBackedAdapterConfig;\n\ninterface GraphqlConfig {\n\tquery: string;\n\tvariables?: Record<string, unknown>;\n\toperationName?: string;\n}\n\ninterface GraphqlResult {\n\tdata?: unknown;\n\terrors?: { message: string }[];\n}\n\ntype GraphqlWireCallback = (result: {\n\tdata: unknown;\n\terrors: { message: string }[] | undefined;\n\trefresh: () => Promise<void>;\n}) => void;\n\n/**\n * Template-literal tag that stitches the string into a plain `query` string.\n * Deliberately minimal — no AST parsing, no fragment substitution, no opaque\n * doc emulation. Matches the shape used by today's off-platform `gql`.\n */\nexport function gql(strings: TemplateStringsArray, ...values: unknown[]): string {\n\tlet result = \"\";\n\tstrings.forEach((string, i) => {\n\t\tresult += string;\n\t\tif (i < values.length) result += String(values[i]);\n\t});\n\treturn result.trim();\n}\n\nasync function runGraphqlQuery(\n\tadapterName: string,\n\ttoolName: string,\n\tconfig: GraphqlConfig,\n): Promise<GraphqlResult> {\n\tconst { query, variables, operationName } = config;\n\tif (!query) return { data: undefined, errors: undefined };\n\n\tconst callTool = await getCallTool(adapterName);\n\tconst raw = await callTool({\n\t\ttoolName,\n\t\tparams: {\n\t\t\tquery,\n\t\t\tvariables: variables ?? {},\n\t\t\t...(operationName !== undefined && { operationName }),\n\t\t},\n\t});\n\n\treturn (normalizeMcpResponse(raw) as GraphqlResult) ?? {};\n}\n\n/** Wraps a thrown Error into the graphql `{ data, errors[] }` envelope. */\nfunction toGraphqlErrorResult(error: unknown): GraphqlResult {\n\treturn { data: undefined, errors: [{ message: (error as Error).message }] };\n}\n\n/**\n * `runGraphqlQuery` wrapped in try/catch so thrown errors land on `errors[]`\n * instead of rejecting. Used by every graphql shape that routes errors\n * in-band (wire, mutation, imperative-read query/query-refreshable, legacy).\n */\nasync function runGraphqlQuerySafe(\n\tadapterName: string,\n\ttoolName: string,\n\tconfig: GraphqlConfig,\n): Promise<GraphqlResult> {\n\ttry {\n\t\treturn await runGraphqlQuery(adapterName, toolName, config);\n\t} catch (error) {\n\t\treturn toGraphqlErrorResult(error);\n\t}\n}\n\n/**\n * GraphQL wire adapter factory. Emits `{ data, errors, refresh }` to the wire\n * callback. Mirrors the `constructor(callback)` → `connect` / `disconnect` /\n * `update(config)` / `refresh()` contract used by the LWC wire service.\n * Thrown fetch errors are routed into `errors[0].message`.\n *\n * `_fetch` is gated on `_connected` so that the common wire lifecycle\n * (`constructor` → `update(config)` → `connect`) doesn't fire two requests:\n * the initial `update(config)` arrives before `connect()`, stores the config,\n * and waits. `connect()` does the one fetch; later `update(config)` while\n * connected re-fetches. This matches luvio's `LWCLuvioWireAdapter`, which\n * gates on the same flag to prevent duplicate endpoint calls.\n */\nexport function createGraphQLWireAdapter(name: string, cfg: GraphqlAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn class {\n\t\t_dataCallback: GraphqlWireCallback;\n\t\t_config: GraphqlConfig | undefined;\n\t\t_connected = false;\n\n\t\tconstructor(dataCallback: GraphqlWireCallback) {\n\t\t\tthis._dataCallback = dataCallback;\n\t\t}\n\n\t\tconnect() {\n\t\t\tthis._connected = true;\n\t\t\tvoid this._fetch();\n\t\t}\n\n\t\tdisconnect() {\n\t\t\tthis._connected = false;\n\t\t}\n\n\t\tupdate(config: GraphqlConfig | undefined) {\n\t\t\tthis._config = config;\n\n\t\t\tif (!this._connected || this._config === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid this._fetch();\n\t\t}\n\n\t\trefresh() {\n\t\t\treturn this._fetch();\n\t\t}\n\n\t\tasync _fetch() {\n\t\t\tthis._emit(await runGraphqlQuerySafe(name, toolName, this._config ?? { query: \"\" }));\n\t\t}\n\n\t\t_emit({ data, errors }: GraphqlResult) {\n\t\t\tthis._dataCallback({\n\t\t\t\tdata,\n\t\t\t\terrors: errors?.length ? errors : undefined,\n\t\t\t\trefresh: () => this.refresh(),\n\t\t\t});\n\t\t}\n\t};\n}\n\n/**\n * GraphQL mutation factory. Returns `async (config) => Promise<{ data, errors }>`.\n * Empty-query guard short-circuits with\n * `{ data: undefined, errors: [{ message: \"No query provided\" }] }`.\n * All other errors are routed in-band to the `errors[]` envelope — the\n * function never rejects.\n */\nexport function createGraphQLMutationAdapter(name: string, cfg: GraphqlAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn async (config: GraphqlConfig): Promise<GraphqlResult> => {\n\t\tif (!config?.query) return { data: undefined, errors: [{ message: \"No query provided\" }] };\n\t\treturn runGraphqlQuerySafe(name, toolName, config);\n\t};\n}\n\ntype GraphqlImperativeReadInvokerShape = \"query\" | \"query-refreshable\" | \"legacy\";\n\ninterface GraphqlImperativeReadAdapterConfig extends GraphqlAdapterConfig {\n\tinvokerShape: GraphqlImperativeReadInvokerShape;\n}\n\ntype GraphqlImperativeResult = GraphqlResult & {\n\tsubscribe?: (cb: (result: GraphqlResult) => void) => Unsubscribe;\n\trefresh?: () => Promise<void>;\n};\n\ntype LegacyGraphqlCallback = (result: GraphqlResult) => void;\n\n/**\n * Imperative GraphQL read factory — single entry point for all imperative\n * graphql read shapes, mirroring the LDS `createReadAdapter` pattern. The\n * `invokerShape` selects the return surface:\n *\n * - `query` — `async (config) => Promise<{ data, errors, subscribe }>`.\n * Mirrors on-platform `GraphQLImperativeBindingsService` without\n * `exposeRefresh`. Errors are routed in-band; the function never throws.\n * - `query-refreshable` — same as `query` plus `refresh()` that re-runs the\n * underlying MCP tool. Mirrors the same service with `exposeRefresh: true`.\n * - `legacy` — `{ invoke(config, context, callback),\n * subscribe(config, context, callback): Unsubscribe }`. The callback\n * always receives `{ data, errors }`; neither method throws. `context` is\n * accepted but ignored.\n *\n * In every shape `subscribe` is a deliberate no-op off-platform (no reactive\n * store); returned unsubscribes are idempotent.\n */\nexport function createGraphQLImperativeReadAdapter(\n\tname: string,\n\tcfg: GraphqlImperativeReadAdapterConfig,\n) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tif (cfg.invokerShape === \"legacy\") {\n\t\tasync function run(\n\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\tcallback: LegacyGraphqlCallback,\n\t\t): Promise<void> {\n\t\t\tif (!config?.query) {\n\t\t\t\tcallback({ data: undefined, errors: undefined });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\tcallback({\n\t\t\t\tdata: result.data,\n\t\t\t\terrors: result.errors?.length ? result.errors : undefined,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tinvoke(\n\t\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\t\t_context: unknown,\n\t\t\t\tcallback: LegacyGraphqlCallback,\n\t\t\t): void {\n\t\t\t\tvoid run(config, callback);\n\t\t\t},\n\t\t\tsubscribe(\n\t\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\t\t_context: unknown,\n\t\t\t\tcallback: LegacyGraphqlCallback,\n\t\t\t): Unsubscribe {\n\t\t\t\tvoid run(config, callback);\n\t\t\t\treturn noopUnsubscribe;\n\t\t\t},\n\t\t};\n\t}\n\n\tif (cfg.invokerShape === \"query-refreshable\") {\n\t\t// Per-invocation subscriber set: each call to the returned function\n\t\t// gets its own adapter instance with an isolated subscriber list.\n\t\t// `refresh()` re-runs the MCP tool and broadcasts the fresh\n\t\t// `{ data, errors }` to every registered callback, which mirrors the\n\t\t// on-platform contract where `refresh` causes store updates that fan\n\t\t// out through the `subscribe` fan-in. Without this wiring, `refresh`\n\t\t// would re-run the query off-platform but nothing could observe the\n\t\t// new payload (no store, noop subscribe).\n\t\treturn async (config: GraphqlConfig): Promise<GraphqlImperativeResult> => {\n\t\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\tif (result.errors?.length) {\n\t\t\t\treturn { data: undefined, errors: result.errors };\n\t\t\t}\n\t\t\tconst subscribers = new Set<(result: GraphqlResult) => void>();\n\t\t\treturn {\n\t\t\t\tdata: result.data,\n\t\t\t\terrors: undefined,\n\t\t\t\tsubscribe: (cb) => {\n\t\t\t\t\tsubscribers.add(cb);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tsubscribers.delete(cb);\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\trefresh: async () => {\n\t\t\t\t\tconst fresh = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\t\t\tconst payload: GraphqlResult = {\n\t\t\t\t\t\tdata: fresh.data,\n\t\t\t\t\t\terrors: fresh.errors?.length ? fresh.errors : undefined,\n\t\t\t\t\t};\n\t\t\t\t\tsubscribers.forEach((cb) => cb(payload));\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\t// `query` shape: no refresh → nothing can trigger a post-initial update\n\t// off-platform, so `subscribe` stays a noop. The on-platform contract\n\t// allows subscribe callbacks to fire from unrelated store writes; off-\n\t// platform there is no store, so the callback is correctly unreachable.\n\treturn async (config: GraphqlConfig): Promise<GraphqlImperativeResult> => {\n\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\tif (result.errors?.length) {\n\t\t\treturn { data: undefined, errors: result.errors };\n\t\t}\n\t\treturn {\n\t\t\tdata: result.data,\n\t\t\terrors: undefined,\n\t\t\tsubscribe: noopSubscribe,\n\t\t};\n\t};\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sources":["../../../src/providers/shared/normalize-mcp-response.ts","../../../src/providers/lds/runtime.ts"],"sourcesContent":["/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\n\n/**\n * Unwraps the MCP tool transport envelope and returns the tool's payload as-is.\n *\n * Handles the three surface shapes `sdk.callTool()` can resolve with:\n * - MCP Apps surface: `{ structuredContent, content }`\n * - OpenAI surface: `{ result: \"<JSON string>\" }`, where the JSON may itself be\n * an MCP content array (`[{ type: 'text', text: \"<JSON string>\" }, ...]`)\n * - Fallback: the raw value returned by `callTool`\n *\n * The shape of the unwrapped payload is the tool's responsibility — this helper\n * does not project out `data` / `error` / `errors`. Callers read whichever keys\n * their tool contract defines.\n */\nexport function normalizeMcpResponse(raw: unknown): unknown {\n\tif (raw && typeof raw === \"object\" && \"structuredContent\" in raw) {\n\t\treturn (raw as { structuredContent: unknown }).structuredContent;\n\t}\n\n\tif (raw && typeof raw === \"object\" && typeof (raw as { result?: unknown }).result === \"string\") {\n\t\tconst parsed = JSON.parse((raw as { result: string }).result);\n\t\tif (Array.isArray(parsed)) {\n\t\t\tconst textBlock = parsed.find(\n\t\t\t\t(b: { type?: string; text?: string }) =>\n\t\t\t\t\tb && b.type === \"text\" && typeof b.text === \"string\",\n\t\t\t);\n\t\t\tconst text = textBlock ? textBlock.text : null;\n\t\t\tif (text) {\n\t\t\t\treturn JSON.parse(text);\n\t\t\t}\n\t\t\treturn {};\n\t\t}\n\t\treturn parsed;\n\t}\n\n\treturn raw ?? {};\n}\n","/**\n * Copyright (c) 2026, Salesforce, Inc.,\n * All rights reserved.\n * For full license text, see the LICENSE.txt file\n */\nimport type { ResultCommand, SubscribableResultCommand } from \"@conduit-client/bindings-utils/v1\";\nimport type { assertIsValid, JSONSchema } from \"@conduit-client/jsonschema-validate\";\nimport {\n\tbuildDefaultImperativeBindingsServiceDescriptor,\n\tbuildLegacyImperativeBindingsServiceDescriptor,\n\tbuildQueryImperativeBindingsServiceDescriptor,\n\tbuildSubscribableImperativeBindingsServiceDescriptor,\n} from \"@conduit-client/service-bindings-imperative/v1\";\nimport { buildLWCWireBindingsServiceDescriptor } from \"@conduit-client/service-bindings-lwc/v1\";\nimport {\n\tbuildSubscribableResult,\n\terr,\n\tok,\n\ttoError,\n\tUserVisibleError,\n\ttype Callback,\n\ttype Result,\n\ttype Unsubscribe,\n} from \"@conduit-client/utils\";\nimport { getChatSDK } from \"@salesforce/platform-sdk\";\nimport type { ReadInvokerShape } from \"./types\";\nimport { normalizeMcpResponse } from \"../shared/normalize-mcp-response\";\n\n/**\n * Runtime mirror of the public `LdsRegistryEntryBase` — adapters dispatch\n * through `cfg.mcp?.toolName`. Kept nominal-free so the virtual module can\n * cheaply deserialize the JSON-stringified config written by the load hook.\n */\ninterface McpBackedAdapterConfig {\n\tmcp?: { toolName: string };\n}\n\n/**\n * LDS adapter configs whose input is validated against a JSON Schema at\n * invoke time. Wire, mutation, and read factories all consume this shape;\n * graphql factories skip the schema layer entirely.\n */\ninterface SchemaValidatedAdapterConfig extends McpBackedAdapterConfig {\n\tconfigJsonSchema: JSONSchema;\n}\n\ntype WireAdapterConfig = SchemaValidatedAdapterConfig;\n\ntype MutationAdapterConfig = SchemaValidatedAdapterConfig;\n\ninterface ReadAdapterConfig extends SchemaValidatedAdapterConfig {\n\tinvokerShape: ReadInvokerShape;\n}\n\n/**\n * Resolves the MCP tool name for an adapter config, or throws if none of the\n * supported backings are set. Today only `mcp` is wired up; future backings\n * (e.g. `http`) will be resolved in the same choke point.\n */\nfunction resolveMcpToolName(adapterName: string, cfg: McpBackedAdapterConfig): string {\n\tconst toolName = cfg.mcp?.toolName;\n\tif (!toolName) {\n\t\tthrow new Error(`[${adapterName}] no dispatch backing configured — expected \\`mcp.toolName\\`.`);\n\t}\n\treturn toolName;\n}\n\n/**\n * Optional envelope splitter. Converts the normalized MCP payload into a\n * `Result<Data, Error>` — used by the wire adapter so tools that return\n * `{ data, error }` land on OneStore's Err branch when `error` is set.\n * Imperative callers leave this unset and get the raw payload wrapped in\n * `ok(...)`.\n */\ntype UnwrapEnvelope<Data> = (payload: unknown) => Result<Data, Error>;\n\n/**\n * Resolves the MCP chat SDK and returns its `callTool` function, or throws a\n * consistent \"[adapter] sdk.callTool is not available\" error. Shared by the\n * LDS `McpToolCommand` and the graphql `runGraphqlQuery` — the check and\n * message are identical on both paths.\n */\nasync function getCallTool(\n\tadapterName: string,\n): Promise<(args: { toolName: string; params?: Record<string, unknown> }) => Promise<unknown>> {\n\tconst sdk = await getChatSDK();\n\tif (typeof sdk.callTool !== \"function\") {\n\t\tthrow new Error(\n\t\t\t`[${adapterName}] sdk.callTool is not available on this surface. ` +\n\t\t\t\t\"Make sure window.openai is configured or the component is running \" +\n\t\t\t\t\"in an MCP Apps / OpenAI chat context.\",\n\t\t);\n\t}\n\treturn sdk.callTool.bind(sdk);\n}\n\n/**\n * Pulls a human-readable message out of an MCP error response\n * (`{ isError: true, content: [{ type: 'text', text: ... }, ...] }`).\n * Returns an empty string if no text content is present so the caller can\n * supply a fallback.\n */\nfunction extractToolErrorText(raw: unknown): string {\n\tconst content = (raw as { content?: unknown }).content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn content\n\t\t.map((c) => {\n\t\t\tif (c && typeof c === \"object\" && (c as { type?: string }).type === \"text\") {\n\t\t\t\treturn (c as { text?: string }).text ?? \"\";\n\t\t\t}\n\t\t\treturn \"\";\n\t\t})\n\t\t.join(\" \")\n\t\t.trim();\n}\n\n/**\n * `Command` implementation that calls the configured MCP tool. One class,\n * reused across imperative and wire adapters.\n *\n * `execute()` returns a `Result<Data, unknown>`:\n * - `ok(data)` when the tool resolves — `data` is the unwrapped payload from\n * `normalizeMcpResponse` (or the result of the optional `unwrap` hook).\n * - `err(error)` when the tool rejects, when `sdk.callTool` is unavailable,\n * or when the `unwrap` hook returns `err(...)`.\n *\n * OneStore's `DefaultImperativeBindingsService` wraps this: on `ok(v)` it\n * deep-freezes and returns `v`; on `err(e)` it re-throws via `toError`. Sync\n * throws from `assertIsValid` in the `getCommand` factory are funneled through\n * `throwUserlandError`. `LWCWireBindingsService` wraps the same command\n * differently — it emits `{ data, error }` to the wire callback and attaches\n * freeze / race-guard / incomplete-config behavior.\n */\nclass McpToolCommand<Data> implements ResultCommand<Data, Error> {\n\tconstructor(\n\t\tprivate readonly adapterName: string,\n\t\tprivate readonly toolName: string,\n\t\tprivate readonly params: unknown,\n\t\tprivate readonly unwrap?: UnwrapEnvelope<Data>,\n\t) {}\n\n\tasync execute(): Promise<Result<Data, Error>> {\n\t\ttry {\n\t\t\tconst callTool = await getCallTool(this.adapterName);\n\t\t\tconst raw = await callTool({\n\t\t\t\ttoolName: this.toolName,\n\t\t\t\tparams: (this.params as Record<string, unknown>) ?? undefined,\n\t\t\t});\n\t\t\t// The MCP SDK converts handler throws into a resolved tool response\n\t\t\t// with `{ isError: true, content: [...] }` — not a transport\n\t\t\t// rejection. Surface it as an Err here so the default invoker\n\t\t\t// re-throws and the wire/legacy adapters route it through their\n\t\t\t// error channel.\n\t\t\tif (raw && typeof raw === \"object\" && (raw as { isError?: boolean }).isError) {\n\t\t\t\treturn err(new Error(extractToolErrorText(raw) || \"MCP tool error\"));\n\t\t\t}\n\t\t\tconst payload = normalizeMcpResponse(raw);\n\t\t\treturn this.unwrap ? this.unwrap(payload) : ok(payload as Data);\n\t\t} catch (e) {\n\t\t\treturn err(e instanceof Error ? e : new Error(String(e)));\n\t\t}\n\t}\n}\n\n// Off-platform has no store to observe. For shapes that have no `refresh`,\n// nothing can ever trigger a post-initial update, so `subscribe` is a\n// deliberate no-op: the callback never fires and the returned unsubscribe is\n// idempotent. Shapes that *do* expose `refresh` wire subscribers into the\n// refresh path instead (see `McpToolSubscribableCommand` and the\n// `query-refreshable` graphql shape).\nconst noopUnsubscribe: Unsubscribe = () => {\n\t// no store to unsubscribe from off-platform\n};\nconst noopSubscribe = (_cb: unknown): Unsubscribe => noopUnsubscribe;\n\n/**\n * Adapts `McpToolCommand` into a `SubscribableResultCommand`. Wraps the\n * command's `Result` with `buildSubscribableResult`, supplying:\n * - `subscribe`: per-execution subscriber set. Each `execute()` call has\n * its own set so sibling invocations don't cross-pollinate. Returned\n * unsubscribe removes the callback and is idempotent.\n * - `refresh`: builds a fresh `McpToolCommand`, re-executes it, and\n * broadcasts the fresh `Result` to every registered subscriber before\n * resolving. Returns `Result<void, Error>` (ok → undefined; err → the\n * error from the fresh execute).\n *\n * Wiring subscribers into refresh mirrors on-platform behavior, where the\n * reactive store fans `refresh` results out to every listener. Off-platform\n * there is no store, so the subscriber set lives on the command itself. This\n * shim is what lets OneStore's Subscribable and Legacy services run verbatim\n * against MCP: their invokers gate on `isSubscribableResult`, which requires\n * the command's `execute()` to resolve a `SubscribableResult` (not a plain\n * `Result`).\n */\nclass McpToolSubscribableCommand<Data> implements SubscribableResultCommand<Data, Error> {\n\tconstructor(\n\t\tprivate readonly adapterName: string,\n\t\tprivate readonly toolName: string,\n\t\tprivate readonly params: unknown,\n\t\tprivate readonly unwrap?: UnwrapEnvelope<Data>,\n\t) {}\n\n\tasync execute() {\n\t\tconst base = new McpToolCommand<Data>(\n\t\t\tthis.adapterName,\n\t\t\tthis.toolName,\n\t\t\tthis.params,\n\t\t\tthis.unwrap,\n\t\t);\n\t\tconst result = await base.execute();\n\t\tconst subscribers = new Set<Callback<Result<Data, Error>>>();\n\t\tconst subscribe = (cb: Callback<Result<Data, Error>>): Unsubscribe => {\n\t\t\tsubscribers.add(cb);\n\t\t\treturn () => {\n\t\t\t\tsubscribers.delete(cb);\n\t\t\t};\n\t\t};\n\t\tconst refresh = async () => {\n\t\t\tconst next = await new McpToolCommand<Data>(\n\t\t\t\tthis.adapterName,\n\t\t\t\tthis.toolName,\n\t\t\t\tthis.params,\n\t\t\t\tthis.unwrap,\n\t\t\t).execute();\n\t\t\tsubscribers.forEach((cb) => cb(next));\n\t\t\treturn next.isOk() ? ok<void, Error>(undefined) : err(next.error);\n\t\t};\n\t\treturn buildSubscribableResult(result, subscribe, refresh);\n\t}\n}\n\n/**\n * Off-core graphql state-manager command factory. Returned function feeds\n * `createSmGraphQL(getCommand)` from\n * `@salesforce/state-managers-uiapi/factory` — i.e. it intentionally\n * bypasses on-core's `_conduit_client_service_provisioner_v1` services\n * pipeline (instrumentation, normalized cache control, type registry,\n * `assertIsValid`, `resolveAndValidateGraphQLConfig`) and dispatches the\n * graphql query as a plain MCP tool call.\n *\n * The returned per-config command's `execute()` resolves a `Result` whose\n * shape matches what `createStateManager`'s `processQueuedConfig` expects\n * (the upstream `createSmGraphQL` wraps `createStateManager`):\n *\n * - `ok({ data: { data: <payload> }, subscribe, refresh })` — `processQueuedConfig`\n * reads `result.value.data.data` (the payload) and binds\n * `result.value.refresh` for the outer `refresh()` action.\n * - `err({ failure: UserVisibleError-with-{data: GraphQLResponse} })` —\n * `processQueuedConfig` calls `toGraphQLResponseFromFailure(result.error.failure)`\n * which extracts `.data.errors` from the `UserVisibleError`'s data field.\n *\n * `subscribe` and `refresh` are inherited verbatim from\n * `McpToolSubscribableCommand` (per-execution subscriber set, refresh\n * re-executes the tool and broadcasts to subscribers — matches the\n * on-platform contract from a state-manager-consumer perspective).\n *\n * @param name - State-manager name (`'default'` for `lightning/stateManagerGraphQL`).\n * @param cfg - Carries `mcp.toolName`. No `configJsonSchema`: this path\n * deliberately forgoes the on-core schema/`assertIsValid`/\n * `resolveAndValidateGraphQLConfig` validation layer for now;\n * malformed configs surface as MCP tool errors at execute time.\n */\nexport function createGraphqlStateManagerCommand(name: string, cfg: McpBackedAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn (config: GraphqlConfig) => ({\n\t\tasync execute() {\n\t\t\tconst base = new McpToolSubscribableCommand<GraphqlResult>(name, toolName, {\n\t\t\t\tquery: config.query,\n\t\t\t\tvariables: config.variables ?? {},\n\t\t\t\t...(config.operationName !== undefined && { operationName: config.operationName }),\n\t\t\t});\n\t\t\tconst subscribable = await base.execute();\n\t\t\tif (subscribable.isOk()) {\n\t\t\t\treturn ok(subscribable.value);\n\t\t\t}\n\t\t\t// Reshape inner `failure: Error` → `failure: UserVisibleError-with-data`\n\t\t\t// so upstream `toGraphQLResponseFromFailure(result.error.failure)`\n\t\t\t// pulls the MCP error message into `errors[0].message`. Keep the\n\t\t\t// surrounding subscribe/refresh envelope intact so the error value\n\t\t\t// is still a valid `SubscribableBase & { failure }`.\n\t\t\tconst innerError = subscribable.error.failure;\n\t\t\tconst message = innerError.message;\n\t\t\tconst userVisible = new UserVisibleError<GraphqlResult>({\n\t\t\t\tdata: undefined,\n\t\t\t\terrors: [{ message }],\n\t\t\t});\n\t\t\tuserVisible.message = message;\n\t\t\treturn err({ ...subscribable.error, failure: userVisible });\n\t\t},\n\t});\n}\n\nconst defaultImperativeService = buildDefaultImperativeBindingsServiceDescriptor().service;\nconst queryImperativeService = buildQueryImperativeBindingsServiceDescriptor().service;\nconst subscribableImperativeService =\n\tbuildSubscribableImperativeBindingsServiceDescriptor().service;\nconst legacyImperativeService = buildLegacyImperativeBindingsServiceDescriptor().service;\n\n/**\n * Mutation-shape factory. Builds an async `(config) => Promise<Data>` via\n * OneStore's `DefaultImperativeBindingsService`. Throws on validation error\n * (`throwUserlandError`) or tool error (`toError`). This is the only shape a\n * mutation ever takes on platform — mutation adapters do not carry an\n * `invokerShape` at all.\n */\nexport function createMutationAdapter(name: string, cfg: MutationAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tconst getCommand = (options: { params: unknown[]; assertIsValid: typeof assertIsValid }) => {\n\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\treturn new McpToolCommand<unknown>(name, toolName, options.params[0]);\n\t};\n\tconst invoker = defaultImperativeService.bind<unknown[], unknown>(getCommand);\n\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n}\n\n/**\n * Read-shape factory. Dispatches on `cfg.invokerShape`:\n *\n * - `legacy` — `{ invoke, subscribe }` callback surface with `{ data, error }`.\n * `subscribe` fires the callback once from the initial execute's `data`,\n * returns a no-op unsubscribe, and never fires again off-platform.\n * - `query` — `(config) => Promise<{ data }>`; one-shot read.\n * - `subscribable` — `(config) => Promise<{ data, subscribe }>`. Callback\n * passed to `subscribe` never fires; unsubscribe is a no-op.\n * - `subscribable-refreshable` — `(config) => Promise<{ data, subscribe, refresh }>`.\n * `refresh()` re-executes the MCP tool; `subscribe` is still a no-op.\n *\n * All four delegate to an OneStore service (Query / Subscribable / Legacy)\n * over `McpToolSubscribableCommand`, which preserves OneStore's deep-freeze\n * and error-funnel semantics end-to-end.\n */\nexport function createReadAdapter(name: string, cfg: ReadAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tconst getSubscribableCommand = (options: {\n\t\tparams: unknown[];\n\t\tassertIsValid: typeof assertIsValid;\n\t}) => {\n\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\treturn new McpToolSubscribableCommand<unknown>(name, toolName, options.params[0]);\n\t};\n\n\tswitch (cfg.invokerShape) {\n\t\tcase \"query\": {\n\t\t\tconst getCommand = (options: { params: unknown[]; assertIsValid: typeof assertIsValid }) => {\n\t\t\t\toptions.assertIsValid(options.params[0], cfg.configJsonSchema);\n\t\t\t\treturn new McpToolCommand<unknown>(name, toolName, options.params[0]);\n\t\t\t};\n\t\t\tconst invoker = queryImperativeService.bind<unknown[], unknown>(getCommand);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"subscribable\": {\n\t\t\tconst invoker = subscribableImperativeService.bind<unknown[], unknown>(\n\t\t\t\tgetSubscribableCommand,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"subscribable-refreshable\": {\n\t\t\tconst invoker = subscribableImperativeService.bind<unknown[], unknown>(\n\t\t\t\tgetSubscribableCommand,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\treturn (...params: unknown[]) => Promise.resolve(invoker(...params));\n\t\t}\n\t\tcase \"legacy\": {\n\t\t\t// Legacy service passes `{ config, assertIsValid }`, not `{ params, ... }`.\n\t\t\tconst getLegacyCommand = (options: {\n\t\t\t\tconfig: unknown;\n\t\t\t\tassertIsValid: typeof assertIsValid;\n\t\t\t}) => {\n\t\t\t\toptions.assertIsValid(options.config, cfg.configJsonSchema);\n\t\t\t\treturn new McpToolSubscribableCommand<unknown>(name, toolName, options.config);\n\t\t\t};\n\t\t\treturn legacyImperativeService.bind<unknown, unknown>(getLegacyCommand);\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(\n\t\t\t\t`[${name}] unsupported invokerShape: ${String((cfg as { invokerShape: unknown }).invokerShape)}. ` +\n\t\t\t\t\t`Expected 'legacy' | 'query' | 'subscribable' | 'subscribable-refreshable'.`,\n\t\t\t);\n\t}\n}\n\nconst lwcWireBindingsService = buildLWCWireBindingsServiceDescriptor().service;\n\n/**\n * Splits the MCP tool's `{ data, error }` envelope into a `Result`. Used as\n * the `unwrap` hook on `McpToolCommand` so OneStore's wire invoker sees the\n * error branch directly instead of receiving an envelope wrapped in `ok(...)`.\n *\n * Tools that don't emit the envelope (e.g. imperative) never go through this\n * path — the default imperative invoker doesn't pass `unwrap`.\n */\nfunction unwrapWireEnvelope<Data>(payload: unknown): Result<Data, Error> {\n\tconst envelope = payload as { data?: unknown; error?: unknown } | null | undefined;\n\tif (envelope && envelope.error !== undefined && envelope.error !== null) {\n\t\treturn err(toError(envelope.error));\n\t}\n\treturn ok(envelope?.data as Data);\n}\n\n/**\n * Creates an LWC wire adapter class that calls an MCP tool. Delegates to\n * OneStore's `LWCWireBindingsService`, so the returned class inherits the\n * full `CommandWireAdapterConstructor` contract: initial empty emit, config\n * `sanitize()`, `MissingRequiredPropertyError` → wait-for-next-config gating,\n * deep-freeze on success, race guard on stale resolves, and unsubscriber\n * management on disconnect.\n *\n * The `McpToolCommand` class is reused verbatim — the wire call-site only\n * supplies an `unwrap` hook so the tool's `{ data, error }` envelope lands\n * on OneStore's Err branch rather than being leaked through as an `ok(...)`\n * envelope.\n *\n * @param name - Wire adapter export name, used in MCP error messages.\n * @param cfg - MCP tool name and JSON Schema for valid wire configs.\n */\nexport function createWireAdapter(name: string, cfg: WireAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn lwcWireBindingsService.bind<unknown>(\n\t\t(config) => new McpToolCommand(name, toolName, config, unwrapWireEnvelope),\n\t\tcfg.configJsonSchema,\n\t);\n}\n\n// ─── GraphQL adapters ─────────────────────────────────────────────────────────\n\n/**\n * GraphQL adapters diverge from the base wire / mutation shapes in two ways:\n *\n * 1. Envelope is `{ data, errors[] }` instead of `{ data, error }`. Errors\n * are collected; an empty array collapses to `undefined`.\n * 2. The `_fetch` path routes thrown errors **into** the `errors[]`\n * envelope on the wire callback (never throws to the LWC host). Mutation\n * likewise resolves with `{ data, errors }` rather than rejecting.\n *\n * Dispatch is MCP-only: `getChatSDK().callTool({ toolName, params })` with\n * `normalizeMcpResponse` unwrapping. No `globalThis.__sfdc_sdk__` shortcut —\n * the on-platform behaviour is already covered by real `lightning/graphql`,\n * and every off-platform caller routes through an MCP tool like every other\n * LDS adapter.\n */\ntype GraphqlAdapterConfig = McpBackedAdapterConfig;\n\ninterface GraphqlConfig {\n\tquery: string;\n\tvariables?: Record<string, unknown>;\n\toperationName?: string;\n}\n\ninterface GraphqlResult {\n\tdata?: unknown;\n\terrors?: { message: string }[];\n}\n\ntype GraphqlWireCallback = (result: {\n\tdata: unknown;\n\terrors: { message: string }[] | undefined;\n\trefresh: () => Promise<void>;\n}) => void;\n\n/**\n * Template-literal tag that stitches the string into a plain `query` string.\n * Deliberately minimal — no AST parsing, no fragment substitution, no opaque\n * doc emulation. Matches the shape used by today's off-platform `gql`.\n */\nexport function gql(strings: TemplateStringsArray, ...values: unknown[]): string {\n\tlet result = \"\";\n\tstrings.forEach((string, i) => {\n\t\tresult += string;\n\t\tif (i < values.length) result += String(values[i]);\n\t});\n\treturn result.trim();\n}\n\nasync function runGraphqlQuery(\n\tadapterName: string,\n\ttoolName: string,\n\tconfig: GraphqlConfig,\n): Promise<GraphqlResult> {\n\tconst { query, variables, operationName } = config;\n\tif (!query) return { data: undefined, errors: undefined };\n\n\tconst callTool = await getCallTool(adapterName);\n\tconst raw = await callTool({\n\t\ttoolName,\n\t\tparams: {\n\t\t\tquery,\n\t\t\tvariables: variables ?? {},\n\t\t\t...(operationName !== undefined && { operationName }),\n\t\t},\n\t});\n\n\treturn (normalizeMcpResponse(raw) as GraphqlResult) ?? {};\n}\n\n/** Wraps a thrown Error into the graphql `{ data, errors[] }` envelope. */\nfunction toGraphqlErrorResult(error: unknown): GraphqlResult {\n\treturn { data: undefined, errors: [{ message: (error as Error).message }] };\n}\n\n/**\n * `runGraphqlQuery` wrapped in try/catch so thrown errors land on `errors[]`\n * instead of rejecting. Used by every graphql shape that routes errors\n * in-band (wire, mutation, imperative-read query/query-refreshable, legacy).\n */\nasync function runGraphqlQuerySafe(\n\tadapterName: string,\n\ttoolName: string,\n\tconfig: GraphqlConfig,\n): Promise<GraphqlResult> {\n\ttry {\n\t\treturn await runGraphqlQuery(adapterName, toolName, config);\n\t} catch (error) {\n\t\treturn toGraphqlErrorResult(error);\n\t}\n}\n\n/**\n * GraphQL wire adapter factory. Emits `{ data, errors, refresh }` to the wire\n * callback. Mirrors the `constructor(callback)` → `connect` / `disconnect` /\n * `update(config)` / `refresh()` contract used by the LWC wire service.\n * Thrown fetch errors are routed into `errors[0].message`.\n *\n * `_fetch` is gated on `_connected` so that the common wire lifecycle\n * (`constructor` → `update(config)` → `connect`) doesn't fire two requests:\n * the initial `update(config)` arrives before `connect()`, stores the config,\n * and waits. `connect()` does the one fetch; later `update(config)` while\n * connected re-fetches. This matches luvio's `LWCLuvioWireAdapter`, which\n * gates on the same flag to prevent duplicate endpoint calls.\n */\nexport function createGraphQLWireAdapter(name: string, cfg: GraphqlAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn class {\n\t\t_dataCallback: GraphqlWireCallback;\n\t\t_config: GraphqlConfig | undefined;\n\t\t_connected = false;\n\n\t\tconstructor(dataCallback: GraphqlWireCallback) {\n\t\t\tthis._dataCallback = dataCallback;\n\t\t}\n\n\t\tconnect() {\n\t\t\tthis._connected = true;\n\t\t\tvoid this._fetch();\n\t\t}\n\n\t\tdisconnect() {\n\t\t\tthis._connected = false;\n\t\t}\n\n\t\tupdate(config: GraphqlConfig | undefined) {\n\t\t\tthis._config = config;\n\n\t\t\tif (!this._connected || this._config === undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvoid this._fetch();\n\t\t}\n\n\t\trefresh() {\n\t\t\treturn this._fetch();\n\t\t}\n\n\t\tasync _fetch() {\n\t\t\tthis._emit(await runGraphqlQuerySafe(name, toolName, this._config ?? { query: \"\" }));\n\t\t}\n\n\t\t_emit({ data, errors }: GraphqlResult) {\n\t\t\tthis._dataCallback({\n\t\t\t\tdata,\n\t\t\t\terrors: errors?.length ? errors : undefined,\n\t\t\t\trefresh: () => this.refresh(),\n\t\t\t});\n\t\t}\n\t};\n}\n\n/**\n * GraphQL mutation factory. Returns `async (config) => Promise<{ data, errors }>`.\n * Empty-query guard short-circuits with\n * `{ data: undefined, errors: [{ message: \"No query provided\" }] }`.\n * All other errors are routed in-band to the `errors[]` envelope — the\n * function never rejects.\n */\nexport function createGraphQLMutationAdapter(name: string, cfg: GraphqlAdapterConfig) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\treturn async (config: GraphqlConfig): Promise<GraphqlResult> => {\n\t\tif (!config?.query) return { data: undefined, errors: [{ message: \"No query provided\" }] };\n\t\treturn runGraphqlQuerySafe(name, toolName, config);\n\t};\n}\n\ntype GraphqlImperativeReadInvokerShape = \"query\" | \"query-refreshable\" | \"legacy\";\n\ninterface GraphqlImperativeReadAdapterConfig extends GraphqlAdapterConfig {\n\tinvokerShape: GraphqlImperativeReadInvokerShape;\n}\n\ntype GraphqlImperativeResult = GraphqlResult & {\n\tsubscribe?: (cb: (result: GraphqlResult) => void) => Unsubscribe;\n\trefresh?: () => Promise<void>;\n};\n\ntype LegacyGraphqlCallback = (result: GraphqlResult) => void;\n\n/**\n * Imperative GraphQL read factory — single entry point for all imperative\n * graphql read shapes, mirroring the LDS `createReadAdapter` pattern. The\n * `invokerShape` selects the return surface:\n *\n * - `query` — `async (config) => Promise<{ data, errors, subscribe }>`.\n * Mirrors on-platform `GraphQLImperativeBindingsService` without\n * `exposeRefresh`. Errors are routed in-band; the function never throws.\n * - `query-refreshable` — same as `query` plus `refresh()` that re-runs the\n * underlying MCP tool. Mirrors the same service with `exposeRefresh: true`.\n * - `legacy` — `{ invoke(config, context, callback),\n * subscribe(config, context, callback): Unsubscribe }`. The callback\n * always receives `{ data, errors }`; neither method throws. `context` is\n * accepted but ignored.\n *\n * In every shape `subscribe` is a deliberate no-op off-platform (no reactive\n * store); returned unsubscribes are idempotent.\n */\nexport function createGraphQLImperativeReadAdapter(\n\tname: string,\n\tcfg: GraphqlImperativeReadAdapterConfig,\n) {\n\tconst toolName = resolveMcpToolName(name, cfg);\n\tif (cfg.invokerShape === \"legacy\") {\n\t\tasync function run(\n\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\tcallback: LegacyGraphqlCallback,\n\t\t): Promise<void> {\n\t\t\tif (!config?.query) {\n\t\t\t\tcallback({ data: undefined, errors: undefined });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\tcallback({\n\t\t\t\tdata: result.data,\n\t\t\t\terrors: result.errors?.length ? result.errors : undefined,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tinvoke(\n\t\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\t\t_context: unknown,\n\t\t\t\tcallback: LegacyGraphqlCallback,\n\t\t\t): void {\n\t\t\t\tvoid run(config, callback);\n\t\t\t},\n\t\t\tsubscribe(\n\t\t\t\tconfig: GraphqlConfig | undefined,\n\t\t\t\t_context: unknown,\n\t\t\t\tcallback: LegacyGraphqlCallback,\n\t\t\t): Unsubscribe {\n\t\t\t\tvoid run(config, callback);\n\t\t\t\treturn noopUnsubscribe;\n\t\t\t},\n\t\t};\n\t}\n\n\tif (cfg.invokerShape === \"query-refreshable\") {\n\t\t// Per-invocation subscriber set: each call to the returned function\n\t\t// gets its own adapter instance with an isolated subscriber list.\n\t\t// `refresh()` re-runs the MCP tool and broadcasts the fresh\n\t\t// `{ data, errors }` to every registered callback, which mirrors the\n\t\t// on-platform contract where `refresh` causes store updates that fan\n\t\t// out through the `subscribe` fan-in. Without this wiring, `refresh`\n\t\t// would re-run the query off-platform but nothing could observe the\n\t\t// new payload (no store, noop subscribe).\n\t\treturn async (config: GraphqlConfig): Promise<GraphqlImperativeResult> => {\n\t\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\tif (result.errors?.length) {\n\t\t\t\treturn { data: undefined, errors: result.errors };\n\t\t\t}\n\t\t\tconst subscribers = new Set<(result: GraphqlResult) => void>();\n\t\t\treturn {\n\t\t\t\tdata: result.data,\n\t\t\t\terrors: undefined,\n\t\t\t\tsubscribe: (cb) => {\n\t\t\t\t\tsubscribers.add(cb);\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tsubscribers.delete(cb);\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\trefresh: async () => {\n\t\t\t\t\tconst fresh = await runGraphqlQuerySafe(name, toolName, config);\n\t\t\t\t\tconst payload: GraphqlResult = {\n\t\t\t\t\t\tdata: fresh.data,\n\t\t\t\t\t\terrors: fresh.errors?.length ? fresh.errors : undefined,\n\t\t\t\t\t};\n\t\t\t\t\tsubscribers.forEach((cb) => cb(payload));\n\t\t\t\t},\n\t\t\t};\n\t\t};\n\t}\n\n\t// `query` shape: no refresh → nothing can trigger a post-initial update\n\t// off-platform, so `subscribe` stays a noop. The on-platform contract\n\t// allows subscribe callbacks to fire from unrelated store writes; off-\n\t// platform there is no store, so the callback is correctly unreachable.\n\treturn async (config: GraphqlConfig): Promise<GraphqlImperativeResult> => {\n\t\tconst result = await runGraphqlQuerySafe(name, toolName, config);\n\t\tif (result.errors?.length) {\n\t\t\treturn { data: undefined, errors: result.errors };\n\t\t}\n\t\treturn {\n\t\t\tdata: result.data,\n\t\t\terrors: undefined,\n\t\t\tsubscribe: noopSubscribe,\n\t\t};\n\t};\n}\n"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ import { LdsRegistryEntry, LdsRegistryEntryBase } from './common-mcp-tooling';
13
13
  *
14
14
  * - **GraphQL** (`lightning/stateManagerGraphQL`) — calls the upstream
15
15
  * per-state-manager factory `createSmGraphQL` re-exported from
16
- * `@salesforce/lds-adapters-onestore-graphql/factory` with an MCP-backed
16
+ * `@salesforce/state-managers-uiapi/factory` with an MCP-backed
17
17
  * `getCommand` synthesized via `createGraphqlStateManagerCommand`
18
18
  * (a `runtime.ts` helper). The required / optional config keys
19
19
  * (`['query']`, `['variables', 'operationName']`) live in the upstream
@@ -42,6 +42,16 @@ export interface LdsStateManagerConfig extends LdsRegistryEntryBase {
42
42
  }
43
43
  /** True when any entry in a module's registry map is a `state-manager` type. */
44
44
  export declare function isStateManagerSpecifier(moduleAdapters: Record<string, LdsRegistryEntry>): boolean;
45
+ /**
46
+ * Runtime body of the state-manager flag prologue — the executable `if` /
47
+ * `setFeatureFlag` block, *without* the ESM `import` lines. Exported for
48
+ * tests that prove idempotency by running the body twice in a `new Function`
49
+ * sandbox (the eval helper can't use ESM imports).
50
+ *
51
+ * Kept in lock-step with `STATE_MANAGER_FLAG_PROLOGUE` below — the imports
52
+ * are concatenated on top of this body to form the full prologue.
53
+ */
54
+ export declare const STATE_MANAGER_FLAG_PROLOGUE_BODY: string;
45
55
  /**
46
56
  * Builds the §8.4 factory-composition body for a single `state-manager`
47
57
  * registry entry. Two emit shapes, gated by `isGraphqlStateManagerSpecifier`:
@@ -56,7 +66,7 @@ export declare function isStateManagerSpecifier(moduleAdapters: Record<string, L
56
66
  *
57
67
  * **GraphQL shape** — `lightning/stateManagerGraphQL`:
58
68
  * 1. Imports `<factoryName>` (`createSmGraphQL`) from the registry's
59
- * `factoryModule` (`@salesforce/lds-adapters-onestore-graphql/factory`).
69
+ * `factoryModule` (`@salesforce/state-managers-uiapi/factory`).
60
70
  * 2. Synthesizes an MCP-backed `getCommand` via `createGraphqlStateManagerCommand`
61
71
  * (a `runtime.ts` helper, in scope as a private binding).
62
72
  * 3. Default-exports `<factoryName>(getCommand)`. The required / optional
@@ -1 +1 @@
1
- {"version":3,"file":"state-managers.d.ts","sourceRoot":"","sources":["../../../src/providers/lds/state-managers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAClE,IAAI,EAAE,eAAe,CAAC;IACtB,oFAAoF;IACpF,aAAa,EAAE,MAAM,CAAC;IACtB,wGAAwG;IACxG,WAAW,EAAE,MAAM,CAAC;IACpB,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,UAAU,CAAC;CAC9B;AAED,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,OAAO,CAEjG;AAwBD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,gCAAgC,CAC/C,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,qBAAqB,EAC1B,SAAS,EAAE,MAAM,GACf,MAAM,CAqBR"}
1
+ {"version":3,"file":"state-managers.d.ts","sourceRoot":"","sources":["../../../src/providers/lds/state-managers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAClE,IAAI,EAAE,eAAe,CAAC;IACtB,oFAAoF;IACpF,aAAa,EAAE,MAAM,CAAC;IACtB,wGAAwG;IACxG,WAAW,EAAE,MAAM,CAAC;IACpB,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,UAAU,CAAC;CAC9B;AAED,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,OAAO,CAEjG;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,gCAAgC,QAIjC,CAAC;AAiDb;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,gCAAgC,CAC/C,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,qBAAqB,EAC1B,SAAS,EAAE,MAAM,GACf,MAAM,CAuBR"}
@@ -69,6 +69,45 @@ All per-state-manager metadata (`definedBy`, `requiredKeys`,
69
69
  off-core verbatim through the externalized state manager — registry
70
70
  entries do **not** redeclare those fields.
71
71
 
72
+ #### Reading state-manager values from LWC templates
73
+
74
+ State managers from `@salesforce/state-managers-uiapi/factory` are LWC
75
+ `Signal`s. Consumer LWCs that import a `lightning/stateManager*` default
76
+ can read its inner atoms directly from getters and the template will
77
+ re-render when the underlying atoms change — no manual `subscribe()` /
78
+ `@track` mirroring required:
79
+
80
+ ```js
81
+ import { LightningElement } from "lwc";
82
+ import smRecord from "lightning/stateManagerRecord";
83
+
84
+ export default class MyComponent extends LightningElement {
85
+ _instance = smRecord();
86
+
87
+ get status() {
88
+ return this._instance.value.status;
89
+ }
90
+ get data() {
91
+ return this._instance.value.data ?? null;
92
+ }
93
+ get isLoaded() {
94
+ return this._instance.value.status === "loaded";
95
+ }
96
+
97
+ handleFetch() {
98
+ this._instance.value.setConfig({ recordId: "001…", fields: ["Name"] });
99
+ }
100
+ }
101
+ ```
102
+
103
+ This works because the plugin's emitted state-manager virtual modules
104
+ auto-enable LWC's `ENABLE_EXPERIMENTAL_SIGNALS` runtime flag at load
105
+ time (idempotently, only when a state-manager specifier is loaded —
106
+ non-state-manager consumers are untouched). With the flag on, getter
107
+ access to a trusted Signal subscribes the template to it; without it,
108
+ templates wouldn't re-render and consumers would have to fall back to
109
+ the older manual-`subscribe()`-+-`@track`-mirror pattern.
110
+
72
111
  ### Configuring `builtins.lds()`
73
112
 
74
113
  Pass an overrides object to extend or replace adapters:
@@ -179,14 +218,12 @@ npm install lwc @salesforce-ux/design-system lightning-base-components
179
218
  > base components (e.g., `lightning-card`, `lightning-button`).
180
219
  >
181
220
  > **State-manager virtual modules** (`lightning/stateManagerRecord`,
182
- > `lightning/stateManagerObjectInfo`, `lightning/stateManagerGraphQL`) emit
183
- > imports from `@salesforce/state-managers-uiapi/factory` and
184
- > `@salesforce/lds-adapters-onestore-graphql/factory`. Both are declared as
185
- > optional peer dependencies of the plugin — install them in your consumer
186
- > only if you import any of those `lightning/stateManager*` specifiers from
187
- > your LWCs. The graphql state manager additionally requires access to
188
- > `@salesforce/lds-adapters-onestore-graphql` (a Salesforce-internal package),
189
- > so external consumers should use the record/objectInfo state managers only.
221
+ > `lightning/stateManagerObjectInfo`, `lightning/stateManagerGraphQL`) all emit
222
+ > imports from `@salesforce/state-managers-uiapi/factory` (the record,
223
+ > objectInfo, and graphql per-state-manager factories are re-exported from a
224
+ > single barrel). It is declared as an optional peer dependency of the plugin —
225
+ > install it in your consumer only if you import any of those
226
+ > `lightning/stateManager*` specifiers from your LWCs.
190
227
 
191
228
  ### Step 2: Create `vite.config.js`
192
229
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salesforce/vite-plugin-lwc-ui-bundle",
3
- "version": "10.7.0",
3
+ "version": "10.9.0",
4
4
  "description": "Vite plugin for compiling LWC components into static bundles for off-platform and MCP use",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "Salesforce",
@@ -58,17 +58,14 @@
58
58
  },
59
59
  "peerDependencies": {
60
60
  "@lwc/rollup-plugin": "^9.0.0",
61
- "@salesforce/lds-adapters-onestore-graphql": "^1.440.0",
62
- "@salesforce/platform-sdk": "^10.7.0",
63
- "@salesforce/state-managers-uiapi": "^0.30.0",
64
- "@salesforce/ui-bundle": "^10.7.0",
61
+ "@salesforce/platform-sdk": "^10.9.0",
62
+ "@salesforce/state-managers-uiapi": "^0.31.0",
63
+ "@salesforce/ui-bundle": "^10.9.0",
64
+ "lwc": "^9.0.0",
65
65
  "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0",
66
66
  "zod": "^3.23.8"
67
67
  },
68
68
  "peerDependenciesMeta": {
69
- "@salesforce/lds-adapters-onestore-graphql": {
70
- "optional": true
71
- },
72
69
  "@salesforce/state-managers-uiapi": {
73
70
  "optional": true
74
71
  },
@@ -87,7 +84,7 @@
87
84
  "devDependencies": {
88
85
  "@conduit-client/bindings-utils": "3.19.6",
89
86
  "@conduit-client/command-base": "3.19.6",
90
- "@salesforce/platform-sdk": "^10.7.0",
87
+ "@salesforce/platform-sdk": "^10.9.0",
91
88
  "typescript": "^5.9.3",
92
89
  "vite": "^7.0.0",
93
90
  "vite-plugin-dts": "^4.5.4",
@@ -447,11 +447,11 @@ builtins.lds({
447
447
 
448
448
  The three default entries are:
449
449
 
450
- | Specifier | `factoryModule` | `factoryName` | Default `mcp.toolName` |
451
- | ---------------------------------- | --------------------------------------------------- | -------------------- | ---------------------- |
452
- | `lightning/stateManagerRecord` | `@salesforce/state-managers-uiapi/factory` | `createSmRecord` | `getRecordMcpTool` |
453
- | `lightning/stateManagerObjectInfo` | `@salesforce/state-managers-uiapi/factory` | `createSmObjectInfo` | `getObjectInfoMcpTool` |
454
- | `lightning/stateManagerGraphQL` | `@salesforce/lds-adapters-onestore-graphql/factory` | `createSmGraphQL` | `graphqlQuery` |
450
+ | Specifier | `factoryModule` | `factoryName` | Default `mcp.toolName` |
451
+ | ---------------------------------- | ------------------------------------------ | -------------------- | ---------------------- |
452
+ | `lightning/stateManagerRecord` | `@salesforce/state-managers-uiapi/factory` | `createSmRecord` | `getRecordMcpTool` |
453
+ | `lightning/stateManagerObjectInfo` | `@salesforce/state-managers-uiapi/factory` | `createSmObjectInfo` | `getObjectInfoMcpTool` |
454
+ | `lightning/stateManagerGraphQL` | `@salesforce/state-managers-uiapi/factory` | `createSmGraphQL` | `graphqlQuery` |
455
455
 
456
456
  State-manager entries do **not** carry `definedBy`, `requiredKeys`,
457
457
  `optionalKeys`, or any predicate — those live in the upstream factory