{"record":{"id":"0bb9d54e9cc52657","repo":"toeverything/AFFiNE","slug":"failed-to-extract-markdown-snapshot-is-undefined","errorCode":null,"errorMessage":"Failed to extract markdown, snapshot is undefined","messagePattern":"Failed to extract markdown, snapshot is undefined","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/frontend/core/src/blocksuite/ai/utils/extract.ts","lineNumber":216,"sourceCode":"}\n\nexport async function extractMarkdownFromDoc(doc: Store): Promise<string> {\n  const std = new BlockStdScope({\n    store: doc,\n    extensions: getStoreManager().config.init().value.get('store'),\n  });\n  const transformer = await getTransformer(doc);\n  const adapter = new MarkdownAdapter(transformer, std.provider);\n  const blockModels = getNoteBlockModels(doc);\n  const textModels = blockModels.filter(\n    model => !matchModels(model, [ImageBlockModel, DatabaseBlockModel])\n  );\n  const drafts = textModels.map(toDraftModel);\n  const slice = Slice.fromModels(doc, drafts);\n\n  const snapshot = transformer.sliceToSnapshot(slice);\n  if (!snapshot) {\n    throw new Error('Failed to extract markdown, snapshot is undefined');\n  }\n  const content = await adapter.fromSliceSnapshot({\n    snapshot,\n    assets: transformer.assetsManager,\n  });\n  return content.file;\n}\n\nfunction getNoteBlockModels(doc: Store) {\n  const notes = doc\n    .getBlocksByFlavour('affine:note')\n    .filter(\n      note =>\n        (note.model as NoteBlockModel).props.displayMode !==\n        NoteDisplayMode.EdgelessOnly\n    )\n    .map(note => note.model as NoteBlockModel);\n  const blockModels = notes.reduce((acc, note) => {","sourceCodeStart":198,"sourceCodeEnd":234,"githubUrl":"https://github.com/toeverything/AFFiNE/blob/b4c8548c09da21b2898443559a5b846f0ccf5dd8/packages/frontend/core/src/blocksuite/ai/utils/extract.ts#L198-L234","documentation":"Thrown in extractMarkdownFromDoc when the transformer produces an undefined snapshot while converting the doc's note models to markdown via the MarkdownAdapter, meaning the doc could not be serialized for AI extraction.","triggerScenarios":"Thrown in extractMarkdownFromDoc when transformer.sliceToSnapshot returns undefined for the slice built from the doc's note block models, aborting markdown extraction.","commonSituations":"Happens when converting a page to markdown for AI features and the slice snapshot fails. Reopen the page or retry once the doc has fully loaded.","solutions":["Obtain a valid snapshot first; do not call markdown extraction with an undefined snapshot.","Check snapshot retrieval errors upstream before extracting."],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"b4c8548c09da21b2898443559a5b846f0ccf5dd8","analyzedAt":"2026-08-18T21:16:52.546Z","contentChangedAt":"2026-08-18T21:16:52.546Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}