{"version":3,"file":"index.cjs","sources":["../src/lib/actions.ts","../src/lib/coordinate-mapper.ts","../src/lib/layout-analysis-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts","../src/lib/merge-utils.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { PageAnalysisState, PageLayout, TableStructureElement } from './types';\n\nexport const INIT_LAYOUT_STATE = 'LAYOUT_ANALYSIS/INIT_STATE';\nexport const CLEANUP_LAYOUT_STATE = 'LAYOUT_ANALYSIS/CLEANUP_STATE';\nexport const SET_PAGE_STATUS = 'LAYOUT_ANALYSIS/SET_PAGE_STATUS';\nexport const SET_PAGE_LAYOUT = 'LAYOUT_ANALYSIS/SET_PAGE_LAYOUT';\nexport const SET_PAGE_ERROR = 'LAYOUT_ANALYSIS/SET_PAGE_ERROR';\nexport const SET_LAYOUT_OVERLAY_VISIBLE = 'LAYOUT_ANALYSIS/SET_LAYOUT_OVERLAY_VISIBLE';\nexport const SET_TABLE_STRUCTURE_OVERLAY_VISIBLE =\n  'LAYOUT_ANALYSIS/SET_TABLE_STRUCTURE_OVERLAY_VISIBLE';\nexport const SET_LAYOUT_THRESHOLD = 'LAYOUT_ANALYSIS/SET_LAYOUT_THRESHOLD';\nexport const SET_TABLE_STRUCTURE_THRESHOLD = 'LAYOUT_ANALYSIS/SET_TABLE_STRUCTURE_THRESHOLD';\nexport const SELECT_BLOCK = 'LAYOUT_ANALYSIS/SELECT_BLOCK';\nexport const SET_TABLE_STRUCTURE_ENABLED = 'LAYOUT_ANALYSIS/SET_TABLE_STRUCTURE_ENABLED';\nexport const SET_PAGE_TABLE_STRUCTURES = 'LAYOUT_ANALYSIS/SET_PAGE_TABLE_STRUCTURES';\nexport const CLEAR_PAGE_RESULTS = 'LAYOUT_ANALYSIS/CLEAR_PAGE_RESULTS';\nexport const CLEAR_ALL_RESULTS = 'LAYOUT_ANALYSIS/CLEAR_ALL_RESULTS';\n\nexport interface InitLayoutStateAction extends Action {\n  type: typeof INIT_LAYOUT_STATE;\n  payload: { documentId: string };\n}\n\nexport interface CleanupLayoutStateAction extends Action {\n  type: typeof CLEANUP_LAYOUT_STATE;\n  payload: string;\n}\n\nexport interface SetPageStatusAction extends Action {\n  type: typeof SET_PAGE_STATUS;\n  payload: { documentId: string; pageIndex: number; status: PageAnalysisState['status'] };\n}\n\nexport interface SetPageLayoutAction extends Action {\n  type: typeof SET_PAGE_LAYOUT;\n  payload: { documentId: string; pageIndex: number; layout: PageLayout };\n}\n\nexport interface SetPageErrorAction extends Action {\n  type: typeof SET_PAGE_ERROR;\n  payload: { documentId: string; pageIndex: number; error: string };\n}\n\nexport interface SetLayoutOverlayVisibleAction extends Action {\n  type: typeof SET_LAYOUT_OVERLAY_VISIBLE;\n  payload: boolean;\n}\n\nexport interface SetTableStructureOverlayVisibleAction extends Action {\n  type: typeof SET_TABLE_STRUCTURE_OVERLAY_VISIBLE;\n  payload: boolean;\n}\n\nexport interface SetLayoutThresholdAction extends Action {\n  type: typeof SET_LAYOUT_THRESHOLD;\n  payload: number;\n}\n\nexport interface SetTableStructureThresholdAction extends Action {\n  type: typeof SET_TABLE_STRUCTURE_THRESHOLD;\n  payload: number;\n}\n\nexport interface SelectBlockAction extends Action {\n  type: typeof SELECT_BLOCK;\n  payload: string | null;\n}\n\nexport interface SetTableStructureEnabledAction extends Action {\n  type: typeof SET_TABLE_STRUCTURE_ENABLED;\n  payload: boolean;\n}\n\nexport interface SetPageTableStructuresAction extends Action {\n  type: typeof SET_PAGE_TABLE_STRUCTURES;\n  payload: {\n    documentId: string;\n    pageIndex: number;\n    tableStructures: Map<string, TableStructureElement[]>;\n  };\n}\n\nexport interface ClearPageResultsAction extends Action {\n  type: typeof CLEAR_PAGE_RESULTS;\n  payload: { documentId: string; pageIndex: number };\n}\n\nexport interface ClearAllResultsAction extends Action {\n  type: typeof CLEAR_ALL_RESULTS;\n  payload: { documentId: string };\n}\n\nexport type LayoutAnalysisAction =\n  | InitLayoutStateAction\n  | CleanupLayoutStateAction\n  | SetPageStatusAction\n  | SetPageLayoutAction\n  | SetPageErrorAction\n  | SetLayoutOverlayVisibleAction\n  | SetTableStructureOverlayVisibleAction\n  | SetLayoutThresholdAction\n  | SetTableStructureThresholdAction\n  | SelectBlockAction\n  | SetTableStructureEnabledAction\n  | SetPageTableStructuresAction\n  | ClearPageResultsAction\n  | ClearAllResultsAction;\n\nexport function initLayoutState(documentId: string): InitLayoutStateAction {\n  return { type: INIT_LAYOUT_STATE, payload: { documentId } };\n}\n\nexport function cleanupLayoutState(documentId: string): CleanupLayoutStateAction {\n  return { type: CLEANUP_LAYOUT_STATE, payload: documentId };\n}\n\nexport function setPageStatus(\n  documentId: string,\n  pageIndex: number,\n  status: PageAnalysisState['status'],\n): SetPageStatusAction {\n  return { type: SET_PAGE_STATUS, payload: { documentId, pageIndex, status } };\n}\n\nexport function setPageLayout(\n  documentId: string,\n  pageIndex: number,\n  layout: PageLayout,\n): SetPageLayoutAction {\n  return { type: SET_PAGE_LAYOUT, payload: { documentId, pageIndex, layout } };\n}\n\nexport function setPageError(\n  documentId: string,\n  pageIndex: number,\n  error: string,\n): SetPageErrorAction {\n  return { type: SET_PAGE_ERROR, payload: { documentId, pageIndex, error } };\n}\n\nexport function setLayoutOverlayVisible(visible: boolean): SetLayoutOverlayVisibleAction {\n  return { type: SET_LAYOUT_OVERLAY_VISIBLE, payload: visible };\n}\n\nexport function setTableStructureOverlayVisible(\n  visible: boolean,\n): SetTableStructureOverlayVisibleAction {\n  return { type: SET_TABLE_STRUCTURE_OVERLAY_VISIBLE, payload: visible };\n}\n\nexport function setLayoutThreshold(threshold: number): SetLayoutThresholdAction {\n  return { type: SET_LAYOUT_THRESHOLD, payload: threshold };\n}\n\nexport function setTableStructureThreshold(threshold: number): SetTableStructureThresholdAction {\n  return { type: SET_TABLE_STRUCTURE_THRESHOLD, payload: threshold };\n}\n\nexport function selectBlock(blockId: string | null): SelectBlockAction {\n  return { type: SELECT_BLOCK, payload: blockId };\n}\n\nexport function setTableStructureEnabled(enabled: boolean): SetTableStructureEnabledAction {\n  return { type: SET_TABLE_STRUCTURE_ENABLED, payload: enabled };\n}\n\nexport function setPageTableStructures(\n  documentId: string,\n  pageIndex: number,\n  tableStructures: Map<string, TableStructureElement[]>,\n): SetPageTableStructuresAction {\n  return { type: SET_PAGE_TABLE_STRUCTURES, payload: { documentId, pageIndex, tableStructures } };\n}\n\nexport function clearPageResults(documentId: string, pageIndex: number): ClearPageResultsAction {\n  return { type: CLEAR_PAGE_RESULTS, payload: { documentId, pageIndex } };\n}\n\nexport function clearAllResults(documentId: string): ClearAllResultsAction {\n  return { type: CLEAR_ALL_RESULTS, payload: { documentId } };\n}\n","import { Rect, Size, Rotation } from '@embedpdf/models';\nimport { LayoutDetection, clamp } from '@embedpdf/ai';\nimport { LayoutBlock } from './types';\n\nconst MODEL_INPUT_SIZE = 800;\n\n/**\n * Map layout detections from model output space to page coordinates.\n *\n * The model outputs coordinates in its 800x800 input space (or sometimes\n * in source image space). This function:\n * 1. Normalizes coordinates to source image space\n * 2. Scales from source image pixels to page points\n *\n * Page coordinates use top-left origin (same as browser/CSS),\n * matching the project's Rect convention.\n */\nexport function mapDetectionsToPageCoordinates(\n  detections: LayoutDetection[],\n  imageSize: Size,\n  pageSize: Size,\n  pageRotation: Rotation = 0,\n): LayoutBlock[] {\n  // Determine if coordinates are in model space (800x800) or source space\n  const normalized = normalizeToSourceSpace(detections, imageSize);\n\n  const scaleX = pageSize.width / imageSize.width;\n  const scaleY = pageSize.height / imageSize.height;\n\n  return normalized.map((det) => {\n    const [x1, y1, x2, y2] = det.bbox;\n\n    // Scale from image pixels to page points (both use top-left origin)\n    const pdfX = x1 * scaleX;\n    const pdfY = y1 * scaleY;\n    const pdfW = (x2 - x1) * scaleX;\n    const pdfH = (y2 - y1) * scaleY;\n\n    const rect: Rect = {\n      origin: { x: pdfX, y: pdfY },\n      size: { width: pdfW, height: pdfH },\n    };\n\n    return {\n      id: String(det.id),\n      classId: det.classId,\n      label: det.label,\n      score: det.score,\n      rect,\n      imageBbox: det.bbox,\n      readingOrder: det.readingOrder,\n    };\n  });\n}\n\n/**\n * Normalize detection coordinates from model space (800x800) to source image space.\n * Follows the same heuristic as the test project.\n */\nfunction normalizeToSourceSpace(detections: LayoutDetection[], imageSize: Size): LayoutDetection[] {\n  if (detections.length === 0) return [];\n\n  let maxCoord = 0;\n  for (const det of detections) {\n    for (const [x, y] of det.polygon) {\n      maxCoord = Math.max(maxCoord, x, y);\n    }\n  }\n\n  const modelCoordTolerance = MODEL_INPUT_SIZE * 0.08;\n  const looksLikeModelSpace = maxCoord <= MODEL_INPUT_SIZE + modelCoordTolerance;\n  const sourceIsDifferentSize =\n    Math.abs(imageSize.width - MODEL_INPUT_SIZE) > 2 ||\n    Math.abs(imageSize.height - MODEL_INPUT_SIZE) > 2;\n  const shouldScale = looksLikeModelSpace && sourceIsDifferentSize;\n\n  if (!shouldScale) return detections;\n\n  const scaleX = imageSize.width / MODEL_INPUT_SIZE;\n  const scaleY = imageSize.height / MODEL_INPUT_SIZE;\n\n  return detections.map((det) => {\n    const polygon = det.polygon.map(([x, y]) => [\n      clamp(x * scaleX, 0, imageSize.width),\n      clamp(y * scaleY, 0, imageSize.height),\n    ]) as LayoutDetection['polygon'];\n\n    const xs = polygon.map((p) => p[0]);\n    const ys = polygon.map((p) => p[1]);\n    const bbox: [number, number, number, number] = [\n      Math.min(...xs),\n      Math.min(...ys),\n      Math.max(...xs),\n      Math.max(...ys),\n    ];\n\n    return { ...det, polygon, bbox };\n  });\n}\n\n/**\n * Map table structure element coordinates from the crop's pixel space\n * to page coordinates.\n *\n * The pipeline outputs bboxes in the unpadded crop's pixel space.\n * This function scales from crop pixels to the table rect's page\n * dimensions and offsets by the rect origin.\n */\nexport function mapTableElementToPageCoordinates(\n  elementBbox: [number, number, number, number],\n  tableRect: Rect,\n  cropImageSize: Size,\n): Rect {\n  const [ex1, ey1, ex2, ey2] = elementBbox;\n\n  const scaleX = tableRect.size.width / cropImageSize.width;\n  const scaleY = tableRect.size.height / cropImageSize.height;\n\n  const pdfX = tableRect.origin.x + ex1 * scaleX;\n  const pdfY = tableRect.origin.y + ey1 * scaleY;\n  const pdfW = (ex2 - ex1) * scaleX;\n  const pdfH = (ey2 - ey1) * scaleY;\n\n  return {\n    origin: { x: pdfX, y: pdfY },\n    size: { width: pdfW, height: pdfH },\n  };\n}\n","import {\n  BasePlugin,\n  PluginRegistry,\n  createScopedEmitter,\n  createEmitter,\n  Listener,\n} from '@embedpdf/core';\nimport {\n  Task,\n  TaskStage,\n  TaskSequence,\n  Size,\n  Rect,\n  PdfPageTextRuns,\n  uuidV4,\n} from '@embedpdf/models';\nimport {\n  LayoutDetectionPipeline,\n  TableStructurePipeline,\n  LayoutDetectionInput,\n  TableStructureInput,\n  PipelineProgress,\n} from '@embedpdf/ai';\nimport { AiManagerPlugin, AiManagerCapability } from '@embedpdf/plugin-ai-manager';\nimport { RenderCapability, RenderPlugin } from '@embedpdf/plugin-render';\n\nimport {\n  LayoutAnalysisPluginConfig,\n  LayoutAnalysisCapability,\n  LayoutAnalysisState,\n  LayoutAnalysisScope,\n  PageLayout,\n  DocumentLayout,\n  LayoutTask,\n  PageAnalysisProgress,\n  DocumentAnalysisProgress,\n  LayoutAnalysisErrorReason,\n  TableStructureElement,\n  PageLayoutChangeEvent,\n  PageLayoutChangeGlobalEvent,\n  StateChangeEvent,\n  AnalyzePageOptions,\n} from './types';\nimport {\n  LayoutAnalysisAction,\n  initLayoutState,\n  cleanupLayoutState,\n  setPageStatus,\n  setPageLayout,\n  setPageError,\n  setLayoutOverlayVisible,\n  setTableStructureOverlayVisible,\n  setTableStructureEnabled,\n  setLayoutThreshold,\n  setTableStructureThreshold,\n  selectBlock,\n  setPageTableStructures,\n  clearPageResults,\n  clearAllResults,\n} from './actions';\nimport {\n  mapDetectionsToPageCoordinates,\n  mapTableElementToPageCoordinates,\n} from './coordinate-mapper';\n\nconst TABLE_CLASS_ID = 21;\nconst TABLE_MIN_SCORE = 0.1;\n\nexport class LayoutAnalysisPlugin extends BasePlugin<\n  LayoutAnalysisPluginConfig,\n  LayoutAnalysisCapability,\n  LayoutAnalysisState,\n  LayoutAnalysisAction\n> {\n  static readonly id = 'layout-analysis' as const;\n\n  private pluginConfig!: Required<LayoutAnalysisPluginConfig>;\n  private aiManager: AiManagerCapability;\n  private renderCapability: RenderCapability;\n\n  private readonly layoutPipeline = new LayoutDetectionPipeline();\n  private readonly tablePipeline = new TableStructurePipeline();\n\n  private readonly pageLayoutChange$ = createScopedEmitter<\n    PageLayoutChangeEvent,\n    PageLayoutChangeGlobalEvent,\n    string\n  >((documentId, data) => ({ documentId, ...data }), { cache: false });\n\n  private readonly stateChange$ = createEmitter<StateChangeEvent>();\n\n  private readonly activeTasks = new Map<string, Task<any, any, any>>();\n\n  constructor(id: string, registry: PluginRegistry, config: LayoutAnalysisPluginConfig) {\n    super(id, registry);\n    this.aiManager = this.registry.getPlugin<AiManagerPlugin>('ai-manager')!.provides();\n    this.renderCapability = this.registry.getPlugin<RenderPlugin>('render')!.provides();\n  }\n\n  async initialize(config: LayoutAnalysisPluginConfig): Promise<void> {\n    this.pluginConfig = {\n      layoutThreshold: 0.35,\n      tableStructureThreshold: 0.8,\n      tableStructure: false,\n      autoAnalyze: false,\n      renderScale: 2.0,\n      ...config,\n    };\n\n    if (this.pluginConfig.tableStructure) {\n      this.dispatch(setTableStructureEnabled(true));\n    }\n  }\n\n  protected onDocumentLoaded(documentId: string): void {\n    this.dispatch(initLayoutState(documentId));\n  }\n\n  protected onDocumentClosed(documentId: string): void {\n    this.abortActiveTask(documentId);\n    this.dispatch(cleanupLayoutState(documentId));\n    this.pageLayoutChange$.clearScope(documentId);\n  }\n\n  protected onStoreUpdated(prevState: LayoutAnalysisState, newState: LayoutAnalysisState): void {\n    if (prevState === newState) return;\n\n    for (const documentId in newState.documents) {\n      const changed =\n        prevState.documents[documentId] !== newState.documents[documentId] ||\n        prevState.layoutOverlayVisible !== newState.layoutOverlayVisible ||\n        prevState.tableStructureOverlayVisible !== newState.tableStructureOverlayVisible ||\n        prevState.tableStructureEnabled !== newState.tableStructureEnabled ||\n        prevState.layoutThreshold !== newState.layoutThreshold ||\n        prevState.tableStructureThreshold !== newState.tableStructureThreshold ||\n        prevState.selectedBlockId !== newState.selectedBlockId;\n\n      if (changed) {\n        this.stateChange$.emit({ documentId, state: newState });\n      }\n    }\n  }\n\n  protected buildCapability(): LayoutAnalysisCapability {\n    return {\n      analyzePage: (pageIndex, options) => this.analyzePage(pageIndex, undefined, options),\n      analyzeAllPages: (options) => this.analyzeAllPages(undefined, options),\n      getPageLayout: (pageIndex) => this.getPageLayout(pageIndex),\n      getPageTextRuns: (pageIndex) => this.getPageTextRuns(pageIndex),\n      forDocument: (documentId) => this.createScope(documentId),\n      onPageLayoutChange: this.pageLayoutChange$.onGlobal,\n      onStateChange: this.stateChange$.on,\n      setLayoutOverlayVisible: (v) => this.dispatch(setLayoutOverlayVisible(v)),\n      setTableStructureOverlayVisible: (v) => this.dispatch(setTableStructureOverlayVisible(v)),\n      setTableStructureEnabled: (v) => this.dispatch(setTableStructureEnabled(v)),\n      setLayoutThreshold: (t) => this.dispatch(setLayoutThreshold(t)),\n      setTableStructureThreshold: (t) => this.dispatch(setTableStructureThreshold(t)),\n      selectBlock: (id) => this.dispatch(selectBlock(id)),\n      clearPageResults: (docId, pageIndex) => {\n        this.dispatch(clearPageResults(docId, pageIndex));\n        this.pageLayoutChange$.emit(docId, { pageIndex, layout: null });\n      },\n      clearAllResults: (docId) => {\n        this.dispatch(clearAllResults(docId));\n      },\n    };\n  }\n\n  // ─── Public API ──────────────────────────────────────────\n\n  private analyzePage(\n    pageIndex: number,\n    documentId?: string,\n    options?: AnalyzePageOptions,\n  ): LayoutTask<PageLayout, PageAnalysisProgress> {\n    const task = new Task<PageLayout, LayoutAnalysisErrorReason, PageAnalysisProgress>();\n\n    const docId = documentId ?? this.getActiveDocumentId();\n    if (!docId) {\n      task.reject({ type: 'no-document', message: 'No document loaded' });\n      return task;\n    }\n\n    const pageState = this.getPageState(pageIndex, docId);\n    const hasLayout = pageState?.layout != null;\n    const hasTableStructure = pageState?.tableStructureAnalyzed ?? false;\n    const tableEnabled = this.state.tableStructureEnabled;\n    const force = options?.force ?? false;\n\n    const needsLayout = !hasLayout || force;\n    const needsTableStructure = tableEnabled && (!hasTableStructure || force);\n\n    if (!needsLayout && !needsTableStructure) {\n      task.resolve(pageState!.layout!);\n      return task;\n    }\n\n    this.dispatch(setPageStatus(docId, pageIndex, 'analyzing'));\n    this.doAnalyzePage(docId, pageIndex, task, {\n      runLayout: needsLayout,\n      runTableStructure: needsTableStructure,\n    });\n\n    return task;\n  }\n\n  private analyzeAllPages(\n    documentId?: string,\n    options?: AnalyzePageOptions,\n  ): LayoutTask<DocumentLayout, DocumentAnalysisProgress> {\n    const task = new Task<DocumentLayout, LayoutAnalysisErrorReason, DocumentAnalysisProgress>();\n\n    const docId = documentId ?? this.getActiveDocumentId();\n    if (!docId) {\n      task.reject({ type: 'no-document', message: 'No document loaded' });\n      return task;\n    }\n\n    const coreDoc = this.coreState.core.documents[docId];\n    if (!coreDoc?.document) {\n      task.reject({ type: 'no-document', message: 'No document loaded' });\n      return task;\n    }\n\n    this.trackTask(docId, task);\n\n    const pageCount = coreDoc.document.pageCount;\n    const pages: PageLayout[] = [];\n    let completed = 0;\n    let currentPageTask: LayoutTask<PageLayout, PageAnalysisProgress> | null = null;\n\n    const origAbort = task.abort.bind(task);\n    task.abort = (reason: any) => {\n      currentPageTask?.abort(reason);\n      origAbort(reason);\n    };\n\n    const analyzeNext = (idx: number) => {\n      if (task.state.stage !== TaskStage.Pending) return;\n\n      if (idx >= pageCount) {\n        task.resolve({ pages });\n        return;\n      }\n\n      const pageTask = this.analyzePage(idx, docId, options);\n      currentPageTask = pageTask;\n\n      pageTask.onProgress((p) => {\n        if (task.state.stage === TaskStage.Pending) {\n          task.progress(p);\n        }\n      });\n\n      pageTask.wait(\n        (layout) => {\n          if (task.state.stage !== TaskStage.Pending) return;\n          pages.push(layout);\n          completed++;\n          task.progress({ stage: 'page-complete', pageIndex: idx, completed, total: pageCount });\n          analyzeNext(idx + 1);\n        },\n        (err) => {\n          if (task.state.stage === TaskStage.Pending) {\n            task.fail(err);\n          }\n        },\n      );\n    };\n\n    analyzeNext(0);\n    return task;\n  }\n\n  private getPageLayout(pageIndex: number, documentId?: string): PageLayout | null {\n    const docId = documentId ?? this.getActiveDocumentId();\n    if (!docId) return null;\n    return this.getPageState(pageIndex, docId)?.layout ?? null;\n  }\n\n  private getPageState(pageIndex: number, documentId: string) {\n    return this.state.documents[documentId]?.pages[pageIndex] ?? null;\n  }\n\n  private getPageTextRuns(pageIndex: number, documentId?: string): Task<PdfPageTextRuns, any, any> {\n    const task = new Task<PdfPageTextRuns, any, any>();\n\n    const docId = documentId ?? this.getActiveDocumentId();\n    if (!docId) {\n      task.reject({ type: 'no-document', message: 'No document loaded' });\n      return task;\n    }\n\n    const coreDoc = this.coreState.core.documents[docId];\n    if (!coreDoc?.document) {\n      task.reject({ type: 'no-document', message: 'No document loaded' });\n      return task;\n    }\n\n    const page = coreDoc.document.pages[pageIndex];\n    if (!page) {\n      task.reject({ type: 'no-document', message: `Page ${pageIndex} not found` });\n      return task;\n    }\n\n    const engineTask = this.engine.getPageTextRuns(coreDoc.document, page);\n    engineTask.wait(\n      (result) => task.resolve(result),\n      (err) => task.reject(err),\n    );\n\n    return task;\n  }\n\n  private createScope(documentId: string): LayoutAnalysisScope {\n    return {\n      analyzePage: (pageIndex, options) => this.analyzePage(pageIndex, documentId, options),\n      analyzeAllPages: (options) => this.analyzeAllPages(documentId, options),\n      getPageLayout: (pageIndex) => this.getPageLayout(pageIndex, documentId),\n      getPageTextRuns: (pageIndex) => this.getPageTextRuns(pageIndex, documentId),\n      onPageLayoutChange: this.pageLayoutChange$.forScope(documentId),\n      getState: () => this.state,\n      onStateChange: (listener: Listener<LayoutAnalysisState>) =>\n        this.stateChange$.on((event) => {\n          if (event.documentId === documentId) listener(event.state);\n        }),\n    };\n  }\n\n  // ─── Task tracking & abort ────────────────────────────────\n\n  private trackTask(documentId: string, task: Task<any, any, any>): void {\n    this.abortActiveTask(documentId);\n    this.activeTasks.set(documentId, task);\n\n    const cleanup = () => this.activeTasks.delete(documentId);\n    task.wait(cleanup, cleanup);\n  }\n\n  private abortActiveTask(documentId: string): void {\n    const existing = this.activeTasks.get(documentId);\n    if (existing) {\n      existing.abort({ type: 'no-document', message: 'Aborted' });\n      this.activeTasks.delete(documentId);\n    }\n  }\n\n  // ─── Internal pipeline ───────────────────────────────────\n\n  private doAnalyzePage(\n    documentId: string,\n    pageIndex: number,\n    task: Task<PageLayout, LayoutAnalysisErrorReason, PageAnalysisProgress>,\n    phases: { runLayout: boolean; runTableStructure: boolean },\n  ): void {\n    const seq = new TaskSequence(task);\n\n    seq.execute(\n      async () => {\n        const coreDoc = this.coreState.core.documents[documentId];\n        if (!coreDoc?.document) {\n          task.reject({ type: 'no-document', message: 'No document loaded' });\n          return;\n        }\n\n        const page = coreDoc.document.pages[pageIndex];\n        if (!page) {\n          task.reject({ type: 'render-failed', pageIndex, message: `Page ${pageIndex} not found` });\n          return;\n        }\n\n        const pageSize: Size = page.size;\n        const renderScope = this.renderCapability.forDocument(documentId);\n\n        let layout: PageLayout;\n\n        this.logger.debug('LayoutAnalysis', 'analyzePage', `page ${pageIndex}`, {\n          runLayout: phases.runLayout,\n          runTableStructure: phases.runTableStructure,\n        });\n\n        if (phases.runLayout) {\n          task.progress({ stage: 'rendering', pageIndex });\n          const imageData = await seq.run(() =>\n            renderScope.renderPageRaw({\n              pageIndex,\n              options: { scaleFactor: this.pluginConfig.renderScale },\n            }),\n          );\n\n          task.progress({ stage: 'layout-detection', pageIndex });\n          const input: LayoutDetectionInput = {\n            imageData,\n            sourceWidth: imageData.width,\n            sourceHeight: imageData.height,\n          };\n\n          const detections = await seq.runWithProgress(\n            () => this.aiManager.run(this.layoutPipeline, input),\n            (p: PipelineProgress) => {\n              if (p.stage === 'downloading-model') {\n                return {\n                  stage: 'downloading-model' as const,\n                  pageIndex,\n                  loaded: p.loaded,\n                  total: p.total,\n                };\n              }\n              if (p.stage === 'creating-session') {\n                return { stage: 'creating-session' as const, pageIndex };\n              }\n              return { stage: 'layout-detection' as const, pageIndex };\n            },\n          );\n\n          task.progress({ stage: 'mapping-coordinates', pageIndex });\n          const imageSize: Size = { width: imageData.width, height: imageData.height };\n          const blocks = mapDetectionsToPageCoordinates(detections, imageSize, pageSize);\n          for (const block of blocks) {\n            block.id = uuidV4();\n          }\n\n          layout = {\n            pageIndex,\n            blocks,\n            tableStructures: new Map(),\n            imageSize,\n            pageSize,\n          };\n\n          this.logger.debug('LayoutAnalysis', 'layoutDetection', `page ${pageIndex} complete`, {\n            blockCount: blocks.length,\n          });\n\n          this.dispatch(setPageLayout(documentId, pageIndex, layout));\n          this.pageLayoutChange$.emit(documentId, { pageIndex, layout });\n        } else {\n          layout = this.getPageLayout(pageIndex, documentId)!;\n        }\n\n        if (phases.runTableStructure) {\n          const tableStructures = await this.runTableStructurePass(\n            documentId,\n            pageIndex,\n            layout,\n            seq,\n            task,\n          );\n\n          layout = { ...layout, tableStructures };\n          this.dispatch(setPageTableStructures(documentId, pageIndex, tableStructures));\n          this.pageLayoutChange$.emit(documentId, { pageIndex, layout });\n        }\n\n        task.resolve(layout);\n      },\n      (err) => {\n        const message = err instanceof Error ? err.message : String(err);\n        return { type: 'inference-failed' as const, message };\n      },\n    );\n\n    task.wait(\n      () => {},\n      (error) => {\n        if (error.type === 'reject') {\n          this.dispatch(setPageError(documentId, pageIndex, error.reason.message));\n        } else if (error.type === 'abort') {\n          this.dispatch(setPageStatus(documentId, pageIndex, 'idle'));\n        }\n      },\n    );\n  }\n\n  private async runTableStructurePass(\n    documentId: string,\n    pageIndex: number,\n    layout: PageLayout,\n    seq: TaskSequence<LayoutAnalysisErrorReason, PageAnalysisProgress>,\n    task: Task<PageLayout, LayoutAnalysisErrorReason, PageAnalysisProgress>,\n  ): Promise<Map<string, TableStructureElement[]>> {\n    const tableStructures = new Map<string, TableStructureElement[]>();\n    const tableBlocks = layout.blocks.filter(\n      (b) => b.classId === TABLE_CLASS_ID && b.score >= TABLE_MIN_SCORE,\n    );\n\n    this.logger.debug('LayoutAnalysis', 'runTableStructurePass', {\n      totalBlocks: layout.blocks.length,\n      qualifyingTableBlocks: tableBlocks.length,\n      tableBlockScores: tableBlocks.map((b) => b.score),\n      tableMinScore: TABLE_MIN_SCORE,\n    });\n\n    for (let ti = 0; ti < tableBlocks.length; ti++) {\n      task.progress({\n        stage: 'table-structure',\n        pageIndex,\n        tableIndex: ti,\n        tableCount: tableBlocks.length,\n      });\n\n      try {\n        const tableBlock = tableBlocks[ti];\n        const elements = await this.analyzeTableStructure(\n          tableBlock.rect,\n          documentId,\n          pageIndex,\n          seq,\n          ti,\n          tableBlocks.length,\n        );\n        this.logger.debug(\n          'LayoutAnalysis',\n          'tableStructure',\n          `table ${ti} (block ${tableBlock.id})`,\n          {\n            elementsCount: elements.length,\n            tableRect: tableBlock.rect,\n            sampleElement: elements.length > 0 ? elements[0] : null,\n          },\n        );\n        tableStructures.set(tableBlock.id, elements);\n      } catch {\n        tableStructures.set(tableBlocks[ti].id, []);\n      }\n    }\n\n    return tableStructures;\n  }\n\n  private async analyzeTableStructure(\n    tableRect: Rect,\n    documentId: string,\n    pageIndex: number,\n    seq: TaskSequence<LayoutAnalysisErrorReason, PageAnalysisProgress>,\n    tableIndex: number,\n    tableCount: number,\n  ): Promise<TableStructureElement[]> {\n    if (tableRect.size.width < 1 || tableRect.size.height < 1) return [];\n\n    const renderScope = this.renderCapability.forDocument(documentId);\n    const cropData = await seq.run(() =>\n      renderScope.renderPageRectRaw({\n        pageIndex,\n        rect: tableRect,\n        options: { scaleFactor: this.pluginConfig.renderScale },\n      }),\n    );\n\n    const cropSize: Size = { width: cropData.width, height: cropData.height };\n    if (cropSize.width < 8 || cropSize.height < 8) return [];\n\n    const input: TableStructureInput = { imageData: cropData };\n\n    const result = await seq.runWithProgress(\n      () => this.aiManager.run(this.tablePipeline, input),\n      (p: PipelineProgress) => {\n        if (p.stage === 'downloading-model') {\n          return {\n            stage: 'downloading-model' as const,\n            pageIndex,\n            loaded: p.loaded,\n            total: p.total,\n          };\n        }\n        if (p.stage === 'creating-session') {\n          return { stage: 'creating-session' as const, pageIndex };\n        }\n        return { stage: 'table-structure' as const, pageIndex, tableIndex, tableCount };\n      },\n    );\n\n    return result.elements.map((el) => ({\n      classId: el.classId,\n      label: el.label,\n      score: el.score,\n      rect: mapTableElementToPageCoordinates(el.bbox, tableRect, cropSize),\n    }));\n  }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { LayoutAnalysisPluginConfig } from './types';\n\nexport const LAYOUT_ANALYSIS_PLUGIN_ID = 'layout-analysis';\n\nexport const manifest: PluginManifest<LayoutAnalysisPluginConfig> = {\n  id: LAYOUT_ANALYSIS_PLUGIN_ID,\n  name: 'Layout Analysis Plugin',\n  version: '1.0.0',\n  provides: ['layout-analysis'],\n  requires: ['render', 'ai-manager'],\n  optional: [],\n  defaultConfig: {\n    layoutThreshold: 0.35,\n    tableStructureThreshold: 0.8,\n    tableStructure: false,\n    autoAnalyze: false,\n    renderScale: 2.0,\n  },\n};\n","import { Reducer } from '@embedpdf/core';\nimport { LayoutAnalysisState } from './types';\nimport {\n  LayoutAnalysisAction,\n  INIT_LAYOUT_STATE,\n  CLEANUP_LAYOUT_STATE,\n  SET_PAGE_STATUS,\n  SET_PAGE_LAYOUT,\n  SET_PAGE_ERROR,\n  SET_LAYOUT_OVERLAY_VISIBLE,\n  SET_TABLE_STRUCTURE_OVERLAY_VISIBLE,\n  SET_TABLE_STRUCTURE_ENABLED,\n  SET_LAYOUT_THRESHOLD,\n  SET_TABLE_STRUCTURE_THRESHOLD,\n  SELECT_BLOCK,\n  SET_PAGE_TABLE_STRUCTURES,\n  CLEAR_PAGE_RESULTS,\n  CLEAR_ALL_RESULTS,\n} from './actions';\n\nexport const initialState: LayoutAnalysisState = {\n  documents: {},\n  layoutOverlayVisible: true,\n  tableStructureOverlayVisible: true,\n  tableStructureEnabled: false,\n  selectedBlockId: null,\n  layoutThreshold: 0.35,\n  tableStructureThreshold: 0.8,\n};\n\nexport const reducer: Reducer<LayoutAnalysisState, LayoutAnalysisAction> = (\n  state = initialState,\n  action,\n) => {\n  switch (action.type) {\n    case INIT_LAYOUT_STATE: {\n      const { documentId } = action.payload;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: { pages: {} },\n        },\n      };\n    }\n\n    case CLEANUP_LAYOUT_STATE: {\n      const docId = action.payload;\n      const { [docId]: _, ...rest } = state.documents;\n      return { ...state, documents: rest };\n    }\n\n    case SET_PAGE_STATUS: {\n      const { documentId, pageIndex, status } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      const page = doc.pages[pageIndex] ?? {\n        status: 'idle',\n        layout: null,\n        error: null,\n        tableStructureAnalyzed: false,\n      };\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: { ...page, status },\n            },\n          },\n        },\n      };\n    }\n\n    case SET_PAGE_LAYOUT: {\n      const { documentId, pageIndex, layout } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: {\n                status: 'complete',\n                layout,\n                error: null,\n                tableStructureAnalyzed: false,\n              },\n            },\n          },\n        },\n      };\n    }\n\n    case SET_PAGE_ERROR: {\n      const { documentId, pageIndex, error } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: { status: 'error', layout: null, error, tableStructureAnalyzed: false },\n            },\n          },\n        },\n      };\n    }\n\n    case CLEAR_PAGE_RESULTS: {\n      const { documentId, pageIndex } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      const { [pageIndex]: _, ...restPages } = doc.pages;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: { ...doc, pages: restPages },\n        },\n      };\n    }\n\n    case CLEAR_ALL_RESULTS: {\n      const { documentId } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: { ...doc, pages: {} },\n        },\n      };\n    }\n\n    case SET_PAGE_TABLE_STRUCTURES: {\n      const { documentId, pageIndex, tableStructures } = action.payload;\n      const doc = state.documents[documentId];\n      if (!doc) return state;\n      const page = doc.pages[pageIndex];\n      if (!page?.layout) return state;\n      return {\n        ...state,\n        documents: {\n          ...state.documents,\n          [documentId]: {\n            ...doc,\n            pages: {\n              ...doc.pages,\n              [pageIndex]: {\n                ...page,\n                layout: { ...page.layout, tableStructures },\n                tableStructureAnalyzed: true,\n              },\n            },\n          },\n        },\n      };\n    }\n\n    case SET_LAYOUT_OVERLAY_VISIBLE:\n      return { ...state, layoutOverlayVisible: action.payload };\n\n    case SET_TABLE_STRUCTURE_OVERLAY_VISIBLE:\n      return { ...state, tableStructureOverlayVisible: action.payload };\n\n    case SET_TABLE_STRUCTURE_ENABLED:\n      return { ...state, tableStructureEnabled: action.payload };\n\n    case SET_LAYOUT_THRESHOLD:\n      return { ...state, layoutThreshold: action.payload };\n\n    case SET_TABLE_STRUCTURE_THRESHOLD:\n      return { ...state, tableStructureThreshold: action.payload };\n\n    case SELECT_BLOCK:\n      return { ...state, selectedBlockId: action.payload };\n\n    default:\n      return state;\n  }\n};\n","import { PluginPackage } from '@embedpdf/core';\n\nimport { LayoutAnalysisPlugin } from './layout-analysis-plugin';\nimport { manifest, LAYOUT_ANALYSIS_PLUGIN_ID } from './manifest';\nimport { LayoutAnalysisPluginConfig, LayoutAnalysisState } from './types';\nimport { reducer, initialState } from './reducer';\nimport { LayoutAnalysisAction } from './actions';\n\nexport const LayoutAnalysisPluginPackage: PluginPackage<\n  LayoutAnalysisPlugin,\n  LayoutAnalysisPluginConfig,\n  LayoutAnalysisState,\n  LayoutAnalysisAction\n> = {\n  manifest,\n  create: (registry, config) =>\n    new LayoutAnalysisPlugin(LAYOUT_ANALYSIS_PLUGIN_ID, registry, config),\n  reducer,\n  initialState,\n};\n\nexport * from './layout-analysis-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './coordinate-mapper';\nexport * from './merge-utils';\n","import { Rect, PdfTextRun, PdfPageTextRuns } from '@embedpdf/models';\nimport { LayoutBlock, PageLayout } from './types';\n\n/**\n * A layout block enriched with the text runs that spatially overlap it.\n */\nexport interface EnrichedLayoutBlock extends LayoutBlock {\n  textRuns: PdfTextRun[];\n}\n\n/**\n * Merge text runs with layout blocks based on spatial overlap.\n *\n * For each block, collects all text runs whose bounding rect intersects\n * the block's rect. Both are in PDF page coordinates (points).\n */\nexport function mergeTextRunsWithLayout(\n  layout: PageLayout,\n  textRuns: PdfPageTextRuns,\n): EnrichedLayoutBlock[] {\n  return layout.blocks.map((block) => ({\n    ...block,\n    textRuns: textRuns.runs.filter((run) => rectsOverlap(run.rect, block.rect)),\n  }));\n}\n\nfunction rectsOverlap(a: Rect, b: Rect): boolean {\n  const aLeft = a.origin.x;\n  const aRight = a.origin.x + a.size.width;\n  const aTop = a.origin.y;\n  const aBottom = a.origin.y + a.size.height;\n\n  const bLeft = b.origin.x;\n  const bRight = b.origin.x + b.size.width;\n  const bTop = b.origin.y;\n  const bBottom = b.origin.y + b.size.height;\n\n  return aLeft < bRight && aRight > bLeft && aTop < bBottom && aBottom > bTop;\n}\n"],"names":["INIT_LAYOUT_STATE","CLEANUP_LAYOUT_STATE","SET_PAGE_STATUS","SET_PAGE_LAYOUT","SET_PAGE_ERROR","SET_LAYOUT_OVERLAY_VISIBLE","SET_TABLE_STRUCTURE_OVERLAY_VISIBLE","SET_LAYOUT_THRESHOLD","SET_TABLE_STRUCTURE_THRESHOLD","SELECT_BLOCK","SET_TABLE_STRUCTURE_ENABLED","SET_PAGE_TABLE_STRUCTURES","CLEAR_PAGE_RESULTS","CLEAR_ALL_RESULTS","setPageStatus","documentId","pageIndex","status","type","payload","setTableStructureEnabled","enabled","MODEL_INPUT_SIZE","mapDetectionsToPageCoordinates","detections","imageSize","pageSize","pageRotation","normalized","length","maxCoord","det","x","y","polygon","Math","max","looksLikeModelSpace","sourceIsDifferentSize","abs","width","height","scaleX","scaleY","map","clamp","xs","p","ys","bbox","min","normalizeToSourceSpace","x1","y1","x2","y2","rect","origin","size","id","String","classId","label","score","imageBbox","readingOrder","mapTableElementToPageCoordinates","elementBbox","tableRect","cropImageSize","ex1","ey1","ex2","ey2","_LayoutAnalysisPlugin","BasePlugin","constructor","registry","config","super","this","layoutPipeline","LayoutDetectionPipeline","tablePipeline","TableStructurePipeline","pageLayoutChange$","createScopedEmitter","data","cache","stateChange$","createEmitter","activeTasks","Map","aiManager","getPlugin","provides","renderCapability","initialize","pluginConfig","layoutThreshold","tableStructureThreshold","tableStructure","autoAnalyze","renderScale","dispatch","onDocumentLoaded","initLayoutState","onDocumentClosed","abortActiveTask","cleanupLayoutState","clearScope","onStoreUpdated","prevState","newState","documents","layoutOverlayVisible","tableStructureOverlayVisible","tableStructureEnabled","selectedBlockId","emit","state","buildCapability","analyzePage","options","analyzeAllPages","getPageLayout","getPageTextRuns","forDocument","createScope","onPageLayoutChange","onGlobal","onStateChange","on","setLayoutOverlayVisible","v","setTableStructureOverlayVisible","setLayoutThreshold","t","setTableStructureThreshold","selectBlock","clearPageResults","docId","layout","clearAllResults","task","Task","getActiveDocumentId","reject","message","pageState","getPageState","hasLayout","hasTableStructure","tableStructureAnalyzed","tableEnabled","force","needsLayout","needsTableStructure","doAnalyzePage","runLayout","runTableStructure","resolve","coreDoc","coreState","core","document","trackTask","pageCount","pages","completed","currentPageTask","origAbort","abort","bind","reason","analyzeNext","idx","stage","TaskStage","Pending","pageTask","onProgress","progress","wait","push","total","err","fail","_a","page","engine","result","forScope","getState","listener","event","set","cleanup","delete","existing","get","phases","seq","TaskSequence","execute","async","renderScope","logger","debug","imageData","run","renderPageRaw","scaleFactor","input","sourceWidth","sourceHeight","runWithProgress","loaded","blocks","block","uuidV4","tableStructures","blockCount","setPageLayout","runTableStructurePass","setPageTableStructures","Error","error","setPageError","tableBlocks","filter","b","totalBlocks","qualifyingTableBlocks","tableBlockScores","tableMinScore","ti","tableIndex","tableCount","tableBlock","elements","analyzeTableStructure","elementsCount","sampleElement","cropData","renderPageRectRaw","cropSize","el","LayoutAnalysisPlugin","LAYOUT_ANALYSIS_PLUGIN_ID","manifest","name","version","requires","optional","defaultConfig","initialState","LayoutAnalysisPluginPackage","create","reducer","action","_","rest","doc","restPages","textRuns","runs","a","aLeft","aRight","aTop","aBottom","bLeft","bRight","bTop","bBottom","rectsOverlap"],"mappings":"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"}