@slicemachine/manager 0.25.7-alpha.jp-figma-to-slice-2.5 → 0.25.7-alpha.jp-figma-to-slice-3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
2
5
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
6
  const t = require("io-ts");
4
7
  const prismicCustomTypesClient = require("@prismicio/custom-types-client");
@@ -37,6 +40,10 @@ function _interopNamespaceDefault(e) {
37
40
  const t__namespace = /* @__PURE__ */ _interopNamespaceDefault(t);
38
41
  const prismicCustomTypesClient__namespace = /* @__PURE__ */ _interopNamespaceDefault(prismicCustomTypesClient);
39
42
  class CustomTypesManager extends BaseManager.BaseManager {
43
+ constructor() {
44
+ super(...arguments);
45
+ __publicField(this, "inferSliceAbortControllers", /* @__PURE__ */ new Map());
46
+ }
40
47
  async readCustomTypeLibrary() {
41
48
  var _a;
42
49
  assertPluginsInitialized.assertPluginsInitialized(this.sliceMachinePluginRunner);
@@ -300,10 +307,18 @@ class CustomTypesManager extends BaseManager.BaseManager {
300
307
  }
301
308
  async inferSlice(args) {
302
309
  var _a;
303
- const { source, imageUrl } = args;
310
+ const { source, imageUrl, requestId } = args;
304
311
  const authToken = await this.user.getAuthenticationToken();
305
312
  const repository = await this.project.getResolvedRepositoryName();
306
- console.info(`inferSlice (${source}) started`);
313
+ let abortController;
314
+ if (requestId) {
315
+ abortController = new AbortController();
316
+ abortController.signal.addEventListener("abort", () => {
317
+ console.warn(`inferSlice (${source}) request ${requestId} was aborted`);
318
+ });
319
+ this.inferSliceAbortControllers.set(requestId, abortController);
320
+ }
321
+ console.info(`inferSlice (${source}) started${requestId ? ` for request ${requestId}` : ""}`);
307
322
  const startTime = Date.now();
308
323
  try {
309
324
  if (source === "figma") {
@@ -547,7 +562,8 @@ x-prismic-repository: ${repository}
547
562
  command: "npx",
548
563
  args: ["-y", "@prismicio/mcp-server@0.0.20-alpha.6"]
549
564
  }
550
- }
565
+ },
566
+ abortController
551
567
  }
552
568
  });
553
569
  let newSliceAbsPath;
@@ -584,7 +600,8 @@ x-prismic-repository: ${repository}
584
600
  const response = await fetch.default(url.toString(), {
585
601
  method: "POST",
586
602
  headers: { Authorization: `Bearer ${authToken}` },
587
- body: JSON.stringify({ imageUrl })
603
+ body: JSON.stringify({ imageUrl }),
604
+ signal: abortController == null ? void 0 : abortController.signal
588
605
  });
589
606
  if (!response.ok) {
590
607
  throw new Error(`Failed to infer slice: ${response.statusText}`);
@@ -593,12 +610,25 @@ x-prismic-repository: ${repository}
593
610
  return InferSliceResponse.parse(json);
594
611
  }
595
612
  } catch (error) {
596
- console.error(`inferSlice (${source}) failed`, error);
613
+ console.error(`inferSlice (${source}) failed${requestId ? ` for request ${requestId}` : ""}`, error);
597
614
  throw error;
598
615
  } finally {
616
+ if (requestId) {
617
+ this.inferSliceAbortControllers.delete(requestId);
618
+ }
599
619
  const elapsedTimeSeconds = (Date.now() - startTime) / 1e3;
600
- console.info(`inferSlice (${source}) took ${elapsedTimeSeconds}s`);
620
+ console.info(`inferSlice took ${elapsedTimeSeconds}s${requestId ? ` for request ${requestId}` : ""}`);
621
+ }
622
+ }
623
+ async cancelInferSlice(args) {
624
+ const { requestId } = args;
625
+ const abortController = this.inferSliceAbortControllers.get(requestId);
626
+ if (abortController) {
627
+ abortController.abort();
628
+ this.inferSliceAbortControllers.delete(requestId);
629
+ return { cancelled: true };
601
630
  }
631
+ return { cancelled: false };
602
632
  }
603
633
  }
604
634
  const InferSliceResponse = index.default.object({
@@ -1 +1 @@
1
- {"version":3,"file":"CustomTypesManager.cjs","sources":["../../../../src/managers/customTypes/CustomTypesManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport * as prismicCustomTypesClient from \"@prismicio/custom-types-client\";\nimport {\n\tCustomType,\n\tGroup,\n\tLinkConfig,\n\tNestableWidget,\n\tNestedGroup,\n\tSharedSlice,\n\tUID,\n\ttraverseCustomType,\n\ttraverseSharedSlice,\n} from \"@prismicio/types-internal/lib/customtypes\";\nimport {\n\tCallHookReturnType,\n\tCustomTypeCreateHook,\n\tCustomTypeCreateHookData,\n\tCustomTypeReadHookData,\n\tCustomTypeRenameHook,\n\tCustomTypeRenameHookData,\n\tCustomTypeUpdateHook,\n\tCustomTypeUpdateHookData,\n\tHookError,\n} from \"@slicemachine/plugin-kit\";\nimport { z } from \"zod\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport fetch from \"../../lib/fetch\";\n\nimport { OnlyHookErrors } from \"../../types\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { UnauthorizedError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\nimport { CustomTypeFormat } from \"./types\";\nimport { existsSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport { join as joinPath, relative as relativePath } from \"node:path\";\nimport {\n\tmkdtemp,\n\trename,\n\trm,\n\twriteFile,\n\treadFile,\n\treaddir,\n} from \"node:fs/promises\";\nimport { query as queryClaude } from \"@anthropic-ai/claude-agent-sdk\";\nimport { APPLICATION_MODE } from \"../../constants/APPLICATION_MODE\";\n\ntype SliceMachineManagerReadCustomTypeLibraryReturnType = {\n\tids: string[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesManagerReadAllCustomTypesArgs = {\n\tformat: CustomTypeFormat;\n};\n\ntype SliceMachineManagerReadAllCustomTypeReturnType = {\n\tmodels: { model: CustomType }[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerReadCustomTypeReturnType = {\n\tmodel: CustomType | undefined;\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerPushCustomTypeArgs = {\n\tid: string;\n\tuserAgent?: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType = {\n\t// TODO\n\tmocksConfig?: Record<string, unknown>;\n\terrors: HookError[];\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n\t// TODO\n\tmocksConfig: Record<string, unknown>;\n};\n\n/** `[field]` or `[group, field]` – path **inside** the Custom Type */\ntype PathWithoutCustomType = [string] | [string, string];\n\ntype SliceMachineManagerUpdateCustomTypeFieldIdChanged = {\n\t/**\n\t * Previous path of the changed field, excluding the custom type id. Can be\n\t * used to identify the field that had an API ID rename (e.g. [\"fieldA\"] or\n\t * [\"groupA\", \"fieldA\"])\n\t */\n\tpreviousPath: PathWithoutCustomType;\n\t/**\n\t * New path of the changed field, excluding the custom type id. Can be used to\n\t * identify the field that had an API ID rename (e.g. [\"fieldB\"] or [\"groupA\",\n\t * \"fieldB\"])\n\t */\n\tnewPath: PathWithoutCustomType;\n};\n\ntype SliceMachineManagerUpdateCustomTypeArgs = CustomTypeUpdateHookData & {\n\tupdateMeta?: {\n\t\tfieldIdChanged?: SliceMachineManagerUpdateCustomTypeFieldIdChanged;\n\t};\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType = {\n\terrors: HookError[];\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeArgs = {\n\tid: string;\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesMachineManagerUpdateCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\n/** `[ct, field]` or `[ct, group, field]` – path **with** Custom Type ID */\ntype PathWithCustomType = [string, string] | [string, string, string];\n\ntype CustomTypeFieldIdChangedMeta = {\n\tpreviousPath: PathWithCustomType;\n\tnewPath: PathWithCustomType;\n};\n\ntype LinkCustomType = NonNullable<LinkConfig[\"customtypes\"]>[number];\n\nexport class CustomTypesManager extends BaseManager {\n\tasync readCustomTypeLibrary(): Promise<SliceMachineManagerReadCustomTypeLibraryReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type-library:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tids: t.array(t.string),\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tids: data[0]?.ids || [],\n\t\t\terrors,\n\t\t};\n\t}\n\n\tasync readAllCustomTypes(\n\t\targs?: CustomTypesManagerReadAllCustomTypesArgs,\n\t): Promise<SliceMachineManagerReadAllCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst res: SliceMachineManagerReadAllCustomTypeReturnType = {\n\t\t\tmodels: [],\n\t\t\terrors: [],\n\t\t};\n\n\t\tconst { ids, errors } = await this.readCustomTypeLibrary();\n\t\tres.errors = [...res.errors, ...errors];\n\n\t\tif (ids) {\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst { model, errors } = await this.readCustomType({ id });\n\t\t\t\tres.errors = [...res.errors, ...errors];\n\n\t\t\t\tif (model && (!args || args.format === model.format)) {\n\t\t\t\t\tres.models.push({ model });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tasync createCustomType(\n\t\targs: CustomTypeCreateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeCreateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:create\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync readCustomType(\n\t\targs: CustomTypeReadHookData,\n\t): Promise<SliceMachineManagerReadCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:read\",\n\t\t\targs,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tmodel: CustomType,\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tmodel: data[0]?.model,\n\t\t\terrors,\n\t\t};\n\t}\n\n\t/**\n\t * Update the Content Relationship API IDs for all existing custom types and\n\t * slices. The change is determined by properties inside the `updateMeta`\n\t * property.\n\t */\n\tprivate async updateContentRelationships(\n\t\targs: {\n\t\t\tmodel: CustomType;\n\t\t} & SliceMachineManagerUpdateCustomTypeFieldIdChanged,\n\t): Promise<\n\t\tOnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>> & {\n\t\t\trollback?: () => Promise<void>;\n\t\t}\n\t> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst {\n\t\t\tmodel,\n\t\t\tpreviousPath: previousFieldPath,\n\t\t\tnewPath: newFieldPath,\n\t\t} = args;\n\n\t\tif (previousFieldPath.join(\".\") !== newFieldPath.join(\".\")) {\n\t\t\tconst { id: ctId } = model;\n\t\t\tconst previousPath: PathWithCustomType = [ctId, ...previousFieldPath];\n\t\t\tconst newPath: PathWithCustomType = [ctId, ...newFieldPath];\n\n\t\t\tconst crUpdates: {\n\t\t\t\tupdatePromise: Promise<{ errors: HookError[] }>;\n\t\t\t\trollback: () => void;\n\t\t\t}[] = [];\n\n\t\t\t// Find existing content relationships that link to the renamed field id in\n\t\t\t// any custom type and update them to use the new one.\n\t\t\tconst customTypes = await this.readAllCustomTypes();\n\n\t\t\tupdateCustomTypeContentRelationships({\n\t\t\t\tmodels: customTypes.models,\n\t\t\t\tonUpdate: ({ previousModel, model: updatedModel }) => {\n\t\t\t\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\t\t\t\tcrUpdates.push({\n\t\t\t\t\t\tupdatePromise: this.sliceMachinePluginRunner?.callHook(\n\t\t\t\t\t\t\t\"custom-type:update\",\n\t\t\t\t\t\t\t{ model: updatedModel },\n\t\t\t\t\t\t),\n\t\t\t\t\t\trollback: () => {\n\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"custom-type:update\", {\n\t\t\t\t\t\t\t\tmodel: previousModel,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tpreviousPath,\n\t\t\t\tnewPath,\n\t\t\t});\n\n\t\t\t// Find existing slice with content relationships that link to the renamed\n\t\t\t// field id in all libraries and update them to use the new one.\n\t\t\tconst { libraries } = await this.slices.readAllSliceLibraries();\n\n\t\t\tfor (const library of libraries) {\n\t\t\t\tconst slices = await this.slices.readAllSlicesForLibrary({\n\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t});\n\n\t\t\t\tupdateSharedSliceContentRelationships({\n\t\t\t\t\tmodels: slices.models,\n\t\t\t\t\tonUpdate: ({ previousModel, model: updatedModel }) => {\n\t\t\t\t\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\t\t\t\t\tcrUpdates.push({\n\t\t\t\t\t\t\tupdatePromise: this.sliceMachinePluginRunner?.callHook(\n\t\t\t\t\t\t\t\t\"slice:update\",\n\t\t\t\t\t\t\t\t{ libraryID: library.libraryID, model: updatedModel },\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\trollback: () => {\n\t\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"slice:update\", {\n\t\t\t\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: previousModel,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Process all the Content Relationship updates at once.\n\t\t\tconst crUpdatesResult = await Promise.all(\n\t\t\t\tcrUpdates.map((update) => update.updatePromise),\n\t\t\t);\n\n\t\t\tif (crUpdatesResult.some((result) => result.errors.length > 0)) {\n\t\t\t\treturn {\n\t\t\t\t\terrors: crUpdatesResult.flatMap((result) => result.errors),\n\t\t\t\t\trollback: async () => {\n\t\t\t\t\t\tawait Promise.all(crUpdates.map((update) => update.rollback()));\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync updateCustomType(\n\t\targs: SliceMachineManagerUpdateCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerUpdateCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\t\tconst { model } = args;\n\t\tconst { fieldIdChanged } = args.updateMeta ?? {};\n\n\t\tlet previousCustomType: CustomType | undefined;\n\n\t\tif (fieldIdChanged) {\n\t\t\tconst customTypeRead = await this.readCustomType({ id: model.id });\n\n\t\t\tif (customTypeRead.errors.length > 0) {\n\t\t\t\treturn { errors: customTypeRead.errors };\n\t\t\t}\n\t\t\tif (!customTypeRead.model) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`readCustomType succeeded reading custom type ${model.id} but model is undefined.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpreviousCustomType = customTypeRead.model;\n\t\t}\n\n\t\tconst customTypeUpdateResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:update\",\n\t\t\t{ model },\n\t\t);\n\n\t\tif (customTypeUpdateResult.errors.length > 0) {\n\t\t\treturn { errors: customTypeUpdateResult.errors };\n\t\t}\n\n\t\tif (previousCustomType && fieldIdChanged) {\n\t\t\tconst crUpdateResult = await this.updateContentRelationships({\n\t\t\t\t...fieldIdChanged,\n\t\t\t\tmodel: previousCustomType,\n\t\t\t});\n\n\t\t\tif (crUpdateResult.errors.length > 0) {\n\t\t\t\t// put the previous custom type back\n\t\t\t\tawait this.sliceMachinePluginRunner?.callHook(\"custom-type:update\", {\n\t\t\t\t\tmodel: previousCustomType,\n\t\t\t\t});\n\t\t\t\t// revert the content relationships updates\n\t\t\t\tawait crUpdateResult.rollback?.();\n\n\t\t\t\treturn { errors: crUpdateResult.errors };\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync renameCustomType(\n\t\targs: CustomTypeRenameHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeRenameHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:rename\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync deleteCustomType(\n\t\targs: CustomTypesMachineManagerDeleteCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerDeleteCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, errors: readCustomTypeErrors } = await this.readCustomType({\n\t\t\tid: args.id,\n\t\t});\n\n\t\tif (model) {\n\t\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\t\"custom-type:delete\",\n\t\t\t\t{ model },\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\terrors: readCustomTypeErrors,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync pushCustomType(\n\t\targs: SliceMachineManagerPushCustomTypeArgs,\n\t): Promise<void> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\t// TODO: Handle errors\n\t\tconst { model } = await this.readCustomType({ id: args.id });\n\n\t\tif (model) {\n\t\t\t// TODO: Create a single shared client.\n\t\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\t\trepositoryName,\n\t\t\t\ttoken: authenticationToken,\n\t\t\t\tfetch,\n\t\t\t\tfetchOptions: {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Check if Custom Type already exists on the repository.\n\t\t\t\tawait client.getCustomTypeByID(args.id);\n\n\t\t\t\t// If it exists on the repository, update it.\n\t\t\t\tawait client.updateCustomType(model);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof prismicCustomTypesClient.NotFoundError) {\n\t\t\t\t\t// If it doesn't exist on the repository, insert it.\n\t\t\t\t\tawait client.insertCustomType(model);\n\t\t\t\t} else if (error instanceof prismicCustomTypesClient.ForbiddenError) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\"You do not have access to push types to this Prismic repository.\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcause: error,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync readCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerReadCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:read\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tassetID: \"mocks.config.json\",\n\t\t\t},\n\t\t);\n\t\tconst data = hookResult.data[0]?.data;\n\n\t\t// TODO: Validate the returned data.\n\n\t\tif (data) {\n\t\t\treturn {\n\t\t\t\tmocksConfig: JSON.parse(data.toString()),\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tmocksConfig: undefined,\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync updateCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerUpdateCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:update\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tasset: {\n\t\t\t\t\tid: \"mocks.config.json\",\n\t\t\t\t\tdata: Buffer.from(JSON.stringify(args.mocksConfig, null, \"\\t\")),\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync fetchRemoteCustomTypes(): Promise<CustomType[]> {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\trepositoryName,\n\t\t\ttoken: authenticationToken,\n\t\t\tfetch,\n\t\t\tfetchOptions: {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn await client.getAllCustomTypes();\n\t}\n\n\tasync inferSlice(\n\t\targs: { imageUrl: string } & (\n\t\t\t| { source: \"upload\" }\n\t\t\t| { source: \"figma\"; libraryID: string }\n\t\t),\n\t): Promise<InferSliceResponse> {\n\t\tconst { source, imageUrl } = args;\n\n\t\tconst authToken = await this.user.getAuthenticationToken();\n\t\tconst repository = await this.project.getResolvedRepositoryName();\n\n\t\tconsole.info(`inferSlice (${source}) started`);\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\tif (source === \"figma\") {\n\t\t\t\tconst { libraryID } = args;\n\n\t\t\t\tconst exp =\n\t\t\t\t\tawait this.telemetry.getExperimentVariant(\"llm-proxy-access\");\n\t\t\t\tif (exp?.value !== \"on\") {\n\t\t\t\t\tthrow new Error(\"User does not have access to the LLM proxy.\");\n\t\t\t\t}\n\n\t\t\t\tconst { llmProxyUrl } = z\n\t\t\t\t\t.object({ llmProxyUrl: z.string().url() })\n\t\t\t\t\t.parse(exp.payload);\n\n\t\t\t\tconsole.info({ llmProxyUrl });\n\n\t\t\t\tlet tmpDir: string | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tconst config = await this.project.getSliceMachineConfig();\n\n\t\t\t\t\tlet framework:\n\t\t\t\t\t\t| { type: \"nextjs\" | \"nuxt\" | \"sveltekit\"; label: string }\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (config.adapter === \"@slicemachine/adapter-next\") {\n\t\t\t\t\t\tframework = { type: \"nextjs\", label: \"Next.js (React)\" };\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tconfig.adapter === \"@slicemachine/adapter-nuxt\" ||\n\t\t\t\t\t\tconfig.adapter === \"@slicemachine/adapter-nuxt2\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tframework = { type: \"nuxt\", label: \"Nuxt (Vue)\" };\n\t\t\t\t\t} else if (config.adapter === \"@slicemachine/adapter-sveltekit\") {\n\t\t\t\t\t\tframework = { type: \"sveltekit\", label: \"SvelteKit (Svelte)\" };\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!framework) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Could not determine framework from Slice Machine config.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectRoot = await this.project.getRoot();\n\t\t\t\t\tconst libraryAbsPath = joinPath(projectRoot, libraryID);\n\t\t\t\t\tconst cwd = libraryAbsPath;\n\n\t\t\t\t\ttmpDir = await mkdtemp(\n\t\t\t\t\t\tjoinPath(tmpdir(), \"slice-machine-infer-slice-tmp-\"),\n\t\t\t\t\t);\n\t\t\t\t\tconst tmpImageAbsPath = joinPath(tmpDir, `${randomUUID()}.png`);\n\t\t\t\t\tconst response = await fetch(imageUrl);\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Failed to download image: ${response.status} ${response.statusText}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tawait writeFile(\n\t\t\t\t\t\ttmpImageAbsPath,\n\t\t\t\t\t\tBuffer.from(await response.arrayBuffer()),\n\t\t\t\t\t);\n\n\t\t\t\t\tconst otherSlices = (\n\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\t(await readdir(libraryAbsPath, { withFileTypes: true })).flatMap(\n\t\t\t\t\t\t\t\tasync (path) => {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tif (!path.isDirectory()) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Not a directory\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst absPath = joinPath(libraryAbsPath, path.name);\n\t\t\t\t\t\t\t\t\t\tconst modelAbsPath = joinPath(absPath, \"model.json\");\n\t\t\t\t\t\t\t\t\t\tif (!existsSync(modelAbsPath)) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Model file not found\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst decoded = SharedSlice.decode(\n\t\t\t\t\t\t\t\t\t\t\tJSON.parse(await readFile(modelAbsPath, \"utf-8\")),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tif (decoded._tag === \"Left\") {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Invalid model file\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tabsPath,\n\t\t\t\t\t\t\t\t\t\t\t\trelPath: relativePath(cwd, absPath),\n\t\t\t\t\t\t\t\t\t\t\t\tname: decoded.right.name,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t).flat();\n\n\t\t\t\t\tconst prompt = `CRITICAL INSTRUCTIONS - READ FIRST:\n- You MUST start immediately with Step 1.1. DO NOT read, analyze, or explore any project files first.\n- Work step-by-step through the numbered tasks below.\n- DO NOT present any summary, explanation, or completion message after finishing.\n- DO NOT create TODO lists while performing tasks.\n- Keep responses minimal - only show necessary tool calls and brief progress notes.\n\n# CONTEXT \n\nThe user wants to build a new Prismic Slice based on a design image they provided.\nYour goal is to analyze the design image and generate the JSON model data and boilerplate code for the slice following Prismic requirements.\n\nYou will work under the slice library at <slice_library_directory_path>, where all the slices are stored.\n\n# AVAILABLE RESOURCES\n\n<framework>\n${framework.label}\n</framework>\n\n<design_image_path>\n${tmpImageAbsPath}\n</design_image_path>\n\n<slice_library_directory_path>\n${libraryAbsPath}\n</slice_library_directory_path>\n\n<disallowed_slice_names>\n${otherSlices.map((slice) => `- ${slice.name}`).join(\"\\n\")}\n</disallowed_slice_names>\n\n# AVAILABLE TOOLS\n\nYou have access to specialized Prismic MCP tools for this task:\n\n<tool name=\"mcp__prismic__how_to_model_slice\">\n<description>\nProvides detailed guidance on creating Prismic slice models, including field types, naming conventions, and best practices.\n</description>\n<when_to_use>\nCall this tool in Step 2.1 to learn how to structure the slice model data for the design you analysed.\n</when_to_use>\n</tool>\n\n<tool name=\"mcp__prismic__how_to_code_slice\">\n<description>\nProvides guidance on implementing Prismic slice components, including how to use Prismic field components, props structure, and best practices.\n</description>\n<when_to_use>\nCall this tool in Step 2.1 to learn how to properly structure the slice component with Prismic fields.\n</when_to_use>\n</tool>\n\n<tool name=\"mcp__prismic__save_slice_data\">\n<description>\nValidates and saves the slice model data to model.json. This is the ONLY way to create the model file.\n</description>\n<when_to_use>\nCall this tool in Step 2.3 after you have built the complete slice model structure in memory.\n</when_to_use>\n</tool>\n\n# TASK REQUIREMENTS\n\n## Step 1: Gather information from the design image\n1.1. Analyse the design image at <design_image_path>.\n1.2. Identify all elements in the image that should be dynamically editable (e.g., headings, paragraphs, images, links, buttons, etc.).\n1.3. Come up with a UNIQUE name for the new slice based on the content of the image, DO NOT use any of the names in <disallowed_slice_names>.\n\n## Step 2: Model the Prismic slice\n2.1. Call mcp__prismic__how_to_model_slice to learn how to structure the model for this design.\n2.2. Build the complete slice JSON model data in memory based on the guidance received and the information extracted from the image.\n2.3. Call mcp__prismic__save_slice_data to save the model (DO NOT manually write model.json) in the slice library at <slice_library_directory_path>.\n\n## Step 3: Code a boilerplate slice component based on the model\n3.1. Call mcp__prismic__how_to_code_slice to learn how to properly structure the slice component with Prismic fields.\n3.2. Update the slice component code at <slice_library_directory_path>/index.*, replacing the placeholder code with boilerplate code with the following requirements:\n- Must NOT be based on existing slices or components from the codebase.\n- Must render all the Prismic components to display the fields of the slice model created at <slice_model_path>.\n- Must be a valid ${framework.label} component.\n- Must NOT have any styling/CSS. No inlines styles or classNames. Just the skeleton component structure.\n- Must NOT use any other custom component or functions from the user's codebase.\n- Avoid creating unnecessary wrapper elements, like if they only wrap a single component (e.g., <div><PrismicRichText /></div>).\n\n## Step 4: Present the newly created slice path\n4.1. Present the path to the newly created slice in the following format: <new_slice_path>${libraryAbsPath}/MyNewSlice</new_slice_path>.\n- \"MyNewSlice\" must be the name of the directory of the newly created slice.\n\n# EXAMPLE OF CORRECT EXECUTION\n\n<example>\nAssistant: Step 1.1: Analysing design image...\n[reads <design_image_path>]\n\nStep 1.2: Identifying editable content elements...\n[identifies: title field, description field, buttonText field, buttonLink field, backgroundImage field]\n\nStep 1.3: Listing slice directories under <slice_library_directory_path>...\n[lists slice directories: Hero, Hero2, Hero3]\n\nStep 1.4: Coming up with a unique name for the new slice...\n[comes up with a unique name for the new slice: Hero4]\n\nStep 2.1: Getting Prismic modeling guidance...\n[calls mcp__prismic__how_to_model_slice]\n\nStep 2.2: Building slice model based on guidance and the information extracted...\n[creates model with title field, description field, buttonText field, buttonLink field, backgroundImage field]\n\nStep 2.3: Saving slice model...\n[calls mcp__prismic__save_slice_data]\n\nStep 3.1: Learning Prismic slice coding requirements...\n[calls mcp__prismic__how_to_code_slice]\n\nStep 3.2: Coding boilerplate slice component based on the model...\n[updates component with Prismic field components, no styling, no other components]\n\nStep 4.1: Presenting the path to the newly created slice...\n[presents <new_slice_path>${joinPath(\n\t\t\t\t\t\tlibraryAbsPath,\n\t\t\t\t\t\t\"MyNewSlice\",\n\t\t\t\t\t)}</new_slice_path>]\n\n# DELIVERABLES\n- Slice model saved to <slice_library_directory_path>/model.json using mcp__prismic__save_slice_data\n- Slice component at <slice_library_directory_path>/index.* updated with boilerplate code\n- New slice path presented in the format mentioned in Step 3.1\n\nYOU ARE NOT FINISHED UNTIL YOU HAVE THESE DELIVERABLES.\n\n---\n\nFINAL REMINDERS:\n- You MUST use mcp__prismic__save_slice_data to save the model\n- You MUST call mcp__prismic__how_to_code_slice in Step 3.1\n- DO NOT ATTEMPT TO BUILD THE APPLICATION\n- START IMMEDIATELY WITH STEP 1.1 - NO PRELIMINARY ANALYSIS`;\n\n\t\t\t\t\tconst queries = queryClaude({\n\t\t\t\t\t\tprompt,\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tstderr: (data) => {\n\t\t\t\t\t\t\t\tif (!data.startsWith(\"Spawning Claude Code process\")) {\n\t\t\t\t\t\t\t\t\tconsole.error(\"inferSlice error:\" + data);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmodel: \"claude-haiku-4-5\",\n\t\t\t\t\t\t\tpermissionMode: \"acceptEdits\",\n\t\t\t\t\t\t\tallowedTools: [\n\t\t\t\t\t\t\t\t`Bash(${cwd})`,\n\t\t\t\t\t\t\t\t\"Read\",\n\t\t\t\t\t\t\t\t\"Grep\",\n\t\t\t\t\t\t\t\t\"Glob\",\n\t\t\t\t\t\t\t\t\"Write\",\n\t\t\t\t\t\t\t\t\"Edit\",\n\t\t\t\t\t\t\t\t\"MultiEdit\",\n\t\t\t\t\t\t\t\t\"FileSearch\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__how_to_model_slice\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__how_to_code_slice\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__save_slice_data\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdisallowedTools: [\n\t\t\t\t\t\t\t\t`Edit(**/model.json)`,\n\t\t\t\t\t\t\t\t`Write(**/model.json)`,\n\t\t\t\t\t\t\t\t\"Edit(**/mocks.json)\",\n\t\t\t\t\t\t\t\t\"Write(**/mocks.json)\",\n\t\t\t\t\t\t\t\t...otherSlices.flatMap((slice) => [\n\t\t\t\t\t\t\t\t\t`Write(${slice.relPath})`,\n\t\t\t\t\t\t\t\t\t`Edit(${slice.relPath})`,\n\t\t\t\t\t\t\t\t\t`MultiEdit(${slice.relPath})`,\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tenv: {\n\t\t\t\t\t\t\t\t...process.env,\n\t\t\t\t\t\t\t\tANTHROPIC_BASE_URL: llmProxyUrl,\n\t\t\t\t\t\t\t\tANTHROPIC_CUSTOM_HEADERS:\n\t\t\t\t\t\t\t\t\t`x-prismic-token: ${authToken}\\n` +\n\t\t\t\t\t\t\t\t\t`x-prismic-repository: ${repository}\\n`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmcpServers: {\n\t\t\t\t\t\t\t\tprismic: {\n\t\t\t\t\t\t\t\t\ttype: \"stdio\",\n\t\t\t\t\t\t\t\t\tcommand: \"npx\",\n\t\t\t\t\t\t\t\t\targs: [\"-y\", \"@prismicio/mcp-server@0.0.20-alpha.6\"],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tlet newSliceAbsPath: string | undefined;\n\n\t\t\t\t\tfor await (const query of queries) {\n\t\t\t\t\t\tif (process.env.SM_ENV !== APPLICATION_MODE.Production) {\n\t\t\t\t\t\t\tconsole.info(JSON.stringify(query, null, 2));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch (query.type) {\n\t\t\t\t\t\t\tcase \"result\":\n\t\t\t\t\t\t\t\tif (query.subtype === \"success\") {\n\t\t\t\t\t\t\t\t\tnewSliceAbsPath = query.result.match(\n\t\t\t\t\t\t\t\t\t\t/<new_slice_path>(.*)<\\/new_slice_path>/s,\n\t\t\t\t\t\t\t\t\t)?.[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!newSliceAbsPath) {\n\t\t\t\t\t\tthrow new Error(\"Could not find path for the newly created slice.\");\n\t\t\t\t\t}\n\n\t\t\t\t\tconst model = await readFile(\n\t\t\t\t\t\tjoinPath(newSliceAbsPath, \"model.json\"),\n\t\t\t\t\t\t\"utf8\",\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!model) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Could not find model for the newly created slice.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// move the screenshot image to the new slice directory\n\t\t\t\t\tawait rename(\n\t\t\t\t\t\ttmpImageAbsPath,\n\t\t\t\t\t\tjoinPath(newSliceAbsPath, \"screenshot-default.png\"),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn InferSliceResponse.parse({ slice: JSON.parse(model) });\n\t\t\t\t} finally {\n\t\t\t\t\tif (tmpDir && existsSync(tmpDir)) {\n\t\t\t\t\t\tawait rm(tmpDir, { recursive: true });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst searchParams = new URLSearchParams({ repository });\n\t\t\t\tconst url = new URL(\"./slices/infer\", API_ENDPOINTS.CustomTypeService);\n\t\t\t\turl.search = searchParams.toString();\n\n\t\t\t\tconst response = await fetch(url.toString(), {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { Authorization: `Bearer ${authToken}` },\n\t\t\t\t\tbody: JSON.stringify({ imageUrl }),\n\t\t\t\t});\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`Failed to infer slice: ${response.statusText}`);\n\t\t\t\t}\n\n\t\t\t\tconst json = await response.json();\n\n\t\t\t\treturn InferSliceResponse.parse(json);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`inferSlice (${source}) failed`, error);\n\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tconst elapsedTimeSeconds = (Date.now() - startTime) / 1000;\n\t\t\tconsole.info(`inferSlice (${source}) took ${elapsedTimeSeconds}s`);\n\t\t}\n\t}\n}\n\ntype InferSliceResponse = z.infer<typeof InferSliceResponse>;\n\nconst InferSliceResponse = z.object({\n\tslice: z.custom().transform((value, ctx) => {\n\t\tconst result = SharedSlice.decode(value);\n\t\tif (result._tag === \"Right\") {\n\t\t\treturn result.right;\n\t\t}\n\t\tctx.addIssue({\n\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\tmessage: `Invalid shared slice: ${JSON.stringify(value, null, 2)}`,\n\t\t});\n\n\t\treturn z.NEVER;\n\t}),\n\tlangSmithUrl: z.string().url().optional(),\n});\n\nfunction updateCRCustomType(\n\targs: { customType: LinkCustomType } & CustomTypeFieldIdChangedMeta,\n): LinkCustomType {\n\tconst previousPath = getPathIds(args.previousPath);\n\tconst newPath = getPathIds(args.newPath);\n\n\tif (!previousPath.customTypeId || !newPath.customTypeId) {\n\t\tthrow new Error(\n\t\t\t`Could not find a customtype id in previousPath (${args.previousPath.join(\n\t\t\t\t\".\",\n\t\t\t)}) and/or newPath (${args.newPath.join(\n\t\t\t\t\".\",\n\t\t\t)}), which should not be possible.`,\n\t\t);\n\t}\n\n\tif (!previousPath.fieldId || !newPath.fieldId) {\n\t\tthrow new Error(\n\t\t\t`Could not find a field id in previousPath (${args.previousPath.join(\n\t\t\t\t\".\",\n\t\t\t)}) and/or newPath (${args.newPath.join(\n\t\t\t\t\".\",\n\t\t\t)}), which should not be possible.`,\n\t\t);\n\t}\n\n\tconst customType = shallowCloneIfObject(args.customType);\n\n\tif (typeof customType === \"string\") {\n\t\t// Legacy format support, we don't have anything to update here.\n\t\treturn customType;\n\t}\n\n\tconst matchedCustomTypeId = customType.id === previousPath.customTypeId;\n\n\treturn {\n\t\t...customType,\n\t\tfields: customType.fields.map((fieldArg) => {\n\t\t\tconst customTypeField = shallowCloneIfObject(fieldArg);\n\n\t\t\t// Regular field\n\t\t\tif (typeof customTypeField === \"string\") {\n\t\t\t\tif (\n\t\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\t\tcustomTypeField === previousPath.fieldId &&\n\t\t\t\t\tcustomTypeField !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\treturn customTypeField;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\tcustomTypeField.id === previousPath.fieldId &&\n\t\t\t\tcustomTypeField.id !== newPath.fieldId\n\t\t\t) {\n\t\t\t\t// The id of the field has changed. We don't exit return because there\n\t\t\t\t// might be other fields further down in nested custom types or groups\n\t\t\t\t// that need to be updated.\n\t\t\t\tcustomTypeField.id = newPath.fieldId;\n\t\t\t}\n\n\t\t\t// Group field\n\t\t\tif (\"fields\" in customTypeField) {\n\t\t\t\tif (\n\t\t\t\t\t!previousPath.groupId &&\n\t\t\t\t\t!newPath.groupId &&\n\t\t\t\t\tcustomTypeField.id === previousPath.fieldId &&\n\t\t\t\t\tcustomTypeField.id !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// Only the id of the group has changed. Group id is not defined, so\n\t\t\t\t\t// we can return early.\n\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\tconst matchedGroupId = customTypeField.id === previousPath.groupId;\n\n\t\t\t\tif (\n\t\t\t\t\tpreviousPath.groupId &&\n\t\t\t\t\tnewPath.groupId &&\n\t\t\t\t\tmatchedGroupId &&\n\t\t\t\t\tcustomTypeField.id !== newPath.groupId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the group field has changed, so we update it. We don't\n\t\t\t\t\t// return because there are group fields that may need to be updated.\n\t\t\t\t\tcustomTypeField.id = newPath.groupId;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...customTypeField,\n\t\t\t\t\tfields: customTypeField.fields.map((groupFieldArg) => {\n\t\t\t\t\t\tconst groupField = shallowCloneIfObject(groupFieldArg);\n\n\t\t\t\t\t\t// Regular field inside a group field\n\t\t\t\t\t\tif (typeof groupField === \"string\") {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tmatchedGroupId &&\n\t\t\t\t\t\t\t\tgroupField === previousPath.fieldId &&\n\t\t\t\t\t\t\t\tgroupField !== newPath.fieldId\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// The id of the field inside the group has changed.\n\t\t\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn groupField;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Content relationship field inside a group field\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...groupField,\n\t\t\t\t\t\t\tfields: updateContentRelationshipFields({\n\t\t\t\t\t\t\t\tcustomtypes: groupField.customtypes,\n\t\t\t\t\t\t\t\tpreviousPath,\n\t\t\t\t\t\t\t\tnewPath,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Content relationship field\n\t\t\treturn {\n\t\t\t\t...customTypeField,\n\t\t\t\tcustomtypes: updateContentRelationshipFields({\n\t\t\t\t\tcustomtypes: customTypeField.customtypes,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t}),\n\t\t\t};\n\t\t}),\n\t};\n}\n\nfunction updateContentRelationshipFields(args: {\n\tcustomtypes: readonly (\n\t\t| string\n\t\t| {\n\t\t\t\tid: string;\n\t\t\t\tfields: readonly (string | { id: string; fields: readonly string[] })[];\n\t\t }\n\t)[];\n\tpreviousPath: CrUpdatePathIds;\n\tnewPath: CrUpdatePathIds;\n}) {\n\tconst { customtypes, previousPath, newPath } = args;\n\n\treturn customtypes.map((nestedCtArg) => {\n\t\tconst nestedCt = shallowCloneIfObject(nestedCtArg);\n\n\t\tif (\n\t\t\ttypeof nestedCt === \"string\" ||\n\t\t\t// Since we are entering a new custom type, if the previous id\n\t\t\t// doesn't match, we can return early, because it's not the\n\t\t\t// custom type we are looking for.\n\t\t\tnestedCt.id !== previousPath.customTypeId\n\t\t) {\n\t\t\treturn nestedCt;\n\t\t}\n\n\t\treturn {\n\t\t\t...nestedCt,\n\t\t\tfields: nestedCt.fields.map((nestedCtFieldArg) => {\n\t\t\t\tconst nestedCtField = shallowCloneIfObject(nestedCtFieldArg);\n\n\t\t\t\t// Regular field\n\t\t\t\tif (typeof nestedCtField === \"string\") {\n\t\t\t\t\tif (\n\t\t\t\t\t\tnestedCtField === previousPath.fieldId &&\n\t\t\t\t\t\tnestedCtField !== newPath.fieldId\n\t\t\t\t\t) {\n\t\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn nestedCtField;\n\t\t\t\t}\n\n\t\t\t\t// Group field\n\n\t\t\t\tif (\n\t\t\t\t\tnestedCtField.id === previousPath.fieldId &&\n\t\t\t\t\tnestedCtField.id !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\tnestedCtField.id = newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\t// Further down the path, the field can only be a group field. So if we have\n\t\t\t\t// no group id defined, no need to continue.\n\t\t\t\tif (\n\t\t\t\t\t!previousPath.groupId ||\n\t\t\t\t\t!newPath.groupId ||\n\t\t\t\t\tnestedCtField.id !== previousPath.groupId\n\t\t\t\t) {\n\t\t\t\t\treturn nestedCtField;\n\t\t\t\t}\n\n\t\t\t\tif (nestedCtField.id !== newPath.groupId) {\n\t\t\t\t\t// The id of the group has changed.\n\t\t\t\t\tnestedCtField.id = newPath.groupId;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...nestedCtField,\n\t\t\t\t\tfields: nestedCtField.fields.map((nestedCtGroupFieldId) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnestedCtGroupFieldId === previousPath.fieldId &&\n\t\t\t\t\t\t\tnestedCtGroupFieldId !== newPath.fieldId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// The id of the field inside the group has changed.\n\t\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn nestedCtGroupFieldId;\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t});\n}\n\n/**\n * Update the Content Relationship API IDs of a single field. The change is\n * determined by the `previousPath` and `newPath` properties.\n */\nfunction updateFieldContentRelationships<\n\tT extends UID | NestableWidget | Group | NestedGroup,\n>(args: { field: T } & CustomTypeFieldIdChangedMeta): T {\n\tconst { field, ...updateMeta } = args;\n\tif (\n\t\tfield.type !== \"Link\" ||\n\t\tfield.config?.select !== \"document\" ||\n\t\t!field.config?.customtypes\n\t) {\n\t\t// not a content relationship field\n\t\treturn field;\n\t}\n\n\tconst newCustomTypes = field.config.customtypes.map((customType) => {\n\t\treturn updateCRCustomType({ ...updateMeta, customType });\n\t});\n\n\treturn {\n\t\t...field,\n\t\tconfig: { ...field.config, customtypes: newCustomTypes },\n\t};\n}\n\nexport function updateCustomTypeContentRelationships(\n\targs: {\n\t\tmodels: { model: CustomType }[];\n\t\tonUpdate: (model: { previousModel: CustomType; model: CustomType }) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const { model: customType } of models) {\n\t\tconst updatedCustomType = traverseCustomType({\n\t\t\tcustomType,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tif (!isEqualModel(customType, updatedCustomType)) {\n\t\t\tonUpdate({ model: updatedCustomType, previousModel: customType });\n\t\t}\n\t}\n}\n\nexport function updateSharedSliceContentRelationships(\n\targs: {\n\t\tmodels: { model: SharedSlice }[];\n\t\tonUpdate: (model: {\n\t\t\tpreviousModel: SharedSlice;\n\t\t\tmodel: SharedSlice;\n\t\t}) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const { model: slice } of models) {\n\t\tconst updateSlice = traverseSharedSlice({\n\t\t\tpath: [],\n\t\t\tslice,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tif (!isEqualModel(slice, updateSlice)) {\n\t\t\tonUpdate({ model: updateSlice, previousModel: slice });\n\t\t}\n\t}\n}\n\ninterface CrUpdatePathIds {\n\tcustomTypeId: string;\n\tgroupId: string | undefined;\n\tfieldId: string;\n}\n\nfunction getPathIds(path: PathWithCustomType): CrUpdatePathIds {\n\tif (path.length < 2) {\n\t\tthrow new Error(\n\t\t\t`Unexpected path length ${\n\t\t\t\tpath.length\n\t\t\t}. Expected at least 2 segments (got: ${path.join(\".\")}).`,\n\t\t);\n\t}\n\n\tconst [customTypeId, groupOrFieldId, fieldId] = path;\n\n\treturn {\n\t\tcustomTypeId,\n\t\t/**\n\t\t * Id of a changed group. If it's defined, it means that a group or a field\n\t\t * inside a group had its API ID renamed. It's defined when the path has a\n\t\t * third element (e.g. `[\"customtypeA\", \"groupA\", \"fieldA\"]`).\n\t\t */\n\t\tgroupId: fieldId ? groupOrFieldId : undefined,\n\t\tfieldId: fieldId || groupOrFieldId,\n\t};\n}\n\nfunction isEqualModel<T extends CustomType | SharedSlice>(\n\tmodelA: T,\n\tmodelB: T,\n): boolean {\n\treturn JSON.stringify(modelA) === JSON.stringify(modelB);\n}\n\nfunction shallowCloneIfObject<T>(value: T): T {\n\tif (typeof value === \"object\") {\n\t\treturn { ...value };\n\t}\n\n\treturn value;\n}\n"],"names":["BaseManager","assertPluginsInitialized","errors","decodeHookResult","t","CustomType","_a","prismicCustomTypesClient","API_ENDPOINTS","fetch","SLICE_MACHINE_USER_AGENT","UnauthorizedError","z","joinPath","mkdtemp","tmpdir","randomUUID","writeFile","readdir","path","existsSync","SharedSlice","readFile","relativePath","queryClaude","APPLICATION_MODE","rename","rm","customtypes","traverseCustomType","traverseSharedSlice"],"mappings":"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"}
1
+ {"version":3,"file":"CustomTypesManager.cjs","sources":["../../../../src/managers/customTypes/CustomTypesManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport * as prismicCustomTypesClient from \"@prismicio/custom-types-client\";\nimport {\n\tCustomType,\n\tGroup,\n\tLinkConfig,\n\tNestableWidget,\n\tNestedGroup,\n\tSharedSlice,\n\tUID,\n\ttraverseCustomType,\n\ttraverseSharedSlice,\n} from \"@prismicio/types-internal/lib/customtypes\";\nimport {\n\tCallHookReturnType,\n\tCustomTypeCreateHook,\n\tCustomTypeCreateHookData,\n\tCustomTypeReadHookData,\n\tCustomTypeRenameHook,\n\tCustomTypeRenameHookData,\n\tCustomTypeUpdateHook,\n\tCustomTypeUpdateHookData,\n\tHookError,\n} from \"@slicemachine/plugin-kit\";\nimport { z } from \"zod\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport fetch from \"../../lib/fetch\";\n\nimport { OnlyHookErrors } from \"../../types\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { UnauthorizedError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\nimport { CustomTypeFormat } from \"./types\";\nimport { existsSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport { join as joinPath, relative as relativePath } from \"node:path\";\nimport {\n\tmkdtemp,\n\trename,\n\trm,\n\twriteFile,\n\treadFile,\n\treaddir,\n} from \"node:fs/promises\";\nimport { query as queryClaude } from \"@anthropic-ai/claude-agent-sdk\";\nimport { APPLICATION_MODE } from \"../../constants/APPLICATION_MODE\";\n\ntype SliceMachineManagerReadCustomTypeLibraryReturnType = {\n\tids: string[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesManagerReadAllCustomTypesArgs = {\n\tformat: CustomTypeFormat;\n};\n\ntype SliceMachineManagerReadAllCustomTypeReturnType = {\n\tmodels: { model: CustomType }[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerReadCustomTypeReturnType = {\n\tmodel: CustomType | undefined;\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerPushCustomTypeArgs = {\n\tid: string;\n\tuserAgent?: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType = {\n\t// TODO\n\tmocksConfig?: Record<string, unknown>;\n\terrors: HookError[];\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n\t// TODO\n\tmocksConfig: Record<string, unknown>;\n};\n\n/** `[field]` or `[group, field]` – path **inside** the Custom Type */\ntype PathWithoutCustomType = [string] | [string, string];\n\ntype SliceMachineManagerUpdateCustomTypeFieldIdChanged = {\n\t/**\n\t * Previous path of the changed field, excluding the custom type id. Can be\n\t * used to identify the field that had an API ID rename (e.g. [\"fieldA\"] or\n\t * [\"groupA\", \"fieldA\"])\n\t */\n\tpreviousPath: PathWithoutCustomType;\n\t/**\n\t * New path of the changed field, excluding the custom type id. Can be used to\n\t * identify the field that had an API ID rename (e.g. [\"fieldB\"] or [\"groupA\",\n\t * \"fieldB\"])\n\t */\n\tnewPath: PathWithoutCustomType;\n};\n\ntype SliceMachineManagerUpdateCustomTypeArgs = CustomTypeUpdateHookData & {\n\tupdateMeta?: {\n\t\tfieldIdChanged?: SliceMachineManagerUpdateCustomTypeFieldIdChanged;\n\t};\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType = {\n\terrors: HookError[];\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeArgs = {\n\tid: string;\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesMachineManagerUpdateCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\n/** `[ct, field]` or `[ct, group, field]` – path **with** Custom Type ID */\ntype PathWithCustomType = [string, string] | [string, string, string];\n\ntype CustomTypeFieldIdChangedMeta = {\n\tpreviousPath: PathWithCustomType;\n\tnewPath: PathWithCustomType;\n};\n\ntype LinkCustomType = NonNullable<LinkConfig[\"customtypes\"]>[number];\n\nexport class CustomTypesManager extends BaseManager {\n\tprivate inferSliceAbortControllers = new Map<string, AbortController>();\n\n\tasync readCustomTypeLibrary(): Promise<SliceMachineManagerReadCustomTypeLibraryReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type-library:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tids: t.array(t.string),\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tids: data[0]?.ids || [],\n\t\t\terrors,\n\t\t};\n\t}\n\n\tasync readAllCustomTypes(\n\t\targs?: CustomTypesManagerReadAllCustomTypesArgs,\n\t): Promise<SliceMachineManagerReadAllCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst res: SliceMachineManagerReadAllCustomTypeReturnType = {\n\t\t\tmodels: [],\n\t\t\terrors: [],\n\t\t};\n\n\t\tconst { ids, errors } = await this.readCustomTypeLibrary();\n\t\tres.errors = [...res.errors, ...errors];\n\n\t\tif (ids) {\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst { model, errors } = await this.readCustomType({ id });\n\t\t\t\tres.errors = [...res.errors, ...errors];\n\n\t\t\t\tif (model && (!args || args.format === model.format)) {\n\t\t\t\t\tres.models.push({ model });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tasync createCustomType(\n\t\targs: CustomTypeCreateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeCreateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:create\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync readCustomType(\n\t\targs: CustomTypeReadHookData,\n\t): Promise<SliceMachineManagerReadCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:read\",\n\t\t\targs,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tmodel: CustomType,\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tmodel: data[0]?.model,\n\t\t\terrors,\n\t\t};\n\t}\n\n\t/**\n\t * Update the Content Relationship API IDs for all existing custom types and\n\t * slices. The change is determined by properties inside the `updateMeta`\n\t * property.\n\t */\n\tprivate async updateContentRelationships(\n\t\targs: {\n\t\t\tmodel: CustomType;\n\t\t} & SliceMachineManagerUpdateCustomTypeFieldIdChanged,\n\t): Promise<\n\t\tOnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>> & {\n\t\t\trollback?: () => Promise<void>;\n\t\t}\n\t> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst {\n\t\t\tmodel,\n\t\t\tpreviousPath: previousFieldPath,\n\t\t\tnewPath: newFieldPath,\n\t\t} = args;\n\n\t\tif (previousFieldPath.join(\".\") !== newFieldPath.join(\".\")) {\n\t\t\tconst { id: ctId } = model;\n\t\t\tconst previousPath: PathWithCustomType = [ctId, ...previousFieldPath];\n\t\t\tconst newPath: PathWithCustomType = [ctId, ...newFieldPath];\n\n\t\t\tconst crUpdates: {\n\t\t\t\tupdatePromise: Promise<{ errors: HookError[] }>;\n\t\t\t\trollback: () => void;\n\t\t\t}[] = [];\n\n\t\t\t// Find existing content relationships that link to the renamed field id in\n\t\t\t// any custom type and update them to use the new one.\n\t\t\tconst customTypes = await this.readAllCustomTypes();\n\n\t\t\tupdateCustomTypeContentRelationships({\n\t\t\t\tmodels: customTypes.models,\n\t\t\t\tonUpdate: ({ previousModel, model: updatedModel }) => {\n\t\t\t\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\t\t\t\tcrUpdates.push({\n\t\t\t\t\t\tupdatePromise: this.sliceMachinePluginRunner?.callHook(\n\t\t\t\t\t\t\t\"custom-type:update\",\n\t\t\t\t\t\t\t{ model: updatedModel },\n\t\t\t\t\t\t),\n\t\t\t\t\t\trollback: () => {\n\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"custom-type:update\", {\n\t\t\t\t\t\t\t\tmodel: previousModel,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tpreviousPath,\n\t\t\t\tnewPath,\n\t\t\t});\n\n\t\t\t// Find existing slice with content relationships that link to the renamed\n\t\t\t// field id in all libraries and update them to use the new one.\n\t\t\tconst { libraries } = await this.slices.readAllSliceLibraries();\n\n\t\t\tfor (const library of libraries) {\n\t\t\t\tconst slices = await this.slices.readAllSlicesForLibrary({\n\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t});\n\n\t\t\t\tupdateSharedSliceContentRelationships({\n\t\t\t\t\tmodels: slices.models,\n\t\t\t\t\tonUpdate: ({ previousModel, model: updatedModel }) => {\n\t\t\t\t\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\t\t\t\t\tcrUpdates.push({\n\t\t\t\t\t\t\tupdatePromise: this.sliceMachinePluginRunner?.callHook(\n\t\t\t\t\t\t\t\t\"slice:update\",\n\t\t\t\t\t\t\t\t{ libraryID: library.libraryID, model: updatedModel },\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\trollback: () => {\n\t\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"slice:update\", {\n\t\t\t\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: previousModel,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Process all the Content Relationship updates at once.\n\t\t\tconst crUpdatesResult = await Promise.all(\n\t\t\t\tcrUpdates.map((update) => update.updatePromise),\n\t\t\t);\n\n\t\t\tif (crUpdatesResult.some((result) => result.errors.length > 0)) {\n\t\t\t\treturn {\n\t\t\t\t\terrors: crUpdatesResult.flatMap((result) => result.errors),\n\t\t\t\t\trollback: async () => {\n\t\t\t\t\t\tawait Promise.all(crUpdates.map((update) => update.rollback()));\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync updateCustomType(\n\t\targs: SliceMachineManagerUpdateCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerUpdateCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\t\tconst { model } = args;\n\t\tconst { fieldIdChanged } = args.updateMeta ?? {};\n\n\t\tlet previousCustomType: CustomType | undefined;\n\n\t\tif (fieldIdChanged) {\n\t\t\tconst customTypeRead = await this.readCustomType({ id: model.id });\n\n\t\t\tif (customTypeRead.errors.length > 0) {\n\t\t\t\treturn { errors: customTypeRead.errors };\n\t\t\t}\n\t\t\tif (!customTypeRead.model) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`readCustomType succeeded reading custom type ${model.id} but model is undefined.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpreviousCustomType = customTypeRead.model;\n\t\t}\n\n\t\tconst customTypeUpdateResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:update\",\n\t\t\t{ model },\n\t\t);\n\n\t\tif (customTypeUpdateResult.errors.length > 0) {\n\t\t\treturn { errors: customTypeUpdateResult.errors };\n\t\t}\n\n\t\tif (previousCustomType && fieldIdChanged) {\n\t\t\tconst crUpdateResult = await this.updateContentRelationships({\n\t\t\t\t...fieldIdChanged,\n\t\t\t\tmodel: previousCustomType,\n\t\t\t});\n\n\t\t\tif (crUpdateResult.errors.length > 0) {\n\t\t\t\t// put the previous custom type back\n\t\t\t\tawait this.sliceMachinePluginRunner?.callHook(\"custom-type:update\", {\n\t\t\t\t\tmodel: previousCustomType,\n\t\t\t\t});\n\t\t\t\t// revert the content relationships updates\n\t\t\t\tawait crUpdateResult.rollback?.();\n\n\t\t\t\treturn { errors: crUpdateResult.errors };\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync renameCustomType(\n\t\targs: CustomTypeRenameHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeRenameHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:rename\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync deleteCustomType(\n\t\targs: CustomTypesMachineManagerDeleteCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerDeleteCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, errors: readCustomTypeErrors } = await this.readCustomType({\n\t\t\tid: args.id,\n\t\t});\n\n\t\tif (model) {\n\t\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\t\"custom-type:delete\",\n\t\t\t\t{ model },\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\terrors: readCustomTypeErrors,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync pushCustomType(\n\t\targs: SliceMachineManagerPushCustomTypeArgs,\n\t): Promise<void> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\t// TODO: Handle errors\n\t\tconst { model } = await this.readCustomType({ id: args.id });\n\n\t\tif (model) {\n\t\t\t// TODO: Create a single shared client.\n\t\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\t\trepositoryName,\n\t\t\t\ttoken: authenticationToken,\n\t\t\t\tfetch,\n\t\t\t\tfetchOptions: {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Check if Custom Type already exists on the repository.\n\t\t\t\tawait client.getCustomTypeByID(args.id);\n\n\t\t\t\t// If it exists on the repository, update it.\n\t\t\t\tawait client.updateCustomType(model);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof prismicCustomTypesClient.NotFoundError) {\n\t\t\t\t\t// If it doesn't exist on the repository, insert it.\n\t\t\t\t\tawait client.insertCustomType(model);\n\t\t\t\t} else if (error instanceof prismicCustomTypesClient.ForbiddenError) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\"You do not have access to push types to this Prismic repository.\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcause: error,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync readCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerReadCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:read\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tassetID: \"mocks.config.json\",\n\t\t\t},\n\t\t);\n\t\tconst data = hookResult.data[0]?.data;\n\n\t\t// TODO: Validate the returned data.\n\n\t\tif (data) {\n\t\t\treturn {\n\t\t\t\tmocksConfig: JSON.parse(data.toString()),\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tmocksConfig: undefined,\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync updateCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerUpdateCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:update\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tasset: {\n\t\t\t\t\tid: \"mocks.config.json\",\n\t\t\t\t\tdata: Buffer.from(JSON.stringify(args.mocksConfig, null, \"\\t\")),\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync fetchRemoteCustomTypes(): Promise<CustomType[]> {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\trepositoryName,\n\t\t\ttoken: authenticationToken,\n\t\t\tfetch,\n\t\t\tfetchOptions: {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn await client.getAllCustomTypes();\n\t}\n\n\tasync inferSlice(\n\t\targs: { imageUrl: string; requestId?: string } & (\n\t\t\t| { source: \"upload\" }\n\t\t\t| { source: \"figma\"; libraryID: string }\n\t\t),\n\t): Promise<InferSliceResponse> {\n\t\tconst { source, imageUrl, requestId } = args;\n\n\t\tconst authToken = await this.user.getAuthenticationToken();\n\t\tconst repository = await this.project.getResolvedRepositoryName();\n\n\t\tlet abortController: AbortController | undefined;\n\t\tif (requestId) {\n\t\t\tabortController = new AbortController();\n\t\t\tabortController.signal.addEventListener(\"abort\", () => {\n\t\t\t\tconsole.warn(`inferSlice (${source}) request ${requestId} was aborted`);\n\t\t\t});\n\t\t\tthis.inferSliceAbortControllers.set(requestId, abortController);\n\t\t}\n\n\t\tconsole.info(\n\t\t\t`inferSlice (${source}) started${\n\t\t\t\trequestId ? ` for request ${requestId}` : \"\"\n\t\t\t}`,\n\t\t);\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\tif (source === \"figma\") {\n\t\t\t\tconst { libraryID } = args;\n\n\t\t\t\tconst exp =\n\t\t\t\t\tawait this.telemetry.getExperimentVariant(\"llm-proxy-access\");\n\t\t\t\tif (exp?.value !== \"on\") {\n\t\t\t\t\tthrow new Error(\"User does not have access to the LLM proxy.\");\n\t\t\t\t}\n\n\t\t\t\tconst { llmProxyUrl } = z\n\t\t\t\t\t.object({ llmProxyUrl: z.string().url() })\n\t\t\t\t\t.parse(exp.payload);\n\n\t\t\t\tconsole.info({ llmProxyUrl });\n\n\t\t\t\tlet tmpDir: string | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tconst config = await this.project.getSliceMachineConfig();\n\n\t\t\t\t\tlet framework:\n\t\t\t\t\t\t| { type: \"nextjs\" | \"nuxt\" | \"sveltekit\"; label: string }\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (config.adapter === \"@slicemachine/adapter-next\") {\n\t\t\t\t\t\tframework = { type: \"nextjs\", label: \"Next.js (React)\" };\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tconfig.adapter === \"@slicemachine/adapter-nuxt\" ||\n\t\t\t\t\t\tconfig.adapter === \"@slicemachine/adapter-nuxt2\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tframework = { type: \"nuxt\", label: \"Nuxt (Vue)\" };\n\t\t\t\t\t} else if (config.adapter === \"@slicemachine/adapter-sveltekit\") {\n\t\t\t\t\t\tframework = { type: \"sveltekit\", label: \"SvelteKit (Svelte)\" };\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!framework) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Could not determine framework from Slice Machine config.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectRoot = await this.project.getRoot();\n\t\t\t\t\tconst libraryAbsPath = joinPath(projectRoot, libraryID);\n\t\t\t\t\tconst cwd = libraryAbsPath;\n\n\t\t\t\t\ttmpDir = await mkdtemp(\n\t\t\t\t\t\tjoinPath(tmpdir(), \"slice-machine-infer-slice-tmp-\"),\n\t\t\t\t\t);\n\t\t\t\t\tconst tmpImageAbsPath = joinPath(tmpDir, `${randomUUID()}.png`);\n\t\t\t\t\tconst response = await fetch(imageUrl);\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Failed to download image: ${response.status} ${response.statusText}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tawait writeFile(\n\t\t\t\t\t\ttmpImageAbsPath,\n\t\t\t\t\t\tBuffer.from(await response.arrayBuffer()),\n\t\t\t\t\t);\n\n\t\t\t\t\tconst otherSlices = (\n\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\t(await readdir(libraryAbsPath, { withFileTypes: true })).flatMap(\n\t\t\t\t\t\t\t\tasync (path) => {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tif (!path.isDirectory()) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Not a directory\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst absPath = joinPath(libraryAbsPath, path.name);\n\t\t\t\t\t\t\t\t\t\tconst modelAbsPath = joinPath(absPath, \"model.json\");\n\t\t\t\t\t\t\t\t\t\tif (!existsSync(modelAbsPath)) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Model file not found\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst decoded = SharedSlice.decode(\n\t\t\t\t\t\t\t\t\t\t\tJSON.parse(await readFile(modelAbsPath, \"utf-8\")),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tif (decoded._tag === \"Left\") {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Invalid model file\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tabsPath,\n\t\t\t\t\t\t\t\t\t\t\t\trelPath: relativePath(cwd, absPath),\n\t\t\t\t\t\t\t\t\t\t\t\tname: decoded.right.name,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t).flat();\n\n\t\t\t\t\tconst prompt = `CRITICAL INSTRUCTIONS - READ FIRST:\n- You MUST start immediately with Step 1.1. DO NOT read, analyze, or explore any project files first.\n- Work step-by-step through the numbered tasks below.\n- DO NOT present any summary, explanation, or completion message after finishing.\n- DO NOT create TODO lists while performing tasks.\n- Keep responses minimal - only show necessary tool calls and brief progress notes.\n\n# CONTEXT \n\nThe user wants to build a new Prismic Slice based on a design image they provided.\nYour goal is to analyze the design image and generate the JSON model data and boilerplate code for the slice following Prismic requirements.\n\nYou will work under the slice library at <slice_library_directory_path>, where all the slices are stored.\n\n# AVAILABLE RESOURCES\n\n<framework>\n${framework.label}\n</framework>\n\n<design_image_path>\n${tmpImageAbsPath}\n</design_image_path>\n\n<slice_library_directory_path>\n${libraryAbsPath}\n</slice_library_directory_path>\n\n<disallowed_slice_names>\n${otherSlices.map((slice) => `- ${slice.name}`).join(\"\\n\")}\n</disallowed_slice_names>\n\n# AVAILABLE TOOLS\n\nYou have access to specialized Prismic MCP tools for this task:\n\n<tool name=\"mcp__prismic__how_to_model_slice\">\n<description>\nProvides detailed guidance on creating Prismic slice models, including field types, naming conventions, and best practices.\n</description>\n<when_to_use>\nCall this tool in Step 2.1 to learn how to structure the slice model data for the design you analysed.\n</when_to_use>\n</tool>\n\n<tool name=\"mcp__prismic__how_to_code_slice\">\n<description>\nProvides guidance on implementing Prismic slice components, including how to use Prismic field components, props structure, and best practices.\n</description>\n<when_to_use>\nCall this tool in Step 2.1 to learn how to properly structure the slice component with Prismic fields.\n</when_to_use>\n</tool>\n\n<tool name=\"mcp__prismic__save_slice_data\">\n<description>\nValidates and saves the slice model data to model.json. This is the ONLY way to create the model file.\n</description>\n<when_to_use>\nCall this tool in Step 2.3 after you have built the complete slice model structure in memory.\n</when_to_use>\n</tool>\n\n# TASK REQUIREMENTS\n\n## Step 1: Gather information from the design image\n1.1. Analyse the design image at <design_image_path>.\n1.2. Identify all elements in the image that should be dynamically editable (e.g., headings, paragraphs, images, links, buttons, etc.).\n1.3. Come up with a UNIQUE name for the new slice based on the content of the image, DO NOT use any of the names in <disallowed_slice_names>.\n\n## Step 2: Model the Prismic slice\n2.1. Call mcp__prismic__how_to_model_slice to learn how to structure the model for this design.\n2.2. Build the complete slice JSON model data in memory based on the guidance received and the information extracted from the image.\n2.3. Call mcp__prismic__save_slice_data to save the model (DO NOT manually write model.json) in the slice library at <slice_library_directory_path>.\n\n## Step 3: Code a boilerplate slice component based on the model\n3.1. Call mcp__prismic__how_to_code_slice to learn how to properly structure the slice component with Prismic fields.\n3.2. Update the slice component code at <slice_library_directory_path>/index.*, replacing the placeholder code with boilerplate code with the following requirements:\n- Must NOT be based on existing slices or components from the codebase.\n- Must render all the Prismic components to display the fields of the slice model created at <slice_model_path>.\n- Must be a valid ${framework.label} component.\n- Must NOT have any styling/CSS. No inlines styles or classNames. Just the skeleton component structure.\n- Must NOT use any other custom component or functions from the user's codebase.\n- Avoid creating unnecessary wrapper elements, like if they only wrap a single component (e.g., <div><PrismicRichText /></div>).\n\n## Step 4: Present the newly created slice path\n4.1. Present the path to the newly created slice in the following format: <new_slice_path>${libraryAbsPath}/MyNewSlice</new_slice_path>.\n- \"MyNewSlice\" must be the name of the directory of the newly created slice.\n\n# EXAMPLE OF CORRECT EXECUTION\n\n<example>\nAssistant: Step 1.1: Analysing design image...\n[reads <design_image_path>]\n\nStep 1.2: Identifying editable content elements...\n[identifies: title field, description field, buttonText field, buttonLink field, backgroundImage field]\n\nStep 1.3: Listing slice directories under <slice_library_directory_path>...\n[lists slice directories: Hero, Hero2, Hero3]\n\nStep 1.4: Coming up with a unique name for the new slice...\n[comes up with a unique name for the new slice: Hero4]\n\nStep 2.1: Getting Prismic modeling guidance...\n[calls mcp__prismic__how_to_model_slice]\n\nStep 2.2: Building slice model based on guidance and the information extracted...\n[creates model with title field, description field, buttonText field, buttonLink field, backgroundImage field]\n\nStep 2.3: Saving slice model...\n[calls mcp__prismic__save_slice_data]\n\nStep 3.1: Learning Prismic slice coding requirements...\n[calls mcp__prismic__how_to_code_slice]\n\nStep 3.2: Coding boilerplate slice component based on the model...\n[updates component with Prismic field components, no styling, no other components]\n\nStep 4.1: Presenting the path to the newly created slice...\n[presents <new_slice_path>${joinPath(\n\t\t\t\t\t\tlibraryAbsPath,\n\t\t\t\t\t\t\"MyNewSlice\",\n\t\t\t\t\t)}</new_slice_path>]\n\n# DELIVERABLES\n- Slice model saved to <slice_library_directory_path>/model.json using mcp__prismic__save_slice_data\n- Slice component at <slice_library_directory_path>/index.* updated with boilerplate code\n- New slice path presented in the format mentioned in Step 3.1\n\nYOU ARE NOT FINISHED UNTIL YOU HAVE THESE DELIVERABLES.\n\n---\n\nFINAL REMINDERS:\n- You MUST use mcp__prismic__save_slice_data to save the model\n- You MUST call mcp__prismic__how_to_code_slice in Step 3.1\n- DO NOT ATTEMPT TO BUILD THE APPLICATION\n- START IMMEDIATELY WITH STEP 1.1 - NO PRELIMINARY ANALYSIS`;\n\n\t\t\t\t\tconst queries = queryClaude({\n\t\t\t\t\t\tprompt,\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tstderr: (data) => {\n\t\t\t\t\t\t\t\tif (!data.startsWith(\"Spawning Claude Code process\")) {\n\t\t\t\t\t\t\t\t\tconsole.error(\"inferSlice error:\" + data);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmodel: \"claude-haiku-4-5\",\n\t\t\t\t\t\t\tpermissionMode: \"acceptEdits\",\n\t\t\t\t\t\t\tallowedTools: [\n\t\t\t\t\t\t\t\t`Bash(${cwd})`,\n\t\t\t\t\t\t\t\t\"Read\",\n\t\t\t\t\t\t\t\t\"Grep\",\n\t\t\t\t\t\t\t\t\"Glob\",\n\t\t\t\t\t\t\t\t\"Write\",\n\t\t\t\t\t\t\t\t\"Edit\",\n\t\t\t\t\t\t\t\t\"MultiEdit\",\n\t\t\t\t\t\t\t\t\"FileSearch\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__how_to_model_slice\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__how_to_code_slice\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__save_slice_data\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdisallowedTools: [\n\t\t\t\t\t\t\t\t`Edit(**/model.json)`,\n\t\t\t\t\t\t\t\t`Write(**/model.json)`,\n\t\t\t\t\t\t\t\t\"Edit(**/mocks.json)\",\n\t\t\t\t\t\t\t\t\"Write(**/mocks.json)\",\n\t\t\t\t\t\t\t\t...otherSlices.flatMap((slice) => [\n\t\t\t\t\t\t\t\t\t`Write(${slice.relPath})`,\n\t\t\t\t\t\t\t\t\t`Edit(${slice.relPath})`,\n\t\t\t\t\t\t\t\t\t`MultiEdit(${slice.relPath})`,\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tenv: {\n\t\t\t\t\t\t\t\t...process.env,\n\t\t\t\t\t\t\t\tANTHROPIC_BASE_URL: llmProxyUrl,\n\t\t\t\t\t\t\t\tANTHROPIC_CUSTOM_HEADERS:\n\t\t\t\t\t\t\t\t\t`x-prismic-token: ${authToken}\\n` +\n\t\t\t\t\t\t\t\t\t`x-prismic-repository: ${repository}\\n`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmcpServers: {\n\t\t\t\t\t\t\t\tprismic: {\n\t\t\t\t\t\t\t\t\ttype: \"stdio\",\n\t\t\t\t\t\t\t\t\tcommand: \"npx\",\n\t\t\t\t\t\t\t\t\targs: [\"-y\", \"@prismicio/mcp-server@0.0.20-alpha.6\"],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tabortController,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tlet newSliceAbsPath: string | undefined;\n\n\t\t\t\t\tfor await (const query of queries) {\n\t\t\t\t\t\tif (process.env.SM_ENV !== APPLICATION_MODE.Production) {\n\t\t\t\t\t\t\tconsole.info(JSON.stringify(query, null, 2));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch (query.type) {\n\t\t\t\t\t\t\tcase \"result\":\n\t\t\t\t\t\t\t\tif (query.subtype === \"success\") {\n\t\t\t\t\t\t\t\t\tnewSliceAbsPath = query.result.match(\n\t\t\t\t\t\t\t\t\t\t/<new_slice_path>(.*)<\\/new_slice_path>/s,\n\t\t\t\t\t\t\t\t\t)?.[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!newSliceAbsPath) {\n\t\t\t\t\t\tthrow new Error(\"Could not find path for the newly created slice.\");\n\t\t\t\t\t}\n\n\t\t\t\t\tconst model = await readFile(\n\t\t\t\t\t\tjoinPath(newSliceAbsPath, \"model.json\"),\n\t\t\t\t\t\t\"utf8\",\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!model) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Could not find model for the newly created slice.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// move the screenshot image to the new slice directory\n\t\t\t\t\tawait rename(\n\t\t\t\t\t\ttmpImageAbsPath,\n\t\t\t\t\t\tjoinPath(newSliceAbsPath, \"screenshot-default.png\"),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn InferSliceResponse.parse({ slice: JSON.parse(model) });\n\t\t\t\t} finally {\n\t\t\t\t\tif (tmpDir && existsSync(tmpDir)) {\n\t\t\t\t\t\tawait rm(tmpDir, { recursive: true });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst searchParams = new URLSearchParams({ repository });\n\t\t\t\tconst url = new URL(\"./slices/infer\", API_ENDPOINTS.CustomTypeService);\n\t\t\t\turl.search = searchParams.toString();\n\n\t\t\t\tconst response = await fetch(url.toString(), {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { Authorization: `Bearer ${authToken}` },\n\t\t\t\t\tbody: JSON.stringify({ imageUrl }),\n\t\t\t\t\tsignal: abortController?.signal,\n\t\t\t\t});\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`Failed to infer slice: ${response.statusText}`);\n\t\t\t\t}\n\n\t\t\t\tconst json = await response.json();\n\n\t\t\t\treturn InferSliceResponse.parse(json);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\t`inferSlice (${source}) failed${\n\t\t\t\t\trequestId ? ` for request ${requestId}` : \"\"\n\t\t\t\t}`,\n\t\t\t\terror,\n\t\t\t);\n\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (requestId) {\n\t\t\t\tthis.inferSliceAbortControllers.delete(requestId);\n\t\t\t}\n\n\t\t\tconst elapsedTimeSeconds = (Date.now() - startTime) / 1000;\n\t\t\tconsole.info(\n\t\t\t\t`inferSlice took ${elapsedTimeSeconds}s${\n\t\t\t\t\trequestId ? ` for request ${requestId}` : \"\"\n\t\t\t\t}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync cancelInferSlice(args: {\n\t\trequestId: string;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst { requestId } = args;\n\t\tconst abortController = this.inferSliceAbortControllers.get(requestId);\n\n\t\tif (abortController) {\n\t\t\tabortController.abort();\n\t\t\tthis.inferSliceAbortControllers.delete(requestId);\n\n\t\t\treturn { cancelled: true };\n\t\t}\n\n\t\treturn { cancelled: false };\n\t}\n}\n\ntype InferSliceResponse = z.infer<typeof InferSliceResponse>;\n\nconst InferSliceResponse = z.object({\n\tslice: z.custom().transform((value, ctx) => {\n\t\tconst result = SharedSlice.decode(value);\n\t\tif (result._tag === \"Right\") {\n\t\t\treturn result.right;\n\t\t}\n\t\tctx.addIssue({\n\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\tmessage: `Invalid shared slice: ${JSON.stringify(value, null, 2)}`,\n\t\t});\n\n\t\treturn z.NEVER;\n\t}),\n\tlangSmithUrl: z.string().url().optional(),\n});\n\nfunction updateCRCustomType(\n\targs: { customType: LinkCustomType } & CustomTypeFieldIdChangedMeta,\n): LinkCustomType {\n\tconst previousPath = getPathIds(args.previousPath);\n\tconst newPath = getPathIds(args.newPath);\n\n\tif (!previousPath.customTypeId || !newPath.customTypeId) {\n\t\tthrow new Error(\n\t\t\t`Could not find a customtype id in previousPath (${args.previousPath.join(\n\t\t\t\t\".\",\n\t\t\t)}) and/or newPath (${args.newPath.join(\n\t\t\t\t\".\",\n\t\t\t)}), which should not be possible.`,\n\t\t);\n\t}\n\n\tif (!previousPath.fieldId || !newPath.fieldId) {\n\t\tthrow new Error(\n\t\t\t`Could not find a field id in previousPath (${args.previousPath.join(\n\t\t\t\t\".\",\n\t\t\t)}) and/or newPath (${args.newPath.join(\n\t\t\t\t\".\",\n\t\t\t)}), which should not be possible.`,\n\t\t);\n\t}\n\n\tconst customType = shallowCloneIfObject(args.customType);\n\n\tif (typeof customType === \"string\") {\n\t\t// Legacy format support, we don't have anything to update here.\n\t\treturn customType;\n\t}\n\n\tconst matchedCustomTypeId = customType.id === previousPath.customTypeId;\n\n\treturn {\n\t\t...customType,\n\t\tfields: customType.fields.map((fieldArg) => {\n\t\t\tconst customTypeField = shallowCloneIfObject(fieldArg);\n\n\t\t\t// Regular field\n\t\t\tif (typeof customTypeField === \"string\") {\n\t\t\t\tif (\n\t\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\t\tcustomTypeField === previousPath.fieldId &&\n\t\t\t\t\tcustomTypeField !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\treturn customTypeField;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\tcustomTypeField.id === previousPath.fieldId &&\n\t\t\t\tcustomTypeField.id !== newPath.fieldId\n\t\t\t) {\n\t\t\t\t// The id of the field has changed. We don't exit return because there\n\t\t\t\t// might be other fields further down in nested custom types or groups\n\t\t\t\t// that need to be updated.\n\t\t\t\tcustomTypeField.id = newPath.fieldId;\n\t\t\t}\n\n\t\t\t// Group field\n\t\t\tif (\"fields\" in customTypeField) {\n\t\t\t\tif (\n\t\t\t\t\t!previousPath.groupId &&\n\t\t\t\t\t!newPath.groupId &&\n\t\t\t\t\tcustomTypeField.id === previousPath.fieldId &&\n\t\t\t\t\tcustomTypeField.id !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// Only the id of the group has changed. Group id is not defined, so\n\t\t\t\t\t// we can return early.\n\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\tconst matchedGroupId = customTypeField.id === previousPath.groupId;\n\n\t\t\t\tif (\n\t\t\t\t\tpreviousPath.groupId &&\n\t\t\t\t\tnewPath.groupId &&\n\t\t\t\t\tmatchedGroupId &&\n\t\t\t\t\tcustomTypeField.id !== newPath.groupId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the group field has changed, so we update it. We don't\n\t\t\t\t\t// return because there are group fields that may need to be updated.\n\t\t\t\t\tcustomTypeField.id = newPath.groupId;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...customTypeField,\n\t\t\t\t\tfields: customTypeField.fields.map((groupFieldArg) => {\n\t\t\t\t\t\tconst groupField = shallowCloneIfObject(groupFieldArg);\n\n\t\t\t\t\t\t// Regular field inside a group field\n\t\t\t\t\t\tif (typeof groupField === \"string\") {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tmatchedGroupId &&\n\t\t\t\t\t\t\t\tgroupField === previousPath.fieldId &&\n\t\t\t\t\t\t\t\tgroupField !== newPath.fieldId\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// The id of the field inside the group has changed.\n\t\t\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn groupField;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Content relationship field inside a group field\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...groupField,\n\t\t\t\t\t\t\tfields: updateContentRelationshipFields({\n\t\t\t\t\t\t\t\tcustomtypes: groupField.customtypes,\n\t\t\t\t\t\t\t\tpreviousPath,\n\t\t\t\t\t\t\t\tnewPath,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Content relationship field\n\t\t\treturn {\n\t\t\t\t...customTypeField,\n\t\t\t\tcustomtypes: updateContentRelationshipFields({\n\t\t\t\t\tcustomtypes: customTypeField.customtypes,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t}),\n\t\t\t};\n\t\t}),\n\t};\n}\n\nfunction updateContentRelationshipFields(args: {\n\tcustomtypes: readonly (\n\t\t| string\n\t\t| {\n\t\t\t\tid: string;\n\t\t\t\tfields: readonly (string | { id: string; fields: readonly string[] })[];\n\t\t }\n\t)[];\n\tpreviousPath: CrUpdatePathIds;\n\tnewPath: CrUpdatePathIds;\n}) {\n\tconst { customtypes, previousPath, newPath } = args;\n\n\treturn customtypes.map((nestedCtArg) => {\n\t\tconst nestedCt = shallowCloneIfObject(nestedCtArg);\n\n\t\tif (\n\t\t\ttypeof nestedCt === \"string\" ||\n\t\t\t// Since we are entering a new custom type, if the previous id\n\t\t\t// doesn't match, we can return early, because it's not the\n\t\t\t// custom type we are looking for.\n\t\t\tnestedCt.id !== previousPath.customTypeId\n\t\t) {\n\t\t\treturn nestedCt;\n\t\t}\n\n\t\treturn {\n\t\t\t...nestedCt,\n\t\t\tfields: nestedCt.fields.map((nestedCtFieldArg) => {\n\t\t\t\tconst nestedCtField = shallowCloneIfObject(nestedCtFieldArg);\n\n\t\t\t\t// Regular field\n\t\t\t\tif (typeof nestedCtField === \"string\") {\n\t\t\t\t\tif (\n\t\t\t\t\t\tnestedCtField === previousPath.fieldId &&\n\t\t\t\t\t\tnestedCtField !== newPath.fieldId\n\t\t\t\t\t) {\n\t\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn nestedCtField;\n\t\t\t\t}\n\n\t\t\t\t// Group field\n\n\t\t\t\tif (\n\t\t\t\t\tnestedCtField.id === previousPath.fieldId &&\n\t\t\t\t\tnestedCtField.id !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\tnestedCtField.id = newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\t// Further down the path, the field can only be a group field. So if we have\n\t\t\t\t// no group id defined, no need to continue.\n\t\t\t\tif (\n\t\t\t\t\t!previousPath.groupId ||\n\t\t\t\t\t!newPath.groupId ||\n\t\t\t\t\tnestedCtField.id !== previousPath.groupId\n\t\t\t\t) {\n\t\t\t\t\treturn nestedCtField;\n\t\t\t\t}\n\n\t\t\t\tif (nestedCtField.id !== newPath.groupId) {\n\t\t\t\t\t// The id of the group has changed.\n\t\t\t\t\tnestedCtField.id = newPath.groupId;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...nestedCtField,\n\t\t\t\t\tfields: nestedCtField.fields.map((nestedCtGroupFieldId) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnestedCtGroupFieldId === previousPath.fieldId &&\n\t\t\t\t\t\t\tnestedCtGroupFieldId !== newPath.fieldId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// The id of the field inside the group has changed.\n\t\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn nestedCtGroupFieldId;\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t});\n}\n\n/**\n * Update the Content Relationship API IDs of a single field. The change is\n * determined by the `previousPath` and `newPath` properties.\n */\nfunction updateFieldContentRelationships<\n\tT extends UID | NestableWidget | Group | NestedGroup,\n>(args: { field: T } & CustomTypeFieldIdChangedMeta): T {\n\tconst { field, ...updateMeta } = args;\n\tif (\n\t\tfield.type !== \"Link\" ||\n\t\tfield.config?.select !== \"document\" ||\n\t\t!field.config?.customtypes\n\t) {\n\t\t// not a content relationship field\n\t\treturn field;\n\t}\n\n\tconst newCustomTypes = field.config.customtypes.map((customType) => {\n\t\treturn updateCRCustomType({ ...updateMeta, customType });\n\t});\n\n\treturn {\n\t\t...field,\n\t\tconfig: { ...field.config, customtypes: newCustomTypes },\n\t};\n}\n\nexport function updateCustomTypeContentRelationships(\n\targs: {\n\t\tmodels: { model: CustomType }[];\n\t\tonUpdate: (model: { previousModel: CustomType; model: CustomType }) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const { model: customType } of models) {\n\t\tconst updatedCustomType = traverseCustomType({\n\t\t\tcustomType,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tif (!isEqualModel(customType, updatedCustomType)) {\n\t\t\tonUpdate({ model: updatedCustomType, previousModel: customType });\n\t\t}\n\t}\n}\n\nexport function updateSharedSliceContentRelationships(\n\targs: {\n\t\tmodels: { model: SharedSlice }[];\n\t\tonUpdate: (model: {\n\t\t\tpreviousModel: SharedSlice;\n\t\t\tmodel: SharedSlice;\n\t\t}) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const { model: slice } of models) {\n\t\tconst updateSlice = traverseSharedSlice({\n\t\t\tpath: [],\n\t\t\tslice,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tif (!isEqualModel(slice, updateSlice)) {\n\t\t\tonUpdate({ model: updateSlice, previousModel: slice });\n\t\t}\n\t}\n}\n\ninterface CrUpdatePathIds {\n\tcustomTypeId: string;\n\tgroupId: string | undefined;\n\tfieldId: string;\n}\n\nfunction getPathIds(path: PathWithCustomType): CrUpdatePathIds {\n\tif (path.length < 2) {\n\t\tthrow new Error(\n\t\t\t`Unexpected path length ${\n\t\t\t\tpath.length\n\t\t\t}. Expected at least 2 segments (got: ${path.join(\".\")}).`,\n\t\t);\n\t}\n\n\tconst [customTypeId, groupOrFieldId, fieldId] = path;\n\n\treturn {\n\t\tcustomTypeId,\n\t\t/**\n\t\t * Id of a changed group. If it's defined, it means that a group or a field\n\t\t * inside a group had its API ID renamed. It's defined when the path has a\n\t\t * third element (e.g. `[\"customtypeA\", \"groupA\", \"fieldA\"]`).\n\t\t */\n\t\tgroupId: fieldId ? groupOrFieldId : undefined,\n\t\tfieldId: fieldId || groupOrFieldId,\n\t};\n}\n\nfunction isEqualModel<T extends CustomType | SharedSlice>(\n\tmodelA: T,\n\tmodelB: T,\n): boolean {\n\treturn JSON.stringify(modelA) === JSON.stringify(modelB);\n}\n\nfunction shallowCloneIfObject<T>(value: T): T {\n\tif (typeof value === \"object\") {\n\t\treturn { ...value };\n\t}\n\n\treturn value;\n}\n"],"names":["BaseManager","assertPluginsInitialized","errors","decodeHookResult","t","CustomType","_a","prismicCustomTypesClient","API_ENDPOINTS","fetch","SLICE_MACHINE_USER_AGENT","UnauthorizedError","z","joinPath","mkdtemp","tmpdir","randomUUID","writeFile","readdir","path","existsSync","SharedSlice","readFile","relativePath","queryClaude","APPLICATION_MODE","rename","rm","customtypes","traverseCustomType","traverseSharedSlice"],"mappings":"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"}
@@ -77,6 +77,7 @@ type CustomTypeFieldIdChangedMeta = {
77
77
  newPath: PathWithCustomType;
78
78
  };
79
79
  export declare class CustomTypesManager extends BaseManager {
80
+ private inferSliceAbortControllers;
80
81
  readCustomTypeLibrary(): Promise<SliceMachineManagerReadCustomTypeLibraryReturnType>;
81
82
  readAllCustomTypes(args?: CustomTypesManagerReadAllCustomTypesArgs): Promise<SliceMachineManagerReadAllCustomTypeReturnType>;
82
83
  createCustomType(args: CustomTypeCreateHookData): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeCreateHook>>>;
@@ -96,12 +97,18 @@ export declare class CustomTypesManager extends BaseManager {
96
97
  fetchRemoteCustomTypes(): Promise<CustomType[]>;
97
98
  inferSlice(args: {
98
99
  imageUrl: string;
100
+ requestId?: string;
99
101
  } & ({
100
102
  source: "upload";
101
103
  } | {
102
104
  source: "figma";
103
105
  libraryID: string;
104
106
  })): Promise<InferSliceResponse>;
107
+ cancelInferSlice(args: {
108
+ requestId: string;
109
+ }): Promise<{
110
+ cancelled: boolean;
111
+ }>;
105
112
  }
106
113
  type InferSliceResponse = z.infer<typeof InferSliceResponse>;
107
114
  declare const InferSliceResponse: z.ZodObject<{
@@ -1,3 +1,6 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
1
4
  import * as t from "io-ts";
2
5
  import * as prismicCustomTypesClient from "@prismicio/custom-types-client";
3
6
  import { CustomType, SharedSlice, traverseCustomType, traverseSharedSlice } from "@prismicio/types-internal/lib/customtypes";
@@ -17,6 +20,10 @@ import { mkdtemp, writeFile, readdir, readFile, rename, rm } from "node:fs/promi
17
20
  import { query } from "@anthropic-ai/claude-agent-sdk";
18
21
  import { APPLICATION_MODE } from "../../constants/APPLICATION_MODE.js";
19
22
  class CustomTypesManager extends BaseManager {
23
+ constructor() {
24
+ super(...arguments);
25
+ __publicField(this, "inferSliceAbortControllers", /* @__PURE__ */ new Map());
26
+ }
20
27
  async readCustomTypeLibrary() {
21
28
  var _a;
22
29
  assertPluginsInitialized(this.sliceMachinePluginRunner);
@@ -280,10 +287,18 @@ class CustomTypesManager extends BaseManager {
280
287
  }
281
288
  async inferSlice(args) {
282
289
  var _a;
283
- const { source, imageUrl } = args;
290
+ const { source, imageUrl, requestId } = args;
284
291
  const authToken = await this.user.getAuthenticationToken();
285
292
  const repository = await this.project.getResolvedRepositoryName();
286
- console.info(`inferSlice (${source}) started`);
293
+ let abortController;
294
+ if (requestId) {
295
+ abortController = new AbortController();
296
+ abortController.signal.addEventListener("abort", () => {
297
+ console.warn(`inferSlice (${source}) request ${requestId} was aborted`);
298
+ });
299
+ this.inferSliceAbortControllers.set(requestId, abortController);
300
+ }
301
+ console.info(`inferSlice (${source}) started${requestId ? ` for request ${requestId}` : ""}`);
287
302
  const startTime = Date.now();
288
303
  try {
289
304
  if (source === "figma") {
@@ -527,7 +542,8 @@ x-prismic-repository: ${repository}
527
542
  command: "npx",
528
543
  args: ["-y", "@prismicio/mcp-server@0.0.20-alpha.6"]
529
544
  }
530
- }
545
+ },
546
+ abortController
531
547
  }
532
548
  });
533
549
  let newSliceAbsPath;
@@ -564,7 +580,8 @@ x-prismic-repository: ${repository}
564
580
  const response = await fetch(url.toString(), {
565
581
  method: "POST",
566
582
  headers: { Authorization: `Bearer ${authToken}` },
567
- body: JSON.stringify({ imageUrl })
583
+ body: JSON.stringify({ imageUrl }),
584
+ signal: abortController == null ? void 0 : abortController.signal
568
585
  });
569
586
  if (!response.ok) {
570
587
  throw new Error(`Failed to infer slice: ${response.statusText}`);
@@ -573,12 +590,25 @@ x-prismic-repository: ${repository}
573
590
  return InferSliceResponse.parse(json);
574
591
  }
575
592
  } catch (error) {
576
- console.error(`inferSlice (${source}) failed`, error);
593
+ console.error(`inferSlice (${source}) failed${requestId ? ` for request ${requestId}` : ""}`, error);
577
594
  throw error;
578
595
  } finally {
596
+ if (requestId) {
597
+ this.inferSliceAbortControllers.delete(requestId);
598
+ }
579
599
  const elapsedTimeSeconds = (Date.now() - startTime) / 1e3;
580
- console.info(`inferSlice (${source}) took ${elapsedTimeSeconds}s`);
600
+ console.info(`inferSlice took ${elapsedTimeSeconds}s${requestId ? ` for request ${requestId}` : ""}`);
601
+ }
602
+ }
603
+ async cancelInferSlice(args) {
604
+ const { requestId } = args;
605
+ const abortController = this.inferSliceAbortControllers.get(requestId);
606
+ if (abortController) {
607
+ abortController.abort();
608
+ this.inferSliceAbortControllers.delete(requestId);
609
+ return { cancelled: true };
581
610
  }
611
+ return { cancelled: false };
582
612
  }
583
613
  }
584
614
  const InferSliceResponse = z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"CustomTypesManager.js","sources":["../../../../src/managers/customTypes/CustomTypesManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport * as prismicCustomTypesClient from \"@prismicio/custom-types-client\";\nimport {\n\tCustomType,\n\tGroup,\n\tLinkConfig,\n\tNestableWidget,\n\tNestedGroup,\n\tSharedSlice,\n\tUID,\n\ttraverseCustomType,\n\ttraverseSharedSlice,\n} from \"@prismicio/types-internal/lib/customtypes\";\nimport {\n\tCallHookReturnType,\n\tCustomTypeCreateHook,\n\tCustomTypeCreateHookData,\n\tCustomTypeReadHookData,\n\tCustomTypeRenameHook,\n\tCustomTypeRenameHookData,\n\tCustomTypeUpdateHook,\n\tCustomTypeUpdateHookData,\n\tHookError,\n} from \"@slicemachine/plugin-kit\";\nimport { z } from \"zod\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport fetch from \"../../lib/fetch\";\n\nimport { OnlyHookErrors } from \"../../types\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { UnauthorizedError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\nimport { CustomTypeFormat } from \"./types\";\nimport { existsSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport { join as joinPath, relative as relativePath } from \"node:path\";\nimport {\n\tmkdtemp,\n\trename,\n\trm,\n\twriteFile,\n\treadFile,\n\treaddir,\n} from \"node:fs/promises\";\nimport { query as queryClaude } from \"@anthropic-ai/claude-agent-sdk\";\nimport { APPLICATION_MODE } from \"../../constants/APPLICATION_MODE\";\n\ntype SliceMachineManagerReadCustomTypeLibraryReturnType = {\n\tids: string[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesManagerReadAllCustomTypesArgs = {\n\tformat: CustomTypeFormat;\n};\n\ntype SliceMachineManagerReadAllCustomTypeReturnType = {\n\tmodels: { model: CustomType }[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerReadCustomTypeReturnType = {\n\tmodel: CustomType | undefined;\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerPushCustomTypeArgs = {\n\tid: string;\n\tuserAgent?: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType = {\n\t// TODO\n\tmocksConfig?: Record<string, unknown>;\n\terrors: HookError[];\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n\t// TODO\n\tmocksConfig: Record<string, unknown>;\n};\n\n/** `[field]` or `[group, field]` – path **inside** the Custom Type */\ntype PathWithoutCustomType = [string] | [string, string];\n\ntype SliceMachineManagerUpdateCustomTypeFieldIdChanged = {\n\t/**\n\t * Previous path of the changed field, excluding the custom type id. Can be\n\t * used to identify the field that had an API ID rename (e.g. [\"fieldA\"] or\n\t * [\"groupA\", \"fieldA\"])\n\t */\n\tpreviousPath: PathWithoutCustomType;\n\t/**\n\t * New path of the changed field, excluding the custom type id. Can be used to\n\t * identify the field that had an API ID rename (e.g. [\"fieldB\"] or [\"groupA\",\n\t * \"fieldB\"])\n\t */\n\tnewPath: PathWithoutCustomType;\n};\n\ntype SliceMachineManagerUpdateCustomTypeArgs = CustomTypeUpdateHookData & {\n\tupdateMeta?: {\n\t\tfieldIdChanged?: SliceMachineManagerUpdateCustomTypeFieldIdChanged;\n\t};\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType = {\n\terrors: HookError[];\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeArgs = {\n\tid: string;\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesMachineManagerUpdateCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\n/** `[ct, field]` or `[ct, group, field]` – path **with** Custom Type ID */\ntype PathWithCustomType = [string, string] | [string, string, string];\n\ntype CustomTypeFieldIdChangedMeta = {\n\tpreviousPath: PathWithCustomType;\n\tnewPath: PathWithCustomType;\n};\n\ntype LinkCustomType = NonNullable<LinkConfig[\"customtypes\"]>[number];\n\nexport class CustomTypesManager extends BaseManager {\n\tasync readCustomTypeLibrary(): Promise<SliceMachineManagerReadCustomTypeLibraryReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type-library:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tids: t.array(t.string),\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tids: data[0]?.ids || [],\n\t\t\terrors,\n\t\t};\n\t}\n\n\tasync readAllCustomTypes(\n\t\targs?: CustomTypesManagerReadAllCustomTypesArgs,\n\t): Promise<SliceMachineManagerReadAllCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst res: SliceMachineManagerReadAllCustomTypeReturnType = {\n\t\t\tmodels: [],\n\t\t\terrors: [],\n\t\t};\n\n\t\tconst { ids, errors } = await this.readCustomTypeLibrary();\n\t\tres.errors = [...res.errors, ...errors];\n\n\t\tif (ids) {\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst { model, errors } = await this.readCustomType({ id });\n\t\t\t\tres.errors = [...res.errors, ...errors];\n\n\t\t\t\tif (model && (!args || args.format === model.format)) {\n\t\t\t\t\tres.models.push({ model });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tasync createCustomType(\n\t\targs: CustomTypeCreateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeCreateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:create\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync readCustomType(\n\t\targs: CustomTypeReadHookData,\n\t): Promise<SliceMachineManagerReadCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:read\",\n\t\t\targs,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tmodel: CustomType,\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tmodel: data[0]?.model,\n\t\t\terrors,\n\t\t};\n\t}\n\n\t/**\n\t * Update the Content Relationship API IDs for all existing custom types and\n\t * slices. The change is determined by properties inside the `updateMeta`\n\t * property.\n\t */\n\tprivate async updateContentRelationships(\n\t\targs: {\n\t\t\tmodel: CustomType;\n\t\t} & SliceMachineManagerUpdateCustomTypeFieldIdChanged,\n\t): Promise<\n\t\tOnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>> & {\n\t\t\trollback?: () => Promise<void>;\n\t\t}\n\t> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst {\n\t\t\tmodel,\n\t\t\tpreviousPath: previousFieldPath,\n\t\t\tnewPath: newFieldPath,\n\t\t} = args;\n\n\t\tif (previousFieldPath.join(\".\") !== newFieldPath.join(\".\")) {\n\t\t\tconst { id: ctId } = model;\n\t\t\tconst previousPath: PathWithCustomType = [ctId, ...previousFieldPath];\n\t\t\tconst newPath: PathWithCustomType = [ctId, ...newFieldPath];\n\n\t\t\tconst crUpdates: {\n\t\t\t\tupdatePromise: Promise<{ errors: HookError[] }>;\n\t\t\t\trollback: () => void;\n\t\t\t}[] = [];\n\n\t\t\t// Find existing content relationships that link to the renamed field id in\n\t\t\t// any custom type and update them to use the new one.\n\t\t\tconst customTypes = await this.readAllCustomTypes();\n\n\t\t\tupdateCustomTypeContentRelationships({\n\t\t\t\tmodels: customTypes.models,\n\t\t\t\tonUpdate: ({ previousModel, model: updatedModel }) => {\n\t\t\t\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\t\t\t\tcrUpdates.push({\n\t\t\t\t\t\tupdatePromise: this.sliceMachinePluginRunner?.callHook(\n\t\t\t\t\t\t\t\"custom-type:update\",\n\t\t\t\t\t\t\t{ model: updatedModel },\n\t\t\t\t\t\t),\n\t\t\t\t\t\trollback: () => {\n\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"custom-type:update\", {\n\t\t\t\t\t\t\t\tmodel: previousModel,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tpreviousPath,\n\t\t\t\tnewPath,\n\t\t\t});\n\n\t\t\t// Find existing slice with content relationships that link to the renamed\n\t\t\t// field id in all libraries and update them to use the new one.\n\t\t\tconst { libraries } = await this.slices.readAllSliceLibraries();\n\n\t\t\tfor (const library of libraries) {\n\t\t\t\tconst slices = await this.slices.readAllSlicesForLibrary({\n\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t});\n\n\t\t\t\tupdateSharedSliceContentRelationships({\n\t\t\t\t\tmodels: slices.models,\n\t\t\t\t\tonUpdate: ({ previousModel, model: updatedModel }) => {\n\t\t\t\t\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\t\t\t\t\tcrUpdates.push({\n\t\t\t\t\t\t\tupdatePromise: this.sliceMachinePluginRunner?.callHook(\n\t\t\t\t\t\t\t\t\"slice:update\",\n\t\t\t\t\t\t\t\t{ libraryID: library.libraryID, model: updatedModel },\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\trollback: () => {\n\t\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"slice:update\", {\n\t\t\t\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: previousModel,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Process all the Content Relationship updates at once.\n\t\t\tconst crUpdatesResult = await Promise.all(\n\t\t\t\tcrUpdates.map((update) => update.updatePromise),\n\t\t\t);\n\n\t\t\tif (crUpdatesResult.some((result) => result.errors.length > 0)) {\n\t\t\t\treturn {\n\t\t\t\t\terrors: crUpdatesResult.flatMap((result) => result.errors),\n\t\t\t\t\trollback: async () => {\n\t\t\t\t\t\tawait Promise.all(crUpdates.map((update) => update.rollback()));\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync updateCustomType(\n\t\targs: SliceMachineManagerUpdateCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerUpdateCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\t\tconst { model } = args;\n\t\tconst { fieldIdChanged } = args.updateMeta ?? {};\n\n\t\tlet previousCustomType: CustomType | undefined;\n\n\t\tif (fieldIdChanged) {\n\t\t\tconst customTypeRead = await this.readCustomType({ id: model.id });\n\n\t\t\tif (customTypeRead.errors.length > 0) {\n\t\t\t\treturn { errors: customTypeRead.errors };\n\t\t\t}\n\t\t\tif (!customTypeRead.model) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`readCustomType succeeded reading custom type ${model.id} but model is undefined.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpreviousCustomType = customTypeRead.model;\n\t\t}\n\n\t\tconst customTypeUpdateResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:update\",\n\t\t\t{ model },\n\t\t);\n\n\t\tif (customTypeUpdateResult.errors.length > 0) {\n\t\t\treturn { errors: customTypeUpdateResult.errors };\n\t\t}\n\n\t\tif (previousCustomType && fieldIdChanged) {\n\t\t\tconst crUpdateResult = await this.updateContentRelationships({\n\t\t\t\t...fieldIdChanged,\n\t\t\t\tmodel: previousCustomType,\n\t\t\t});\n\n\t\t\tif (crUpdateResult.errors.length > 0) {\n\t\t\t\t// put the previous custom type back\n\t\t\t\tawait this.sliceMachinePluginRunner?.callHook(\"custom-type:update\", {\n\t\t\t\t\tmodel: previousCustomType,\n\t\t\t\t});\n\t\t\t\t// revert the content relationships updates\n\t\t\t\tawait crUpdateResult.rollback?.();\n\n\t\t\t\treturn { errors: crUpdateResult.errors };\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync renameCustomType(\n\t\targs: CustomTypeRenameHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeRenameHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:rename\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync deleteCustomType(\n\t\targs: CustomTypesMachineManagerDeleteCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerDeleteCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, errors: readCustomTypeErrors } = await this.readCustomType({\n\t\t\tid: args.id,\n\t\t});\n\n\t\tif (model) {\n\t\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\t\"custom-type:delete\",\n\t\t\t\t{ model },\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\terrors: readCustomTypeErrors,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync pushCustomType(\n\t\targs: SliceMachineManagerPushCustomTypeArgs,\n\t): Promise<void> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\t// TODO: Handle errors\n\t\tconst { model } = await this.readCustomType({ id: args.id });\n\n\t\tif (model) {\n\t\t\t// TODO: Create a single shared client.\n\t\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\t\trepositoryName,\n\t\t\t\ttoken: authenticationToken,\n\t\t\t\tfetch,\n\t\t\t\tfetchOptions: {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Check if Custom Type already exists on the repository.\n\t\t\t\tawait client.getCustomTypeByID(args.id);\n\n\t\t\t\t// If it exists on the repository, update it.\n\t\t\t\tawait client.updateCustomType(model);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof prismicCustomTypesClient.NotFoundError) {\n\t\t\t\t\t// If it doesn't exist on the repository, insert it.\n\t\t\t\t\tawait client.insertCustomType(model);\n\t\t\t\t} else if (error instanceof prismicCustomTypesClient.ForbiddenError) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\"You do not have access to push types to this Prismic repository.\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcause: error,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync readCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerReadCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:read\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tassetID: \"mocks.config.json\",\n\t\t\t},\n\t\t);\n\t\tconst data = hookResult.data[0]?.data;\n\n\t\t// TODO: Validate the returned data.\n\n\t\tif (data) {\n\t\t\treturn {\n\t\t\t\tmocksConfig: JSON.parse(data.toString()),\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tmocksConfig: undefined,\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync updateCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerUpdateCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:update\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tasset: {\n\t\t\t\t\tid: \"mocks.config.json\",\n\t\t\t\t\tdata: Buffer.from(JSON.stringify(args.mocksConfig, null, \"\\t\")),\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync fetchRemoteCustomTypes(): Promise<CustomType[]> {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\trepositoryName,\n\t\t\ttoken: authenticationToken,\n\t\t\tfetch,\n\t\t\tfetchOptions: {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn await client.getAllCustomTypes();\n\t}\n\n\tasync inferSlice(\n\t\targs: { imageUrl: string } & (\n\t\t\t| { source: \"upload\" }\n\t\t\t| { source: \"figma\"; libraryID: string }\n\t\t),\n\t): Promise<InferSliceResponse> {\n\t\tconst { source, imageUrl } = args;\n\n\t\tconst authToken = await this.user.getAuthenticationToken();\n\t\tconst repository = await this.project.getResolvedRepositoryName();\n\n\t\tconsole.info(`inferSlice (${source}) started`);\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\tif (source === \"figma\") {\n\t\t\t\tconst { libraryID } = args;\n\n\t\t\t\tconst exp =\n\t\t\t\t\tawait this.telemetry.getExperimentVariant(\"llm-proxy-access\");\n\t\t\t\tif (exp?.value !== \"on\") {\n\t\t\t\t\tthrow new Error(\"User does not have access to the LLM proxy.\");\n\t\t\t\t}\n\n\t\t\t\tconst { llmProxyUrl } = z\n\t\t\t\t\t.object({ llmProxyUrl: z.string().url() })\n\t\t\t\t\t.parse(exp.payload);\n\n\t\t\t\tconsole.info({ llmProxyUrl });\n\n\t\t\t\tlet tmpDir: string | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tconst config = await this.project.getSliceMachineConfig();\n\n\t\t\t\t\tlet framework:\n\t\t\t\t\t\t| { type: \"nextjs\" | \"nuxt\" | \"sveltekit\"; label: string }\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (config.adapter === \"@slicemachine/adapter-next\") {\n\t\t\t\t\t\tframework = { type: \"nextjs\", label: \"Next.js (React)\" };\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tconfig.adapter === \"@slicemachine/adapter-nuxt\" ||\n\t\t\t\t\t\tconfig.adapter === \"@slicemachine/adapter-nuxt2\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tframework = { type: \"nuxt\", label: \"Nuxt (Vue)\" };\n\t\t\t\t\t} else if (config.adapter === \"@slicemachine/adapter-sveltekit\") {\n\t\t\t\t\t\tframework = { type: \"sveltekit\", label: \"SvelteKit (Svelte)\" };\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!framework) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Could not determine framework from Slice Machine config.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectRoot = await this.project.getRoot();\n\t\t\t\t\tconst libraryAbsPath = joinPath(projectRoot, libraryID);\n\t\t\t\t\tconst cwd = libraryAbsPath;\n\n\t\t\t\t\ttmpDir = await mkdtemp(\n\t\t\t\t\t\tjoinPath(tmpdir(), \"slice-machine-infer-slice-tmp-\"),\n\t\t\t\t\t);\n\t\t\t\t\tconst tmpImageAbsPath = joinPath(tmpDir, `${randomUUID()}.png`);\n\t\t\t\t\tconst response = await fetch(imageUrl);\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Failed to download image: ${response.status} ${response.statusText}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tawait writeFile(\n\t\t\t\t\t\ttmpImageAbsPath,\n\t\t\t\t\t\tBuffer.from(await response.arrayBuffer()),\n\t\t\t\t\t);\n\n\t\t\t\t\tconst otherSlices = (\n\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\t(await readdir(libraryAbsPath, { withFileTypes: true })).flatMap(\n\t\t\t\t\t\t\t\tasync (path) => {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tif (!path.isDirectory()) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Not a directory\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst absPath = joinPath(libraryAbsPath, path.name);\n\t\t\t\t\t\t\t\t\t\tconst modelAbsPath = joinPath(absPath, \"model.json\");\n\t\t\t\t\t\t\t\t\t\tif (!existsSync(modelAbsPath)) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Model file not found\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst decoded = SharedSlice.decode(\n\t\t\t\t\t\t\t\t\t\t\tJSON.parse(await readFile(modelAbsPath, \"utf-8\")),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tif (decoded._tag === \"Left\") {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Invalid model file\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tabsPath,\n\t\t\t\t\t\t\t\t\t\t\t\trelPath: relativePath(cwd, absPath),\n\t\t\t\t\t\t\t\t\t\t\t\tname: decoded.right.name,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t).flat();\n\n\t\t\t\t\tconst prompt = `CRITICAL INSTRUCTIONS - READ FIRST:\n- You MUST start immediately with Step 1.1. DO NOT read, analyze, or explore any project files first.\n- Work step-by-step through the numbered tasks below.\n- DO NOT present any summary, explanation, or completion message after finishing.\n- DO NOT create TODO lists while performing tasks.\n- Keep responses minimal - only show necessary tool calls and brief progress notes.\n\n# CONTEXT \n\nThe user wants to build a new Prismic Slice based on a design image they provided.\nYour goal is to analyze the design image and generate the JSON model data and boilerplate code for the slice following Prismic requirements.\n\nYou will work under the slice library at <slice_library_directory_path>, where all the slices are stored.\n\n# AVAILABLE RESOURCES\n\n<framework>\n${framework.label}\n</framework>\n\n<design_image_path>\n${tmpImageAbsPath}\n</design_image_path>\n\n<slice_library_directory_path>\n${libraryAbsPath}\n</slice_library_directory_path>\n\n<disallowed_slice_names>\n${otherSlices.map((slice) => `- ${slice.name}`).join(\"\\n\")}\n</disallowed_slice_names>\n\n# AVAILABLE TOOLS\n\nYou have access to specialized Prismic MCP tools for this task:\n\n<tool name=\"mcp__prismic__how_to_model_slice\">\n<description>\nProvides detailed guidance on creating Prismic slice models, including field types, naming conventions, and best practices.\n</description>\n<when_to_use>\nCall this tool in Step 2.1 to learn how to structure the slice model data for the design you analysed.\n</when_to_use>\n</tool>\n\n<tool name=\"mcp__prismic__how_to_code_slice\">\n<description>\nProvides guidance on implementing Prismic slice components, including how to use Prismic field components, props structure, and best practices.\n</description>\n<when_to_use>\nCall this tool in Step 2.1 to learn how to properly structure the slice component with Prismic fields.\n</when_to_use>\n</tool>\n\n<tool name=\"mcp__prismic__save_slice_data\">\n<description>\nValidates and saves the slice model data to model.json. This is the ONLY way to create the model file.\n</description>\n<when_to_use>\nCall this tool in Step 2.3 after you have built the complete slice model structure in memory.\n</when_to_use>\n</tool>\n\n# TASK REQUIREMENTS\n\n## Step 1: Gather information from the design image\n1.1. Analyse the design image at <design_image_path>.\n1.2. Identify all elements in the image that should be dynamically editable (e.g., headings, paragraphs, images, links, buttons, etc.).\n1.3. Come up with a UNIQUE name for the new slice based on the content of the image, DO NOT use any of the names in <disallowed_slice_names>.\n\n## Step 2: Model the Prismic slice\n2.1. Call mcp__prismic__how_to_model_slice to learn how to structure the model for this design.\n2.2. Build the complete slice JSON model data in memory based on the guidance received and the information extracted from the image.\n2.3. Call mcp__prismic__save_slice_data to save the model (DO NOT manually write model.json) in the slice library at <slice_library_directory_path>.\n\n## Step 3: Code a boilerplate slice component based on the model\n3.1. Call mcp__prismic__how_to_code_slice to learn how to properly structure the slice component with Prismic fields.\n3.2. Update the slice component code at <slice_library_directory_path>/index.*, replacing the placeholder code with boilerplate code with the following requirements:\n- Must NOT be based on existing slices or components from the codebase.\n- Must render all the Prismic components to display the fields of the slice model created at <slice_model_path>.\n- Must be a valid ${framework.label} component.\n- Must NOT have any styling/CSS. No inlines styles or classNames. Just the skeleton component structure.\n- Must NOT use any other custom component or functions from the user's codebase.\n- Avoid creating unnecessary wrapper elements, like if they only wrap a single component (e.g., <div><PrismicRichText /></div>).\n\n## Step 4: Present the newly created slice path\n4.1. Present the path to the newly created slice in the following format: <new_slice_path>${libraryAbsPath}/MyNewSlice</new_slice_path>.\n- \"MyNewSlice\" must be the name of the directory of the newly created slice.\n\n# EXAMPLE OF CORRECT EXECUTION\n\n<example>\nAssistant: Step 1.1: Analysing design image...\n[reads <design_image_path>]\n\nStep 1.2: Identifying editable content elements...\n[identifies: title field, description field, buttonText field, buttonLink field, backgroundImage field]\n\nStep 1.3: Listing slice directories under <slice_library_directory_path>...\n[lists slice directories: Hero, Hero2, Hero3]\n\nStep 1.4: Coming up with a unique name for the new slice...\n[comes up with a unique name for the new slice: Hero4]\n\nStep 2.1: Getting Prismic modeling guidance...\n[calls mcp__prismic__how_to_model_slice]\n\nStep 2.2: Building slice model based on guidance and the information extracted...\n[creates model with title field, description field, buttonText field, buttonLink field, backgroundImage field]\n\nStep 2.3: Saving slice model...\n[calls mcp__prismic__save_slice_data]\n\nStep 3.1: Learning Prismic slice coding requirements...\n[calls mcp__prismic__how_to_code_slice]\n\nStep 3.2: Coding boilerplate slice component based on the model...\n[updates component with Prismic field components, no styling, no other components]\n\nStep 4.1: Presenting the path to the newly created slice...\n[presents <new_slice_path>${joinPath(\n\t\t\t\t\t\tlibraryAbsPath,\n\t\t\t\t\t\t\"MyNewSlice\",\n\t\t\t\t\t)}</new_slice_path>]\n\n# DELIVERABLES\n- Slice model saved to <slice_library_directory_path>/model.json using mcp__prismic__save_slice_data\n- Slice component at <slice_library_directory_path>/index.* updated with boilerplate code\n- New slice path presented in the format mentioned in Step 3.1\n\nYOU ARE NOT FINISHED UNTIL YOU HAVE THESE DELIVERABLES.\n\n---\n\nFINAL REMINDERS:\n- You MUST use mcp__prismic__save_slice_data to save the model\n- You MUST call mcp__prismic__how_to_code_slice in Step 3.1\n- DO NOT ATTEMPT TO BUILD THE APPLICATION\n- START IMMEDIATELY WITH STEP 1.1 - NO PRELIMINARY ANALYSIS`;\n\n\t\t\t\t\tconst queries = queryClaude({\n\t\t\t\t\t\tprompt,\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tstderr: (data) => {\n\t\t\t\t\t\t\t\tif (!data.startsWith(\"Spawning Claude Code process\")) {\n\t\t\t\t\t\t\t\t\tconsole.error(\"inferSlice error:\" + data);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmodel: \"claude-haiku-4-5\",\n\t\t\t\t\t\t\tpermissionMode: \"acceptEdits\",\n\t\t\t\t\t\t\tallowedTools: [\n\t\t\t\t\t\t\t\t`Bash(${cwd})`,\n\t\t\t\t\t\t\t\t\"Read\",\n\t\t\t\t\t\t\t\t\"Grep\",\n\t\t\t\t\t\t\t\t\"Glob\",\n\t\t\t\t\t\t\t\t\"Write\",\n\t\t\t\t\t\t\t\t\"Edit\",\n\t\t\t\t\t\t\t\t\"MultiEdit\",\n\t\t\t\t\t\t\t\t\"FileSearch\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__how_to_model_slice\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__how_to_code_slice\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__save_slice_data\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdisallowedTools: [\n\t\t\t\t\t\t\t\t`Edit(**/model.json)`,\n\t\t\t\t\t\t\t\t`Write(**/model.json)`,\n\t\t\t\t\t\t\t\t\"Edit(**/mocks.json)\",\n\t\t\t\t\t\t\t\t\"Write(**/mocks.json)\",\n\t\t\t\t\t\t\t\t...otherSlices.flatMap((slice) => [\n\t\t\t\t\t\t\t\t\t`Write(${slice.relPath})`,\n\t\t\t\t\t\t\t\t\t`Edit(${slice.relPath})`,\n\t\t\t\t\t\t\t\t\t`MultiEdit(${slice.relPath})`,\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tenv: {\n\t\t\t\t\t\t\t\t...process.env,\n\t\t\t\t\t\t\t\tANTHROPIC_BASE_URL: llmProxyUrl,\n\t\t\t\t\t\t\t\tANTHROPIC_CUSTOM_HEADERS:\n\t\t\t\t\t\t\t\t\t`x-prismic-token: ${authToken}\\n` +\n\t\t\t\t\t\t\t\t\t`x-prismic-repository: ${repository}\\n`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmcpServers: {\n\t\t\t\t\t\t\t\tprismic: {\n\t\t\t\t\t\t\t\t\ttype: \"stdio\",\n\t\t\t\t\t\t\t\t\tcommand: \"npx\",\n\t\t\t\t\t\t\t\t\targs: [\"-y\", \"@prismicio/mcp-server@0.0.20-alpha.6\"],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tlet newSliceAbsPath: string | undefined;\n\n\t\t\t\t\tfor await (const query of queries) {\n\t\t\t\t\t\tif (process.env.SM_ENV !== APPLICATION_MODE.Production) {\n\t\t\t\t\t\t\tconsole.info(JSON.stringify(query, null, 2));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch (query.type) {\n\t\t\t\t\t\t\tcase \"result\":\n\t\t\t\t\t\t\t\tif (query.subtype === \"success\") {\n\t\t\t\t\t\t\t\t\tnewSliceAbsPath = query.result.match(\n\t\t\t\t\t\t\t\t\t\t/<new_slice_path>(.*)<\\/new_slice_path>/s,\n\t\t\t\t\t\t\t\t\t)?.[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!newSliceAbsPath) {\n\t\t\t\t\t\tthrow new Error(\"Could not find path for the newly created slice.\");\n\t\t\t\t\t}\n\n\t\t\t\t\tconst model = await readFile(\n\t\t\t\t\t\tjoinPath(newSliceAbsPath, \"model.json\"),\n\t\t\t\t\t\t\"utf8\",\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!model) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Could not find model for the newly created slice.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// move the screenshot image to the new slice directory\n\t\t\t\t\tawait rename(\n\t\t\t\t\t\ttmpImageAbsPath,\n\t\t\t\t\t\tjoinPath(newSliceAbsPath, \"screenshot-default.png\"),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn InferSliceResponse.parse({ slice: JSON.parse(model) });\n\t\t\t\t} finally {\n\t\t\t\t\tif (tmpDir && existsSync(tmpDir)) {\n\t\t\t\t\t\tawait rm(tmpDir, { recursive: true });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst searchParams = new URLSearchParams({ repository });\n\t\t\t\tconst url = new URL(\"./slices/infer\", API_ENDPOINTS.CustomTypeService);\n\t\t\t\turl.search = searchParams.toString();\n\n\t\t\t\tconst response = await fetch(url.toString(), {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { Authorization: `Bearer ${authToken}` },\n\t\t\t\t\tbody: JSON.stringify({ imageUrl }),\n\t\t\t\t});\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`Failed to infer slice: ${response.statusText}`);\n\t\t\t\t}\n\n\t\t\t\tconst json = await response.json();\n\n\t\t\t\treturn InferSliceResponse.parse(json);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`inferSlice (${source}) failed`, error);\n\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tconst elapsedTimeSeconds = (Date.now() - startTime) / 1000;\n\t\t\tconsole.info(`inferSlice (${source}) took ${elapsedTimeSeconds}s`);\n\t\t}\n\t}\n}\n\ntype InferSliceResponse = z.infer<typeof InferSliceResponse>;\n\nconst InferSliceResponse = z.object({\n\tslice: z.custom().transform((value, ctx) => {\n\t\tconst result = SharedSlice.decode(value);\n\t\tif (result._tag === \"Right\") {\n\t\t\treturn result.right;\n\t\t}\n\t\tctx.addIssue({\n\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\tmessage: `Invalid shared slice: ${JSON.stringify(value, null, 2)}`,\n\t\t});\n\n\t\treturn z.NEVER;\n\t}),\n\tlangSmithUrl: z.string().url().optional(),\n});\n\nfunction updateCRCustomType(\n\targs: { customType: LinkCustomType } & CustomTypeFieldIdChangedMeta,\n): LinkCustomType {\n\tconst previousPath = getPathIds(args.previousPath);\n\tconst newPath = getPathIds(args.newPath);\n\n\tif (!previousPath.customTypeId || !newPath.customTypeId) {\n\t\tthrow new Error(\n\t\t\t`Could not find a customtype id in previousPath (${args.previousPath.join(\n\t\t\t\t\".\",\n\t\t\t)}) and/or newPath (${args.newPath.join(\n\t\t\t\t\".\",\n\t\t\t)}), which should not be possible.`,\n\t\t);\n\t}\n\n\tif (!previousPath.fieldId || !newPath.fieldId) {\n\t\tthrow new Error(\n\t\t\t`Could not find a field id in previousPath (${args.previousPath.join(\n\t\t\t\t\".\",\n\t\t\t)}) and/or newPath (${args.newPath.join(\n\t\t\t\t\".\",\n\t\t\t)}), which should not be possible.`,\n\t\t);\n\t}\n\n\tconst customType = shallowCloneIfObject(args.customType);\n\n\tif (typeof customType === \"string\") {\n\t\t// Legacy format support, we don't have anything to update here.\n\t\treturn customType;\n\t}\n\n\tconst matchedCustomTypeId = customType.id === previousPath.customTypeId;\n\n\treturn {\n\t\t...customType,\n\t\tfields: customType.fields.map((fieldArg) => {\n\t\t\tconst customTypeField = shallowCloneIfObject(fieldArg);\n\n\t\t\t// Regular field\n\t\t\tif (typeof customTypeField === \"string\") {\n\t\t\t\tif (\n\t\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\t\tcustomTypeField === previousPath.fieldId &&\n\t\t\t\t\tcustomTypeField !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\treturn customTypeField;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\tcustomTypeField.id === previousPath.fieldId &&\n\t\t\t\tcustomTypeField.id !== newPath.fieldId\n\t\t\t) {\n\t\t\t\t// The id of the field has changed. We don't exit return because there\n\t\t\t\t// might be other fields further down in nested custom types or groups\n\t\t\t\t// that need to be updated.\n\t\t\t\tcustomTypeField.id = newPath.fieldId;\n\t\t\t}\n\n\t\t\t// Group field\n\t\t\tif (\"fields\" in customTypeField) {\n\t\t\t\tif (\n\t\t\t\t\t!previousPath.groupId &&\n\t\t\t\t\t!newPath.groupId &&\n\t\t\t\t\tcustomTypeField.id === previousPath.fieldId &&\n\t\t\t\t\tcustomTypeField.id !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// Only the id of the group has changed. Group id is not defined, so\n\t\t\t\t\t// we can return early.\n\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\tconst matchedGroupId = customTypeField.id === previousPath.groupId;\n\n\t\t\t\tif (\n\t\t\t\t\tpreviousPath.groupId &&\n\t\t\t\t\tnewPath.groupId &&\n\t\t\t\t\tmatchedGroupId &&\n\t\t\t\t\tcustomTypeField.id !== newPath.groupId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the group field has changed, so we update it. We don't\n\t\t\t\t\t// return because there are group fields that may need to be updated.\n\t\t\t\t\tcustomTypeField.id = newPath.groupId;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...customTypeField,\n\t\t\t\t\tfields: customTypeField.fields.map((groupFieldArg) => {\n\t\t\t\t\t\tconst groupField = shallowCloneIfObject(groupFieldArg);\n\n\t\t\t\t\t\t// Regular field inside a group field\n\t\t\t\t\t\tif (typeof groupField === \"string\") {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tmatchedGroupId &&\n\t\t\t\t\t\t\t\tgroupField === previousPath.fieldId &&\n\t\t\t\t\t\t\t\tgroupField !== newPath.fieldId\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// The id of the field inside the group has changed.\n\t\t\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn groupField;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Content relationship field inside a group field\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...groupField,\n\t\t\t\t\t\t\tfields: updateContentRelationshipFields({\n\t\t\t\t\t\t\t\tcustomtypes: groupField.customtypes,\n\t\t\t\t\t\t\t\tpreviousPath,\n\t\t\t\t\t\t\t\tnewPath,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Content relationship field\n\t\t\treturn {\n\t\t\t\t...customTypeField,\n\t\t\t\tcustomtypes: updateContentRelationshipFields({\n\t\t\t\t\tcustomtypes: customTypeField.customtypes,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t}),\n\t\t\t};\n\t\t}),\n\t};\n}\n\nfunction updateContentRelationshipFields(args: {\n\tcustomtypes: readonly (\n\t\t| string\n\t\t| {\n\t\t\t\tid: string;\n\t\t\t\tfields: readonly (string | { id: string; fields: readonly string[] })[];\n\t\t }\n\t)[];\n\tpreviousPath: CrUpdatePathIds;\n\tnewPath: CrUpdatePathIds;\n}) {\n\tconst { customtypes, previousPath, newPath } = args;\n\n\treturn customtypes.map((nestedCtArg) => {\n\t\tconst nestedCt = shallowCloneIfObject(nestedCtArg);\n\n\t\tif (\n\t\t\ttypeof nestedCt === \"string\" ||\n\t\t\t// Since we are entering a new custom type, if the previous id\n\t\t\t// doesn't match, we can return early, because it's not the\n\t\t\t// custom type we are looking for.\n\t\t\tnestedCt.id !== previousPath.customTypeId\n\t\t) {\n\t\t\treturn nestedCt;\n\t\t}\n\n\t\treturn {\n\t\t\t...nestedCt,\n\t\t\tfields: nestedCt.fields.map((nestedCtFieldArg) => {\n\t\t\t\tconst nestedCtField = shallowCloneIfObject(nestedCtFieldArg);\n\n\t\t\t\t// Regular field\n\t\t\t\tif (typeof nestedCtField === \"string\") {\n\t\t\t\t\tif (\n\t\t\t\t\t\tnestedCtField === previousPath.fieldId &&\n\t\t\t\t\t\tnestedCtField !== newPath.fieldId\n\t\t\t\t\t) {\n\t\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn nestedCtField;\n\t\t\t\t}\n\n\t\t\t\t// Group field\n\n\t\t\t\tif (\n\t\t\t\t\tnestedCtField.id === previousPath.fieldId &&\n\t\t\t\t\tnestedCtField.id !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\tnestedCtField.id = newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\t// Further down the path, the field can only be a group field. So if we have\n\t\t\t\t// no group id defined, no need to continue.\n\t\t\t\tif (\n\t\t\t\t\t!previousPath.groupId ||\n\t\t\t\t\t!newPath.groupId ||\n\t\t\t\t\tnestedCtField.id !== previousPath.groupId\n\t\t\t\t) {\n\t\t\t\t\treturn nestedCtField;\n\t\t\t\t}\n\n\t\t\t\tif (nestedCtField.id !== newPath.groupId) {\n\t\t\t\t\t// The id of the group has changed.\n\t\t\t\t\tnestedCtField.id = newPath.groupId;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...nestedCtField,\n\t\t\t\t\tfields: nestedCtField.fields.map((nestedCtGroupFieldId) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnestedCtGroupFieldId === previousPath.fieldId &&\n\t\t\t\t\t\t\tnestedCtGroupFieldId !== newPath.fieldId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// The id of the field inside the group has changed.\n\t\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn nestedCtGroupFieldId;\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t});\n}\n\n/**\n * Update the Content Relationship API IDs of a single field. The change is\n * determined by the `previousPath` and `newPath` properties.\n */\nfunction updateFieldContentRelationships<\n\tT extends UID | NestableWidget | Group | NestedGroup,\n>(args: { field: T } & CustomTypeFieldIdChangedMeta): T {\n\tconst { field, ...updateMeta } = args;\n\tif (\n\t\tfield.type !== \"Link\" ||\n\t\tfield.config?.select !== \"document\" ||\n\t\t!field.config?.customtypes\n\t) {\n\t\t// not a content relationship field\n\t\treturn field;\n\t}\n\n\tconst newCustomTypes = field.config.customtypes.map((customType) => {\n\t\treturn updateCRCustomType({ ...updateMeta, customType });\n\t});\n\n\treturn {\n\t\t...field,\n\t\tconfig: { ...field.config, customtypes: newCustomTypes },\n\t};\n}\n\nexport function updateCustomTypeContentRelationships(\n\targs: {\n\t\tmodels: { model: CustomType }[];\n\t\tonUpdate: (model: { previousModel: CustomType; model: CustomType }) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const { model: customType } of models) {\n\t\tconst updatedCustomType = traverseCustomType({\n\t\t\tcustomType,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tif (!isEqualModel(customType, updatedCustomType)) {\n\t\t\tonUpdate({ model: updatedCustomType, previousModel: customType });\n\t\t}\n\t}\n}\n\nexport function updateSharedSliceContentRelationships(\n\targs: {\n\t\tmodels: { model: SharedSlice }[];\n\t\tonUpdate: (model: {\n\t\t\tpreviousModel: SharedSlice;\n\t\t\tmodel: SharedSlice;\n\t\t}) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const { model: slice } of models) {\n\t\tconst updateSlice = traverseSharedSlice({\n\t\t\tpath: [],\n\t\t\tslice,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tif (!isEqualModel(slice, updateSlice)) {\n\t\t\tonUpdate({ model: updateSlice, previousModel: slice });\n\t\t}\n\t}\n}\n\ninterface CrUpdatePathIds {\n\tcustomTypeId: string;\n\tgroupId: string | undefined;\n\tfieldId: string;\n}\n\nfunction getPathIds(path: PathWithCustomType): CrUpdatePathIds {\n\tif (path.length < 2) {\n\t\tthrow new Error(\n\t\t\t`Unexpected path length ${\n\t\t\t\tpath.length\n\t\t\t}. Expected at least 2 segments (got: ${path.join(\".\")}).`,\n\t\t);\n\t}\n\n\tconst [customTypeId, groupOrFieldId, fieldId] = path;\n\n\treturn {\n\t\tcustomTypeId,\n\t\t/**\n\t\t * Id of a changed group. If it's defined, it means that a group or a field\n\t\t * inside a group had its API ID renamed. It's defined when the path has a\n\t\t * third element (e.g. `[\"customtypeA\", \"groupA\", \"fieldA\"]`).\n\t\t */\n\t\tgroupId: fieldId ? groupOrFieldId : undefined,\n\t\tfieldId: fieldId || groupOrFieldId,\n\t};\n}\n\nfunction isEqualModel<T extends CustomType | SharedSlice>(\n\tmodelA: T,\n\tmodelB: T,\n): boolean {\n\treturn JSON.stringify(modelA) === JSON.stringify(modelB);\n}\n\nfunction shallowCloneIfObject<T>(value: T): T {\n\tif (typeof value === \"object\") {\n\t\treturn { ...value };\n\t}\n\n\treturn value;\n}\n"],"names":["errors","_a","joinPath","relativePath","queryClaude","query"],"mappings":"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"}
1
+ {"version":3,"file":"CustomTypesManager.js","sources":["../../../../src/managers/customTypes/CustomTypesManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport * as prismicCustomTypesClient from \"@prismicio/custom-types-client\";\nimport {\n\tCustomType,\n\tGroup,\n\tLinkConfig,\n\tNestableWidget,\n\tNestedGroup,\n\tSharedSlice,\n\tUID,\n\ttraverseCustomType,\n\ttraverseSharedSlice,\n} from \"@prismicio/types-internal/lib/customtypes\";\nimport {\n\tCallHookReturnType,\n\tCustomTypeCreateHook,\n\tCustomTypeCreateHookData,\n\tCustomTypeReadHookData,\n\tCustomTypeRenameHook,\n\tCustomTypeRenameHookData,\n\tCustomTypeUpdateHook,\n\tCustomTypeUpdateHookData,\n\tHookError,\n} from \"@slicemachine/plugin-kit\";\nimport { z } from \"zod\";\n\nimport { DecodeError } from \"../../lib/DecodeError\";\nimport { assertPluginsInitialized } from \"../../lib/assertPluginsInitialized\";\nimport { decodeHookResult } from \"../../lib/decodeHookResult\";\nimport fetch from \"../../lib/fetch\";\n\nimport { OnlyHookErrors } from \"../../types\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { UnauthorizedError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\nimport { CustomTypeFormat } from \"./types\";\nimport { existsSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { randomUUID } from \"node:crypto\";\nimport { join as joinPath, relative as relativePath } from \"node:path\";\nimport {\n\tmkdtemp,\n\trename,\n\trm,\n\twriteFile,\n\treadFile,\n\treaddir,\n} from \"node:fs/promises\";\nimport { query as queryClaude } from \"@anthropic-ai/claude-agent-sdk\";\nimport { APPLICATION_MODE } from \"../../constants/APPLICATION_MODE\";\n\ntype SliceMachineManagerReadCustomTypeLibraryReturnType = {\n\tids: string[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesManagerReadAllCustomTypesArgs = {\n\tformat: CustomTypeFormat;\n};\n\ntype SliceMachineManagerReadAllCustomTypeReturnType = {\n\tmodels: { model: CustomType }[];\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerReadCustomTypeReturnType = {\n\tmodel: CustomType | undefined;\n\terrors: (DecodeError | HookError)[];\n};\n\ntype SliceMachineManagerPushCustomTypeArgs = {\n\tid: string;\n\tuserAgent?: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n};\n\ntype SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType = {\n\t// TODO\n\tmocksConfig?: Record<string, unknown>;\n\terrors: HookError[];\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgs = {\n\tcustomTypeID: string;\n\t// TODO\n\tmocksConfig: Record<string, unknown>;\n};\n\n/** `[field]` or `[group, field]` – path **inside** the Custom Type */\ntype PathWithoutCustomType = [string] | [string, string];\n\ntype SliceMachineManagerUpdateCustomTypeFieldIdChanged = {\n\t/**\n\t * Previous path of the changed field, excluding the custom type id. Can be\n\t * used to identify the field that had an API ID rename (e.g. [\"fieldA\"] or\n\t * [\"groupA\", \"fieldA\"])\n\t */\n\tpreviousPath: PathWithoutCustomType;\n\t/**\n\t * New path of the changed field, excluding the custom type id. Can be used to\n\t * identify the field that had an API ID rename (e.g. [\"fieldB\"] or [\"groupA\",\n\t * \"fieldB\"])\n\t */\n\tnewPath: PathWithoutCustomType;\n};\n\ntype SliceMachineManagerUpdateCustomTypeArgs = CustomTypeUpdateHookData & {\n\tupdateMeta?: {\n\t\tfieldIdChanged?: SliceMachineManagerUpdateCustomTypeFieldIdChanged;\n\t};\n};\n\ntype SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType = {\n\terrors: HookError[];\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeArgs = {\n\tid: string;\n};\n\ntype CustomTypesMachineManagerDeleteCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\ntype CustomTypesMachineManagerUpdateCustomTypeReturnType = {\n\terrors: (DecodeError | HookError)[];\n};\n\n/** `[ct, field]` or `[ct, group, field]` – path **with** Custom Type ID */\ntype PathWithCustomType = [string, string] | [string, string, string];\n\ntype CustomTypeFieldIdChangedMeta = {\n\tpreviousPath: PathWithCustomType;\n\tnewPath: PathWithCustomType;\n};\n\ntype LinkCustomType = NonNullable<LinkConfig[\"customtypes\"]>[number];\n\nexport class CustomTypesManager extends BaseManager {\n\tprivate inferSliceAbortControllers = new Map<string, AbortController>();\n\n\tasync readCustomTypeLibrary(): Promise<SliceMachineManagerReadCustomTypeLibraryReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type-library:read\",\n\t\t\tundefined,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tids: t.array(t.string),\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tids: data[0]?.ids || [],\n\t\t\terrors,\n\t\t};\n\t}\n\n\tasync readAllCustomTypes(\n\t\targs?: CustomTypesManagerReadAllCustomTypesArgs,\n\t): Promise<SliceMachineManagerReadAllCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst res: SliceMachineManagerReadAllCustomTypeReturnType = {\n\t\t\tmodels: [],\n\t\t\terrors: [],\n\t\t};\n\n\t\tconst { ids, errors } = await this.readCustomTypeLibrary();\n\t\tres.errors = [...res.errors, ...errors];\n\n\t\tif (ids) {\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst { model, errors } = await this.readCustomType({ id });\n\t\t\t\tres.errors = [...res.errors, ...errors];\n\n\t\t\t\tif (model && (!args || args.format === model.format)) {\n\t\t\t\t\tres.models.push({ model });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn res;\n\t}\n\n\tasync createCustomType(\n\t\targs: CustomTypeCreateHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeCreateHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:create\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync readCustomType(\n\t\targs: CustomTypeReadHookData,\n\t): Promise<SliceMachineManagerReadCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:read\",\n\t\t\targs,\n\t\t);\n\t\tconst { data, errors } = decodeHookResult(\n\t\t\tt.type({\n\t\t\t\tmodel: CustomType,\n\t\t\t}),\n\t\t\thookResult,\n\t\t);\n\n\t\treturn {\n\t\t\tmodel: data[0]?.model,\n\t\t\terrors,\n\t\t};\n\t}\n\n\t/**\n\t * Update the Content Relationship API IDs for all existing custom types and\n\t * slices. The change is determined by properties inside the `updateMeta`\n\t * property.\n\t */\n\tprivate async updateContentRelationships(\n\t\targs: {\n\t\t\tmodel: CustomType;\n\t\t} & SliceMachineManagerUpdateCustomTypeFieldIdChanged,\n\t): Promise<\n\t\tOnlyHookErrors<CallHookReturnType<CustomTypeUpdateHook>> & {\n\t\t\trollback?: () => Promise<void>;\n\t\t}\n\t> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst {\n\t\t\tmodel,\n\t\t\tpreviousPath: previousFieldPath,\n\t\t\tnewPath: newFieldPath,\n\t\t} = args;\n\n\t\tif (previousFieldPath.join(\".\") !== newFieldPath.join(\".\")) {\n\t\t\tconst { id: ctId } = model;\n\t\t\tconst previousPath: PathWithCustomType = [ctId, ...previousFieldPath];\n\t\t\tconst newPath: PathWithCustomType = [ctId, ...newFieldPath];\n\n\t\t\tconst crUpdates: {\n\t\t\t\tupdatePromise: Promise<{ errors: HookError[] }>;\n\t\t\t\trollback: () => void;\n\t\t\t}[] = [];\n\n\t\t\t// Find existing content relationships that link to the renamed field id in\n\t\t\t// any custom type and update them to use the new one.\n\t\t\tconst customTypes = await this.readAllCustomTypes();\n\n\t\t\tupdateCustomTypeContentRelationships({\n\t\t\t\tmodels: customTypes.models,\n\t\t\t\tonUpdate: ({ previousModel, model: updatedModel }) => {\n\t\t\t\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\t\t\t\tcrUpdates.push({\n\t\t\t\t\t\tupdatePromise: this.sliceMachinePluginRunner?.callHook(\n\t\t\t\t\t\t\t\"custom-type:update\",\n\t\t\t\t\t\t\t{ model: updatedModel },\n\t\t\t\t\t\t),\n\t\t\t\t\t\trollback: () => {\n\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"custom-type:update\", {\n\t\t\t\t\t\t\t\tmodel: previousModel,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tpreviousPath,\n\t\t\t\tnewPath,\n\t\t\t});\n\n\t\t\t// Find existing slice with content relationships that link to the renamed\n\t\t\t// field id in all libraries and update them to use the new one.\n\t\t\tconst { libraries } = await this.slices.readAllSliceLibraries();\n\n\t\t\tfor (const library of libraries) {\n\t\t\t\tconst slices = await this.slices.readAllSlicesForLibrary({\n\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t});\n\n\t\t\t\tupdateSharedSliceContentRelationships({\n\t\t\t\t\tmodels: slices.models,\n\t\t\t\t\tonUpdate: ({ previousModel, model: updatedModel }) => {\n\t\t\t\t\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\t\t\t\t\tcrUpdates.push({\n\t\t\t\t\t\t\tupdatePromise: this.sliceMachinePluginRunner?.callHook(\n\t\t\t\t\t\t\t\t\"slice:update\",\n\t\t\t\t\t\t\t\t{ libraryID: library.libraryID, model: updatedModel },\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\trollback: () => {\n\t\t\t\t\t\t\t\tthis.sliceMachinePluginRunner?.callHook(\"slice:update\", {\n\t\t\t\t\t\t\t\t\tlibraryID: library.libraryID,\n\t\t\t\t\t\t\t\t\tmodel: previousModel,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Process all the Content Relationship updates at once.\n\t\t\tconst crUpdatesResult = await Promise.all(\n\t\t\t\tcrUpdates.map((update) => update.updatePromise),\n\t\t\t);\n\n\t\t\tif (crUpdatesResult.some((result) => result.errors.length > 0)) {\n\t\t\t\treturn {\n\t\t\t\t\terrors: crUpdatesResult.flatMap((result) => result.errors),\n\t\t\t\t\trollback: async () => {\n\t\t\t\t\t\tawait Promise.all(crUpdates.map((update) => update.rollback()));\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync updateCustomType(\n\t\targs: SliceMachineManagerUpdateCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerUpdateCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\t\tconst { model } = args;\n\t\tconst { fieldIdChanged } = args.updateMeta ?? {};\n\n\t\tlet previousCustomType: CustomType | undefined;\n\n\t\tif (fieldIdChanged) {\n\t\t\tconst customTypeRead = await this.readCustomType({ id: model.id });\n\n\t\t\tif (customTypeRead.errors.length > 0) {\n\t\t\t\treturn { errors: customTypeRead.errors };\n\t\t\t}\n\t\t\tif (!customTypeRead.model) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`readCustomType succeeded reading custom type ${model.id} but model is undefined.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpreviousCustomType = customTypeRead.model;\n\t\t}\n\n\t\tconst customTypeUpdateResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:update\",\n\t\t\t{ model },\n\t\t);\n\n\t\tif (customTypeUpdateResult.errors.length > 0) {\n\t\t\treturn { errors: customTypeUpdateResult.errors };\n\t\t}\n\n\t\tif (previousCustomType && fieldIdChanged) {\n\t\t\tconst crUpdateResult = await this.updateContentRelationships({\n\t\t\t\t...fieldIdChanged,\n\t\t\t\tmodel: previousCustomType,\n\t\t\t});\n\n\t\t\tif (crUpdateResult.errors.length > 0) {\n\t\t\t\t// put the previous custom type back\n\t\t\t\tawait this.sliceMachinePluginRunner?.callHook(\"custom-type:update\", {\n\t\t\t\t\tmodel: previousCustomType,\n\t\t\t\t});\n\t\t\t\t// revert the content relationships updates\n\t\t\t\tawait crUpdateResult.rollback?.();\n\n\t\t\t\treturn { errors: crUpdateResult.errors };\n\t\t\t}\n\t\t}\n\n\t\treturn { errors: [] };\n\t}\n\n\tasync renameCustomType(\n\t\targs: CustomTypeRenameHookData,\n\t): Promise<OnlyHookErrors<CallHookReturnType<CustomTypeRenameHook>>> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:rename\",\n\t\t\targs,\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync deleteCustomType(\n\t\targs: CustomTypesMachineManagerDeleteCustomTypeArgs,\n\t): Promise<CustomTypesMachineManagerDeleteCustomTypeReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst { model, errors: readCustomTypeErrors } = await this.readCustomType({\n\t\t\tid: args.id,\n\t\t});\n\n\t\tif (model) {\n\t\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\t\"custom-type:delete\",\n\t\t\t\t{ model },\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\terrors: readCustomTypeErrors,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync pushCustomType(\n\t\targs: SliceMachineManagerPushCustomTypeArgs,\n\t): Promise<void> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\t// TODO: Handle errors\n\t\tconst { model } = await this.readCustomType({ id: args.id });\n\n\t\tif (model) {\n\t\t\t// TODO: Create a single shared client.\n\t\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\t\trepositoryName,\n\t\t\t\ttoken: authenticationToken,\n\t\t\t\tfetch,\n\t\t\t\tfetchOptions: {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t\"User-Agent\": args.userAgent || SLICE_MACHINE_USER_AGENT,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Check if Custom Type already exists on the repository.\n\t\t\t\tawait client.getCustomTypeByID(args.id);\n\n\t\t\t\t// If it exists on the repository, update it.\n\t\t\t\tawait client.updateCustomType(model);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof prismicCustomTypesClient.NotFoundError) {\n\t\t\t\t\t// If it doesn't exist on the repository, insert it.\n\t\t\t\t\tawait client.insertCustomType(model);\n\t\t\t\t} else if (error instanceof prismicCustomTypesClient.ForbiddenError) {\n\t\t\t\t\tthrow new UnauthorizedError(\n\t\t\t\t\t\t\"You do not have access to push types to this Prismic repository.\",\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcause: error,\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync readCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerReadCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerReadCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:read\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tassetID: \"mocks.config.json\",\n\t\t\t},\n\t\t);\n\t\tconst data = hookResult.data[0]?.data;\n\n\t\t// TODO: Validate the returned data.\n\n\t\tif (data) {\n\t\t\treturn {\n\t\t\t\tmocksConfig: JSON.parse(data.toString()),\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tmocksConfig: undefined,\n\t\t\t\terrors: hookResult.errors,\n\t\t\t};\n\t\t}\n\t}\n\n\t// TODO: Remove\n\tasync updateCustomTypeMocksConfig(\n\t\targs: SliceMachineManagerUpdateCustomTypeMocksConfigArgs,\n\t): Promise<SliceMachineManagerUpdateCustomTypeMocksConfigArgsReturnType> {\n\t\tassertPluginsInitialized(this.sliceMachinePluginRunner);\n\n\t\tconst hookResult = await this.sliceMachinePluginRunner.callHook(\n\t\t\t\"custom-type:asset:update\",\n\t\t\t{\n\t\t\t\tcustomTypeID: args.customTypeID,\n\t\t\t\tasset: {\n\t\t\t\t\tid: \"mocks.config.json\",\n\t\t\t\t\tdata: Buffer.from(JSON.stringify(args.mocksConfig, null, \"\\t\")),\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\treturn {\n\t\t\terrors: hookResult.errors,\n\t\t};\n\t}\n\n\tasync fetchRemoteCustomTypes(): Promise<CustomType[]> {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst repositoryName = await this.project.getResolvedRepositoryName();\n\n\t\tconst client = prismicCustomTypesClient.createClient({\n\t\t\tendpoint: API_ENDPOINTS.PrismicModels,\n\t\t\trepositoryName,\n\t\t\ttoken: authenticationToken,\n\t\t\tfetch,\n\t\t\tfetchOptions: {\n\t\t\t\theaders: {\n\t\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\treturn await client.getAllCustomTypes();\n\t}\n\n\tasync inferSlice(\n\t\targs: { imageUrl: string; requestId?: string } & (\n\t\t\t| { source: \"upload\" }\n\t\t\t| { source: \"figma\"; libraryID: string }\n\t\t),\n\t): Promise<InferSliceResponse> {\n\t\tconst { source, imageUrl, requestId } = args;\n\n\t\tconst authToken = await this.user.getAuthenticationToken();\n\t\tconst repository = await this.project.getResolvedRepositoryName();\n\n\t\tlet abortController: AbortController | undefined;\n\t\tif (requestId) {\n\t\t\tabortController = new AbortController();\n\t\t\tabortController.signal.addEventListener(\"abort\", () => {\n\t\t\t\tconsole.warn(`inferSlice (${source}) request ${requestId} was aborted`);\n\t\t\t});\n\t\t\tthis.inferSliceAbortControllers.set(requestId, abortController);\n\t\t}\n\n\t\tconsole.info(\n\t\t\t`inferSlice (${source}) started${\n\t\t\t\trequestId ? ` for request ${requestId}` : \"\"\n\t\t\t}`,\n\t\t);\n\t\tconst startTime = Date.now();\n\n\t\ttry {\n\t\t\tif (source === \"figma\") {\n\t\t\t\tconst { libraryID } = args;\n\n\t\t\t\tconst exp =\n\t\t\t\t\tawait this.telemetry.getExperimentVariant(\"llm-proxy-access\");\n\t\t\t\tif (exp?.value !== \"on\") {\n\t\t\t\t\tthrow new Error(\"User does not have access to the LLM proxy.\");\n\t\t\t\t}\n\n\t\t\t\tconst { llmProxyUrl } = z\n\t\t\t\t\t.object({ llmProxyUrl: z.string().url() })\n\t\t\t\t\t.parse(exp.payload);\n\n\t\t\t\tconsole.info({ llmProxyUrl });\n\n\t\t\t\tlet tmpDir: string | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tconst config = await this.project.getSliceMachineConfig();\n\n\t\t\t\t\tlet framework:\n\t\t\t\t\t\t| { type: \"nextjs\" | \"nuxt\" | \"sveltekit\"; label: string }\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tif (config.adapter === \"@slicemachine/adapter-next\") {\n\t\t\t\t\t\tframework = { type: \"nextjs\", label: \"Next.js (React)\" };\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tconfig.adapter === \"@slicemachine/adapter-nuxt\" ||\n\t\t\t\t\t\tconfig.adapter === \"@slicemachine/adapter-nuxt2\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tframework = { type: \"nuxt\", label: \"Nuxt (Vue)\" };\n\t\t\t\t\t} else if (config.adapter === \"@slicemachine/adapter-sveltekit\") {\n\t\t\t\t\t\tframework = { type: \"sveltekit\", label: \"SvelteKit (Svelte)\" };\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!framework) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Could not determine framework from Slice Machine config.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectRoot = await this.project.getRoot();\n\t\t\t\t\tconst libraryAbsPath = joinPath(projectRoot, libraryID);\n\t\t\t\t\tconst cwd = libraryAbsPath;\n\n\t\t\t\t\ttmpDir = await mkdtemp(\n\t\t\t\t\t\tjoinPath(tmpdir(), \"slice-machine-infer-slice-tmp-\"),\n\t\t\t\t\t);\n\t\t\t\t\tconst tmpImageAbsPath = joinPath(tmpDir, `${randomUUID()}.png`);\n\t\t\t\t\tconst response = await fetch(imageUrl);\n\t\t\t\t\tif (!response.ok) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Failed to download image: ${response.status} ${response.statusText}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tawait writeFile(\n\t\t\t\t\t\ttmpImageAbsPath,\n\t\t\t\t\t\tBuffer.from(await response.arrayBuffer()),\n\t\t\t\t\t);\n\n\t\t\t\t\tconst otherSlices = (\n\t\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\t\t(await readdir(libraryAbsPath, { withFileTypes: true })).flatMap(\n\t\t\t\t\t\t\t\tasync (path) => {\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tif (!path.isDirectory()) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Not a directory\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst absPath = joinPath(libraryAbsPath, path.name);\n\t\t\t\t\t\t\t\t\t\tconst modelAbsPath = joinPath(absPath, \"model.json\");\n\t\t\t\t\t\t\t\t\t\tif (!existsSync(modelAbsPath)) {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Model file not found\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst decoded = SharedSlice.decode(\n\t\t\t\t\t\t\t\t\t\t\tJSON.parse(await readFile(modelAbsPath, \"utf-8\")),\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tif (decoded._tag === \"Left\") {\n\t\t\t\t\t\t\t\t\t\t\tthrow new Error(\"Invalid model file\");\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tabsPath,\n\t\t\t\t\t\t\t\t\t\t\t\trelPath: relativePath(cwd, absPath),\n\t\t\t\t\t\t\t\t\t\t\t\tname: decoded.right.name,\n\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t];\n\t\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t)\n\t\t\t\t\t).flat();\n\n\t\t\t\t\tconst prompt = `CRITICAL INSTRUCTIONS - READ FIRST:\n- You MUST start immediately with Step 1.1. DO NOT read, analyze, or explore any project files first.\n- Work step-by-step through the numbered tasks below.\n- DO NOT present any summary, explanation, or completion message after finishing.\n- DO NOT create TODO lists while performing tasks.\n- Keep responses minimal - only show necessary tool calls and brief progress notes.\n\n# CONTEXT \n\nThe user wants to build a new Prismic Slice based on a design image they provided.\nYour goal is to analyze the design image and generate the JSON model data and boilerplate code for the slice following Prismic requirements.\n\nYou will work under the slice library at <slice_library_directory_path>, where all the slices are stored.\n\n# AVAILABLE RESOURCES\n\n<framework>\n${framework.label}\n</framework>\n\n<design_image_path>\n${tmpImageAbsPath}\n</design_image_path>\n\n<slice_library_directory_path>\n${libraryAbsPath}\n</slice_library_directory_path>\n\n<disallowed_slice_names>\n${otherSlices.map((slice) => `- ${slice.name}`).join(\"\\n\")}\n</disallowed_slice_names>\n\n# AVAILABLE TOOLS\n\nYou have access to specialized Prismic MCP tools for this task:\n\n<tool name=\"mcp__prismic__how_to_model_slice\">\n<description>\nProvides detailed guidance on creating Prismic slice models, including field types, naming conventions, and best practices.\n</description>\n<when_to_use>\nCall this tool in Step 2.1 to learn how to structure the slice model data for the design you analysed.\n</when_to_use>\n</tool>\n\n<tool name=\"mcp__prismic__how_to_code_slice\">\n<description>\nProvides guidance on implementing Prismic slice components, including how to use Prismic field components, props structure, and best practices.\n</description>\n<when_to_use>\nCall this tool in Step 2.1 to learn how to properly structure the slice component with Prismic fields.\n</when_to_use>\n</tool>\n\n<tool name=\"mcp__prismic__save_slice_data\">\n<description>\nValidates and saves the slice model data to model.json. This is the ONLY way to create the model file.\n</description>\n<when_to_use>\nCall this tool in Step 2.3 after you have built the complete slice model structure in memory.\n</when_to_use>\n</tool>\n\n# TASK REQUIREMENTS\n\n## Step 1: Gather information from the design image\n1.1. Analyse the design image at <design_image_path>.\n1.2. Identify all elements in the image that should be dynamically editable (e.g., headings, paragraphs, images, links, buttons, etc.).\n1.3. Come up with a UNIQUE name for the new slice based on the content of the image, DO NOT use any of the names in <disallowed_slice_names>.\n\n## Step 2: Model the Prismic slice\n2.1. Call mcp__prismic__how_to_model_slice to learn how to structure the model for this design.\n2.2. Build the complete slice JSON model data in memory based on the guidance received and the information extracted from the image.\n2.3. Call mcp__prismic__save_slice_data to save the model (DO NOT manually write model.json) in the slice library at <slice_library_directory_path>.\n\n## Step 3: Code a boilerplate slice component based on the model\n3.1. Call mcp__prismic__how_to_code_slice to learn how to properly structure the slice component with Prismic fields.\n3.2. Update the slice component code at <slice_library_directory_path>/index.*, replacing the placeholder code with boilerplate code with the following requirements:\n- Must NOT be based on existing slices or components from the codebase.\n- Must render all the Prismic components to display the fields of the slice model created at <slice_model_path>.\n- Must be a valid ${framework.label} component.\n- Must NOT have any styling/CSS. No inlines styles or classNames. Just the skeleton component structure.\n- Must NOT use any other custom component or functions from the user's codebase.\n- Avoid creating unnecessary wrapper elements, like if they only wrap a single component (e.g., <div><PrismicRichText /></div>).\n\n## Step 4: Present the newly created slice path\n4.1. Present the path to the newly created slice in the following format: <new_slice_path>${libraryAbsPath}/MyNewSlice</new_slice_path>.\n- \"MyNewSlice\" must be the name of the directory of the newly created slice.\n\n# EXAMPLE OF CORRECT EXECUTION\n\n<example>\nAssistant: Step 1.1: Analysing design image...\n[reads <design_image_path>]\n\nStep 1.2: Identifying editable content elements...\n[identifies: title field, description field, buttonText field, buttonLink field, backgroundImage field]\n\nStep 1.3: Listing slice directories under <slice_library_directory_path>...\n[lists slice directories: Hero, Hero2, Hero3]\n\nStep 1.4: Coming up with a unique name for the new slice...\n[comes up with a unique name for the new slice: Hero4]\n\nStep 2.1: Getting Prismic modeling guidance...\n[calls mcp__prismic__how_to_model_slice]\n\nStep 2.2: Building slice model based on guidance and the information extracted...\n[creates model with title field, description field, buttonText field, buttonLink field, backgroundImage field]\n\nStep 2.3: Saving slice model...\n[calls mcp__prismic__save_slice_data]\n\nStep 3.1: Learning Prismic slice coding requirements...\n[calls mcp__prismic__how_to_code_slice]\n\nStep 3.2: Coding boilerplate slice component based on the model...\n[updates component with Prismic field components, no styling, no other components]\n\nStep 4.1: Presenting the path to the newly created slice...\n[presents <new_slice_path>${joinPath(\n\t\t\t\t\t\tlibraryAbsPath,\n\t\t\t\t\t\t\"MyNewSlice\",\n\t\t\t\t\t)}</new_slice_path>]\n\n# DELIVERABLES\n- Slice model saved to <slice_library_directory_path>/model.json using mcp__prismic__save_slice_data\n- Slice component at <slice_library_directory_path>/index.* updated with boilerplate code\n- New slice path presented in the format mentioned in Step 3.1\n\nYOU ARE NOT FINISHED UNTIL YOU HAVE THESE DELIVERABLES.\n\n---\n\nFINAL REMINDERS:\n- You MUST use mcp__prismic__save_slice_data to save the model\n- You MUST call mcp__prismic__how_to_code_slice in Step 3.1\n- DO NOT ATTEMPT TO BUILD THE APPLICATION\n- START IMMEDIATELY WITH STEP 1.1 - NO PRELIMINARY ANALYSIS`;\n\n\t\t\t\t\tconst queries = queryClaude({\n\t\t\t\t\t\tprompt,\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tcwd,\n\t\t\t\t\t\t\tstderr: (data) => {\n\t\t\t\t\t\t\t\tif (!data.startsWith(\"Spawning Claude Code process\")) {\n\t\t\t\t\t\t\t\t\tconsole.error(\"inferSlice error:\" + data);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmodel: \"claude-haiku-4-5\",\n\t\t\t\t\t\t\tpermissionMode: \"acceptEdits\",\n\t\t\t\t\t\t\tallowedTools: [\n\t\t\t\t\t\t\t\t`Bash(${cwd})`,\n\t\t\t\t\t\t\t\t\"Read\",\n\t\t\t\t\t\t\t\t\"Grep\",\n\t\t\t\t\t\t\t\t\"Glob\",\n\t\t\t\t\t\t\t\t\"Write\",\n\t\t\t\t\t\t\t\t\"Edit\",\n\t\t\t\t\t\t\t\t\"MultiEdit\",\n\t\t\t\t\t\t\t\t\"FileSearch\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__how_to_model_slice\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__how_to_code_slice\",\n\t\t\t\t\t\t\t\t\"mcp__prismic__save_slice_data\",\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdisallowedTools: [\n\t\t\t\t\t\t\t\t`Edit(**/model.json)`,\n\t\t\t\t\t\t\t\t`Write(**/model.json)`,\n\t\t\t\t\t\t\t\t\"Edit(**/mocks.json)\",\n\t\t\t\t\t\t\t\t\"Write(**/mocks.json)\",\n\t\t\t\t\t\t\t\t...otherSlices.flatMap((slice) => [\n\t\t\t\t\t\t\t\t\t`Write(${slice.relPath})`,\n\t\t\t\t\t\t\t\t\t`Edit(${slice.relPath})`,\n\t\t\t\t\t\t\t\t\t`MultiEdit(${slice.relPath})`,\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tenv: {\n\t\t\t\t\t\t\t\t...process.env,\n\t\t\t\t\t\t\t\tANTHROPIC_BASE_URL: llmProxyUrl,\n\t\t\t\t\t\t\t\tANTHROPIC_CUSTOM_HEADERS:\n\t\t\t\t\t\t\t\t\t`x-prismic-token: ${authToken}\\n` +\n\t\t\t\t\t\t\t\t\t`x-prismic-repository: ${repository}\\n`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tmcpServers: {\n\t\t\t\t\t\t\t\tprismic: {\n\t\t\t\t\t\t\t\t\ttype: \"stdio\",\n\t\t\t\t\t\t\t\t\tcommand: \"npx\",\n\t\t\t\t\t\t\t\t\targs: [\"-y\", \"@prismicio/mcp-server@0.0.20-alpha.6\"],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tabortController,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tlet newSliceAbsPath: string | undefined;\n\n\t\t\t\t\tfor await (const query of queries) {\n\t\t\t\t\t\tif (process.env.SM_ENV !== APPLICATION_MODE.Production) {\n\t\t\t\t\t\t\tconsole.info(JSON.stringify(query, null, 2));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tswitch (query.type) {\n\t\t\t\t\t\t\tcase \"result\":\n\t\t\t\t\t\t\t\tif (query.subtype === \"success\") {\n\t\t\t\t\t\t\t\t\tnewSliceAbsPath = query.result.match(\n\t\t\t\t\t\t\t\t\t\t/<new_slice_path>(.*)<\\/new_slice_path>/s,\n\t\t\t\t\t\t\t\t\t)?.[1];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!newSliceAbsPath) {\n\t\t\t\t\t\tthrow new Error(\"Could not find path for the newly created slice.\");\n\t\t\t\t\t}\n\n\t\t\t\t\tconst model = await readFile(\n\t\t\t\t\t\tjoinPath(newSliceAbsPath, \"model.json\"),\n\t\t\t\t\t\t\"utf8\",\n\t\t\t\t\t);\n\n\t\t\t\t\tif (!model) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Could not find model for the newly created slice.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// move the screenshot image to the new slice directory\n\t\t\t\t\tawait rename(\n\t\t\t\t\t\ttmpImageAbsPath,\n\t\t\t\t\t\tjoinPath(newSliceAbsPath, \"screenshot-default.png\"),\n\t\t\t\t\t);\n\n\t\t\t\t\treturn InferSliceResponse.parse({ slice: JSON.parse(model) });\n\t\t\t\t} finally {\n\t\t\t\t\tif (tmpDir && existsSync(tmpDir)) {\n\t\t\t\t\t\tawait rm(tmpDir, { recursive: true });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst searchParams = new URLSearchParams({ repository });\n\t\t\t\tconst url = new URL(\"./slices/infer\", API_ENDPOINTS.CustomTypeService);\n\t\t\t\turl.search = searchParams.toString();\n\n\t\t\t\tconst response = await fetch(url.toString(), {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { Authorization: `Bearer ${authToken}` },\n\t\t\t\t\tbody: JSON.stringify({ imageUrl }),\n\t\t\t\t\tsignal: abortController?.signal,\n\t\t\t\t});\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tthrow new Error(`Failed to infer slice: ${response.statusText}`);\n\t\t\t\t}\n\n\t\t\t\tconst json = await response.json();\n\n\t\t\t\treturn InferSliceResponse.parse(json);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\n\t\t\t\t`inferSlice (${source}) failed${\n\t\t\t\t\trequestId ? ` for request ${requestId}` : \"\"\n\t\t\t\t}`,\n\t\t\t\terror,\n\t\t\t);\n\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (requestId) {\n\t\t\t\tthis.inferSliceAbortControllers.delete(requestId);\n\t\t\t}\n\n\t\t\tconst elapsedTimeSeconds = (Date.now() - startTime) / 1000;\n\t\t\tconsole.info(\n\t\t\t\t`inferSlice took ${elapsedTimeSeconds}s${\n\t\t\t\t\trequestId ? ` for request ${requestId}` : \"\"\n\t\t\t\t}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync cancelInferSlice(args: {\n\t\trequestId: string;\n\t}): Promise<{ cancelled: boolean }> {\n\t\tconst { requestId } = args;\n\t\tconst abortController = this.inferSliceAbortControllers.get(requestId);\n\n\t\tif (abortController) {\n\t\t\tabortController.abort();\n\t\t\tthis.inferSliceAbortControllers.delete(requestId);\n\n\t\t\treturn { cancelled: true };\n\t\t}\n\n\t\treturn { cancelled: false };\n\t}\n}\n\ntype InferSliceResponse = z.infer<typeof InferSliceResponse>;\n\nconst InferSliceResponse = z.object({\n\tslice: z.custom().transform((value, ctx) => {\n\t\tconst result = SharedSlice.decode(value);\n\t\tif (result._tag === \"Right\") {\n\t\t\treturn result.right;\n\t\t}\n\t\tctx.addIssue({\n\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\tmessage: `Invalid shared slice: ${JSON.stringify(value, null, 2)}`,\n\t\t});\n\n\t\treturn z.NEVER;\n\t}),\n\tlangSmithUrl: z.string().url().optional(),\n});\n\nfunction updateCRCustomType(\n\targs: { customType: LinkCustomType } & CustomTypeFieldIdChangedMeta,\n): LinkCustomType {\n\tconst previousPath = getPathIds(args.previousPath);\n\tconst newPath = getPathIds(args.newPath);\n\n\tif (!previousPath.customTypeId || !newPath.customTypeId) {\n\t\tthrow new Error(\n\t\t\t`Could not find a customtype id in previousPath (${args.previousPath.join(\n\t\t\t\t\".\",\n\t\t\t)}) and/or newPath (${args.newPath.join(\n\t\t\t\t\".\",\n\t\t\t)}), which should not be possible.`,\n\t\t);\n\t}\n\n\tif (!previousPath.fieldId || !newPath.fieldId) {\n\t\tthrow new Error(\n\t\t\t`Could not find a field id in previousPath (${args.previousPath.join(\n\t\t\t\t\".\",\n\t\t\t)}) and/or newPath (${args.newPath.join(\n\t\t\t\t\".\",\n\t\t\t)}), which should not be possible.`,\n\t\t);\n\t}\n\n\tconst customType = shallowCloneIfObject(args.customType);\n\n\tif (typeof customType === \"string\") {\n\t\t// Legacy format support, we don't have anything to update here.\n\t\treturn customType;\n\t}\n\n\tconst matchedCustomTypeId = customType.id === previousPath.customTypeId;\n\n\treturn {\n\t\t...customType,\n\t\tfields: customType.fields.map((fieldArg) => {\n\t\t\tconst customTypeField = shallowCloneIfObject(fieldArg);\n\n\t\t\t// Regular field\n\t\t\tif (typeof customTypeField === \"string\") {\n\t\t\t\tif (\n\t\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\t\tcustomTypeField === previousPath.fieldId &&\n\t\t\t\t\tcustomTypeField !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\treturn customTypeField;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tmatchedCustomTypeId &&\n\t\t\t\tcustomTypeField.id === previousPath.fieldId &&\n\t\t\t\tcustomTypeField.id !== newPath.fieldId\n\t\t\t) {\n\t\t\t\t// The id of the field has changed. We don't exit return because there\n\t\t\t\t// might be other fields further down in nested custom types or groups\n\t\t\t\t// that need to be updated.\n\t\t\t\tcustomTypeField.id = newPath.fieldId;\n\t\t\t}\n\n\t\t\t// Group field\n\t\t\tif (\"fields\" in customTypeField) {\n\t\t\t\tif (\n\t\t\t\t\t!previousPath.groupId &&\n\t\t\t\t\t!newPath.groupId &&\n\t\t\t\t\tcustomTypeField.id === previousPath.fieldId &&\n\t\t\t\t\tcustomTypeField.id !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// Only the id of the group has changed. Group id is not defined, so\n\t\t\t\t\t// we can return early.\n\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\tconst matchedGroupId = customTypeField.id === previousPath.groupId;\n\n\t\t\t\tif (\n\t\t\t\t\tpreviousPath.groupId &&\n\t\t\t\t\tnewPath.groupId &&\n\t\t\t\t\tmatchedGroupId &&\n\t\t\t\t\tcustomTypeField.id !== newPath.groupId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the group field has changed, so we update it. We don't\n\t\t\t\t\t// return because there are group fields that may need to be updated.\n\t\t\t\t\tcustomTypeField.id = newPath.groupId;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...customTypeField,\n\t\t\t\t\tfields: customTypeField.fields.map((groupFieldArg) => {\n\t\t\t\t\t\tconst groupField = shallowCloneIfObject(groupFieldArg);\n\n\t\t\t\t\t\t// Regular field inside a group field\n\t\t\t\t\t\tif (typeof groupField === \"string\") {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tmatchedGroupId &&\n\t\t\t\t\t\t\t\tgroupField === previousPath.fieldId &&\n\t\t\t\t\t\t\t\tgroupField !== newPath.fieldId\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t// The id of the field inside the group has changed.\n\t\t\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn groupField;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Content relationship field inside a group field\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...groupField,\n\t\t\t\t\t\t\tfields: updateContentRelationshipFields({\n\t\t\t\t\t\t\t\tcustomtypes: groupField.customtypes,\n\t\t\t\t\t\t\t\tpreviousPath,\n\t\t\t\t\t\t\t\tnewPath,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Content relationship field\n\t\t\treturn {\n\t\t\t\t...customTypeField,\n\t\t\t\tcustomtypes: updateContentRelationshipFields({\n\t\t\t\t\tcustomtypes: customTypeField.customtypes,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t}),\n\t\t\t};\n\t\t}),\n\t};\n}\n\nfunction updateContentRelationshipFields(args: {\n\tcustomtypes: readonly (\n\t\t| string\n\t\t| {\n\t\t\t\tid: string;\n\t\t\t\tfields: readonly (string | { id: string; fields: readonly string[] })[];\n\t\t }\n\t)[];\n\tpreviousPath: CrUpdatePathIds;\n\tnewPath: CrUpdatePathIds;\n}) {\n\tconst { customtypes, previousPath, newPath } = args;\n\n\treturn customtypes.map((nestedCtArg) => {\n\t\tconst nestedCt = shallowCloneIfObject(nestedCtArg);\n\n\t\tif (\n\t\t\ttypeof nestedCt === \"string\" ||\n\t\t\t// Since we are entering a new custom type, if the previous id\n\t\t\t// doesn't match, we can return early, because it's not the\n\t\t\t// custom type we are looking for.\n\t\t\tnestedCt.id !== previousPath.customTypeId\n\t\t) {\n\t\t\treturn nestedCt;\n\t\t}\n\n\t\treturn {\n\t\t\t...nestedCt,\n\t\t\tfields: nestedCt.fields.map((nestedCtFieldArg) => {\n\t\t\t\tconst nestedCtField = shallowCloneIfObject(nestedCtFieldArg);\n\n\t\t\t\t// Regular field\n\t\t\t\tif (typeof nestedCtField === \"string\") {\n\t\t\t\t\tif (\n\t\t\t\t\t\tnestedCtField === previousPath.fieldId &&\n\t\t\t\t\t\tnestedCtField !== newPath.fieldId\n\t\t\t\t\t) {\n\t\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn nestedCtField;\n\t\t\t\t}\n\n\t\t\t\t// Group field\n\n\t\t\t\tif (\n\t\t\t\t\tnestedCtField.id === previousPath.fieldId &&\n\t\t\t\t\tnestedCtField.id !== newPath.fieldId\n\t\t\t\t) {\n\t\t\t\t\t// The id of the field has changed.\n\t\t\t\t\tnestedCtField.id = newPath.fieldId;\n\t\t\t\t}\n\n\t\t\t\t// Further down the path, the field can only be a group field. So if we have\n\t\t\t\t// no group id defined, no need to continue.\n\t\t\t\tif (\n\t\t\t\t\t!previousPath.groupId ||\n\t\t\t\t\t!newPath.groupId ||\n\t\t\t\t\tnestedCtField.id !== previousPath.groupId\n\t\t\t\t) {\n\t\t\t\t\treturn nestedCtField;\n\t\t\t\t}\n\n\t\t\t\tif (nestedCtField.id !== newPath.groupId) {\n\t\t\t\t\t// The id of the group has changed.\n\t\t\t\t\tnestedCtField.id = newPath.groupId;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t...nestedCtField,\n\t\t\t\t\tfields: nestedCtField.fields.map((nestedCtGroupFieldId) => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tnestedCtGroupFieldId === previousPath.fieldId &&\n\t\t\t\t\t\t\tnestedCtGroupFieldId !== newPath.fieldId\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// The id of the field inside the group has changed.\n\t\t\t\t\t\t\treturn newPath.fieldId;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn nestedCtGroupFieldId;\n\t\t\t\t\t}),\n\t\t\t\t};\n\t\t\t}),\n\t\t};\n\t});\n}\n\n/**\n * Update the Content Relationship API IDs of a single field. The change is\n * determined by the `previousPath` and `newPath` properties.\n */\nfunction updateFieldContentRelationships<\n\tT extends UID | NestableWidget | Group | NestedGroup,\n>(args: { field: T } & CustomTypeFieldIdChangedMeta): T {\n\tconst { field, ...updateMeta } = args;\n\tif (\n\t\tfield.type !== \"Link\" ||\n\t\tfield.config?.select !== \"document\" ||\n\t\t!field.config?.customtypes\n\t) {\n\t\t// not a content relationship field\n\t\treturn field;\n\t}\n\n\tconst newCustomTypes = field.config.customtypes.map((customType) => {\n\t\treturn updateCRCustomType({ ...updateMeta, customType });\n\t});\n\n\treturn {\n\t\t...field,\n\t\tconfig: { ...field.config, customtypes: newCustomTypes },\n\t};\n}\n\nexport function updateCustomTypeContentRelationships(\n\targs: {\n\t\tmodels: { model: CustomType }[];\n\t\tonUpdate: (model: { previousModel: CustomType; model: CustomType }) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const { model: customType } of models) {\n\t\tconst updatedCustomType = traverseCustomType({\n\t\t\tcustomType,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tif (!isEqualModel(customType, updatedCustomType)) {\n\t\t\tonUpdate({ model: updatedCustomType, previousModel: customType });\n\t\t}\n\t}\n}\n\nexport function updateSharedSliceContentRelationships(\n\targs: {\n\t\tmodels: { model: SharedSlice }[];\n\t\tonUpdate: (model: {\n\t\t\tpreviousModel: SharedSlice;\n\t\t\tmodel: SharedSlice;\n\t\t}) => void;\n\t} & CustomTypeFieldIdChangedMeta,\n): void {\n\tconst { models, previousPath, newPath, onUpdate } = args;\n\n\tfor (const { model: slice } of models) {\n\t\tconst updateSlice = traverseSharedSlice({\n\t\t\tpath: [],\n\t\t\tslice,\n\t\t\tonField: ({ field }) => {\n\t\t\t\treturn updateFieldContentRelationships({\n\t\t\t\t\tfield,\n\t\t\t\t\tpreviousPath,\n\t\t\t\t\tnewPath,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tif (!isEqualModel(slice, updateSlice)) {\n\t\t\tonUpdate({ model: updateSlice, previousModel: slice });\n\t\t}\n\t}\n}\n\ninterface CrUpdatePathIds {\n\tcustomTypeId: string;\n\tgroupId: string | undefined;\n\tfieldId: string;\n}\n\nfunction getPathIds(path: PathWithCustomType): CrUpdatePathIds {\n\tif (path.length < 2) {\n\t\tthrow new Error(\n\t\t\t`Unexpected path length ${\n\t\t\t\tpath.length\n\t\t\t}. Expected at least 2 segments (got: ${path.join(\".\")}).`,\n\t\t);\n\t}\n\n\tconst [customTypeId, groupOrFieldId, fieldId] = path;\n\n\treturn {\n\t\tcustomTypeId,\n\t\t/**\n\t\t * Id of a changed group. If it's defined, it means that a group or a field\n\t\t * inside a group had its API ID renamed. It's defined when the path has a\n\t\t * third element (e.g. `[\"customtypeA\", \"groupA\", \"fieldA\"]`).\n\t\t */\n\t\tgroupId: fieldId ? groupOrFieldId : undefined,\n\t\tfieldId: fieldId || groupOrFieldId,\n\t};\n}\n\nfunction isEqualModel<T extends CustomType | SharedSlice>(\n\tmodelA: T,\n\tmodelB: T,\n): boolean {\n\treturn JSON.stringify(modelA) === JSON.stringify(modelB);\n}\n\nfunction shallowCloneIfObject<T>(value: T): T {\n\tif (typeof value === \"object\") {\n\t\treturn { ...value };\n\t}\n\n\treturn value;\n}\n"],"names":["errors","_a","joinPath","relativePath","queryClaude","query"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slicemachine/manager",
3
- "version": "0.25.7-alpha.jp-figma-to-slice-2.5",
3
+ "version": "0.25.7-alpha.jp-figma-to-slice-3.1",
4
4
  "description": "Manage all aspects of a Slice Machine project.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -71,7 +71,7 @@
71
71
  "@prismicio/mocks": "2.14.0",
72
72
  "@prismicio/types-internal": "3.11.2",
73
73
  "@segment/analytics-node": "^2.1.2",
74
- "@slicemachine/plugin-kit": "0.4.85-alpha.jp-figma-to-slice-2.5",
74
+ "@slicemachine/plugin-kit": "0.4.85-alpha.jp-figma-to-slice-3.1",
75
75
  "cookie": "^1.0.1",
76
76
  "cors": "^2.8.5",
77
77
  "execa": "^7.1.1",
@@ -142,6 +142,8 @@ type CustomTypeFieldIdChangedMeta = {
142
142
  type LinkCustomType = NonNullable<LinkConfig["customtypes"]>[number];
143
143
 
144
144
  export class CustomTypesManager extends BaseManager {
145
+ private inferSliceAbortControllers = new Map<string, AbortController>();
146
+
145
147
  async readCustomTypeLibrary(): Promise<SliceMachineManagerReadCustomTypeLibraryReturnType> {
146
148
  assertPluginsInitialized(this.sliceMachinePluginRunner);
147
149
 
@@ -548,17 +550,30 @@ export class CustomTypesManager extends BaseManager {
548
550
  }
549
551
 
550
552
  async inferSlice(
551
- args: { imageUrl: string } & (
553
+ args: { imageUrl: string; requestId?: string } & (
552
554
  | { source: "upload" }
553
555
  | { source: "figma"; libraryID: string }
554
556
  ),
555
557
  ): Promise<InferSliceResponse> {
556
- const { source, imageUrl } = args;
558
+ const { source, imageUrl, requestId } = args;
557
559
 
558
560
  const authToken = await this.user.getAuthenticationToken();
559
561
  const repository = await this.project.getResolvedRepositoryName();
560
562
 
561
- console.info(`inferSlice (${source}) started`);
563
+ let abortController: AbortController | undefined;
564
+ if (requestId) {
565
+ abortController = new AbortController();
566
+ abortController.signal.addEventListener("abort", () => {
567
+ console.warn(`inferSlice (${source}) request ${requestId} was aborted`);
568
+ });
569
+ this.inferSliceAbortControllers.set(requestId, abortController);
570
+ }
571
+
572
+ console.info(
573
+ `inferSlice (${source}) started${
574
+ requestId ? ` for request ${requestId}` : ""
575
+ }`,
576
+ );
562
577
  const startTime = Date.now();
563
578
 
564
579
  try {
@@ -846,6 +861,7 @@ FINAL REMINDERS:
846
861
  args: ["-y", "@prismicio/mcp-server@0.0.20-alpha.6"],
847
862
  },
848
863
  },
864
+ abortController,
849
865
  },
850
866
  });
851
867
 
@@ -902,6 +918,7 @@ FINAL REMINDERS:
902
918
  method: "POST",
903
919
  headers: { Authorization: `Bearer ${authToken}` },
904
920
  body: JSON.stringify({ imageUrl }),
921
+ signal: abortController?.signal,
905
922
  });
906
923
 
907
924
  if (!response.ok) {
@@ -913,14 +930,43 @@ FINAL REMINDERS:
913
930
  return InferSliceResponse.parse(json);
914
931
  }
915
932
  } catch (error) {
916
- console.error(`inferSlice (${source}) failed`, error);
933
+ console.error(
934
+ `inferSlice (${source}) failed${
935
+ requestId ? ` for request ${requestId}` : ""
936
+ }`,
937
+ error,
938
+ );
917
939
 
918
940
  throw error;
919
941
  } finally {
942
+ if (requestId) {
943
+ this.inferSliceAbortControllers.delete(requestId);
944
+ }
945
+
920
946
  const elapsedTimeSeconds = (Date.now() - startTime) / 1000;
921
- console.info(`inferSlice (${source}) took ${elapsedTimeSeconds}s`);
947
+ console.info(
948
+ `inferSlice took ${elapsedTimeSeconds}s${
949
+ requestId ? ` for request ${requestId}` : ""
950
+ }`,
951
+ );
922
952
  }
923
953
  }
954
+
955
+ async cancelInferSlice(args: {
956
+ requestId: string;
957
+ }): Promise<{ cancelled: boolean }> {
958
+ const { requestId } = args;
959
+ const abortController = this.inferSliceAbortControllers.get(requestId);
960
+
961
+ if (abortController) {
962
+ abortController.abort();
963
+ this.inferSliceAbortControllers.delete(requestId);
964
+
965
+ return { cancelled: true };
966
+ }
967
+
968
+ return { cancelled: false };
969
+ }
924
970
  }
925
971
 
926
972
  type InferSliceResponse = z.infer<typeof InferSliceResponse>;