@sendbird/actionbook-core 0.10.6 → 0.10.8
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.
- package/dist/index.d.ts +2 -2
- package/dist/index.js +58 -4
- package/dist/index.js.map +1 -1
- package/dist/{types-DK_GhIWZ.d.ts → types-BQ95zx4j.d.ts} +1 -0
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +297 -126
- package/dist/ui/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ast/types.ts","../src/ast/builders.ts","../src/ast/traverse.ts","../src/ast/predicates.ts","../src/ast/path.ts","../src/schema/schema.ts","../src/markdown/parser.ts","../node_modules/micromark-util-chunked/index.js","../node_modules/micromark-util-combine-extensions/index.js","../node_modules/micromark-util-classify-character/index.js","../node_modules/micromark-util-resolve-all/index.js","../node_modules/micromark-factory-space/index.js","../node_modules/micromark-core-commonmark/lib/blank-line.js","../node_modules/micromark-util-normalize-identifier/index.js","../node_modules/micromark-extension-gfm-footnote/lib/syntax.js","../node_modules/micromark-extension-gfm-strikethrough/lib/syntax.js","../node_modules/micromark-extension-gfm-table/lib/syntax.js","../node_modules/micromark-extension-gfm-table/lib/edit-map.js","../node_modules/micromark-extension-gfm-table/lib/infer.js","../node_modules/micromark-extension-gfm-task-list-item/lib/syntax.js","../node_modules/devlop/lib/default.js","../node_modules/mdast-util-gfm-footnote/lib/index.js","../node_modules/mdast-util-gfm-strikethrough/lib/index.js","../node_modules/markdown-table/index.js","../node_modules/mdast-util-gfm-table/lib/index.js","../node_modules/mdast-util-gfm-task-list-item/lib/index.js","../src/markdown/plugins/resourceTag.ts","../src/markdown/plugins/jumpPoint.ts","../src/markdown/mdastAdapter.ts","../src/markdown/plugins/jinjaBlock.ts","../src/markdown/serializer.ts","../src/markdown/fragment.ts","../src/json/serialize.ts","../src/compat/prosemirror.ts","../src/json/deserialize.ts","../src/operations/apply.ts","../src/jinja/scanner.ts","../src/jinja/structurer.ts","../src/jinja/analyzer.ts","../src/jinja/variableExtractor.ts","../src/jinja/evaluator.ts","../src/jinja/conditionHighlighter.ts","../src/jinja/evaluateNodes.ts","../src/lint/runner.ts","../src/lint/rules/duplicateJumpPoints.ts","../src/lint/rules/jumpPointRefValidity.ts","../src/lint/rules/consecutiveMergeableActions.ts","../src/lint/rules/index.ts","../src/lint/chunker.ts","../src/lint/llmRunner.ts","../src/lint/rules/llm/parseIssueLines.ts","../src/lint/rules/llm/repetitionDetection.ts","../src/lint/rules/llm/koreanVerbFirst.ts","../src/lint/rules/llm/conditionGrounding.ts","../src/lint/rules/llm/index.ts","../src/utils/resourceTags.ts","../src/utils/jumpPointDuplicate.ts","../src/tree/documentTree.ts","../src/tree/generator.ts","../src/actionbookToAST.ts"],"sourcesContent":["// === Marks (인라인 서식) ===\nexport type BoldMark = { readonly type: 'bold' };\nexport type ItalicMark = { readonly type: 'italic' };\nexport type UnderlineMark = { readonly type: 'underline' };\nexport type StrikethroughMark = { readonly type: 'strikethrough' };\nexport type CodeMark = { readonly type: 'code' };\nexport type LinkMark = { readonly type: 'link'; readonly href: string; readonly title?: string };\nexport type Mark = BoldMark | ItalicMark | UnderlineMark | StrikethroughMark | CodeMark | LinkMark;\n\n// === Resource tag type values ===\nexport const RESOURCE_TAG_TYPES = ['tool', 'manual', 'agent_message_template', 'handoff', 'time_diff', 'time_difference'] as const;\nexport type ResourceTagType = (typeof RESOURCE_TAG_TYPES)[number];\n\n// === Inline Nodes ===\nexport type TextNode = {\n readonly type: 'text';\n readonly text: string;\n readonly marks?: readonly Mark[];\n};\n\nexport type ResourceTagNode = {\n readonly type: 'resourceTag';\n readonly tagType: ResourceTagType;\n readonly resourceId: string;\n readonly text: string;\n};\n\nexport type JumpPointNode = {\n readonly type: 'jumpPoint';\n readonly id: string; // /^[\\p{L}\\p{N}_-]+$/u\n};\n\nexport type HardBreakNode = { readonly type: 'hardBreak' };\n\n// === Jinja If (Inline) ===\nexport type JinjaIfBranch<T> = {\n readonly branchType: 'if' | 'elif' | 'else';\n readonly condition?: string;\n readonly content: readonly T[];\n};\n\nexport type JinjaIfInlineNode = {\n readonly type: 'jinjaIfInline';\n readonly branches: readonly JinjaIfBranch<InlineNode>[];\n};\n\nexport type InlineNode = TextNode | ResourceTagNode | JumpPointNode | HardBreakNode | JinjaIfInlineNode;\n\n// === Block Nodes ===\nexport type ParagraphNode = {\n readonly type: 'paragraph';\n readonly content: readonly InlineNode[];\n};\n\nexport type HeadingNode = {\n readonly type: 'heading';\n readonly level: 1 | 2 | 3 | 4 | 5 | 6;\n readonly content: readonly InlineNode[];\n};\n\nexport type ListItemNode = {\n readonly type: 'listItem';\n readonly checked?: boolean | null;\n readonly spread?: boolean;\n readonly content: readonly BlockNode[];\n};\n\nexport type BulletListNode = {\n readonly type: 'bulletList';\n readonly spread?: boolean;\n readonly content: readonly ListItemNode[];\n};\n\nexport type OrderedListNode = {\n readonly type: 'orderedList';\n readonly start: number;\n readonly spread?: boolean;\n readonly content: readonly ListItemNode[];\n};\n\nexport type BlockquoteNode = {\n readonly type: 'blockquote';\n readonly content: readonly BlockNode[];\n};\n\nexport type HorizontalRuleNode = { readonly type: 'horizontalRule' };\n\nexport type CodeBlockNode = {\n readonly type: 'codeBlock';\n readonly language?: string;\n readonly content: string;\n};\n\nexport type TableCellNode = {\n readonly type: 'tableCell';\n readonly header?: boolean;\n readonly content: readonly InlineNode[];\n};\n\nexport type TableRowNode = {\n readonly type: 'tableRow';\n readonly content: readonly TableCellNode[];\n};\n\nexport type TableNode = {\n readonly type: 'table';\n readonly content: readonly TableRowNode[];\n};\n\n// === Jinja If (Block) ===\nexport type JinjaIfBlockNode = {\n readonly type: 'jinjaIfBlock';\n readonly branches: readonly JinjaIfBranch<BlockNode>[];\n};\n\n// === Note Block (editor-only, not serialized to markdown) ===\nexport type NoteBlockNode = {\n readonly type: 'noteBlock';\n readonly content: readonly BlockNode[];\n};\n\nexport type BlockNode =\n | ParagraphNode\n | HeadingNode\n | BulletListNode\n | OrderedListNode\n | ListItemNode\n | BlockquoteNode\n | HorizontalRuleNode\n | CodeBlockNode\n | TableNode\n | JinjaIfBlockNode\n | NoteBlockNode;\n\n// === Document Root ===\nexport type DocumentNode = {\n readonly type: 'doc';\n readonly content: readonly BlockNode[];\n};\n\n// === Union ===\nexport type AstNode = DocumentNode | BlockNode | InlineNode | TableRowNode | TableCellNode;\n\n// === Node Path (향후 CRDT/undo-redo 지원) ===\nexport type NodePath = readonly number[];\n\n// === Jump point ID validation ===\nexport const JUMP_POINT_ID_PATTERN = /^[\\p{L}\\p{N}_-]+$/u;\n","import type {\n BoldMark,\n ItalicMark,\n UnderlineMark,\n StrikethroughMark,\n CodeMark,\n LinkMark,\n Mark,\n TextNode,\n ResourceTagNode,\n ResourceTagType,\n JumpPointNode,\n HardBreakNode,\n InlineNode,\n ParagraphNode,\n HeadingNode,\n BulletListNode,\n OrderedListNode,\n ListItemNode,\n BlockquoteNode,\n HorizontalRuleNode,\n CodeBlockNode,\n NoteBlockNode,\n TableCellNode,\n TableRowNode,\n TableNode,\n BlockNode,\n DocumentNode,\n JinjaIfBranch,\n JinjaIfBlockNode,\n JinjaIfInlineNode,\n} from './types';\nimport { JUMP_POINT_ID_PATTERN } from './types';\n\n// === Mark builders ===\nexport const bold = (): BoldMark => ({ type: 'bold' });\nexport const italic = (): ItalicMark => ({ type: 'italic' });\nexport const underline = (): UnderlineMark => ({ type: 'underline' });\nexport const strikethrough = (): StrikethroughMark => ({ type: 'strikethrough' });\nexport const code = (): CodeMark => ({ type: 'code' });\nexport const link = (href: string, title?: string): LinkMark =>\n title != null ? { type: 'link', href, title } : { type: 'link', href };\n\n// === Inline node builders ===\nexport const text = (t: string, marks?: Mark[]): TextNode =>\n marks && marks.length > 0 ? { type: 'text', text: t, marks } : { type: 'text', text: t };\n\nexport const resourceTag = (tagType: ResourceTagType, resourceId: string, displayText: string): ResourceTagNode => ({\n type: 'resourceTag',\n tagType,\n resourceId,\n text: displayText,\n});\n\nexport const jumpPoint = (id: string): JumpPointNode => {\n if (!JUMP_POINT_ID_PATTERN.test(id)) {\n throw new Error(`Invalid jump point ID: \"${id}\". Letters, numbers, underscore, and hyphen only.`);\n }\n return { type: 'jumpPoint', id };\n};\n\nexport const hardBreak = (): HardBreakNode => ({ type: 'hardBreak' });\n\n// === Block node builders ===\nexport const paragraph = (...content: InlineNode[]): ParagraphNode => ({\n type: 'paragraph',\n content,\n});\n\nexport const heading = (level: 1 | 2 | 3 | 4 | 5 | 6, ...content: InlineNode[]): HeadingNode => ({\n type: 'heading',\n level,\n content,\n});\n\nexport const bulletList = (...items: ListItemNode[]): BulletListNode => ({\n type: 'bulletList',\n content: items,\n});\n\nexport const orderedList = (start: number, ...items: ListItemNode[]): OrderedListNode => ({\n type: 'orderedList',\n start,\n content: items,\n});\n\nexport function listItem(...content: BlockNode[]): ListItemNode;\nexport function listItem(checked: boolean | null, ...content: BlockNode[]): ListItemNode;\nexport function listItem(first?: boolean | null | BlockNode, ...rest: BlockNode[]): ListItemNode {\n // If first arg is a BlockNode (has 'type' property), treat as content-only call\n if (first != null && typeof first === 'object' && 'type' in first) {\n return { type: 'listItem', content: [first as BlockNode, ...rest] };\n }\n const checked = first as boolean | null | undefined;\n const base: ListItemNode = { type: 'listItem', content: rest };\n if (typeof checked === 'boolean') return { ...base, checked };\n return base;\n}\n\nexport const todoItem = (checked: boolean, ...content: BlockNode[]): ListItemNode => ({\n type: 'listItem',\n checked,\n content,\n});\n\nexport const blockquote = (...content: BlockNode[]): BlockquoteNode => ({\n type: 'blockquote',\n content,\n});\n\nexport const horizontalRule = (): HorizontalRuleNode => ({ type: 'horizontalRule' });\n\nexport const codeBlock = (content: string, language?: string): CodeBlockNode => ({\n type: 'codeBlock',\n ...(language ? { language } : {}),\n content,\n});\n\nexport const noteBlock = (...content: BlockNode[]): NoteBlockNode => ({\n type: 'noteBlock',\n content,\n});\n\n// === Table builders ===\nexport const tableCell = (header: boolean, ...content: InlineNode[]): TableCellNode => ({\n type: 'tableCell',\n ...(header ? { header: true } : {}),\n content,\n});\n\nexport const tableRow = (...cells: TableCellNode[]): TableRowNode => ({\n type: 'tableRow',\n content: cells,\n});\n\nexport const table = (...rows: TableRowNode[]): TableNode => ({\n type: 'table',\n content: rows,\n});\n\n// === Jinja builders ===\nexport function jinjaBranch<T extends InlineNode | BlockNode>(\n branchType: 'if' | 'elif' | 'else',\n condition: string | undefined,\n ...content: T[]\n): JinjaIfBranch<T> {\n return condition != null\n ? { branchType, condition, content }\n : { branchType, content };\n}\n\nexport const jinjaIfBlock = (...branches: JinjaIfBranch<BlockNode>[]): JinjaIfBlockNode => ({\n type: 'jinjaIfBlock',\n branches,\n});\n\nexport const jinjaIfInline = (...branches: JinjaIfBranch<InlineNode>[]): JinjaIfInlineNode => ({\n type: 'jinjaIfInline',\n branches,\n});\n\n// === Document builder ===\nexport const doc = (...content: BlockNode[]): DocumentNode => ({\n type: 'doc',\n content,\n});\n","import type { AstNode, BlockNode, DocumentNode, InlineNode, JinjaIfBlockNode, JinjaIfInlineNode, NodePath } from './types';\n\n/**\n * Maximum recursion depth for all tree traversal functions.\n * Prevents stack overflow from maliciously deep or malformed input.\n */\nexport const MAX_DEPTH = 128;\n\nexport class TraversalDepthError extends Error {\n constructor(depth: number) {\n super(`Maximum traversal depth (${MAX_DEPTH}) exceeded at depth ${depth}`);\n this.name = 'TraversalDepthError';\n }\n}\n\nfunction getChildren(node: AstNode): readonly AstNode[] {\n switch (node.type) {\n case 'doc':\n case 'blockquote':\n case 'listItem':\n case 'noteBlock':\n return node.content;\n case 'paragraph':\n case 'heading':\n return node.content;\n case 'bulletList':\n case 'orderedList':\n return node.content;\n case 'jinjaIfBlock':\n return node.branches.flatMap(b => b.content as readonly AstNode[]);\n case 'jinjaIfInline':\n return node.branches.flatMap(b => b.content as readonly AstNode[]);\n default:\n return [];\n }\n}\n\n// Internal recursive implementation shared by visit()\nfunction visitInternal(\n node: AstNode,\n callback: (node: AstNode, parent?: AstNode, path?: NodePath) => void,\n parent: AstNode | undefined,\n path: NodePath,\n depth: number,\n trackPath: boolean,\n): void {\n if (depth > MAX_DEPTH) {\n throw new TraversalDepthError(depth);\n }\n callback(node, parent, trackPath ? path : undefined);\n const children = getChildren(node);\n for (let i = 0; i < children.length; i++) {\n const nextPath = trackPath ? [...path, i] : path;\n visitInternal(children[i], callback, node, nextPath, depth + 1, trackPath);\n }\n}\n\nexport interface VisitOptions {\n /**\n * Whether to compute and pass a NodePath to each callback invocation.\n * Defaults to true for backward compatibility.\n * Set to false for performance-critical traversals that don't need path info.\n */\n trackPath?: boolean;\n}\n\nexport function visit(\n node: AstNode,\n callback: (node: AstNode, parent?: AstNode, path?: NodePath) => void,\n options?: VisitOptions,\n): void {\n visitInternal(node, callback, undefined, [], 0, options?.trackPath ?? true);\n}\n\nexport function map(node: AstNode, fn: (node: AstNode) => AstNode, _depth: number = 0): AstNode {\n if (_depth > MAX_DEPTH) {\n throw new TraversalDepthError(_depth);\n }\n const mapped = fn(node);\n const children = getChildren(mapped);\n if (children.length === 0) return mapped;\n\n const newChildren = children.map((child) => map(child, fn, _depth + 1));\n const changed = newChildren.some((c, i) => c !== children[i]);\n if (!changed) return mapped;\n\n switch (mapped.type) {\n case 'doc':\n return { ...mapped, content: newChildren as BlockNode[] };\n case 'blockquote':\n case 'listItem':\n case 'noteBlock':\n return { ...mapped, content: newChildren as BlockNode[] };\n case 'paragraph':\n case 'heading':\n return { ...mapped, content: newChildren as InlineNode[] };\n case 'bulletList':\n return { ...mapped, content: newChildren as typeof mapped.content };\n case 'orderedList':\n return { ...mapped, content: newChildren as typeof mapped.content };\n case 'jinjaIfBlock': {\n const jNode = mapped as JinjaIfBlockNode;\n let offset = 0;\n const newBranches = jNode.branches.map(b => {\n const slice = newChildren.slice(offset, offset + b.content.length) as BlockNode[];\n offset += b.content.length;\n return { ...b, content: slice };\n });\n return { ...jNode, branches: newBranches };\n }\n case 'jinjaIfInline': {\n const jNode = mapped as JinjaIfInlineNode;\n let offset = 0;\n const newBranches = jNode.branches.map(b => {\n const slice = newChildren.slice(offset, offset + b.content.length) as InlineNode[];\n offset += b.content.length;\n return { ...b, content: slice };\n });\n return { ...jNode, branches: newBranches };\n }\n default:\n return mapped;\n }\n}\n\nexport function textContent(node: AstNode, _depth: number = 0): string {\n if (_depth > MAX_DEPTH) {\n throw new TraversalDepthError(_depth);\n }\n switch (node.type) {\n case 'text':\n return node.text;\n case 'resourceTag':\n return node.text;\n case 'jumpPoint':\n return `^${node.id}^`;\n case 'hardBreak':\n return '\\n';\n case 'jinjaIfInline': {\n // Reconstruct original {% %} text for analyzer compatibility\n let out = '';\n for (const branch of node.branches) {\n if (branch.branchType === 'if') out += `{% if ${branch.condition} %}`;\n else if (branch.branchType === 'elif') out += `{% elif ${branch.condition} %}`;\n else out += '{% else %}';\n for (const child of branch.content) out += textContent(child, _depth + 1);\n }\n out += '{% endif %}';\n return out;\n }\n case 'horizontalRule':\n return '';\n default: {\n const children = getChildren(node);\n let out = '';\n for (const child of children) out += textContent(child, _depth + 1);\n return out;\n }\n }\n}\n\nexport function findAll(node: AstNode, predicate: (n: AstNode) => boolean): AstNode[] {\n const results: AstNode[] = [];\n visit(node, (n) => {\n if (predicate(n)) results.push(n);\n }, { trackPath: false });\n return results;\n}\n\nexport function nodeAtPath(root: DocumentNode, path: NodePath): AstNode | undefined {\n if (path.length > MAX_DEPTH) {\n throw new TraversalDepthError(path.length);\n }\n let current: AstNode = root;\n for (const index of path) {\n const children = getChildren(current);\n if (index < 0 || index >= children.length) return undefined;\n current = children[index];\n }\n return current;\n}\n","import type { AstNode, BlockNode, InlineNode, TextNode, DocumentNode } from './types';\n\nconst BLOCK_TYPES = new Set([\n 'paragraph',\n 'heading',\n 'bulletList',\n 'orderedList',\n 'listItem',\n 'blockquote',\n 'horizontalRule',\n 'codeBlock',\n 'jinjaIfBlock',\n 'noteBlock',\n]);\n\nconst INLINE_TYPES = new Set(['text', 'resourceTag', 'jumpPoint', 'hardBreak', 'jinjaIfInline']);\n\nexport function isBlock(node: AstNode): node is BlockNode {\n return BLOCK_TYPES.has(node.type);\n}\n\nexport function isInline(node: AstNode): node is InlineNode {\n return INLINE_TYPES.has(node.type);\n}\n\nexport function isTextNode(node: AstNode): node is TextNode {\n return node.type === 'text';\n}\n\nexport function isDocument(node: AstNode): node is DocumentNode {\n return node.type === 'doc';\n}\n","import type { NodePath } from './types';\n\nexport { nodeAtPath } from './traverse';\n\nexport function parentPath(path: NodePath): NodePath {\n return path.slice(0, -1);\n}\n\nexport function pathToString(path: NodePath): string {\n return `[${path.join(',')}]`;\n}\n\nexport function pathFromString(str: string): NodePath {\n const inner = str.slice(1, -1);\n if (inner === '') return [];\n return inner.split(',').map(Number);\n}\n\nexport function comparePaths(a: NodePath, b: NodePath): number {\n const len = Math.min(a.length, b.length);\n for (let i = 0; i < len; i++) {\n if (a[i] !== b[i]) return a[i] - b[i];\n }\n return a.length - b.length;\n}\n","import type { AstNode, DocumentNode, Mark, TableNode, TableRowNode } from '../ast/types';\nimport { JUMP_POINT_ID_PATTERN } from '../ast/types';\n\nexport type ValidationError = {\n path: string;\n message: string;\n};\n\nconst MAX_VALIDATION_DEPTH = 128;\n\nconst ALLOWED_URL_PROTOCOLS = /^(https?:|mailto:|tel:|#|\\/|www\\.)/i;\n\nfunction validateMark(mark: Mark, path: string): ValidationError[] {\n const errors: ValidationError[] = [];\n switch (mark.type) {\n case 'bold':\n case 'italic':\n case 'underline':\n case 'strikethrough':\n case 'code':\n break;\n case 'link':\n if (typeof mark.href !== 'string' || mark.href.length === 0) {\n errors.push({ path: `${path}.href`, message: 'Link mark requires a non-empty href' });\n } else if (!ALLOWED_URL_PROTOCOLS.test(mark.href)) {\n errors.push({\n path: `${path}.href`,\n message: `Disallowed URL protocol in href: \"${mark.href}\". Allowed: http, https, mailto, tel, #, /`,\n });\n }\n break;\n default:\n errors.push({ path, message: `Unknown mark type: ${(mark as { type: string }).type}` });\n }\n return errors;\n}\n\nconst VALID_RESOURCE_TAG_TYPES = new Set<string>(['tool', 'manual', 'agent_message_template', 'handoff', 'end_call', 'time_diff', 'time_difference']);\nconst RESOURCE_ID_OPTIONAL_TYPES = new Set<string>(['handoff', 'end_call']);\n\nfunction validateNode(node: AstNode, path: string, depth: number): ValidationError[] {\n if (depth > MAX_VALIDATION_DEPTH) {\n return [{ path, message: `Maximum validation depth (${MAX_VALIDATION_DEPTH}) exceeded` }];\n }\n\n const errors: ValidationError[] = [];\n\n switch (node.type) {\n case 'doc':\n if (!Array.isArray(node.content)) {\n errors.push({ path, message: 'doc must have content array' });\n } else {\n node.content.forEach((child, i) => errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1)));\n }\n break;\n\n case 'paragraph':\n case 'heading':\n if (node.type === 'heading' && (node.level < 1 || node.level > 6)) {\n errors.push({ path: `${path}.level`, message: `Invalid heading level: ${node.level}` });\n }\n if (Array.isArray(node.content)) {\n node.content.forEach((child, i) => errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1)));\n }\n break;\n\n case 'bulletList':\n case 'orderedList':\n if (!Array.isArray(node.content) || node.content.length === 0) {\n errors.push({ path, message: `${node.type} must have at least one listItem` });\n } else {\n node.content.forEach((child, i) => {\n if (child.type !== 'listItem') {\n errors.push({ path: `${path}.content[${i}]`, message: `${node.type} children must be listItem` });\n }\n errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1));\n });\n }\n if (node.type === 'orderedList' && typeof node.start !== 'number') {\n errors.push({ path: `${path}.start`, message: 'orderedList requires a start number' });\n }\n break;\n\n case 'listItem':\n if (!Array.isArray(node.content)) {\n errors.push({ path, message: 'listItem must have content array' });\n } else {\n node.content.forEach((child, i) => errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1)));\n }\n break;\n\n case 'blockquote':\n if (!Array.isArray(node.content)) {\n errors.push({ path, message: 'blockquote must have content array' });\n } else {\n node.content.forEach((child, i) => errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1)));\n }\n break;\n\n case 'horizontalRule':\n break;\n\n case 'codeBlock':\n // codeBlock has string content, no children to validate\n break;\n\n case 'noteBlock':\n if (!Array.isArray(node.content)) {\n errors.push({ path, message: 'noteBlock must have content array' });\n } else {\n node.content.forEach((child, i) => errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1)));\n }\n break;\n\n case 'table': {\n const tbl = node as TableNode;\n if (!Array.isArray(tbl.content) || tbl.content.length === 0) {\n errors.push({ path, message: 'table must have at least one tableRow' });\n } else {\n tbl.content.forEach((row: TableRowNode, i: number) => {\n if (row.type !== 'tableRow') {\n errors.push({ path: `${path}.content[${i}]`, message: 'table children must be tableRow' });\n } else {\n row.content.forEach((cell, j) => {\n if (cell.type !== 'tableCell') {\n errors.push({ path: `${path}.content[${i}].content[${j}]`, message: 'tableRow children must be tableCell' });\n }\n });\n }\n });\n }\n break;\n }\n\n case 'text':\n if (typeof node.text !== 'string') {\n errors.push({ path, message: 'text node must have a string text field' });\n }\n if (node.marks) {\n node.marks.forEach((mark, i) => errors.push(...validateMark(mark, `${path}.marks[${i}]`)));\n }\n break;\n\n case 'resourceTag':\n if (!VALID_RESOURCE_TAG_TYPES.has(node.tagType)) {\n errors.push({ path: `${path}.tagType`, message: `Invalid resource tag type: ${node.tagType}` });\n }\n if (typeof node.resourceId !== 'string' || (!RESOURCE_ID_OPTIONAL_TYPES.has(node.tagType) && node.resourceId.length === 0)) {\n errors.push({ path: `${path}.resourceId`, message: 'resourceTag requires a non-empty resourceId' });\n }\n if (typeof node.text !== 'string' || node.text.length === 0) {\n errors.push({ path: `${path}.text`, message: 'resourceTag requires a non-empty text' });\n }\n break;\n\n case 'jumpPoint':\n if (!JUMP_POINT_ID_PATTERN.test(node.id)) {\n errors.push({ path: `${path}.id`, message: `Invalid jump point ID: \"${node.id}\"` });\n }\n break;\n\n case 'hardBreak':\n break;\n\n case 'jinjaIfBlock': {\n if (!Array.isArray(node.branches) || node.branches.length === 0) {\n errors.push({ path, message: 'jinjaIfBlock must have at least one branch' });\n } else {\n if (node.branches[0].branchType !== 'if') {\n errors.push({ path: `${path}.branches[0]`, message: 'First branch must be \"if\"' });\n }\n for (let bi = 0; bi < node.branches.length; bi++) {\n const b = node.branches[bi];\n const bp = `${path}.branches[${bi}]`;\n if ((b.branchType === 'if' || b.branchType === 'elif') && !b.condition) {\n errors.push({ path: bp, message: `${b.branchType} branch requires a condition` });\n }\n if (b.branchType === 'else' && b.condition) {\n errors.push({ path: bp, message: 'else branch must not have a condition' });\n }\n if (Array.isArray(b.content)) {\n b.content.forEach((child: AstNode, ci: number) => errors.push(...validateNode(child, `${bp}.content[${ci}]`, depth + 1)));\n }\n }\n }\n break;\n }\n\n case 'jinjaIfInline': {\n if (!Array.isArray(node.branches) || node.branches.length === 0) {\n errors.push({ path, message: 'jinjaIfInline must have at least one branch' });\n } else {\n if (node.branches[0].branchType !== 'if') {\n errors.push({ path: `${path}.branches[0]`, message: 'First branch must be \"if\"' });\n }\n for (let bi = 0; bi < node.branches.length; bi++) {\n const b = node.branches[bi];\n const bp = `${path}.branches[${bi}]`;\n if ((b.branchType === 'if' || b.branchType === 'elif') && !b.condition) {\n errors.push({ path: bp, message: `${b.branchType} branch requires a condition` });\n }\n if (b.branchType === 'else' && b.condition) {\n errors.push({ path: bp, message: 'else branch must not have a condition' });\n }\n if (Array.isArray(b.content)) {\n b.content.forEach((child: AstNode, ci: number) => errors.push(...validateNode(child, `${bp}.content[${ci}]`, depth + 1)));\n }\n }\n }\n break;\n }\n\n default:\n errors.push({ path, message: `Unknown node type: ${(node as { type: string }).type}` });\n }\n\n return errors;\n}\n\nexport function validate(doc: DocumentNode): ValidationError[] {\n if (doc.type !== 'doc') {\n return [{ path: '', message: 'Root node must be of type \"doc\"' }];\n }\n return validateNode(doc, 'doc', 0);\n}\n","import { fromMarkdown } from 'mdast-util-from-markdown';\nimport { combineExtensions } from 'micromark-util-combine-extensions';\nimport { gfmFootnote } from 'micromark-extension-gfm-footnote';\nimport { gfmStrikethrough } from 'micromark-extension-gfm-strikethrough';\nimport { gfmTable } from 'micromark-extension-gfm-table';\nimport { gfmTaskListItem } from 'micromark-extension-gfm-task-list-item';\nimport { gfmFootnoteFromMarkdown } from 'mdast-util-gfm-footnote';\nimport { gfmStrikethroughFromMarkdown } from 'mdast-util-gfm-strikethrough';\nimport { gfmTableFromMarkdown } from 'mdast-util-gfm-table';\nimport { gfmTaskListItemFromMarkdown } from 'mdast-util-gfm-task-list-item';\nimport { splitTextWithResourceTags } from './plugins/resourceTag';\nimport { splitTextWithJumpPoints } from './plugins/jumpPoint';\nimport type { ResourceTagMdastNode } from './plugins/resourceTag';\nimport type { JumpPointMdastNode } from './plugins/jumpPoint';\nimport { fromMdast } from './mdastAdapter';\nimport { jinjaBlockTransform } from './plugins/jinjaBlock';\nimport type { DocumentNode } from '../ast/types';\nimport type { Link, Root, Text } from 'mdast';\n\nexport interface ParseMarkdownOptions {\n jinjaNodes?: boolean;\n}\n\n// GFM without autolink literal — autolink literal converts escaped emails/URLs\n// (e.g. bookings\\@flynorse.com) into link nodes during the mdast transform pass,\n// which then serialize as <bookings@flynorse.com> instead of preserving the\n// original backslash escaping.\nconst gfmNoAutolink = () =>\n combineExtensions([gfmFootnote(), gfmStrikethrough(), gfmTable(), gfmTaskListItem()]);\n\nconst gfmNoAutolinkFromMarkdown = () => [\n gfmFootnoteFromMarkdown(),\n gfmStrikethroughFromMarkdown(),\n gfmTableFromMarkdown(),\n gfmTaskListItemFromMarkdown(),\n];\n\nconst MAX_DEPTH = 128;\n\ntype CustomNode = ResourceTagMdastNode | JumpPointMdastNode;\n\n/**\n * Recover markdown links that micromark failed to parse because the URL\n * contains spaces (e.g. `[Go to #Wrap up](#Wrap up)`). CommonMark requires\n * `<>` around such URLs, but tiptap-markdown emits the bare form.\n */\nconst BRACKET_LINK_RE = /\\[([^\\]]+)\\]\\(([^)]*\\s[^)]*)\\)/g;\n\nfunction splitTextWithBracketLinks(value: string): Array<Text | Link> {\n const results: Array<Text | Link> = [];\n let lastIndex = 0;\n for (const m of value.matchAll(BRACKET_LINK_RE)) {\n const idx = m.index!;\n if (idx > lastIndex) results.push({ type: 'text', value: value.slice(lastIndex, idx) } as Text);\n results.push({\n type: 'link',\n url: m[2],\n children: [{ type: 'text', value: m[1] } as Text],\n } as Link);\n lastIndex = idx + m[0].length;\n }\n if (lastIndex < value.length) results.push({ type: 'text', value: value.slice(lastIndex) } as Text);\n return results;\n}\n\n/**\n * Combined single-pass transform for resource tags and jump points.\n * Each text node is scanned for both patterns in one iteration,\n * avoiding two separate full-tree traversals.\n */\nfunction combinedTokensFromMarkdown(node: { children?: unknown[] }, depth: number = 0): void {\n if (depth > MAX_DEPTH) return;\n if (!node.children) return;\n for (const child of node.children) {\n combinedTokensFromMarkdown(child as { children?: unknown[] }, depth + 1);\n }\n if (Array.isArray(node.children)) {\n const newChildren: unknown[] = [];\n for (const child of node.children) {\n const c = child as { type: string };\n if (c.type === 'text') {\n // Split pipeline: bracket links → resource tags → jump points\n const afterLinks = splitTextWithBracketLinks((child as Text).value);\n for (const linkPart of afterLinks) {\n if (linkPart.type !== 'text') { newChildren.push(linkPart); continue; }\n const afterResourceTags = splitTextWithResourceTags(linkPart.value);\n for (const part of afterResourceTags) {\n if (part.type === 'text') {\n const afterJumpPoints = splitTextWithJumpPoints(part.value);\n newChildren.push(...afterJumpPoints);\n } else {\n newChildren.push(part as unknown as CustomNode);\n }\n }\n }\n } else {\n newChildren.push(child);\n }\n }\n node.children = newChildren;\n }\n}\n\nexport function parseMarkdown(markdown: string, options?: ParseMarkdownOptions): DocumentNode {\n const tree = fromMarkdown(markdown, {\n extensions: [gfmNoAutolink()],\n mdastExtensions: [gfmNoAutolinkFromMarkdown()],\n });\n\n // Single combined pass for resource tags and jump points\n combinedTokensFromMarkdown(tree as unknown as { children?: unknown[] });\n\n // Optional: transform Jinja tags into structured mdast nodes\n if (options?.jinjaNodes) {\n jinjaBlockTransform(tree as unknown as { type: string; children?: unknown[] });\n }\n\n return fromMdast(tree);\n}\n","/**\n * Like `Array#splice`, but smarter for giant arrays.\n *\n * `Array#splice` takes all items to be inserted as individual argument which\n * causes a stack overflow in V8 when trying to insert 100k items for instance.\n *\n * Otherwise, this does not return the removed items, and takes `items` as an\n * array instead of rest parameters.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {number} start\n * Index to remove/insert at (can be negative).\n * @param {number} remove\n * Number of items to remove.\n * @param {Array<T>} items\n * Items to inject into `list`.\n * @returns {undefined}\n * Nothing.\n */\nexport function splice(list, start, remove, items) {\n const end = list.length;\n let chunkStart = 0;\n /** @type {Array<unknown>} */\n let parameters;\n\n // Make start between zero and `end` (included).\n if (start < 0) {\n start = -start > end ? 0 : end + start;\n } else {\n start = start > end ? end : start;\n }\n remove = remove > 0 ? remove : 0;\n\n // No need to chunk the items if there’s only a couple (10k) items.\n if (items.length < 10000) {\n parameters = Array.from(items);\n parameters.unshift(start, remove);\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters);\n } else {\n // Delete `remove` items starting from `start`\n if (remove) list.splice(start, remove);\n\n // Insert the items in chunks to not cause stack overflows.\n while (chunkStart < items.length) {\n parameters = items.slice(chunkStart, chunkStart + 10000);\n parameters.unshift(start, 0);\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters);\n chunkStart += 10000;\n start += 10000;\n }\n }\n}\n\n/**\n * Append `items` (an array) at the end of `list` (another array).\n * When `list` was empty, returns `items` instead.\n *\n * This prevents a potentially expensive operation when `list` is empty,\n * and adds items in batches to prevent V8 from hanging.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {Array<T>} items\n * Items to add to `list`.\n * @returns {Array<T>}\n * Either `list` or `items`.\n */\nexport function push(list, items) {\n if (list.length > 0) {\n splice(list, list.length, 0, items);\n return list;\n }\n return items;\n}","/**\n * @import {\n * Extension,\n * Handles,\n * HtmlExtension,\n * NormalizedExtension\n * } from 'micromark-util-types'\n */\n\nimport {splice} from 'micromark-util-chunked'\n\nconst hasOwnProperty = {}.hasOwnProperty\n\n/**\n * Combine multiple syntax extensions into one.\n *\n * @param {ReadonlyArray<Extension>} extensions\n * List of syntax extensions.\n * @returns {NormalizedExtension}\n * A single combined extension.\n */\nexport function combineExtensions(extensions) {\n /** @type {NormalizedExtension} */\n const all = {}\n let index = -1\n\n while (++index < extensions.length) {\n syntaxExtension(all, extensions[index])\n }\n\n return all\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {NormalizedExtension} all\n * Extension to merge into.\n * @param {Extension} extension\n * Extension to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction syntaxExtension(all, extension) {\n /** @type {keyof Extension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n /** @type {Record<string, unknown>} */\n const left = maybe || (all[hook] = {})\n /** @type {Record<string, unknown> | undefined} */\n const right = extension[hook]\n /** @type {string} */\n let code\n\n if (right) {\n for (code in right) {\n if (!hasOwnProperty.call(left, code)) left[code] = []\n const value = right[code]\n constructs(\n // @ts-expect-error Looks like a list.\n left[code],\n Array.isArray(value) ? value : value ? [value] : []\n )\n }\n }\n }\n}\n\n/**\n * Merge `list` into `existing` (both lists of constructs).\n * Mutates `existing`.\n *\n * @param {Array<unknown>} existing\n * List of constructs to merge into.\n * @param {Array<unknown>} list\n * List of constructs to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction constructs(existing, list) {\n let index = -1\n /** @type {Array<unknown>} */\n const before = []\n\n while (++index < list.length) {\n // @ts-expect-error Looks like an object.\n ;(list[index].add === 'after' ? existing : before).push(list[index])\n }\n\n splice(existing, 0, 0, before)\n}\n\n/**\n * Combine multiple HTML extensions into one.\n *\n * @param {ReadonlyArray<HtmlExtension>} htmlExtensions\n * List of HTML extensions.\n * @returns {HtmlExtension}\n * Single combined HTML extension.\n */\nexport function combineHtmlExtensions(htmlExtensions) {\n /** @type {HtmlExtension} */\n const handlers = {}\n let index = -1\n\n while (++index < htmlExtensions.length) {\n htmlExtension(handlers, htmlExtensions[index])\n }\n\n return handlers\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {HtmlExtension} all\n * Extension to merge into.\n * @param {HtmlExtension} extension\n * Extension to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction htmlExtension(all, extension) {\n /** @type {keyof HtmlExtension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n const left = maybe || (all[hook] = {})\n const right = extension[hook]\n /** @type {keyof Handles} */\n let type\n\n if (right) {\n for (type in right) {\n // @ts-expect-error assume document vs regular handler are managed correctly.\n left[type] = right[type]\n }\n }\n }\n}\n","/**\n * @import {Code} from 'micromark-util-types'\n */\n\nimport { markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from 'micromark-util-character';\n/**\n * Classify whether a code represents whitespace, punctuation, or something\n * else.\n *\n * Used for attention (emphasis, strong), whose sequences can open or close\n * based on the class of surrounding characters.\n *\n * > 👉 **Note**: eof (`null`) is seen as whitespace.\n *\n * @param {Code} code\n * Code.\n * @returns {typeof constants.characterGroupWhitespace | typeof constants.characterGroupPunctuation | undefined}\n * Group.\n */\nexport function classifyCharacter(code) {\n if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return 1;\n }\n if (unicodePunctuation(code)) {\n return 2;\n }\n}","/**\n * @import {Event, Resolver, TokenizeContext} from 'micromark-util-types'\n */\n\n/**\n * Call all `resolveAll`s.\n *\n * @param {ReadonlyArray<{resolveAll?: Resolver | undefined}>} constructs\n * List of constructs, optionally with `resolveAll`s.\n * @param {Array<Event>} events\n * List of events.\n * @param {TokenizeContext} context\n * Context used by `tokenize`.\n * @returns {Array<Event>}\n * Changed events.\n */\nexport function resolveAll(constructs, events, context) {\n /** @type {Array<Resolver>} */\n const called = []\n let index = -1\n\n while (++index < constructs.length) {\n const resolve = constructs[index].resolveAll\n\n if (resolve && !called.includes(resolve)) {\n events = resolve(events, context)\n called.push(resolve)\n }\n }\n\n return events\n}\n","/**\n * @import {Effects, State, TokenType} from 'micromark-util-types'\n */\n\nimport { markdownSpace } from 'micromark-util-character';\n\n// To do: implement `spaceOrTab`, `spaceOrTabMinMax`, `spaceOrTabWithOptions`.\n\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * * spaces in markdown are often optional, in which case this factory can be\n * used and `ok` will be switched to whether spaces were found or not\n * * one line ending or space can be detected with `markdownSpace(code)` right\n * before using `factorySpace`\n *\n * ###### Examples\n *\n * Where `␉` represents a tab (plus how much it expands) and `␠` represents a\n * single space.\n *\n * ```markdown\n * ␉\n * ␠␠␠␠\n * ␉␠\n * ```\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {TokenType} type\n * Type (`' \\t'`).\n * @param {number | undefined} [max=Infinity]\n * Max (exclusive).\n * @returns {State}\n * Start state.\n */\nexport function factorySpace(effects, ok, type, max) {\n const limit = max ? max - 1 : Number.POSITIVE_INFINITY;\n let size = 0;\n return start;\n\n /** @type {State} */\n function start(code) {\n if (markdownSpace(code)) {\n effects.enter(type);\n return prefix(code);\n }\n return ok(code);\n }\n\n /** @type {State} */\n function prefix(code) {\n if (markdownSpace(code) && size++ < limit) {\n effects.consume(code);\n return prefix;\n }\n effects.exit(type);\n return ok(code);\n }\n}","/**\n * @import {\n * Construct,\n * State,\n * TokenizeContext,\n * Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blankLine = {\n partial: true,\n tokenize: tokenizeBlankLine\n};\n\n/**\n * @this {TokenizeContext}\n * Context.\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLine(effects, ok, nok) {\n return start;\n\n /**\n * Start of blank line.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n return markdownSpace(code) ? factorySpace(effects, after, \"linePrefix\")(code) : after(code);\n }\n\n /**\n * At eof/eol, after optional whitespace.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n }\n}","/**\n * Normalize an identifier (as found in references, definitions).\n *\n * Collapses markdown whitespace, trim, and then lower- and uppercase.\n *\n * Some characters are considered “uppercase”, such as U+03F4 (`ϴ`), but if their\n * lowercase counterpart (U+03B8 (`θ`)) is uppercased will result in a different\n * uppercase character (U+0398 (`Θ`)).\n * So, to get a canonical form, we perform both lower- and uppercase.\n *\n * Using uppercase last makes sure keys will never interact with default\n * prototypal values (such as `constructor`): nothing in the prototype of\n * `Object` is uppercase.\n *\n * @param {string} value\n * Identifier to normalize.\n * @returns {string}\n * Normalized identifier.\n */\nexport function normalizeIdentifier(value) {\n return value\n // Collapse markdown whitespace.\n .replace(/[\\t\\n\\r ]+/g, \" \")\n // Trim.\n .replace(/^ | $/g, '')\n // Some characters are considered “uppercase”, but if their lowercase\n // counterpart is uppercased will result in a different uppercase\n // character.\n // Hence, to get that form, we perform both lower- and uppercase.\n // Upper case makes sure keys will not interact with default prototypal\n // methods: no method is uppercase.\n .toLowerCase().toUpperCase();\n}","/**\n * @import {Event, Exiter, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { blankLine } from 'micromark-core-commonmark';\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEndingOrSpace } from 'micromark-util-character';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\nconst indent = {\n tokenize: tokenizeIndent,\n partial: true\n};\n\n// To do: micromark should support a `_hiddenGfmFootnoteSupport`, which only\n// affects label start (image).\n// That will let us drop `tokenizePotentialGfmFootnote*`.\n// It currently has a `_hiddenFootnoteSupport`, which affects that and more.\n// That can be removed when `micromark-extension-footnote` is archived.\n\n/**\n * Create an extension for `micromark` to enable GFM footnote syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to\n * enable GFM footnote syntax.\n */\nexport function gfmFootnote() {\n /** @type {Extension} */\n return {\n document: {\n [91]: {\n name: 'gfmFootnoteDefinition',\n tokenize: tokenizeDefinitionStart,\n continuation: {\n tokenize: tokenizeDefinitionContinuation\n },\n exit: gfmFootnoteDefinitionEnd\n }\n },\n text: {\n [91]: {\n name: 'gfmFootnoteCall',\n tokenize: tokenizeGfmFootnoteCall\n },\n [93]: {\n name: 'gfmPotentialFootnoteCall',\n add: 'after',\n tokenize: tokenizePotentialGfmFootnoteCall,\n resolveTo: resolveToPotentialGfmFootnoteCall\n }\n }\n };\n}\n\n// To do: remove after micromark update.\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizePotentialGfmFootnoteCall(effects, ok, nok) {\n const self = this;\n let index = self.events.length;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n /** @type {Token} */\n let labelStart;\n\n // Find an opening.\n while (index--) {\n const token = self.events[index][1];\n if (token.type === \"labelImage\") {\n labelStart = token;\n break;\n }\n\n // Exit if we’ve walked far enough.\n if (token.type === 'gfmFootnoteCall' || token.type === \"labelLink\" || token.type === \"label\" || token.type === \"image\" || token.type === \"link\") {\n break;\n }\n }\n return start;\n\n /**\n * @type {State}\n */\n function start(code) {\n if (!labelStart || !labelStart._balanced) {\n return nok(code);\n }\n const id = normalizeIdentifier(self.sliceSerialize({\n start: labelStart.end,\n end: self.now()\n }));\n if (id.codePointAt(0) !== 94 || !defined.includes(id.slice(1))) {\n return nok(code);\n }\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n return ok(code);\n }\n}\n\n// To do: remove after micromark update.\n/** @type {Resolver} */\nfunction resolveToPotentialGfmFootnoteCall(events, context) {\n let index = events.length;\n /** @type {Token | undefined} */\n let labelStart;\n\n // Find an opening.\n while (index--) {\n if (events[index][1].type === \"labelImage\" && events[index][0] === 'enter') {\n labelStart = events[index][1];\n break;\n }\n }\n // Change the `labelImageMarker` to a `data`.\n events[index + 1][1].type = \"data\";\n events[index + 3][1].type = 'gfmFootnoteCallLabelMarker';\n\n // The whole (without `!`):\n /** @type {Token} */\n const call = {\n type: 'gfmFootnoteCall',\n start: Object.assign({}, events[index + 3][1].start),\n end: Object.assign({}, events[events.length - 1][1].end)\n };\n // The `^` marker\n /** @type {Token} */\n const marker = {\n type: 'gfmFootnoteCallMarker',\n start: Object.assign({}, events[index + 3][1].end),\n end: Object.assign({}, events[index + 3][1].end)\n };\n // Increment the end 1 character.\n marker.end.column++;\n marker.end.offset++;\n marker.end._bufferIndex++;\n /** @type {Token} */\n const string = {\n type: 'gfmFootnoteCallString',\n start: Object.assign({}, marker.end),\n end: Object.assign({}, events[events.length - 1][1].start)\n };\n /** @type {Token} */\n const chunk = {\n type: \"chunkString\",\n contentType: 'string',\n start: Object.assign({}, string.start),\n end: Object.assign({}, string.end)\n };\n\n /** @type {Array<Event>} */\n const replacement = [\n // Take the `labelImageMarker` (now `data`, the `!`)\n events[index + 1], events[index + 2], ['enter', call, context],\n // The `[`\n events[index + 3], events[index + 4],\n // The `^`.\n ['enter', marker, context], ['exit', marker, context],\n // Everything in between.\n ['enter', string, context], ['enter', chunk, context], ['exit', chunk, context], ['exit', string, context],\n // The ending (`]`, properly parsed and labelled).\n events[events.length - 2], events[events.length - 1], ['exit', call, context]];\n events.splice(index, events.length - index + 1, ...replacement);\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeGfmFootnoteCall(effects, ok, nok) {\n const self = this;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n let size = 0;\n /** @type {boolean} */\n let data;\n\n // Note: the implementation of `markdown-rs` is different, because it houses\n // core *and* extensions in one project.\n // Therefore, it can include footnote logic inside `label-end`.\n // We can’t do that, but luckily, we can parse footnotes in a simpler way than\n // needed for labels.\n return start;\n\n /**\n * Start of footnote label.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter('gfmFootnoteCall');\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n return callStart;\n }\n\n /**\n * After `[`, at `^`.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function callStart(code) {\n if (code !== 94) return nok(code);\n effects.enter('gfmFootnoteCallMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallMarker');\n effects.enter('gfmFootnoteCallString');\n effects.enter('chunkString').contentType = 'string';\n return callData;\n }\n\n /**\n * In label.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function callData(code) {\n if (\n // Too long.\n size > 999 ||\n // Closing brace with nothing.\n code === 93 && !data ||\n // Space or tab is not supported by GFM for some reason.\n // `\\n` and `[` not being supported makes sense.\n code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n return nok(code);\n }\n if (code === 93) {\n effects.exit('chunkString');\n const token = effects.exit('gfmFootnoteCallString');\n if (!defined.includes(normalizeIdentifier(self.sliceSerialize(token)))) {\n return nok(code);\n }\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n effects.exit('gfmFootnoteCall');\n return ok;\n }\n if (!markdownLineEndingOrSpace(code)) {\n data = true;\n }\n size++;\n effects.consume(code);\n return code === 92 ? callEscape : callData;\n }\n\n /**\n * On character after escape.\n *\n * ```markdown\n * > | a [^b\\c] d\n * ^\n * ```\n *\n * @type {State}\n */\n function callEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code);\n size++;\n return callData;\n }\n return callData(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionStart(effects, ok, nok) {\n const self = this;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n /** @type {string} */\n let identifier;\n let size = 0;\n /** @type {boolean | undefined} */\n let data;\n return start;\n\n /**\n * Start of GFM footnote definition.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter('gfmFootnoteDefinition')._container = true;\n effects.enter('gfmFootnoteDefinitionLabel');\n effects.enter('gfmFootnoteDefinitionLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionLabelMarker');\n return labelAtMarker;\n }\n\n /**\n * In label, at caret.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAtMarker(code) {\n if (code === 94) {\n effects.enter('gfmFootnoteDefinitionMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionMarker');\n effects.enter('gfmFootnoteDefinitionLabelString');\n effects.enter('chunkString').contentType = 'string';\n return labelInside;\n }\n return nok(code);\n }\n\n /**\n * In label.\n *\n * > 👉 **Note**: `cmark-gfm` prevents whitespace from occurring in footnote\n * > definition labels.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelInside(code) {\n if (\n // Too long.\n size > 999 ||\n // Closing brace with nothing.\n code === 93 && !data ||\n // Space or tab is not supported by GFM for some reason.\n // `\\n` and `[` not being supported makes sense.\n code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n return nok(code);\n }\n if (code === 93) {\n effects.exit('chunkString');\n const token = effects.exit('gfmFootnoteDefinitionLabelString');\n identifier = normalizeIdentifier(self.sliceSerialize(token));\n effects.enter('gfmFootnoteDefinitionLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionLabelMarker');\n effects.exit('gfmFootnoteDefinitionLabel');\n return labelAfter;\n }\n if (!markdownLineEndingOrSpace(code)) {\n data = true;\n }\n size++;\n effects.consume(code);\n return code === 92 ? labelEscape : labelInside;\n }\n\n /**\n * After `\\`, at a special character.\n *\n * > 👉 **Note**: `cmark-gfm` currently does not support escaped brackets:\n * > <https://github.com/github/cmark-gfm/issues/240>\n *\n * ```markdown\n * > | [^a\\*b]: c\n * ^\n * ```\n *\n * @type {State}\n */\n function labelEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code);\n size++;\n return labelInside;\n }\n return labelInside(code);\n }\n\n /**\n * After definition label.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAfter(code) {\n if (code === 58) {\n effects.enter('definitionMarker');\n effects.consume(code);\n effects.exit('definitionMarker');\n if (!defined.includes(identifier)) {\n defined.push(identifier);\n }\n\n // Any whitespace after the marker is eaten, forming indented code\n // is not possible.\n // No space is also fine, just like a block quote marker.\n return factorySpace(effects, whitespaceAfter, 'gfmFootnoteDefinitionWhitespace');\n }\n return nok(code);\n }\n\n /**\n * After definition prefix.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function whitespaceAfter(code) {\n // `markdown-rs` has a wrapping token for the prefix that is closed here.\n return ok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionContinuation(effects, ok, nok) {\n /// Start of footnote definition continuation.\n ///\n /// ```markdown\n /// | [^a]: b\n /// > | c\n /// ^\n /// ```\n //\n // Either a blank line, which is okay, or an indented thing.\n return effects.check(blankLine, ok, effects.attempt(indent, ok, nok));\n}\n\n/** @type {Exiter} */\nfunction gfmFootnoteDefinitionEnd(effects) {\n effects.exit('gfmFootnoteDefinition');\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeIndent(effects, ok, nok) {\n const self = this;\n return factorySpace(effects, afterPrefix, 'gfmFootnoteDefinitionIndent', 4 + 1);\n\n /**\n * @type {State}\n */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return tail && tail[1].type === 'gfmFootnoteDefinitionIndent' && tail[2].sliceSerialize(tail[1], true).length === 4 ? ok(code) : nok(code);\n }\n}","/**\n * @import {Options} from 'micromark-extension-gfm-strikethrough'\n * @import {Event, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { splice } from 'micromark-util-chunked';\nimport { classifyCharacter } from 'micromark-util-classify-character';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/**\n * Create an extension for `micromark` to enable GFM strikethrough syntax.\n *\n * @param {Options | null | undefined} [options={}]\n * Configuration.\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions`, to\n * enable GFM strikethrough syntax.\n */\nexport function gfmStrikethrough(options) {\n const options_ = options || {};\n let single = options_.singleTilde;\n const tokenizer = {\n name: 'strikethrough',\n tokenize: tokenizeStrikethrough,\n resolveAll: resolveAllStrikethrough\n };\n if (single === null || single === undefined) {\n single = true;\n }\n return {\n text: {\n [126]: tokenizer\n },\n insideSpan: {\n null: [tokenizer]\n },\n attentionMarkers: {\n null: [126]\n }\n };\n\n /**\n * Take events and resolve strikethrough.\n *\n * @type {Resolver}\n */\n function resolveAllStrikethrough(events, context) {\n let index = -1;\n\n // Walk through all events.\n while (++index < events.length) {\n // Find a token that can close.\n if (events[index][0] === 'enter' && events[index][1].type === 'strikethroughSequenceTemporary' && events[index][1]._close) {\n let open = index;\n\n // Now walk back to find an opener.\n while (open--) {\n // Find a token that can open the closer.\n if (events[open][0] === 'exit' && events[open][1].type === 'strikethroughSequenceTemporary' && events[open][1]._open &&\n // If the sizes are the same:\n events[index][1].end.offset - events[index][1].start.offset === events[open][1].end.offset - events[open][1].start.offset) {\n events[index][1].type = 'strikethroughSequence';\n events[open][1].type = 'strikethroughSequence';\n\n /** @type {Token} */\n const strikethrough = {\n type: 'strikethrough',\n start: Object.assign({}, events[open][1].start),\n end: Object.assign({}, events[index][1].end)\n };\n\n /** @type {Token} */\n const text = {\n type: 'strikethroughText',\n start: Object.assign({}, events[open][1].end),\n end: Object.assign({}, events[index][1].start)\n };\n\n // Opening.\n /** @type {Array<Event>} */\n const nextEvents = [['enter', strikethrough, context], ['enter', events[open][1], context], ['exit', events[open][1], context], ['enter', text, context]];\n const insideSpan = context.parser.constructs.insideSpan.null;\n if (insideSpan) {\n // Between.\n splice(nextEvents, nextEvents.length, 0, resolveAll(insideSpan, events.slice(open + 1, index), context));\n }\n\n // Closing.\n splice(nextEvents, nextEvents.length, 0, [['exit', text, context], ['enter', events[index][1], context], ['exit', events[index][1], context], ['exit', strikethrough, context]]);\n splice(events, open - 1, index - open + 3, nextEvents);\n index = open + nextEvents.length - 2;\n break;\n }\n }\n }\n }\n index = -1;\n while (++index < events.length) {\n if (events[index][1].type === 'strikethroughSequenceTemporary') {\n events[index][1].type = \"data\";\n }\n }\n return events;\n }\n\n /**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\n function tokenizeStrikethrough(effects, ok, nok) {\n const previous = this.previous;\n const events = this.events;\n let size = 0;\n return start;\n\n /** @type {State} */\n function start(code) {\n if (previous === 126 && events[events.length - 1][1].type !== \"characterEscape\") {\n return nok(code);\n }\n effects.enter('strikethroughSequenceTemporary');\n return more(code);\n }\n\n /** @type {State} */\n function more(code) {\n const before = classifyCharacter(previous);\n if (code === 126) {\n // If this is the third marker, exit.\n if (size > 1) return nok(code);\n effects.consume(code);\n size++;\n return more;\n }\n if (size < 2 && !single) return nok(code);\n const token = effects.exit('strikethroughSequenceTemporary');\n const after = classifyCharacter(code);\n token._open = !after || after === 2 && Boolean(before);\n token._close = !before || before === 2 && Boolean(after);\n return ok(code);\n }\n }\n}","/**\n * @import {Event, Extension, Point, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\n/**\n * @typedef {[number, number, number, number]} Range\n * Cell info.\n *\n * @typedef {0 | 1 | 2 | 3} RowKind\n * Where we are: `1` for head row, `2` for delimiter row, `3` for body row.\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { EditMap } from './edit-map.js';\nimport { gfmTableAlign } from './infer.js';\n\n/**\n * Create an HTML extension for `micromark` to support GitHub tables syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to enable GFM\n * table syntax.\n */\nexport function gfmTable() {\n return {\n flow: {\n null: {\n name: 'table',\n tokenize: tokenizeTable,\n resolveAll: resolveTable\n }\n }\n };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTable(effects, ok, nok) {\n const self = this;\n let size = 0;\n let sizeB = 0;\n /** @type {boolean | undefined} */\n let seen;\n return start;\n\n /**\n * Start of a GFM table.\n *\n * If there is a valid table row or table head before, then we try to parse\n * another row.\n * Otherwise, we try to parse a head.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * > | | b |\n * ^\n * ```\n * @type {State}\n */\n function start(code) {\n let index = self.events.length - 1;\n while (index > -1) {\n const type = self.events[index][1].type;\n if (type === \"lineEnding\" ||\n // Note: markdown-rs uses `whitespace` instead of `linePrefix`\n type === \"linePrefix\") index--;else break;\n }\n const tail = index > -1 ? self.events[index][1].type : null;\n const next = tail === 'tableHead' || tail === 'tableRow' ? bodyRowStart : headRowBefore;\n\n // Don’t allow lazy body rows.\n if (next === bodyRowStart && self.parser.lazy[self.now().line]) {\n return nok(code);\n }\n return next(code);\n }\n\n /**\n * Before table head row.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowBefore(code) {\n effects.enter('tableHead');\n effects.enter('tableRow');\n return headRowStart(code);\n }\n\n /**\n * Before table head row, after whitespace.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowStart(code) {\n if (code === 124) {\n return headRowBreak(code);\n }\n\n // To do: micromark-js should let us parse our own whitespace in extensions,\n // like `markdown-rs`:\n //\n // ```js\n // // 4+ spaces.\n // if (markdownSpace(code)) {\n // return nok(code)\n // }\n // ```\n\n seen = true;\n // Count the first character, that isn’t a pipe, double.\n sizeB += 1;\n return headRowBreak(code);\n }\n\n /**\n * At break in table head row.\n *\n * ```markdown\n * > | | a |\n * ^\n * ^\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowBreak(code) {\n if (code === null) {\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n if (markdownLineEnding(code)) {\n // If anything other than one pipe (ignoring whitespace) was used, it’s fine.\n if (sizeB > 1) {\n sizeB = 0;\n // To do: check if this works.\n // Feel free to interrupt:\n self.interrupt = true;\n effects.exit('tableRow');\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return headDelimiterStart;\n }\n\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n if (markdownSpace(code)) {\n // To do: check if this is fine.\n // effects.attempt(State::Next(StateName::GfmTableHeadRowBreak), State::Nok)\n // State::Retry(space_or_tab(tokenizer))\n return factorySpace(effects, headRowBreak, \"whitespace\")(code);\n }\n sizeB += 1;\n if (seen) {\n seen = false;\n // Header cell count.\n size += 1;\n }\n if (code === 124) {\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n // Whether a delimiter was seen.\n seen = true;\n return headRowBreak;\n }\n\n // Anything else is cell data.\n effects.enter(\"data\");\n return headRowData(code);\n }\n\n /**\n * In table head row data.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowData(code) {\n if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n effects.exit(\"data\");\n return headRowBreak(code);\n }\n effects.consume(code);\n return code === 92 ? headRowEscape : headRowData;\n }\n\n /**\n * In table head row escape.\n *\n * ```markdown\n * > | | a\\-b |\n * ^\n * | | ---- |\n * | | c |\n * ```\n *\n * @type {State}\n */\n function headRowEscape(code) {\n if (code === 92 || code === 124) {\n effects.consume(code);\n return headRowData;\n }\n return headRowData(code);\n }\n\n /**\n * Before delimiter row.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headDelimiterStart(code) {\n // Reset `interrupt`.\n self.interrupt = false;\n\n // Note: in `markdown-rs`, we need to handle piercing here too.\n if (self.parser.lazy[self.now().line]) {\n return nok(code);\n }\n effects.enter('tableDelimiterRow');\n // Track if we’ve seen a `:` or `|`.\n seen = false;\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterBefore, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n }\n return headDelimiterBefore(code);\n }\n\n /**\n * Before delimiter row, after optional whitespace.\n *\n * Reused when a `|` is found later, to parse another cell.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headDelimiterBefore(code) {\n if (code === 45 || code === 58) {\n return headDelimiterValueBefore(code);\n }\n if (code === 124) {\n seen = true;\n // If we start with a pipe, we open a cell marker.\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n return headDelimiterCellBefore;\n }\n\n // More whitespace / empty row not allowed at start.\n return headDelimiterNok(code);\n }\n\n /**\n * After `|`, before delimiter cell.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterCellBefore(code) {\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterValueBefore, \"whitespace\")(code);\n }\n return headDelimiterValueBefore(code);\n }\n\n /**\n * Before delimiter cell value.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterValueBefore(code) {\n // Align: left.\n if (code === 58) {\n sizeB += 1;\n seen = true;\n effects.enter('tableDelimiterMarker');\n effects.consume(code);\n effects.exit('tableDelimiterMarker');\n return headDelimiterLeftAlignmentAfter;\n }\n\n // Align: none.\n if (code === 45) {\n sizeB += 1;\n // To do: seems weird that this *isn’t* left aligned, but that state is used?\n return headDelimiterLeftAlignmentAfter(code);\n }\n if (code === null || markdownLineEnding(code)) {\n return headDelimiterCellAfter(code);\n }\n return headDelimiterNok(code);\n }\n\n /**\n * After delimiter cell left alignment marker.\n *\n * ```markdown\n * | | a |\n * > | | :- |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterLeftAlignmentAfter(code) {\n if (code === 45) {\n effects.enter('tableDelimiterFiller');\n return headDelimiterFiller(code);\n }\n\n // Anything else is not ok after the left-align colon.\n return headDelimiterNok(code);\n }\n\n /**\n * In delimiter cell filler.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterFiller(code) {\n if (code === 45) {\n effects.consume(code);\n return headDelimiterFiller;\n }\n\n // Align is `center` if it was `left`, `right` otherwise.\n if (code === 58) {\n seen = true;\n effects.exit('tableDelimiterFiller');\n effects.enter('tableDelimiterMarker');\n effects.consume(code);\n effects.exit('tableDelimiterMarker');\n return headDelimiterRightAlignmentAfter;\n }\n effects.exit('tableDelimiterFiller');\n return headDelimiterRightAlignmentAfter(code);\n }\n\n /**\n * After delimiter cell right alignment marker.\n *\n * ```markdown\n * | | a |\n * > | | -: |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterRightAlignmentAfter(code) {\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterCellAfter, \"whitespace\")(code);\n }\n return headDelimiterCellAfter(code);\n }\n\n /**\n * After delimiter cell.\n *\n * ```markdown\n * | | a |\n * > | | -: |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterCellAfter(code) {\n if (code === 124) {\n return headDelimiterBefore(code);\n }\n if (code === null || markdownLineEnding(code)) {\n // Exit when:\n // * there was no `:` or `|` at all (it’s a thematic break or setext\n // underline instead)\n // * the header cell count is not the delimiter cell count\n if (!seen || size !== sizeB) {\n return headDelimiterNok(code);\n }\n\n // Note: in markdown-rs`, a reset is needed here.\n effects.exit('tableDelimiterRow');\n effects.exit('tableHead');\n // To do: in `markdown-rs`, resolvers need to be registered manually.\n // effects.register_resolver(ResolveName::GfmTable)\n return ok(code);\n }\n return headDelimiterNok(code);\n }\n\n /**\n * In delimiter row, at a disallowed byte.\n *\n * ```markdown\n * | | a |\n * > | | x |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterNok(code) {\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n\n /**\n * Before table body row.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowStart(code) {\n // Note: in `markdown-rs` we need to manually take care of a prefix,\n // but in `micromark-js` that is done for us, so if we’re here, we’re\n // never at whitespace.\n effects.enter('tableRow');\n return bodyRowBreak(code);\n }\n\n /**\n * At break in table body row.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ^\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowBreak(code) {\n if (code === 124) {\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n return bodyRowBreak;\n }\n if (code === null || markdownLineEnding(code)) {\n effects.exit('tableRow');\n return ok(code);\n }\n if (markdownSpace(code)) {\n return factorySpace(effects, bodyRowBreak, \"whitespace\")(code);\n }\n\n // Anything else is cell content.\n effects.enter(\"data\");\n return bodyRowData(code);\n }\n\n /**\n * In table body row data.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowData(code) {\n if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n effects.exit(\"data\");\n return bodyRowBreak(code);\n }\n effects.consume(code);\n return code === 92 ? bodyRowEscape : bodyRowData;\n }\n\n /**\n * In table body row escape.\n *\n * ```markdown\n * | | a |\n * | | ---- |\n * > | | b\\-c |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowEscape(code) {\n if (code === 92 || code === 124) {\n effects.consume(code);\n return bodyRowData;\n }\n return bodyRowData(code);\n }\n}\n\n/** @type {Resolver} */\n\nfunction resolveTable(events, context) {\n let index = -1;\n let inFirstCellAwaitingPipe = true;\n /** @type {RowKind} */\n let rowKind = 0;\n /** @type {Range} */\n let lastCell = [0, 0, 0, 0];\n /** @type {Range} */\n let cell = [0, 0, 0, 0];\n let afterHeadAwaitingFirstBodyRow = false;\n let lastTableEnd = 0;\n /** @type {Token | undefined} */\n let currentTable;\n /** @type {Token | undefined} */\n let currentBody;\n /** @type {Token | undefined} */\n let currentCell;\n const map = new EditMap();\n while (++index < events.length) {\n const event = events[index];\n const token = event[1];\n if (event[0] === 'enter') {\n // Start of head.\n if (token.type === 'tableHead') {\n afterHeadAwaitingFirstBodyRow = false;\n\n // Inject previous (body end and) table end.\n if (lastTableEnd !== 0) {\n flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n currentBody = undefined;\n lastTableEnd = 0;\n }\n\n // Inject table start.\n currentTable = {\n type: 'table',\n start: Object.assign({}, token.start),\n // Note: correct end is set later.\n end: Object.assign({}, token.end)\n };\n map.add(index, 0, [['enter', currentTable, context]]);\n } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n inFirstCellAwaitingPipe = true;\n currentCell = undefined;\n lastCell = [0, 0, 0, 0];\n cell = [0, index + 1, 0, 0];\n\n // Inject table body start.\n if (afterHeadAwaitingFirstBodyRow) {\n afterHeadAwaitingFirstBodyRow = false;\n currentBody = {\n type: 'tableBody',\n start: Object.assign({}, token.start),\n // Note: correct end is set later.\n end: Object.assign({}, token.end)\n };\n map.add(index, 0, [['enter', currentBody, context]]);\n }\n rowKind = token.type === 'tableDelimiterRow' ? 2 : currentBody ? 3 : 1;\n }\n // Cell data.\n else if (rowKind && (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n inFirstCellAwaitingPipe = false;\n\n // First value in cell.\n if (cell[2] === 0) {\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n lastCell = [0, 0, 0, 0];\n }\n cell[2] = index;\n }\n } else if (token.type === 'tableCellDivider') {\n if (inFirstCellAwaitingPipe) {\n inFirstCellAwaitingPipe = false;\n } else {\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n }\n lastCell = cell;\n cell = [lastCell[1], index, 0, 0];\n }\n }\n }\n // Exit events.\n else if (token.type === 'tableHead') {\n afterHeadAwaitingFirstBodyRow = true;\n lastTableEnd = index;\n } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n lastTableEnd = index;\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, index, currentCell);\n } else if (cell[1] !== 0) {\n currentCell = flushCell(map, context, cell, rowKind, index, currentCell);\n }\n rowKind = 0;\n } else if (rowKind && (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n cell[3] = index;\n }\n }\n if (lastTableEnd !== 0) {\n flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n }\n map.consume(context.events);\n\n // To do: move this into `html`, when events are exposed there.\n // That’s what `markdown-rs` does.\n // That needs updates to `mdast-util-gfm-table`.\n index = -1;\n while (++index < context.events.length) {\n const event = context.events[index];\n if (event[0] === 'enter' && event[1].type === 'table') {\n event[1]._align = gfmTableAlign(context.events, index);\n }\n }\n return events;\n}\n\n/**\n * Generate a cell.\n *\n * @param {EditMap} map\n * @param {Readonly<TokenizeContext>} context\n * @param {Readonly<Range>} range\n * @param {RowKind} rowKind\n * @param {number | undefined} rowEnd\n * @param {Token | undefined} previousCell\n * @returns {Token | undefined}\n */\n// eslint-disable-next-line max-params\nfunction flushCell(map, context, range, rowKind, rowEnd, previousCell) {\n // `markdown-rs` uses:\n // rowKind === 2 ? 'tableDelimiterCell' : 'tableCell'\n const groupName = rowKind === 1 ? 'tableHeader' : rowKind === 2 ? 'tableDelimiter' : 'tableData';\n // `markdown-rs` uses:\n // rowKind === 2 ? 'tableDelimiterCellValue' : 'tableCellText'\n const valueName = 'tableContent';\n\n // Insert an exit for the previous cell, if there is one.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- exit\n // ^^^^-- this cell\n // ```\n if (range[0] !== 0) {\n previousCell.end = Object.assign({}, getPoint(context.events, range[0]));\n map.add(range[0], 0, [['exit', previousCell, context]]);\n }\n\n // Insert enter of this cell.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- enter\n // ^^^^-- this cell\n // ```\n const now = getPoint(context.events, range[1]);\n previousCell = {\n type: groupName,\n start: Object.assign({}, now),\n // Note: correct end is set later.\n end: Object.assign({}, now)\n };\n map.add(range[1], 0, [['enter', previousCell, context]]);\n\n // Insert text start at first data start and end at last data end, and\n // remove events between.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- enter\n // ^-- exit\n // ^^^^-- this cell\n // ```\n if (range[2] !== 0) {\n const relatedStart = getPoint(context.events, range[2]);\n const relatedEnd = getPoint(context.events, range[3]);\n /** @type {Token} */\n const valueToken = {\n type: valueName,\n start: Object.assign({}, relatedStart),\n end: Object.assign({}, relatedEnd)\n };\n map.add(range[2], 0, [['enter', valueToken, context]]);\n if (rowKind !== 2) {\n // Fix positional info on remaining events\n const start = context.events[range[2]];\n const end = context.events[range[3]];\n start[1].end = Object.assign({}, end[1].end);\n start[1].type = \"chunkText\";\n start[1].contentType = \"text\";\n\n // Remove if needed.\n if (range[3] > range[2] + 1) {\n const a = range[2] + 1;\n const b = range[3] - range[2] - 1;\n map.add(a, b, []);\n }\n }\n map.add(range[3] + 1, 0, [['exit', valueToken, context]]);\n }\n\n // Insert an exit for the last cell, if at the row end.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- exit\n // ^^^^^^-- this cell (the last one contains two “between” parts)\n // ```\n if (rowEnd !== undefined) {\n previousCell.end = Object.assign({}, getPoint(context.events, rowEnd));\n map.add(rowEnd, 0, [['exit', previousCell, context]]);\n previousCell = undefined;\n }\n return previousCell;\n}\n\n/**\n * Generate table end (and table body end).\n *\n * @param {Readonly<EditMap>} map\n * @param {Readonly<TokenizeContext>} context\n * @param {number} index\n * @param {Token} table\n * @param {Token | undefined} tableBody\n */\n// eslint-disable-next-line max-params\nfunction flushTableEnd(map, context, index, table, tableBody) {\n /** @type {Array<Event>} */\n const exits = [];\n const related = getPoint(context.events, index);\n if (tableBody) {\n tableBody.end = Object.assign({}, related);\n exits.push(['exit', tableBody, context]);\n }\n table.end = Object.assign({}, related);\n exits.push(['exit', table, context]);\n map.add(index + 1, 0, exits);\n}\n\n/**\n * @param {Readonly<Array<Event>>} events\n * @param {number} index\n * @returns {Readonly<Point>}\n */\nfunction getPoint(events, index) {\n const event = events[index];\n const side = event[0] === 'enter' ? 'start' : 'end';\n return event[1][side];\n}","/**\n * @import {Event} from 'micromark-util-types'\n */\n\n// Port of `edit_map.rs` from `markdown-rs`.\n// This should move to `markdown-js` later.\n\n// Deal with several changes in events, batching them together.\n//\n// Preferably, changes should be kept to a minimum.\n// Sometimes, it’s needed to change the list of events, because parsing can be\n// messy, and it helps to expose a cleaner interface of events to the compiler\n// and other users.\n// It can also help to merge many adjacent similar events.\n// And, in other cases, it’s needed to parse subcontent: pass some events\n// through another tokenizer and inject the result.\n\n/**\n * @typedef {[number, number, Array<Event>]} Change\n * @typedef {[number, number, number]} Jump\n */\n\n/**\n * Tracks a bunch of edits.\n */\nexport class EditMap {\n /**\n * Create a new edit map.\n */\n constructor() {\n /**\n * Record of changes.\n *\n * @type {Array<Change>}\n */\n this.map = [];\n }\n\n /**\n * Create an edit: a remove and/or add at a certain place.\n *\n * @param {number} index\n * @param {number} remove\n * @param {Array<Event>} add\n * @returns {undefined}\n */\n add(index, remove, add) {\n addImplementation(this, index, remove, add);\n }\n\n // To do: add this when moving to `micromark`.\n // /**\n // * Create an edit: but insert `add` before existing additions.\n // *\n // * @param {number} index\n // * @param {number} remove\n // * @param {Array<Event>} add\n // * @returns {undefined}\n // */\n // addBefore(index, remove, add) {\n // addImplementation(this, index, remove, add, true)\n // }\n\n /**\n * Done, change the events.\n *\n * @param {Array<Event>} events\n * @returns {undefined}\n */\n consume(events) {\n this.map.sort(function (a, b) {\n return a[0] - b[0];\n });\n\n /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n if (this.map.length === 0) {\n return;\n }\n\n // To do: if links are added in events, like they are in `markdown-rs`,\n // this is needed.\n // // Calculate jumps: where items in the current list move to.\n // /** @type {Array<Jump>} */\n // const jumps = []\n // let index = 0\n // let addAcc = 0\n // let removeAcc = 0\n // while (index < this.map.length) {\n // const [at, remove, add] = this.map[index]\n // removeAcc += remove\n // addAcc += add.length\n // jumps.push([at, removeAcc, addAcc])\n // index += 1\n // }\n //\n // . shiftLinks(events, jumps)\n\n let index = this.map.length;\n /** @type {Array<Array<Event>>} */\n const vecs = [];\n while (index > 0) {\n index -= 1;\n vecs.push(events.slice(this.map[index][0] + this.map[index][1]), this.map[index][2]);\n\n // Truncate rest.\n events.length = this.map[index][0];\n }\n vecs.push(events.slice());\n events.length = 0;\n let slice = vecs.pop();\n while (slice) {\n for (const element of slice) {\n events.push(element);\n }\n slice = vecs.pop();\n }\n\n // Truncate everything.\n this.map.length = 0;\n }\n}\n\n/**\n * Create an edit.\n *\n * @param {EditMap} editMap\n * @param {number} at\n * @param {number} remove\n * @param {Array<Event>} add\n * @returns {undefined}\n */\nfunction addImplementation(editMap, at, remove, add) {\n let index = 0;\n\n /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n if (remove === 0 && add.length === 0) {\n return;\n }\n while (index < editMap.map.length) {\n if (editMap.map[index][0] === at) {\n editMap.map[index][1] += remove;\n\n // To do: before not used by tables, use when moving to micromark.\n // if (before) {\n // add.push(...editMap.map[index][2])\n // editMap.map[index][2] = add\n // } else {\n editMap.map[index][2].push(...add);\n // }\n\n return;\n }\n index += 1;\n }\n editMap.map.push([at, remove, add]);\n}\n\n// /**\n// * Shift `previous` and `next` links according to `jumps`.\n// *\n// * This fixes links in case there are events removed or added between them.\n// *\n// * @param {Array<Event>} events\n// * @param {Array<Jump>} jumps\n// */\n// function shiftLinks(events, jumps) {\n// let jumpIndex = 0\n// let index = 0\n// let add = 0\n// let rm = 0\n\n// while (index < events.length) {\n// const rmCurr = rm\n\n// while (jumpIndex < jumps.length && jumps[jumpIndex][0] <= index) {\n// add = jumps[jumpIndex][2]\n// rm = jumps[jumpIndex][1]\n// jumpIndex += 1\n// }\n\n// // Ignore items that will be removed.\n// if (rm > rmCurr) {\n// index += rm - rmCurr\n// } else {\n// // ?\n// // if let Some(link) = &events[index].link {\n// // if let Some(next) = link.next {\n// // events[next].link.as_mut().unwrap().previous = Some(index + add - rm);\n// // while jumpIndex < jumps.len() && jumps[jumpIndex].0 <= next {\n// // add = jumps[jumpIndex].2;\n// // rm = jumps[jumpIndex].1;\n// // jumpIndex += 1;\n// // }\n// // events[index].link.as_mut().unwrap().next = Some(next + add - rm);\n// // index = next;\n// // continue;\n// // }\n// // }\n// index += 1\n// }\n// }\n// }","/**\n * @import {Event} from 'micromark-util-types'\n */\n\n/**\n * @typedef {'center' | 'left' | 'none' | 'right'} Align\n */\n\n/**\n * Figure out the alignment of a GFM table.\n *\n * @param {Readonly<Array<Event>>} events\n * List of events.\n * @param {number} index\n * Table enter event.\n * @returns {Array<Align>}\n * List of aligns.\n */\nexport function gfmTableAlign(events, index) {\n let inDelimiterRow = false;\n /** @type {Array<Align>} */\n const align = [];\n while (index < events.length) {\n const event = events[index];\n if (inDelimiterRow) {\n if (event[0] === 'enter') {\n // Start of alignment value: set a new column.\n // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n if (event[1].type === 'tableContent') {\n align.push(events[index + 1][1].type === 'tableDelimiterMarker' ? 'left' : 'none');\n }\n }\n // Exits:\n // End of alignment value: change the column.\n // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n else if (event[1].type === 'tableContent') {\n if (events[index - 1][1].type === 'tableDelimiterMarker') {\n const alignIndex = align.length - 1;\n align[alignIndex] = align[alignIndex] === 'left' ? 'center' : 'right';\n }\n }\n // Done!\n else if (event[1].type === 'tableDelimiterRow') {\n break;\n }\n } else if (event[0] === 'enter' && event[1].type === 'tableDelimiterRow') {\n inDelimiterRow = true;\n }\n index += 1;\n }\n return align;\n}","/**\n * @import {Extension, State, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nconst tasklistCheck = {\n name: 'tasklistCheck',\n tokenize: tokenizeTasklistCheck\n};\n\n/**\n * Create an HTML extension for `micromark` to support GFM task list items\n * syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `htmlExtensions` to\n * support GFM task list items when serializing to HTML.\n */\nexport function gfmTaskListItem() {\n return {\n text: {\n [91]: tasklistCheck\n }\n };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTasklistCheck(effects, ok, nok) {\n const self = this;\n return open;\n\n /**\n * At start of task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (\n // Exit if there’s stuff before.\n self.previous !== null ||\n // Exit if not in the first content that is the first child of a list\n // item.\n !self._gfmTasklistFirstContentOfListItem) {\n return nok(code);\n }\n effects.enter('taskListCheck');\n effects.enter('taskListCheckMarker');\n effects.consume(code);\n effects.exit('taskListCheckMarker');\n return inside;\n }\n\n /**\n * In task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n // Currently we match how GH works in files.\n // To match how GH works in comments, use `markdownSpace` (`[\\t ]`) instead\n // of `markdownLineEndingOrSpace` (`[\\t\\n\\r ]`).\n if (markdownLineEndingOrSpace(code)) {\n effects.enter('taskListCheckValueUnchecked');\n effects.consume(code);\n effects.exit('taskListCheckValueUnchecked');\n return close;\n }\n if (code === 88 || code === 120) {\n effects.enter('taskListCheckValueChecked');\n effects.consume(code);\n effects.exit('taskListCheckValueChecked');\n return close;\n }\n return nok(code);\n }\n\n /**\n * At close of task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function close(code) {\n if (code === 93) {\n effects.enter('taskListCheckMarker');\n effects.consume(code);\n effects.exit('taskListCheckMarker');\n effects.exit('taskListCheck');\n return after;\n }\n return nok(code);\n }\n\n /**\n * @type {State}\n */\n function after(code) {\n // EOL in paragraph means there must be something else after it.\n if (markdownLineEnding(code)) {\n return ok(code);\n }\n\n // Space or tab?\n // Check what comes after.\n if (markdownSpace(code)) {\n return effects.check({\n tokenize: spaceThenNonSpace\n }, ok, nok)(code);\n }\n\n // EOF, or non-whitespace, both wrong.\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction spaceThenNonSpace(effects, ok, nok) {\n return factorySpace(effects, after, \"whitespace\");\n\n /**\n * After whitespace, after task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n // EOF means there was nothing, so bad.\n // EOL means there’s content after it, so good.\n // Impossible to have more spaces.\n // Anything else is good.\n return code === null ? nok(code) : ok(code);\n }\n}","export function deprecate(fn) {\n return fn\n}\n\nexport function equal() {}\n\nexport function ok() {}\n\nexport function unreachable() {}\n","/**\n * @import {\n * CompileContext,\n * Extension as FromMarkdownExtension,\n * Handle as FromMarkdownHandle\n * } from 'mdast-util-from-markdown'\n * @import {ToMarkdownOptions} from 'mdast-util-gfm-footnote'\n * @import {\n * Handle as ToMarkdownHandle,\n * Map,\n * Options as ToMarkdownExtension\n * } from 'mdast-util-to-markdown'\n * @import {FootnoteDefinition, FootnoteReference} from 'mdast'\n */\n\nimport {ok as assert} from 'devlop'\nimport {normalizeIdentifier} from 'micromark-util-normalize-identifier'\n\nfootnoteReference.peek = footnoteReferencePeek\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCallString() {\n this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCall(token) {\n this.enter({type: 'footnoteReference', identifier: '', label: ''}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinitionLabelString() {\n this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinition(token) {\n this.enter(\n {type: 'footnoteDefinition', identifier: '', label: '', children: []},\n token\n )\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCallString(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'footnoteReference')\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCall(token) {\n this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinitionLabelString(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'footnoteDefinition')\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinition(token) {\n this.exit(token)\n}\n\n/** @type {ToMarkdownHandle} */\nfunction footnoteReferencePeek() {\n return '['\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {FootnoteReference} node\n */\nfunction footnoteReference(node, _, state, info) {\n const tracker = state.createTracker(info)\n let value = tracker.move('[^')\n const exit = state.enter('footnoteReference')\n const subexit = state.enter('reference')\n value += tracker.move(\n state.safe(state.associationId(node), {after: ']', before: value})\n )\n subexit()\n exit()\n value += tracker.move(']')\n return value\n}\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown`.\n */\nexport function gfmFootnoteFromMarkdown() {\n return {\n enter: {\n gfmFootnoteCallString: enterFootnoteCallString,\n gfmFootnoteCall: enterFootnoteCall,\n gfmFootnoteDefinitionLabelString: enterFootnoteDefinitionLabelString,\n gfmFootnoteDefinition: enterFootnoteDefinition\n },\n exit: {\n gfmFootnoteCallString: exitFootnoteCallString,\n gfmFootnoteCall: exitFootnoteCall,\n gfmFootnoteDefinitionLabelString: exitFootnoteDefinitionLabelString,\n gfmFootnoteDefinition: exitFootnoteDefinition\n }\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @param {ToMarkdownOptions | null | undefined} [options]\n * Configuration (optional).\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown`.\n */\nexport function gfmFootnoteToMarkdown(options) {\n // To do: next major: change default.\n let firstLineBlank = false\n\n if (options && options.firstLineBlank) {\n firstLineBlank = true\n }\n\n return {\n handlers: {footnoteDefinition, footnoteReference},\n // This is on by default already.\n unsafe: [{character: '[', inConstruct: ['label', 'phrasing', 'reference']}]\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {FootnoteDefinition} node\n */\n function footnoteDefinition(node, _, state, info) {\n const tracker = state.createTracker(info)\n let value = tracker.move('[^')\n const exit = state.enter('footnoteDefinition')\n const subexit = state.enter('label')\n value += tracker.move(\n state.safe(state.associationId(node), {before: value, after: ']'})\n )\n subexit()\n\n value += tracker.move(']:')\n\n if (node.children && node.children.length > 0) {\n tracker.shift(4)\n\n value += tracker.move(\n (firstLineBlank ? '\\n' : ' ') +\n state.indentLines(\n state.containerFlow(node, tracker.current()),\n firstLineBlank ? mapAll : mapExceptFirst\n )\n )\n }\n\n exit()\n\n return value\n }\n}\n\n/** @type {Map} */\nfunction mapExceptFirst(line, index, blank) {\n return index === 0 ? line : mapAll(line, index, blank)\n}\n\n/** @type {Map} */\nfunction mapAll(line, index, blank) {\n return (blank ? '' : ' ') + line\n}\n","/**\n * @typedef {import('mdast').Delete} Delete\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').ConstructName} ConstructName\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n */\n\n/**\n * List of constructs that occur in phrasing (paragraphs, headings), but cannot\n * contain strikethrough.\n * So they sort of cancel each other out.\n * Note: could use a better name.\n *\n * Note: keep in sync with: <https://github.com/syntax-tree/mdast-util-to-markdown/blob/8ce8dbf/lib/unsafe.js#L14>\n *\n * @type {Array<ConstructName>}\n */\nconst constructsWithoutStrikethrough = [\n 'autolink',\n 'destinationLiteral',\n 'destinationRaw',\n 'reference',\n 'titleQuote',\n 'titleApostrophe'\n]\n\nhandleDelete.peek = peekDelete\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughFromMarkdown() {\n return {\n canContainEols: ['delete'],\n enter: {strikethrough: enterStrikethrough},\n exit: {strikethrough: exitStrikethrough}\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughToMarkdown() {\n return {\n unsafe: [\n {\n character: '~',\n inConstruct: 'phrasing',\n notInConstruct: constructsWithoutStrikethrough\n }\n ],\n handlers: {delete: handleDelete}\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterStrikethrough(token) {\n this.enter({type: 'delete', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitStrikethrough(token) {\n this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {Delete} node\n */\nfunction handleDelete(node, _, state, info) {\n const tracker = state.createTracker(info)\n const exit = state.enter('strikethrough')\n let value = tracker.move('~~')\n value += state.containerPhrasing(node, {\n ...tracker.current(),\n before: value,\n after: '~'\n })\n value += tracker.move('~~')\n exit()\n return value\n}\n\n/** @type {ToMarkdownHandle} */\nfunction peekDelete() {\n return '~'\n}\n","// To do: next major: remove.\n/**\n * @typedef {Options} MarkdownTableOptions\n * Configuration.\n */\n\n/**\n * @typedef Options\n * Configuration.\n * @property {boolean | null | undefined} [alignDelimiters=true]\n * Whether to align the delimiters (default: `true`);\n * they are aligned by default:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * Pass `false` to make them staggered:\n *\n * ```markdown\n * | Alpha | B |\n * | - | - |\n * | C | Delta |\n * ```\n * @property {ReadonlyArray<string | null | undefined> | string | null | undefined} [align]\n * How to align columns (default: `''`);\n * one style for all columns or styles for their respective columns;\n * each style is either `'l'` (left), `'r'` (right), or `'c'` (center);\n * other values are treated as `''`, which doesn’t place the colon in the\n * alignment row but does align left;\n * *only the lowercased first character is used, so `Right` is fine.*\n * @property {boolean | null | undefined} [delimiterEnd=true]\n * Whether to end each row with the delimiter (default: `true`).\n *\n * > 👉 **Note**: please don’t use this: it could create fragile structures\n * > that aren’t understandable to some markdown parsers.\n *\n * When `true`, there are ending delimiters:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there are no ending delimiters:\n *\n * ```markdown\n * | Alpha | B\n * | ----- | -----\n * | C | Delta\n * ```\n * @property {boolean | null | undefined} [delimiterStart=true]\n * Whether to begin each row with the delimiter (default: `true`).\n *\n * > 👉 **Note**: please don’t use this: it could create fragile structures\n * > that aren’t understandable to some markdown parsers.\n *\n * When `true`, there are starting delimiters:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there are no starting delimiters:\n *\n * ```markdown\n * Alpha | B |\n * ----- | ----- |\n * C | Delta |\n * ```\n * @property {boolean | null | undefined} [padding=true]\n * Whether to add a space of padding between delimiters and cells\n * (default: `true`).\n *\n * When `true`, there is padding:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there is no padding:\n *\n * ```markdown\n * |Alpha|B |\n * |-----|-----|\n * |C |Delta|\n * ```\n * @property {((value: string) => number) | null | undefined} [stringLength]\n * Function to detect the length of table cell content (optional);\n * this is used when aligning the delimiters (`|`) between table cells;\n * full-width characters and emoji mess up delimiter alignment when viewing\n * the markdown source;\n * to fix this, you can pass this function,\n * which receives the cell content and returns its “visible” size;\n * note that what is and isn’t visible depends on where the text is displayed.\n *\n * Without such a function, the following:\n *\n * ```js\n * markdownTable([\n * ['Alpha', 'Bravo'],\n * ['中文', 'Charlie'],\n * ['👩❤️👩', 'Delta']\n * ])\n * ```\n *\n * Yields:\n *\n * ```markdown\n * | Alpha | Bravo |\n * | - | - |\n * | 中文 | Charlie |\n * | 👩❤️👩 | Delta |\n * ```\n *\n * With [`string-width`](https://github.com/sindresorhus/string-width):\n *\n * ```js\n * import stringWidth from 'string-width'\n *\n * markdownTable(\n * [\n * ['Alpha', 'Bravo'],\n * ['中文', 'Charlie'],\n * ['👩❤️👩', 'Delta']\n * ],\n * {stringLength: stringWidth}\n * )\n * ```\n *\n * Yields:\n *\n * ```markdown\n * | Alpha | Bravo |\n * | ----- | ------- |\n * | 中文 | Charlie |\n * | 👩❤️👩 | Delta |\n * ```\n */\n\n/**\n * @param {string} value\n * Cell value.\n * @returns {number}\n * Cell size.\n */\nfunction defaultStringLength(value) {\n return value.length\n}\n\n/**\n * Generate a markdown\n * ([GFM](https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/organizing-information-with-tables))\n * table.\n *\n * @param {ReadonlyArray<ReadonlyArray<string | null | undefined>>} table\n * Table data (matrix of strings).\n * @param {Readonly<Options> | null | undefined} [options]\n * Configuration (optional).\n * @returns {string}\n * Result.\n */\nexport function markdownTable(table, options) {\n const settings = options || {}\n // To do: next major: change to spread.\n const align = (settings.align || []).concat()\n const stringLength = settings.stringLength || defaultStringLength\n /** @type {Array<number>} Character codes as symbols for alignment per column. */\n const alignments = []\n /** @type {Array<Array<string>>} Cells per row. */\n const cellMatrix = []\n /** @type {Array<Array<number>>} Sizes of each cell per row. */\n const sizeMatrix = []\n /** @type {Array<number>} */\n const longestCellByColumn = []\n let mostCellsPerRow = 0\n let rowIndex = -1\n\n // This is a superfluous loop if we don’t align delimiters, but otherwise we’d\n // do superfluous work when aligning, so optimize for aligning.\n while (++rowIndex < table.length) {\n /** @type {Array<string>} */\n const row = []\n /** @type {Array<number>} */\n const sizes = []\n let columnIndex = -1\n\n if (table[rowIndex].length > mostCellsPerRow) {\n mostCellsPerRow = table[rowIndex].length\n }\n\n while (++columnIndex < table[rowIndex].length) {\n const cell = serialize(table[rowIndex][columnIndex])\n\n if (settings.alignDelimiters !== false) {\n const size = stringLength(cell)\n sizes[columnIndex] = size\n\n if (\n longestCellByColumn[columnIndex] === undefined ||\n size > longestCellByColumn[columnIndex]\n ) {\n longestCellByColumn[columnIndex] = size\n }\n }\n\n row.push(cell)\n }\n\n cellMatrix[rowIndex] = row\n sizeMatrix[rowIndex] = sizes\n }\n\n // Figure out which alignments to use.\n let columnIndex = -1\n\n if (typeof align === 'object' && 'length' in align) {\n while (++columnIndex < mostCellsPerRow) {\n alignments[columnIndex] = toAlignment(align[columnIndex])\n }\n } else {\n const code = toAlignment(align)\n\n while (++columnIndex < mostCellsPerRow) {\n alignments[columnIndex] = code\n }\n }\n\n // Inject the alignment row.\n columnIndex = -1\n /** @type {Array<string>} */\n const row = []\n /** @type {Array<number>} */\n const sizes = []\n\n while (++columnIndex < mostCellsPerRow) {\n const code = alignments[columnIndex]\n let before = ''\n let after = ''\n\n if (code === 99 /* `c` */) {\n before = ':'\n after = ':'\n } else if (code === 108 /* `l` */) {\n before = ':'\n } else if (code === 114 /* `r` */) {\n after = ':'\n }\n\n // There *must* be at least one hyphen-minus in each alignment cell.\n let size =\n settings.alignDelimiters === false\n ? 1\n : Math.max(\n 1,\n longestCellByColumn[columnIndex] - before.length - after.length\n )\n\n const cell = before + '-'.repeat(size) + after\n\n if (settings.alignDelimiters !== false) {\n size = before.length + size + after.length\n\n if (size > longestCellByColumn[columnIndex]) {\n longestCellByColumn[columnIndex] = size\n }\n\n sizes[columnIndex] = size\n }\n\n row[columnIndex] = cell\n }\n\n // Inject the alignment row.\n cellMatrix.splice(1, 0, row)\n sizeMatrix.splice(1, 0, sizes)\n\n rowIndex = -1\n /** @type {Array<string>} */\n const lines = []\n\n while (++rowIndex < cellMatrix.length) {\n const row = cellMatrix[rowIndex]\n const sizes = sizeMatrix[rowIndex]\n columnIndex = -1\n /** @type {Array<string>} */\n const line = []\n\n while (++columnIndex < mostCellsPerRow) {\n const cell = row[columnIndex] || ''\n let before = ''\n let after = ''\n\n if (settings.alignDelimiters !== false) {\n const size =\n longestCellByColumn[columnIndex] - (sizes[columnIndex] || 0)\n const code = alignments[columnIndex]\n\n if (code === 114 /* `r` */) {\n before = ' '.repeat(size)\n } else if (code === 99 /* `c` */) {\n if (size % 2) {\n before = ' '.repeat(size / 2 + 0.5)\n after = ' '.repeat(size / 2 - 0.5)\n } else {\n before = ' '.repeat(size / 2)\n after = before\n }\n } else {\n after = ' '.repeat(size)\n }\n }\n\n if (settings.delimiterStart !== false && !columnIndex) {\n line.push('|')\n }\n\n if (\n settings.padding !== false &&\n // Don’t add the opening space if we’re not aligning and the cell is\n // empty: there will be a closing space.\n !(settings.alignDelimiters === false && cell === '') &&\n (settings.delimiterStart !== false || columnIndex)\n ) {\n line.push(' ')\n }\n\n if (settings.alignDelimiters !== false) {\n line.push(before)\n }\n\n line.push(cell)\n\n if (settings.alignDelimiters !== false) {\n line.push(after)\n }\n\n if (settings.padding !== false) {\n line.push(' ')\n }\n\n if (\n settings.delimiterEnd !== false ||\n columnIndex !== mostCellsPerRow - 1\n ) {\n line.push('|')\n }\n }\n\n lines.push(\n settings.delimiterEnd === false\n ? line.join('').replace(/ +$/, '')\n : line.join('')\n )\n }\n\n return lines.join('\\n')\n}\n\n/**\n * @param {string | null | undefined} [value]\n * Value to serialize.\n * @returns {string}\n * Result.\n */\nfunction serialize(value) {\n return value === null || value === undefined ? '' : String(value)\n}\n\n/**\n * @param {string | null | undefined} value\n * Value.\n * @returns {number}\n * Alignment.\n */\nfunction toAlignment(value) {\n const code = typeof value === 'string' ? value.codePointAt(0) : 0\n\n return code === 67 /* `C` */ || code === 99 /* `c` */\n ? 99 /* `c` */\n : code === 76 /* `L` */ || code === 108 /* `l` */\n ? 108 /* `l` */\n : code === 82 /* `R` */ || code === 114 /* `r` */\n ? 114 /* `r` */\n : 0\n}\n","/**\n * @typedef {import('mdast').InlineCode} InlineCode\n * @typedef {import('mdast').Table} Table\n * @typedef {import('mdast').TableCell} TableCell\n * @typedef {import('mdast').TableRow} TableRow\n *\n * @typedef {import('markdown-table').Options} MarkdownTableOptions\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').State} State\n * @typedef {import('mdast-util-to-markdown').Info} Info\n */\n\n/**\n * @typedef Options\n * Configuration.\n * @property {boolean | null | undefined} [tableCellPadding=true]\n * Whether to add a space of padding between delimiters and cells (default:\n * `true`).\n * @property {boolean | null | undefined} [tablePipeAlign=true]\n * Whether to align the delimiters (default: `true`).\n * @property {MarkdownTableOptions['stringLength'] | null | undefined} [stringLength]\n * Function to detect the length of table cell content, used when aligning\n * the delimiters between cells (optional).\n */\n\nimport {ok as assert} from 'devlop'\nimport {markdownTable} from 'markdown-table'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM tables in\n * markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM tables.\n */\nexport function gfmTableFromMarkdown() {\n return {\n enter: {\n table: enterTable,\n tableData: enterCell,\n tableHeader: enterCell,\n tableRow: enterRow\n },\n exit: {\n codeText: exitCodeText,\n table: exitTable,\n tableData: exit,\n tableHeader: exit,\n tableRow: exit\n }\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterTable(token) {\n const align = token._align\n assert(align, 'expected `_align` on table')\n this.enter(\n {\n type: 'table',\n align: align.map(function (d) {\n return d === 'none' ? null : d\n }),\n children: []\n },\n token\n )\n this.data.inTable = true\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitTable(token) {\n this.exit(token)\n this.data.inTable = undefined\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterRow(token) {\n this.enter({type: 'tableRow', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exit(token) {\n this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterCell(token) {\n this.enter({type: 'tableCell', children: []}, token)\n}\n\n// Overwrite the default code text data handler to unescape escaped pipes when\n// they are in tables.\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCodeText(token) {\n let value = this.resume()\n\n if (this.data.inTable) {\n value = value.replace(/\\\\([\\\\|])/g, replace)\n }\n\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'inlineCode')\n node.value = value\n this.exit(token)\n}\n\n/**\n * @param {string} $0\n * @param {string} $1\n * @returns {string}\n */\nfunction replace($0, $1) {\n // Pipes work, backslashes don’t (but can’t escape pipes).\n return $1 === '|' ? $1 : $0\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM tables in\n * markdown.\n *\n * @param {Options | null | undefined} [options]\n * Configuration.\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM tables.\n */\nexport function gfmTableToMarkdown(options) {\n const settings = options || {}\n const padding = settings.tableCellPadding\n const alignDelimiters = settings.tablePipeAlign\n const stringLength = settings.stringLength\n const around = padding ? ' ' : '|'\n\n return {\n unsafe: [\n {character: '\\r', inConstruct: 'tableCell'},\n {character: '\\n', inConstruct: 'tableCell'},\n // A pipe, when followed by a tab or space (padding), or a dash or colon\n // (unpadded delimiter row), could result in a table.\n {atBreak: true, character: '|', after: '[\\t :-]'},\n // A pipe in a cell must be encoded.\n {character: '|', inConstruct: 'tableCell'},\n // A colon must be followed by a dash, in which case it could start a\n // delimiter row.\n {atBreak: true, character: ':', after: '-'},\n // A delimiter row can also start with a dash, when followed by more\n // dashes, a colon, or a pipe.\n // This is a stricter version than the built in check for lists, thematic\n // breaks, and setex heading underlines though:\n // <https://github.com/syntax-tree/mdast-util-to-markdown/blob/51a2038/lib/unsafe.js#L57>\n {atBreak: true, character: '-', after: '[:|-]'}\n ],\n handlers: {\n inlineCode: inlineCodeWithTable,\n table: handleTable,\n tableCell: handleTableCell,\n tableRow: handleTableRow\n }\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {Table} node\n */\n function handleTable(node, _, state, info) {\n return serializeData(handleTableAsData(node, state, info), node.align)\n }\n\n /**\n * This function isn’t really used normally, because we handle rows at the\n * table level.\n * But, if someone passes in a table row, this ensures we make somewhat sense.\n *\n * @type {ToMarkdownHandle}\n * @param {TableRow} node\n */\n function handleTableRow(node, _, state, info) {\n const row = handleTableRowAsData(node, state, info)\n const value = serializeData([row])\n // `markdown-table` will always add an align row\n return value.slice(0, value.indexOf('\\n'))\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {TableCell} node\n */\n function handleTableCell(node, _, state, info) {\n const exit = state.enter('tableCell')\n const subexit = state.enter('phrasing')\n const value = state.containerPhrasing(node, {\n ...info,\n before: around,\n after: around\n })\n subexit()\n exit()\n return value\n }\n\n /**\n * @param {Array<Array<string>>} matrix\n * @param {Array<string | null | undefined> | null | undefined} [align]\n */\n function serializeData(matrix, align) {\n return markdownTable(matrix, {\n align,\n // @ts-expect-error: `markdown-table` types should support `null`.\n alignDelimiters,\n // @ts-expect-error: `markdown-table` types should support `null`.\n padding,\n // @ts-expect-error: `markdown-table` types should support `null`.\n stringLength\n })\n }\n\n /**\n * @param {Table} node\n * @param {State} state\n * @param {Info} info\n */\n function handleTableAsData(node, state, info) {\n const children = node.children\n let index = -1\n /** @type {Array<Array<string>>} */\n const result = []\n const subexit = state.enter('table')\n\n while (++index < children.length) {\n result[index] = handleTableRowAsData(children[index], state, info)\n }\n\n subexit()\n\n return result\n }\n\n /**\n * @param {TableRow} node\n * @param {State} state\n * @param {Info} info\n */\n function handleTableRowAsData(node, state, info) {\n const children = node.children\n let index = -1\n /** @type {Array<string>} */\n const result = []\n const subexit = state.enter('tableRow')\n\n while (++index < children.length) {\n // Note: the positional info as used here is incorrect.\n // Making it correct would be impossible due to aligning cells?\n // And it would need copy/pasting `markdown-table` into this project.\n result[index] = handleTableCell(children[index], node, state, info)\n }\n\n subexit()\n\n return result\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {InlineCode} node\n */\n function inlineCodeWithTable(node, parent, state) {\n let value = defaultHandlers.inlineCode(node, parent, state)\n\n if (state.stack.includes('tableCell')) {\n value = value.replace(/\\|/g, '\\\\$&')\n }\n\n return value\n }\n}\n","/**\n * @typedef {import('mdast').ListItem} ListItem\n * @typedef {import('mdast').Paragraph} Paragraph\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n */\n\nimport {ok as assert} from 'devlop'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM task\n * list items in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemFromMarkdown() {\n return {\n exit: {\n taskListCheckValueChecked: exitCheck,\n taskListCheckValueUnchecked: exitCheck,\n paragraph: exitParagraphWithTaskListItem\n }\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM task list\n * items in markdown.\n *\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemToMarkdown() {\n return {\n unsafe: [{atBreak: true, character: '-', after: '[:|-]'}],\n handlers: {listItem: listItemWithTaskListItem}\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCheck(token) {\n // We’re always in a paragraph, in a list item.\n const node = this.stack[this.stack.length - 2]\n assert(node.type === 'listItem')\n node.checked = token.type === 'taskListCheckValueChecked'\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitParagraphWithTaskListItem(token) {\n const parent = this.stack[this.stack.length - 2]\n\n if (\n parent &&\n parent.type === 'listItem' &&\n typeof parent.checked === 'boolean'\n ) {\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'paragraph')\n const head = node.children[0]\n\n if (head && head.type === 'text') {\n const siblings = parent.children\n let index = -1\n /** @type {Paragraph | undefined} */\n let firstParaghraph\n\n while (++index < siblings.length) {\n const sibling = siblings[index]\n if (sibling.type === 'paragraph') {\n firstParaghraph = sibling\n break\n }\n }\n\n if (firstParaghraph === node) {\n // Must start with a space or a tab.\n head.value = head.value.slice(1)\n\n if (head.value.length === 0) {\n node.children.shift()\n } else if (\n node.position &&\n head.position &&\n typeof head.position.start.offset === 'number'\n ) {\n head.position.start.column++\n head.position.start.offset++\n node.position.start = Object.assign({}, head.position.start)\n }\n }\n }\n }\n\n this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {ListItem} node\n */\nfunction listItemWithTaskListItem(node, parent, state, info) {\n const head = node.children[0]\n const checkable =\n typeof node.checked === 'boolean' && head && head.type === 'paragraph'\n const checkbox = '[' + (node.checked ? 'x' : ' ') + '] '\n const tracker = state.createTracker(info)\n\n if (checkable) {\n tracker.move(checkbox)\n }\n\n let value = defaultHandlers.listItem(node, parent, state, {\n ...info,\n ...tracker.current()\n })\n\n if (checkable) {\n value = value.replace(/^(?:[*+-]|\\d+\\.)([\\r\\n]| {1,3})/, check)\n }\n\n return value\n\n /**\n * @param {string} $0\n * @returns {string}\n */\n function check($0) {\n return $0 + checkbox\n }\n}\n","/**\n * Micromark syntax extension + mdast extension for resource tags: {{type:resourceId:text}}\n *\n * Instead of a full micromark extension (which requires complex token/state handling),\n * we use mdast-util-from-markdown's transform hook to post-process text nodes.\n * This is simpler and matches the existing regex approach.\n */\nimport type { Root, PhrasingContent, Text } from 'mdast';\n\nconst RESOURCE_TAG_RE = /\\{\\{([^:}]+):([^:}]*):([^}]+)\\}\\}/g;\nconst VALID_TYPES = new Set(['tool', 'manual', 'agent_message_template', 'handoff', 'end_call', 'time_diff']);\nconst MAX_DEPTH = 128;\n\nexport type ResourceTagMdastNode = {\n type: 'resourceTagMdast';\n data: {\n tagType: string;\n resourceId: string;\n };\n value: string;\n};\n\ndeclare module 'mdast' {\n interface PhrasingContentMap {\n resourceTagMdast: ResourceTagMdastNode;\n }\n\n interface RootContentMap {\n resourceTagMdast: ResourceTagMdastNode;\n }\n}\n\nfunction splitTextWithResourceTags(text: string): (Text | ResourceTagMdastNode)[] {\n const results: (Text | ResourceTagMdastNode)[] = [];\n let lastIndex = 0;\n\n RESOURCE_TAG_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = RESOURCE_TAG_RE.exec(text)) !== null) {\n const [full, tagType, resourceId, displayText] = match;\n if (!VALID_TYPES.has(tagType)) continue;\n\n if (match.index > lastIndex) {\n results.push({ type: 'text', value: text.slice(lastIndex, match.index) });\n }\n results.push({\n type: 'resourceTagMdast',\n data: { tagType, resourceId },\n value: displayText,\n });\n lastIndex = match.index + full.length;\n }\n\n if (lastIndex < text.length) {\n results.push({ type: 'text', value: text.slice(lastIndex) });\n }\n\n return results;\n}\n\nfunction visitNode(node: { children?: unknown[] }, depth: number = 0): void {\n if (depth > MAX_DEPTH) return;\n if (!node.children) return;\n for (const child of node.children) {\n visitNode(child as { children?: unknown[] }, depth + 1);\n }\n if (Array.isArray(node.children)) {\n const newChildren: unknown[] = [];\n for (const child of node.children) {\n if ((child as { type: string }).type === 'text') {\n const parts = splitTextWithResourceTags((child as Text).value);\n newChildren.push(...parts);\n } else {\n newChildren.push(child);\n }\n }\n node.children = newChildren;\n }\n}\n\nexport function resourceTagFromMarkdown() {\n return (tree: Root) => {\n visitNode(tree as unknown as { children?: unknown[] }, 0);\n };\n}\n\n/**\n * Exported for use in combined single-pass transform.\n * Returns the per-node text splitter without constructing a full plugin.\n */\nexport { splitTextWithResourceTags };\n\nexport function resourceTagToMarkdown() {\n return {\n handlers: {\n resourceTagMdast(node: ResourceTagMdastNode): string {\n return `{{${node.data.tagType}:${node.data.resourceId}:${node.value}}}`;\n },\n },\n };\n}\n","/**\n * mdast transform for jump points: ^id^\n * id must match /^[\\p{L}\\p{N}_-]+$/u\n */\nimport type { Root, Text, PhrasingContent } from 'mdast';\n\nconst JUMP_POINT_RE = /\\^([\\p{L}\\p{N}_-]+)\\^/gu;\nconst MAX_DEPTH = 128;\n\nexport type JumpPointMdastNode = {\n type: 'jumpPointMdast';\n data: {\n id: string;\n };\n value: string;\n};\n\ndeclare module 'mdast' {\n interface PhrasingContentMap {\n jumpPointMdast: JumpPointMdastNode;\n }\n\n interface RootContentMap {\n jumpPointMdast: JumpPointMdastNode;\n }\n}\n\nfunction splitTextWithJumpPoints(text: string): (Text | JumpPointMdastNode)[] {\n const results: (Text | JumpPointMdastNode)[] = [];\n let lastIndex = 0;\n\n JUMP_POINT_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = JUMP_POINT_RE.exec(text)) !== null) {\n const [full, id] = match;\n\n if (match.index > lastIndex) {\n results.push({ type: 'text', value: text.slice(lastIndex, match.index) });\n }\n results.push({\n type: 'jumpPointMdast',\n data: { id },\n value: id,\n });\n lastIndex = match.index + full.length;\n }\n\n if (lastIndex < text.length) {\n results.push({ type: 'text', value: text.slice(lastIndex) });\n }\n\n return results;\n}\n\nfunction visitNode(node: { children?: unknown[] }, depth: number = 0): void {\n if (depth > MAX_DEPTH) return;\n if (!node.children) return;\n for (const child of node.children) {\n visitNode(child as { children?: unknown[] }, depth + 1);\n }\n if (Array.isArray(node.children)) {\n const newChildren: unknown[] = [];\n for (const child of node.children) {\n if ((child as { type: string }).type === 'text') {\n const parts = splitTextWithJumpPoints((child as Text).value);\n newChildren.push(...parts);\n } else {\n newChildren.push(child);\n }\n }\n node.children = newChildren;\n }\n}\n\nexport function jumpPointFromMarkdown() {\n return (tree: Root) => {\n visitNode(tree as unknown as { children?: unknown[] }, 0);\n };\n}\n\n/**\n * Exported for use in combined single-pass transform.\n * Returns the per-node text splitter without constructing a full plugin.\n */\nexport { splitTextWithJumpPoints };\n\nexport function jumpPointToMarkdown() {\n return {\n handlers: {\n jumpPointMdast(node: JumpPointMdastNode): string {\n return `^${node.data.id}^`;\n },\n },\n };\n}\n","/**\n * Bidirectional conversion between mdast and ActionbookAST.\n */\nimport type { Root, RootContent, PhrasingContent, List, ListItem, Paragraph, Heading, Blockquote, ThematicBreak, Text as MdastText, Strong, Emphasis, InlineCode, Link, Break, Delete } from 'mdast';\nimport type { ResourceTagMdastNode } from './plugins/resourceTag';\nimport type { JumpPointMdastNode } from './plugins/jumpPoint';\nimport type { JinjaIfBlockMdastNode, JinjaIfInlineMdastNode, JinjaBranchMdast } from './plugins/jinjaBlock';\nimport type {\n DocumentNode,\n BlockNode,\n InlineNode,\n Mark,\n TextNode,\n ParagraphNode,\n HeadingNode,\n BulletListNode,\n OrderedListNode,\n ListItemNode,\n BlockquoteNode,\n HorizontalRuleNode,\n ResourceTagNode,\n JumpPointNode,\n HardBreakNode,\n TableNode,\n TableRowNode,\n TableCellNode,\n JinjaIfBlockNode,\n JinjaIfInlineNode,\n JinjaIfBranch,\n} from '../ast/types';\n\nconst MAX_DEPTH = 128;\nconst ALLOWED_URL_PROTOCOLS = /^(https?:|mailto:|tel:|#|\\/|www\\.)/i;\n\nfunction sanitizeUrl(url: string): string {\n if (ALLOWED_URL_PROTOCOLS.test(url)) return url;\n // Strip dangerous protocols (javascript:, data:, vbscript:, etc.)\n return '';\n}\n\nclass DepthError extends Error {\n constructor(depth: number) {\n super(`Maximum mdast conversion depth (${MAX_DEPTH}) exceeded at depth ${depth}`);\n this.name = 'DepthError';\n }\n}\n\n// === mdast → ActionbookAST ===\n\nfunction convertInline(node: PhrasingContent, marks: Mark[] = [], depth: number = 0): InlineNode[] {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n\n switch (node.type) {\n case 'text':\n return [marks.length > 0 ? { type: 'text', text: node.value, marks } : { type: 'text', text: node.value }];\n\n case 'strong': {\n const childMarks: Mark[] = [...marks, { type: 'bold' }];\n return (node as Strong).children.flatMap((child) => convertInline(child as PhrasingContent, childMarks, depth + 1));\n }\n\n case 'emphasis': {\n const childMarks: Mark[] = [...marks, { type: 'italic' }];\n return (node as Emphasis).children.flatMap((child) => convertInline(child as PhrasingContent, childMarks, depth + 1));\n }\n\n case 'delete': {\n const childMarks: Mark[] = [...marks, { type: 'strikethrough' }];\n return (node as Delete).children.flatMap((child) => convertInline(child as PhrasingContent, childMarks, depth + 1));\n }\n\n case 'inlineCode':\n return [\n marks.length > 0\n ? { type: 'text', text: (node as InlineCode).value, marks: [...marks, { type: 'code' }] }\n : { type: 'text', text: (node as InlineCode).value, marks: [{ type: 'code' }] },\n ];\n\n case 'link': {\n const href = sanitizeUrl((node as Link).url);\n if (!href) {\n // Dangerous URL protocol → strip the link, keep children as plain text\n return (node as Link).children.flatMap((child) => convertInline(child as PhrasingContent, marks, depth + 1));\n }\n const linkMark: Mark = { type: 'link', href, ...((node as Link).title ? { title: (node as Link).title! } : {}) };\n const childMarks: Mark[] = [...marks, linkMark];\n return (node as Link).children.flatMap((child) => convertInline(child as PhrasingContent, childMarks, depth + 1));\n }\n\n case 'break':\n return [{ type: 'hardBreak' }];\n\n case 'resourceTagMdast' as string: {\n const rtNode = node as unknown as ResourceTagMdastNode;\n return [\n {\n type: 'resourceTag',\n tagType: rtNode.data.tagType as ResourceTagNode['tagType'],\n resourceId: rtNode.data.resourceId,\n text: rtNode.value,\n },\n ];\n }\n\n case 'jumpPointMdast' as string: {\n const jpNode = node as unknown as JumpPointMdastNode;\n return [{ type: 'jumpPoint', id: jpNode.data.id }];\n }\n\n case 'jinjaIfInlineMdast' as string: {\n const jNode = node as unknown as JinjaIfInlineMdastNode;\n const branches: JinjaIfBranch<InlineNode>[] = jNode.branches.map(b => ({\n branchType: b.branchType,\n ...(b.condition ? { condition: b.condition } : {}),\n content: (b.content as PhrasingContent[]).flatMap(c => convertInline(c, [], depth + 1)),\n }));\n return [{ type: 'jinjaIfInline', branches } as InlineNode];\n }\n\n default:\n if ('value' in node && typeof (node as { value: unknown }).value === 'string') {\n return [{ type: 'text', text: (node as { value: string }).value }];\n }\n if ('children' in node && Array.isArray((node as { children: unknown[] }).children)) {\n return (node as { children: PhrasingContent[] }).children.flatMap((child) => convertInline(child, marks, depth + 1));\n }\n return [];\n }\n}\n\nfunction convertBlock(node: RootContent, depth: number = 0): BlockNode[] {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n\n switch (node.type) {\n case 'paragraph': {\n const para = node as Paragraph;\n const content = para.children.flatMap((child) => convertInline(child as PhrasingContent, [], depth + 1));\n return [{ type: 'paragraph', content }];\n }\n\n case 'heading': {\n const h = node as Heading;\n const content = h.children.flatMap((child) => convertInline(child as PhrasingContent, [], depth + 1));\n return [{ type: 'heading', level: h.depth as HeadingNode['level'], content }];\n }\n\n case 'list': {\n const list = node as List;\n const items = list.children.map((li) => convertListItem(li, depth + 1));\n const spread = list.spread ?? false;\n if (list.ordered) {\n return [{ type: 'orderedList', start: list.start ?? 1, spread, content: items }];\n }\n return [{ type: 'bulletList', spread, content: items }];\n }\n\n case 'blockquote': {\n const bq = node as Blockquote;\n const content = bq.children.flatMap((child) => convertBlock(child, depth + 1));\n return [{ type: 'blockquote', content }];\n }\n\n case 'thematicBreak':\n return [{ type: 'horizontalRule' }];\n\n case 'code': {\n const codeNode = node as import('mdast').Code;\n return [{ type: 'codeBlock', content: codeNode.value, ...(codeNode.lang ? { language: codeNode.lang } : {}) } as BlockNode];\n }\n\n case 'jinjaIfBlockMdast' as string: {\n const jNode = node as unknown as JinjaIfBlockMdastNode;\n const branches: JinjaIfBranch<BlockNode>[] = jNode.branches.map(b => ({\n branchType: b.branchType,\n ...(b.condition ? { condition: b.condition } : {}),\n content: (b.content as RootContent[]).flatMap(c => convertBlock(c, depth + 1)),\n }));\n return [{ type: 'jinjaIfBlock', branches } as BlockNode];\n }\n\n case 'table': {\n const tbl = node as { type: 'table'; children: Array<{ type: 'tableRow'; children: Array<{ type: 'tableCell'; children: PhrasingContent[] }> }>; align?: (string | null)[] };\n const rows: TableRowNode[] = tbl.children.map((row, rowIdx) => {\n const cells: TableCellNode[] = row.children.map((cell) => {\n const content = cell.children.flatMap((child) => convertInline(child as PhrasingContent, [], depth + 2));\n return {\n type: 'tableCell' as const,\n ...(rowIdx === 0 ? { header: true } : {}),\n content,\n };\n });\n return { type: 'tableRow' as const, content: cells };\n });\n return [{ type: 'table', content: rows }];\n }\n\n default:\n if ('children' in node && Array.isArray((node as { children: unknown[] }).children)) {\n const inlines = (node as { children: PhrasingContent[] }).children.flatMap((child) =>\n convertInline(child as PhrasingContent, [], depth + 1),\n );\n if (inlines.length > 0) return [{ type: 'paragraph', content: inlines }];\n }\n if ('value' in node && typeof (node as { value: unknown }).value === 'string') {\n return [{ type: 'paragraph', content: [{ type: 'text', text: (node as { value: string }).value }] }];\n }\n return [];\n }\n}\n\nfunction convertListItem(node: ListItem, depth: number = 0): ListItemNode {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n const content = node.children.flatMap((child) => convertBlock(child as RootContent, depth + 1));\n const base: ListItemNode = {\n type: 'listItem',\n spread: node.spread ?? false,\n content: content.length > 0 ? content : [{ type: 'paragraph', content: [] }],\n };\n if (typeof node.checked === 'boolean') {\n return { ...base, checked: node.checked };\n }\n return base;\n}\n\nexport function fromMdast(root: Root): DocumentNode {\n const blocks: BlockNode[] = [];\n\n for (let i = 0; i < root.children.length; i++) {\n // Detect extra blank lines between consecutive blocks and restore as empty paragraphs.\n // Standard markdown block separation = 1 blank line. Each additional blank line\n // maps to one empty paragraph (1:1), matching the serializer's join function\n // that outputs \\n (instead of \\n\\n) after empty paragraphs.\n if (i > 0) {\n const prev = root.children[i - 1] as { position?: { end?: { line?: number } } };\n const curr = root.children[i] as { position?: { start?: { line?: number } } };\n const prevEndLine = prev.position?.end?.line ?? 0;\n const currStartLine = curr.position?.start?.line ?? 0;\n const emptyCount = currStartLine - prevEndLine - 2;\n for (let j = 0; j < emptyCount; j++) {\n blocks.push({ type: 'paragraph', content: [] });\n }\n }\n\n blocks.push(...convertBlock(root.children[i], 0));\n }\n\n return { type: 'doc', content: blocks.length > 0 ? blocks : [{ type: 'paragraph', content: [] }] };\n}\n\n// === ActionbookAST → mdast ===\n\nfunction inlineToMdast(node: InlineNode, depth: number = 0): PhrasingContent[] {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n\n switch (node.type) {\n case 'text': {\n const marks = node.marks ?? [];\n let result: PhrasingContent[] = [{ type: 'text', value: node.text } as MdastText];\n\n for (const mark of marks) {\n switch (mark.type) {\n case 'bold':\n result = [{ type: 'strong', children: result as Strong['children'] }];\n break;\n case 'italic':\n result = [{ type: 'emphasis', children: result as Emphasis['children'] }];\n break;\n case 'strikethrough':\n result = [{ type: 'delete', children: result as Delete['children'] }];\n break;\n case 'underline':\n // Underline has no markdown representation; mark is lost on serialization\n break;\n case 'code':\n result = [{ type: 'inlineCode', value: node.text }];\n break;\n case 'link':\n result = [\n {\n type: 'link',\n url: mark.href,\n ...(mark.title ? { title: mark.title } : {}),\n children: result as Link['children'],\n },\n ];\n break;\n }\n }\n return result;\n }\n\n case 'resourceTag':\n return [\n {\n type: 'resourceTagMdast',\n data: { tagType: node.tagType, resourceId: node.resourceId },\n value: node.text,\n } as unknown as PhrasingContent,\n ];\n\n case 'jumpPoint':\n return [\n {\n type: 'jumpPointMdast',\n data: { id: node.id },\n value: node.id,\n } as unknown as PhrasingContent,\n ];\n\n case 'hardBreak':\n return [{ type: 'break' } as Break];\n\n case 'jinjaIfInline': {\n const jNode = node as JinjaIfInlineNode;\n const result: PhrasingContent[] = [];\n for (const branch of jNode.branches) {\n const tagText = branch.branchType === 'else'\n ? '{% else %}'\n : `{% ${branch.branchType} ${branch.condition ?? ''} %}`.trim();\n result.push({ type: 'text', value: tagText } as MdastText);\n for (const child of branch.content) {\n result.push(...inlineToMdast(child, depth + 1));\n }\n }\n result.push({ type: 'text', value: '{% endif %}' } as MdastText);\n return result;\n }\n }\n}\n\nfunction blockToMdast(node: BlockNode, depth: number = 0): RootContent[] {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n\n switch (node.type) {\n case 'paragraph':\n return [{ type: 'paragraph', children: node.content.flatMap((c) => inlineToMdast(c, depth + 1)) }];\n\n case 'heading':\n return [{ type: 'heading', depth: node.level, children: node.content.flatMap((c) => inlineToMdast(c, depth + 1)) }];\n\n case 'bulletList': {\n const items = node.content.map((li) => listItemToMdast(li, depth + 1));\n return [\n {\n type: 'list',\n ordered: false,\n spread: node.spread ?? false,\n children: items,\n },\n ];\n }\n\n case 'orderedList': {\n const items = node.content.map((li) => listItemToMdast(li, depth + 1));\n return [\n {\n type: 'list',\n ordered: true,\n start: node.start,\n spread: node.spread ?? false,\n children: items,\n },\n ];\n }\n\n case 'listItem':\n return listItemToMdast(node, depth).children.flatMap((child) => [child as RootContent]);\n\n case 'blockquote':\n return [{ type: 'blockquote', children: node.content.flatMap((c) => blockToMdast(c, depth + 1)) as Blockquote['children'] }];\n\n case 'horizontalRule':\n return [{ type: 'thematicBreak' }];\n\n case 'codeBlock': {\n const cb = node as import('../ast/types').CodeBlockNode;\n return [{ type: 'code', value: cb.content, ...(cb.language ? { lang: cb.language } : {}) } as RootContent];\n }\n\n case 'jinjaIfBlock': {\n const jNode = node as JinjaIfBlockNode;\n const result: RootContent[] = [];\n for (const branch of jNode.branches) {\n const tagText = branch.branchType === 'else'\n ? '{% else %}'\n : `{% ${branch.branchType} ${branch.condition ?? ''} %}`.trim();\n result.push({ type: 'paragraph', children: [{ type: 'text', value: tagText } as MdastText] } as Paragraph);\n for (const child of branch.content) {\n result.push(...blockToMdast(child, depth + 1));\n }\n }\n result.push({ type: 'paragraph', children: [{ type: 'text', value: '{% endif %}' } as MdastText] } as Paragraph);\n return result;\n }\n\n case 'table': {\n const rows = node.content.map((row) => ({\n type: 'tableRow' as const,\n children: row.content.map((cell) => ({\n type: 'tableCell' as const,\n children: cell.content.flatMap((c) => inlineToMdast(c, depth + 2)) as PhrasingContent[],\n })),\n }));\n return [{ type: 'table', children: rows } as unknown as RootContent];\n }\n\n case 'noteBlock':\n // Note blocks are editor-only — not serialized to markdown\n return [];\n }\n}\n\nfunction listItemToMdast(node: ListItemNode, depth: number = 0): ListItem {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n const children = node.content.flatMap((child) => blockToMdast(child, depth + 1)) as ListItem['children'];\n // A list item is \"loose\" (spread) when it has nested lists or multiple\n // block-level children beyond a single paragraph. This matches the blank\n // lines that tiptap-markdown inserts in the original instruction text.\n const isSpread = node.spread ?? false;\n const result: ListItem = {\n type: 'listItem',\n spread: isSpread,\n children,\n };\n if (typeof node.checked === 'boolean') {\n result.checked = node.checked;\n }\n return result;\n}\n\nexport function toMdast(doc: DocumentNode): Root {\n return {\n type: 'root',\n children: doc.content.flatMap((c) => blockToMdast(c, 0)),\n };\n}\n","/**\n * mdast transform plugin for Jinja if/elif/else/endif blocks.\n *\n * Three passes:\n * Pass 1 — Extract Jinja tags absorbed into list item text (Case B)\n * Pass 2 — Group standalone Jinja-tag paragraphs into jinjaIfBlockMdast nodes (Case A)\n * Pass 3 — Structure inline Jinja tags into jinjaIfInlineMdast nodes\n */\n\nconst MAX_DEPTH = 128;\n\n// Regex for a standalone Jinja tag paragraph (entire paragraph is one tag)\nconst JINJA_BLOCK_RE = /^\\s*\\{%\\s*(if|elif|else|endif)\\s*([^%]*?)\\s*%\\}\\s*$/;\n\n// Regex for Jinja tags at line boundaries inside list item text\nconst JINJA_LINE_END_RE = /\\n\\s*(\\{%\\s*(?:if|elif|else|endif)\\s*[^%]*?\\s*%\\})\\s*$/;\nconst JINJA_LINE_START_RE = /^(\\{%\\s*(?:if|elif|else|endif)\\s*[^%]*?\\s*%\\})\\s*\\n/;\n\n// Regex for inline Jinja tags (non-greedy, captures tag type and condition)\nconst JINJA_INLINE_RE = /\\{%\\s*(if|elif|else|endif)\\s*([^%]*?)\\s*%\\}/g;\n\ntype BranchType = 'if' | 'elif' | 'else';\n\nexport interface JinjaBranchMdast {\n branchType: BranchType;\n condition?: string;\n content: unknown[];\n}\n\nexport interface JinjaIfBlockMdastNode {\n type: 'jinjaIfBlockMdast';\n branches: JinjaBranchMdast[];\n}\n\nexport interface JinjaIfInlineMdastNode {\n type: 'jinjaIfInlineMdast';\n branches: JinjaBranchMdast[];\n}\n\ndeclare module 'mdast' {\n interface BlockContentMap {\n jinjaIfBlockMdast: JinjaIfBlockMdastNode;\n }\n interface PhrasingContentMap {\n jinjaIfInlineMdast: JinjaIfInlineMdastNode;\n }\n interface RootContentMap {\n jinjaIfBlockMdast: JinjaIfBlockMdastNode;\n }\n}\n\nfunction parseTag(text: string): { type: 'if' | 'elif' | 'else' | 'endif'; condition?: string } | null {\n const m = text.match(/^\\s*\\{%\\s*(if|elif|else|endif)\\s*([^%]*?)\\s*%\\}\\s*$/);\n if (!m) return null;\n const type = m[1] as 'if' | 'elif' | 'else' | 'endif';\n const condition = m[2]?.trim() || undefined;\n return { type, condition };\n}\n\nfunction isTextOnlyParagraph(node: { type: string; children?: unknown[] }): string | null {\n if (node.type !== 'paragraph') return null;\n if (!node.children || node.children.length !== 1) return null;\n const child = node.children[0] as { type: string; value?: string };\n if (child.type !== 'text') return null;\n return child.value ?? null;\n}\n\n/**\n * Pass 1: Extract Jinja tags absorbed into list item text.\n * When there's no blank line between a Jinja tag and a list, mdast absorbs\n * the tag into the list item's text. We split these out.\n */\nfunction pass1ExtractFromLists(node: { type: string; children?: unknown[] }, depth: number): void {\n if (depth > MAX_DEPTH || !node.children) return;\n\n // Recurse first\n for (const child of node.children) {\n pass1ExtractFromLists(child as { type: string; children?: unknown[] }, depth + 1);\n }\n\n // Only process list nodes\n if (node.type !== 'list') return;\n\n const list = node as { type: string; ordered?: boolean; start?: number; spread?: boolean; children: unknown[] };\n const items = list.children as Array<{ type: string; children: Array<{ type: string; children?: Array<{ type: string; value?: string }> }> }>;\n\n // Scan list items for Jinja tags at text boundaries\n type ExtractedPiece =\n | { kind: 'item'; item: unknown }\n | { kind: 'tag'; raw: string };\n\n const extracted: ExtractedPiece[] = [];\n let hadSplit = false;\n\n for (const item of items) {\n if (item.type !== 'listItem' || !item.children || item.children.length === 0) {\n extracted.push({ kind: 'item', item });\n continue;\n }\n\n // Check first paragraph for leading Jinja tag\n const firstChild = item.children[0];\n if (firstChild.type === 'paragraph' && firstChild.children && firstChild.children.length === 1 && firstChild.children[0].type === 'text') {\n const text = firstChild.children[0].value ?? '';\n const startMatch = text.match(JINJA_LINE_START_RE);\n if (startMatch) {\n hadSplit = true;\n extracted.push({ kind: 'tag', raw: startMatch[1] });\n const remainder = text.slice(startMatch[0].length);\n if (remainder.trim()) {\n firstChild.children[0] = { ...firstChild.children[0], value: remainder };\n extracted.push({ kind: 'item', item });\n } else if (item.children.length > 1) {\n item.children = item.children.slice(1);\n extracted.push({ kind: 'item', item });\n }\n continue;\n }\n }\n\n // Check last paragraph for trailing Jinja tag\n const lastChild = item.children[item.children.length - 1];\n if (lastChild.type === 'paragraph' && lastChild.children && lastChild.children.length === 1 && lastChild.children[0].type === 'text') {\n const text = lastChild.children[0].value ?? '';\n const endMatch = text.match(JINJA_LINE_END_RE);\n if (endMatch) {\n hadSplit = true;\n const remainder = text.slice(0, text.length - endMatch[0].length);\n if (remainder.trim()) {\n lastChild.children[0] = { ...lastChild.children[0], value: remainder };\n extracted.push({ kind: 'item', item });\n } else if (item.children.length > 1) {\n item.children = item.children.slice(0, -1);\n extracted.push({ kind: 'item', item });\n }\n extracted.push({ kind: 'tag', raw: endMatch[1] });\n continue;\n }\n }\n\n extracted.push({ kind: 'item', item });\n }\n\n if (!hadSplit) return;\n\n // Rebuild: replace parent's list node with a sequence of lists and tag paragraphs\n // We need to modify the parent's children. Since we're in the list node itself,\n // we'll reconstruct the list into segments.\n const parent = node as { type: string; children: unknown[] };\n\n // Actually, we need to replace this list node in its parent.\n // Instead, we mark the list with a special property to be expanded later.\n // Let's use a different approach: collect consecutive items into sub-lists,\n // interleaved with tag paragraphs.\n\n const result: unknown[] = [];\n let currentItems: unknown[] = [];\n let itemIndex = 0;\n\n function flushItems(): void {\n if (currentItems.length === 0) return;\n const startNum = list.ordered ? (list.start ?? 1) + itemIndex - currentItems.length : undefined;\n const subList = {\n type: 'list',\n ordered: list.ordered ?? false,\n spread: list.spread ?? false,\n ...(list.ordered ? { start: startNum } : {}),\n children: currentItems,\n };\n result.push(subList);\n currentItems = [];\n }\n\n for (const piece of extracted) {\n if (piece.kind === 'item') {\n currentItems.push(piece.item);\n itemIndex++;\n } else {\n flushItems();\n result.push({\n type: 'paragraph',\n children: [{ type: 'text', value: piece.raw }],\n });\n }\n }\n flushItems();\n\n // Mark this node for expansion in parent\n (node as { _jinjaExpanded?: unknown[] })._jinjaExpanded = result;\n}\n\n/**\n * After pass1, expand any list nodes that were marked with _jinjaExpanded.\n */\nfunction expandMarkedLists(node: { type: string; children?: unknown[] }, depth: number): void {\n if (depth > MAX_DEPTH || !node.children) return;\n\n // Process children first (bottom-up)\n for (const child of node.children) {\n expandMarkedLists(child as { type: string; children?: unknown[] }, depth + 1);\n }\n\n const newChildren: unknown[] = [];\n let changed = false;\n for (const child of node.children) {\n const c = child as { _jinjaExpanded?: unknown[] };\n if (c._jinjaExpanded) {\n newChildren.push(...c._jinjaExpanded);\n changed = true;\n } else {\n newChildren.push(child);\n }\n }\n if (changed) {\n node.children = newChildren;\n }\n}\n\n/**\n * Pass 2: Group standalone Jinja-tag paragraphs into jinjaIfBlockMdast nodes.\n * Works on children of root, blockquote, and listItem.\n */\nfunction pass2GroupBlocks(node: { type: string; children?: unknown[] }, depth: number): void {\n if (depth > MAX_DEPTH || !node.children) return;\n\n // Recurse into children first\n for (const child of node.children) {\n pass2GroupBlocks(child as { type: string; children?: unknown[] }, depth + 1);\n }\n\n // Only process container nodes\n const containerTypes = new Set(['root', 'blockquote', 'listItem']);\n if (!containerTypes.has(node.type)) return;\n\n const children = node.children as Array<{ type: string; children?: unknown[] }>;\n const result: unknown[] = [];\n let i = 0;\n\n while (i < children.length) {\n const child = children[i];\n const text = isTextOnlyParagraph(child);\n const tag = text ? parseTag(text) : null;\n\n if (!tag || tag.type !== 'if') {\n result.push(child);\n i++;\n continue;\n }\n\n // Found {% if %} - use stack to find matching {% endif %}\n const ifParagraph = child; // save for position\n const branches: JinjaBranchMdast[] = [];\n let currentBranch: JinjaBranchMdast = {\n branchType: 'if',\n condition: tag.condition,\n content: [],\n };\n branches.push(currentBranch);\n\n let nestDepth = 1;\n i++; // skip the {% if %} paragraph\n\n let matched = false;\n let endifParagraph: { type: string; children?: unknown[]; position?: unknown } | null = null;\n while (i < children.length && nestDepth > 0) {\n const innerChild = children[i];\n const innerText = isTextOnlyParagraph(innerChild);\n const innerTag = innerText ? parseTag(innerText) : null;\n\n if (innerTag) {\n if (innerTag.type === 'if') {\n nestDepth++;\n if (nestDepth > 1) {\n currentBranch.content.push(innerChild);\n }\n } else if (innerTag.type === 'endif') {\n nestDepth--;\n if (nestDepth === 0) {\n matched = true;\n endifParagraph = innerChild;\n } else {\n currentBranch.content.push(innerChild);\n }\n } else if ((innerTag.type === 'elif' || innerTag.type === 'else') && nestDepth === 1) {\n currentBranch = {\n branchType: innerTag.type as BranchType,\n ...(innerTag.condition ? { condition: innerTag.condition } : {}),\n content: [],\n };\n branches.push(currentBranch);\n } else {\n currentBranch.content.push(innerChild);\n }\n } else {\n currentBranch.content.push(innerChild);\n }\n i++;\n }\n\n if (matched) {\n // Recursively process branch contents\n for (const branch of branches) {\n const wrapper = { type: node.type, children: branch.content };\n pass2GroupBlocks(wrapper, depth + 1);\n branch.content = wrapper.children as unknown[];\n }\n // Propagate position from {% if %} to {% endif %} for blank-line calculation\n const startPos = (ifParagraph as { position?: { start?: unknown } }).position?.start;\n const endPos = (endifParagraph as { position?: { end?: unknown } } | null)?.position?.end;\n const pos = startPos && endPos ? { position: { start: startPos, end: endPos } } : {};\n result.push({ type: 'jinjaIfBlockMdast', branches, ...pos });\n } else {\n // Unmatched {% if %} — restore as plain paragraph\n result.push({ type: 'paragraph', children: [{ type: 'text', value: text }] });\n // Rewind: the content we consumed needs to go back\n // Actually, we already advanced i, and the branches contain the consumed children.\n // We need to flatten them back.\n for (const branch of branches) {\n if (branch !== branches[0]) {\n // Re-emit the branch tag\n const tagText = branch.branchType === 'else'\n ? '{% else %}'\n : `{% ${branch.branchType} ${branch.condition ?? ''} %}`.trim();\n result.push({ type: 'paragraph', children: [{ type: 'text', value: tagText }] });\n }\n result.push(...branch.content);\n }\n }\n }\n\n node.children = result;\n}\n\n/**\n * Pass 3: Structure inline Jinja tags within paragraph/heading text nodes.\n * Only processes direct text children (not inside marks like strong/emphasis).\n */\nfunction pass3InlineJinja(node: { type: string; children?: unknown[] }, depth: number): void {\n if (depth > MAX_DEPTH || !node.children) return;\n\n // Recurse into block-level children\n for (const child of node.children) {\n pass3InlineJinja(child as { type: string; children?: unknown[] }, depth + 1);\n }\n\n // Only process paragraph and heading\n if (node.type !== 'paragraph' && node.type !== 'heading') return;\n\n const children = node.children as Array<{ type: string; value?: string }>;\n\n // Check if any text child contains Jinja tags\n let hasJinja = false;\n for (const child of children) {\n if (child.type === 'text' && child.value) {\n JINJA_INLINE_RE.lastIndex = 0;\n if (JINJA_INLINE_RE.test(child.value)) {\n hasJinja = true;\n break;\n }\n }\n }\n if (!hasJinja) return;\n\n // Split text nodes on Jinja tags, then structure with stack\n const flatParts: Array<{ kind: 'node'; node: unknown } | { kind: 'tag'; tagType: 'if' | 'elif' | 'else' | 'endif'; condition?: string }> = [];\n\n for (const child of children) {\n if (child.type !== 'text' || !child.value) {\n flatParts.push({ kind: 'node', node: child });\n continue;\n }\n\n const text = child.value;\n JINJA_INLINE_RE.lastIndex = 0;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = JINJA_INLINE_RE.exec(text)) !== null) {\n if (match.index > lastIndex) {\n flatParts.push({ kind: 'node', node: { type: 'text', value: text.slice(lastIndex, match.index) } });\n }\n flatParts.push({\n kind: 'tag',\n tagType: match[1] as 'if' | 'elif' | 'else' | 'endif',\n condition: match[2]?.trim() || undefined,\n });\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n flatParts.push({ kind: 'node', node: { type: 'text', value: text.slice(lastIndex) } });\n }\n }\n\n // Stack-based structuring\n const result = structureInlineParts(flatParts);\n if (result) {\n node.children = result;\n }\n}\n\nfunction structureInlineParts(\n parts: Array<{ kind: 'node'; node: unknown } | { kind: 'tag'; tagType: 'if' | 'elif' | 'else' | 'endif'; condition?: string }>,\n): unknown[] | null {\n const output: unknown[] = [];\n let i = 0;\n\n while (i < parts.length) {\n const part = parts[i];\n if (part.kind === 'node') {\n output.push(part.node);\n i++;\n } else if (part.kind === 'tag' && part.tagType === 'if') {\n // Collect branches until matching endif\n const branches: JinjaBranchMdast[] = [];\n let currentBranch: JinjaBranchMdast = {\n branchType: 'if',\n condition: part.condition,\n content: [],\n };\n branches.push(currentBranch);\n i++;\n\n let nestDepth = 1;\n let matched = false;\n\n while (i < parts.length && nestDepth > 0) {\n const inner = parts[i];\n if (inner.kind === 'tag') {\n if (inner.tagType === 'if') {\n nestDepth++;\n if (nestDepth > 1) {\n // Nested if — emit as text for now\n currentBranch.content.push({ type: 'text', value: `{% if ${inner.condition ?? ''} %}`.trim() });\n }\n } else if (inner.tagType === 'endif') {\n nestDepth--;\n if (nestDepth === 0) {\n matched = true;\n } else {\n currentBranch.content.push({ type: 'text', value: '{% endif %}' });\n }\n } else if ((inner.tagType === 'elif' || inner.tagType === 'else') && nestDepth === 1) {\n currentBranch = {\n branchType: inner.tagType as BranchType,\n ...(inner.condition ? { condition: inner.condition } : {}),\n content: [],\n };\n branches.push(currentBranch);\n } else {\n // Nested elif/else\n const tagText = inner.tagType === 'else'\n ? '{% else %}'\n : `{% ${inner.tagType} ${inner.condition ?? ''} %}`.trim();\n currentBranch.content.push({ type: 'text', value: tagText });\n }\n } else {\n currentBranch.content.push(inner.node);\n }\n i++;\n }\n\n if (matched) {\n output.push({ type: 'jinjaIfInlineMdast', branches });\n } else {\n // Unmatched — restore as text\n output.push({ type: 'text', value: `{% if ${branches[0].condition ?? ''} %}`.trim() });\n for (const branch of branches) {\n if (branch !== branches[0]) {\n const tagText = branch.branchType === 'else'\n ? '{% else %}'\n : `{% ${branch.branchType} ${branch.condition ?? ''} %}`.trim();\n output.push({ type: 'text', value: tagText });\n }\n output.push(...branch.content);\n }\n }\n } else {\n // Stray elif/else/endif — keep as text\n const p = part as { tagType: string; condition?: string };\n const tagText = p.tagType === 'else'\n ? '{% else %}'\n : p.tagType === 'endif'\n ? '{% endif %}'\n : `{% ${p.tagType} ${p.condition ?? ''} %}`.trim();\n output.push({ type: 'text', value: tagText });\n i++;\n }\n }\n\n return output;\n}\n\n/**\n * Main transform: apply all three passes to an mdast tree.\n */\nexport function jinjaBlockTransform(tree: { type: string; children?: unknown[] }): void {\n // Pass 1: Extract Jinja tags from list item text\n pass1ExtractFromLists(tree, 0);\n expandMarkedLists(tree, 0);\n\n // Pass 2: Group block-level Jinja structures\n pass2GroupBlocks(tree, 0);\n\n // Pass 3: Structure inline Jinja\n pass3InlineJinja(tree, 0);\n}\n","import type { Link, Parents, Text } from 'mdast';\nimport { defaultHandlers, toMarkdown } from 'mdast-util-to-markdown';\nimport type { Handle, Info, Options, State } from 'mdast-util-to-markdown';\nimport { gfmFootnoteToMarkdown } from 'mdast-util-gfm-footnote';\nimport { gfmStrikethroughToMarkdown } from 'mdast-util-gfm-strikethrough';\nimport { gfmTableToMarkdown } from 'mdast-util-gfm-table';\nimport { gfmTaskListItemToMarkdown } from 'mdast-util-gfm-task-list-item';\nimport { resourceTagToMarkdown } from './plugins/resourceTag';\nimport { jumpPointToMarkdown } from './plugins/jumpPoint';\nimport { toMdast } from './mdastAdapter';\nimport type { DocumentNode } from '../ast/types';\n\n// GFM without autolink literal — see parser.ts for rationale.\nconst gfmNoAutolinkToMarkdown = () => ({\n extensions: [\n gfmFootnoteToMarkdown(),\n gfmStrikethroughToMarkdown(),\n gfmTableToMarkdown(),\n gfmTaskListItemToMarkdown(),\n ],\n});\n\nfunction isEmptyParagraph(node: Parents | { type: string; children?: unknown[] }): boolean {\n return node.type === 'paragraph' && (!('children' in node) || !node.children || node.children.length === 0);\n}\n\nconst JINJA_TAG_RE = /^\\{%\\s*(if|elif|else|endif)\\b/;\n\nfunction isJinjaTagParagraph(node: { type: string; children?: unknown[] }): boolean {\n if (node.type !== 'paragraph') return false;\n const children = (node as Parents).children;\n if (!children || children.length !== 1) return false;\n const child = children[0] as { type: string; value?: string };\n return child.type === 'text' && typeof child.value === 'string' && JINJA_TAG_RE.test(child.value);\n}\n\n/**\n * Custom text handler that prevents unnecessary `_` escaping in inline text.\n *\n * mdast-util-to-markdown's default unsafe rules include\n * `{character: '_', inConstruct: 'phrasing'}`, which escapes every underscore\n * in paragraph/heading text (e.g. `ENUM_VALUE` → `ENUM\\_VALUE`). Since we\n * generate emphasis and strong with `*`, underscores in plain text are never\n * interpreted as emphasis markers and do not need escaping.\n *\n * The `unsafe` option in `toMarkdown` is ADDITIVE (it pushes into the default\n * list, never replaces it), so we cannot override this via options alone.\n * Instead, we temporarily remove the phrasing-`_` rule from `state.unsafe`\n * before delegating to the default text handler.\n */\nfunction textHandler(node: Text, parent: Parents | undefined, state: State, info: Info): string {\n const originalUnsafe = state.unsafe;\n state.unsafe = originalUnsafe.filter((p) => !(p.character === '_' && !p.atBreak));\n const result = (defaultHandlers.text as Options['handlers'] & ((n: Text, p: Parents | undefined, s: State, i: Info) => string))(node, parent, state, info);\n state.unsafe = originalUnsafe;\n return result;\n}\n\n/**\n * Custom link handler — emits `[text](url)` without angle brackets, even when\n * the URL contains spaces. tiptap-markdown uses this form; CommonMark would\n * require `<>` but micromark accepts both.\n */\nfunction linkHandler(node: Link, parent: Parents | undefined, state: State, info: Info): string {\n const childrenText = state.containerPhrasing(node, { ...info, before: '[', after: ']' });\n const url = node.url ?? '';\n const title = node.title;\n const titlePart = title ? ` \"${title.replace(/\"/g, '\\\\\"')}\"` : '';\n return `[${childrenText}](${url}${titlePart})`;\n}\n\nexport function serializeToMarkdown(doc: DocumentNode): string {\n const mdastTree = toMdast(doc);\n\n const raw = toMarkdown(mdastTree, {\n bullet: '-',\n rule: '-',\n listItemIndent: 'one',\n incrementListMarker: true,\n emphasis: '*',\n strong: '*',\n resourceLink: true,\n join: [\n // Empty paragraphs represent blank-line spacers.\n // Reduce the separator after an empty paragraph from \\n\\n to \\n\n // so that 1 empty paragraph = 1 extra blank line in the output.\n (left) => (isEmptyParagraph(left) ? 0 : null),\n ],\n handlers: {\n text: textHandler as Handle,\n link: linkHandler as Handle,\n ...resourceTagToMarkdown().handlers,\n ...jumpPointToMarkdown().handlers,\n },\n extensions: [gfmNoAutolinkToMarkdown()],\n });\n\n // Post-process to match tiptap-markdown's serialization conventions:\n // 1. `\\>` at break positions → `>` (entity-based escaping)\n // 2. Bare `>` in text (non-blockquote) → `>` (tiptap encodes all `>`)\n // 3. `]` after `\\[` patterns → `\\]` (tiptap escapes both brackets)\n // 4. ` ` → plain space (remark encodes leading spaces to prevent\n // markdown interpretation, but downstream consumers expect plain spaces)\n let result = raw\n .replace(/^(\\s*)\\\\>/gm, '$1>')\n .replace(/(\\S) *>/g, (match, pre) => `${pre} >`)\n .replace(/\\\\\\[([^\\]]*)\\]/g, '\\\\[$1\\\\]')\n .replace(/ /g, ' ');\n\n return result;\n}\n","import { parseMarkdown } from './parser';\nimport { serializeToMarkdown } from './serializer';\nimport type { AstNode, BlockNode, InlineNode, DocumentNode } from '../ast/types';\n\n/**\n * Serialize a list of AST nodes to markdown string (for clipboard).\n */\nexport function serializeFragment(nodes: AstNode[]): string {\n if (nodes.length === 0) return '';\n\n // Wrap in a doc for serialization\n const blocks: BlockNode[] = nodes.map((node) => {\n if (node.type === 'text' || node.type === 'resourceTag' || node.type === 'jumpPoint' || node.type === 'hardBreak') {\n return { type: 'paragraph', content: [node] };\n }\n if (node.type === 'doc') {\n // Flatten doc children\n return node.content;\n }\n return node as BlockNode;\n }).flat() as BlockNode[];\n\n const wrapper: DocumentNode = { type: 'doc', content: blocks };\n return serializeToMarkdown(wrapper);\n}\n\n/**\n * Parse a markdown string into a fragment (for clipboard paste).\n * Returns block nodes by default; if the markdown is a single paragraph,\n * returns its inline children.\n */\nexport function parseFragment(markdown: string): InlineNode[] | BlockNode[] {\n const doc = parseMarkdown(markdown);\n\n // If single paragraph, return inline content\n if (doc.content.length === 1 && doc.content[0].type === 'paragraph') {\n return doc.content[0].content as InlineNode[];\n }\n\n return doc.content as BlockNode[];\n}\n","import type { DocumentNode } from '../ast/types';\n\nexport type ActionbookJSON = {\n version: 3;\n ast: DocumentNode;\n};\n\nexport function serializeToJSON(doc: DocumentNode): string {\n const payload: ActionbookJSON = { version: 3, ast: doc };\n return JSON.stringify(payload);\n}\n","/**\n * Convert ProseMirror/Tiptap JSONContent to ActionbookAST.\n *\n * This handles the legacy editor_data format stored in LogicV2.\n */\nimport type {\n DocumentNode,\n BlockNode,\n InlineNode,\n Mark,\n ResourceTagType,\n TableNode,\n TableRowNode,\n TableCellNode,\n JinjaIfBranch,\n} from '../ast/types';\nimport { RESOURCE_TAG_TYPES } from '../ast/types';\n\nconst MAX_DEPTH = 128;\nconst ALLOWED_URL_PROTOCOLS = /^(https?:|mailto:|tel:|#|\\/|www\\.)/i;\n\nconst LIST_TYPES = new Set(['bulletList', 'orderedList']);\n\n/**\n * A list is \"loose\" (spread) if any item has multiple non-list block children.\n * Nested sub-lists don't count — a listItem with [paragraph, bulletList] is still tight.\n */\nfunction isLooseList(items: { content: BlockNode[] }[]): boolean {\n return items.some((li) => {\n const nonListBlocks = li.content.filter((b) => !LIST_TYPES.has(b.type));\n return nonListBlocks.length > 1;\n });\n}\n\n// Minimal JSONContent type (compatible with @tiptap/core)\nexport type JSONContent = {\n type?: string;\n attrs?: Record<string, unknown>;\n content?: JSONContent[];\n marks?: { type: string; attrs?: Record<string, unknown> }[];\n text?: string;\n};\n\nfunction convertPMMark(mark: { type: string; attrs?: Record<string, unknown> }): Mark | null {\n switch (mark.type) {\n case 'bold':\n return { type: 'bold' };\n case 'italic':\n return { type: 'italic' };\n case 'underline':\n return { type: 'underline' };\n case 'strikethrough':\n return { type: 'strikethrough' };\n case 'code':\n return { type: 'code' };\n case 'link': {\n const rawHref = (mark.attrs?.href as string) ?? '';\n // Strip dangerous URL protocols\n if (!ALLOWED_URL_PROTOCOLS.test(rawHref)) return null;\n const title = mark.attrs?.title as string | undefined;\n return title ? { type: 'link', href: rawHref, title } : { type: 'link', href: rawHref };\n }\n // Ignored marks (UI-only or unused)\n case 'diffMark':\n case 'inlineResource':\n case 'textStyle':\n return null;\n default:\n return null;\n }\n}\n\nfunction convertPMInline(node: JSONContent, depth: number): InlineNode[] {\n if (depth > MAX_DEPTH) return [];\n const type = node.type ?? '';\n\n switch (type) {\n case 'text': {\n const marks = (node.marks ?? []).map(convertPMMark).filter((m): m is Mark => m !== null);\n const textNode = node.text ?? '';\n return marks.length > 0 ? [{ type: 'text', text: textNode, marks }] : [{ type: 'text', text: textNode }];\n }\n\n case 'inlineToolTag': {\n const attrs = node.attrs ?? {};\n const tagType = (attrs.type as string) ?? 'tool';\n const text = (attrs.text as string) ?? '';\n // Fallback: unknown tag types become plain text to avoid validation failure\n if (!(RESOURCE_TAG_TYPES as readonly string[]).includes(tagType)) {\n return text ? [{ type: 'text', text }] : [];\n }\n return [\n {\n type: 'resourceTag',\n tagType: tagType as ResourceTagType,\n resourceId: (attrs.resourceId as string) ?? '',\n text,\n },\n ];\n }\n\n case 'jumpPoint': {\n const id = (node.attrs?.id as string) ?? '';\n return [{ type: 'jumpPoint', id }];\n }\n\n case 'hardBreak':\n return [{ type: 'hardBreak' }];\n\n default:\n if (node.text) {\n return [{ type: 'text', text: node.text }];\n }\n if (node.content) {\n return node.content.flatMap((c) => convertPMInline(c, depth + 1));\n }\n return [];\n }\n}\n\nfunction convertPMBlock(node: JSONContent, depth: number = 0): BlockNode[] {\n if (depth > MAX_DEPTH) return [];\n const type = node.type ?? '';\n const children = node.content ?? [];\n\n switch (type) {\n case 'paragraph':\n return [{ type: 'paragraph', content: children.flatMap((c) => convertPMInline(c, depth + 1)) }];\n\n case 'heading': {\n const level = ((node.attrs?.level as number) ?? 1) as 1 | 2 | 3 | 4 | 5 | 6;\n return [{ type: 'heading', level, content: children.flatMap((c) => convertPMInline(c, depth + 1)) }];\n }\n\n case 'bulletList': {\n const items = children.map((c) => convertPMListItem(c, depth + 1));\n const spread = isLooseList(items);\n return [\n {\n type: 'bulletList',\n ...(spread ? { spread: true } : {}),\n content: items.map((li) => spread ? { ...li, spread: true } : li),\n },\n ];\n }\n\n case 'orderedList': {\n const start = (node.attrs?.start as number) ?? 1;\n const items = children.map((c) => convertPMListItem(c, depth + 1));\n const spread = isLooseList(items);\n return [\n {\n type: 'orderedList',\n start,\n ...(spread ? { spread: true } : {}),\n content: items.map((li) => spread ? { ...li, spread: true } : li),\n },\n ];\n }\n\n case 'listItem': {\n return [convertPMListItem(node, depth)];\n }\n\n case 'blockquote':\n return [{ type: 'blockquote', content: children.flatMap((c) => convertPMBlock(c, depth + 1)) }];\n\n case 'horizontalRule':\n return [{ type: 'horizontalRule' }];\n\n case 'codeBlock': {\n const textContent = children.map(c => (c as any).text ?? '').join('');\n return [{ type: 'codeBlock', content: textContent, ...(node.attrs?.language ? { language: node.attrs.language } : {}) } as BlockNode];\n }\n\n case 'noteBlock':\n return [{ type: 'noteBlock', content: children.flatMap((c) => convertPMBlock(c, depth + 1)) }];\n\n case 'table': {\n const rows: TableRowNode[] = children.map((rowNode) => {\n const cells: TableCellNode[] = (rowNode.content ?? []).map((cellNode) => {\n const cellType = cellNode.type ?? '';\n const isHeader = cellType === 'tableHeader';\n const inlines = (cellNode.content ?? []).flatMap((c) => convertPMInline(c, depth + 3));\n return {\n type: 'tableCell' as const,\n ...(isHeader ? { header: true } : {}),\n content: inlines,\n };\n });\n return { type: 'tableRow' as const, content: cells };\n });\n return [{ type: 'table', content: rows }];\n }\n\n case 'jinjaIfBlock': {\n const branches: JinjaIfBranch<BlockNode>[] = children.map((branchNode) => {\n const branchType = (branchNode.attrs?.branchType ?? 'if') as 'if' | 'elif' | 'else';\n const condition = branchNode.attrs?.condition as string | undefined;\n const branchContent = (branchNode.content ?? []).flatMap((c) => convertPMBlock(c, depth + 2));\n return {\n branchType,\n ...(branchType !== 'else' && condition ? { condition } : {}),\n content: branchContent,\n };\n });\n if (branches.length === 0) return [];\n return [{ type: 'jinjaIfBlock', branches } as BlockNode];\n }\n\n case 'jinjaIfBranch':\n // Standalone jinjaIfBranch outside a jinjaIfBlock — flatten content\n return children.flatMap((c) => convertPMBlock(c, depth + 1));\n\n default:\n if (children.length > 0) {\n return children.flatMap((c) => convertPMBlock(c, depth + 1));\n }\n return [];\n }\n}\n\nfunction convertPMListItem(node: JSONContent, depth: number = 0): { type: 'listItem'; checked?: boolean | null; spread?: boolean; content: BlockNode[] } {\n if (depth > MAX_DEPTH) return { type: 'listItem', content: [{ type: 'paragraph', content: [] }] };\n const children = node.content ?? [];\n const content = children.flatMap((c) => convertPMBlock(c, depth + 1));\n const base: { type: 'listItem'; checked?: boolean | null; spread?: boolean; content: BlockNode[] } = {\n type: 'listItem',\n content: content.length > 0 ? content : [{ type: 'paragraph', content: [] }],\n };\n const checked = node.attrs?.checked as boolean | null | undefined;\n if (typeof checked === 'boolean') {\n base.checked = checked;\n }\n return base;\n}\n\nexport function fromProseMirrorJSON(pmJSON: JSONContent): DocumentNode {\n if (pmJSON.type !== 'doc') {\n const blocks = convertPMBlock(pmJSON, 0);\n return { type: 'doc', content: blocks.length > 0 ? blocks : [{ type: 'paragraph', content: [] }] };\n }\n\n const children = pmJSON.content ?? [];\n const blocks = children.flatMap((c) => convertPMBlock(c, 0));\n return { type: 'doc', content: blocks.length > 0 ? blocks : [{ type: 'paragraph', content: [] }] };\n}\n","import type { DocumentNode } from '../ast/types';\nimport type { ActionbookJSON } from './serialize';\nimport { fromProseMirrorJSON, type JSONContent } from '../compat/prosemirror';\nimport { validate } from '../schema/schema';\n\nconst EMPTY_DOC: DocumentNode = { type: 'doc', content: [{ type: 'paragraph', content: [] }] };\n\nexport class DeserializationError extends Error {\n constructor(message: string, public readonly validationErrors?: Array<{ path: string; message: string }>) {\n super(message);\n this.name = 'DeserializationError';\n }\n}\n\nexport function deserializeFromJSON(json: string): DocumentNode {\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n throw new DeserializationError('Invalid JSON input');\n }\n\n if (parsed === null || typeof parsed !== 'object') {\n throw new DeserializationError('JSON must be a non-null object');\n }\n\n const obj = parsed as Record<string, unknown>;\n\n // New v3 format\n if (obj.version === 3) {\n const ast = obj.ast;\n if (ast === null || typeof ast !== 'object' || (ast as Record<string, unknown>).type !== 'doc') {\n throw new DeserializationError('v3 format requires ast field with type \"doc\"');\n }\n const doc = ast as DocumentNode;\n const errors = validate(doc);\n if (errors.length > 0) {\n throw new DeserializationError(`Schema validation failed: ${errors[0].message}`, errors);\n }\n return doc;\n }\n\n // Legacy ProseMirror JSON format (v2 editor_data)\n if (typeof obj.type !== 'string') {\n throw new DeserializationError('Legacy ProseMirror JSON must have a \"type\" field');\n }\n\n const doc = fromProseMirrorJSON(obj as JSONContent);\n const errors = validate(doc);\n if (errors.length > 0) {\n throw new DeserializationError(`Schema validation failed after PM conversion: ${errors[0].message}`, errors);\n }\n return doc;\n}\n","import type { AstNode, BlockNode, DocumentNode, InlineNode, NodePath } from '../ast/types';\nimport type { Operation, Transaction } from './types';\n\nconst MAX_PATH_DEPTH = 64;\n\n// ── Parent–child type matrix ───────────────────────────────────────\n\n/** Which child node types each parent type accepts. */\nconst VALID_CHILDREN: Record<string, Set<string>> = {\n doc: new Set(['paragraph', 'heading', 'bulletList', 'orderedList', 'blockquote', 'horizontalRule', 'codeBlock', 'table', 'jinjaIfBlock', 'noteBlock']),\n paragraph: new Set(['text', 'resourceTag', 'jumpPoint', 'hardBreak', 'jinjaIfInline']),\n heading: new Set(['text', 'resourceTag', 'jumpPoint', 'hardBreak', 'jinjaIfInline']),\n bulletList: new Set(['listItem']),\n orderedList: new Set(['listItem']),\n listItem: new Set(['paragraph', 'heading', 'bulletList', 'orderedList', 'blockquote', 'horizontalRule', 'codeBlock', 'table', 'jinjaIfBlock', 'noteBlock']),\n blockquote: new Set(['paragraph', 'heading', 'bulletList', 'orderedList', 'blockquote', 'horizontalRule', 'codeBlock', 'table', 'jinjaIfBlock', 'noteBlock']),\n noteBlock: new Set(['paragraph', 'heading', 'bulletList', 'orderedList', 'blockquote', 'horizontalRule', 'table', 'jinjaIfBlock']),\n table: new Set(['tableRow']),\n tableRow: new Set(['tableCell']),\n tableCell: new Set(['text', 'resourceTag', 'jumpPoint', 'hardBreak', 'jinjaIfInline']),\n};\n\nfunction assertValidChild(parentType: string, childNode: AstNode): void {\n const allowed = VALID_CHILDREN[parentType];\n if (!allowed) {\n throw new OperationError(`Parent type \"${parentType}\" does not accept children`);\n }\n if (!allowed.has(childNode.type)) {\n throw new OperationError(\n `Cannot place \"${childNode.type}\" inside \"${parentType}\". ` +\n `Allowed children: [${[...allowed].join(', ')}]`,\n );\n }\n}\n\n// ── Error class ────────────────────────────────────────────────────\n\nexport class OperationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OperationError';\n }\n}\n\n// ── Node content helpers ───────────────────────────────────────────\n\ntype NodeWithContent = { content: readonly AstNode[] };\n\nfunction hasContent(node: AstNode): node is AstNode & NodeWithContent {\n return 'content' in node && Array.isArray((node as NodeWithContent).content);\n}\n\nfunction getContent(node: AstNode): readonly AstNode[] {\n return hasContent(node) ? (node as NodeWithContent).content : [];\n}\n\nfunction setContent(node: AstNode, content: AstNode[]): AstNode {\n return { ...node, content } as unknown as AstNode;\n}\n\n// ── Path validation ────────────────────────────────────────────────\n\nfunction validatePath(path: NodePath): void {\n if (path.length === 0) {\n throw new OperationError('Cannot apply operation at empty path');\n }\n if (path.length > MAX_PATH_DEPTH) {\n throw new OperationError(`Path depth ${path.length} exceeds maximum ${MAX_PATH_DEPTH}`);\n }\n for (let i = 0; i < path.length; i++) {\n if (typeof path[i] !== 'number' || !Number.isInteger(path[i]) || path[i] < 0) {\n throw new OperationError(`Invalid path index at position ${i}: ${path[i]}`);\n }\n }\n}\n\n// ── Core apply logic ───────────────────────────────────────────────\n\nfunction applyAtPath(root: DocumentNode, path: NodePath, fn: (parent: AstNode, index: number) => AstNode): DocumentNode {\n validatePath(path);\n\n function recurse(node: AstNode, depth: number): AstNode {\n const index = path[depth];\n const children = [...getContent(node)];\n\n if (depth === path.length - 1) {\n return fn(node, index);\n }\n\n if (index < 0 || index >= children.length) {\n throw new OperationError(\n `Path index out of bounds: index ${index} at depth ${depth}, parent \"${node.type}\" has ${children.length} children`,\n );\n }\n\n children[index] = recurse(children[index], depth + 1);\n return setContent(node, children);\n }\n\n return recurse(root, 0) as DocumentNode;\n}\n\nexport function applyOperation(doc: DocumentNode, op: Operation): DocumentNode {\n switch (op.type) {\n case 'insert':\n validatePath(op.path);\n return applyAtPath(doc, op.path, (parent, index) => {\n const children = [...getContent(parent)];\n if (index < 0 || index > children.length) {\n throw new OperationError(\n `Insert: index ${index} out of bounds for parent \"${parent.type}\" with ${children.length} children`,\n );\n }\n assertValidChild(parent.type, op.node);\n children.splice(index, 0, op.node);\n return setContent(parent, children);\n });\n\n case 'delete':\n validatePath(op.path);\n return applyAtPath(doc, op.path, (parent, index) => {\n const children = [...getContent(parent)];\n if (index < 0 || index >= children.length) {\n throw new OperationError(\n `Delete: index ${index} out of bounds for parent \"${parent.type}\" with ${children.length} children`,\n );\n }\n children.splice(index, 1);\n return setContent(parent, children);\n });\n\n case 'replace':\n validatePath(op.path);\n return applyAtPath(doc, op.path, (parent, index) => {\n const children = [...getContent(parent)];\n if (index < 0 || index >= children.length) {\n throw new OperationError(\n `Replace: index ${index} out of bounds for parent \"${parent.type}\" with ${children.length} children`,\n );\n }\n assertValidChild(parent.type, op.node);\n children[index] = op.node;\n return setContent(parent, children);\n });\n }\n}\n\nexport function applyTransaction(doc: DocumentNode, tx: Transaction): DocumentNode {\n let result = doc;\n for (const op of tx.operations) {\n result = applyOperation(result, op);\n }\n return result;\n}\n\nexport function invertOperation(doc: DocumentNode, op: Operation): Operation {\n validatePath(op.path);\n\n switch (op.type) {\n case 'insert':\n return { type: 'delete', path: op.path };\n\n case 'delete': {\n let current: AstNode = doc;\n for (let i = 0; i < op.path.length - 1; i++) {\n const children = getContent(current);\n if (op.path[i] < 0 || op.path[i] >= children.length) {\n throw new OperationError(\n `invertOperation: path index ${op.path[i]} out of bounds at depth ${i}`,\n );\n }\n current = children[op.path[i]];\n }\n const lastIdx = op.path[op.path.length - 1];\n const children = getContent(current);\n if (lastIdx < 0 || lastIdx >= children.length) {\n throw new OperationError(\n `invertOperation: final path index ${lastIdx} out of bounds, parent has ${children.length} children`,\n );\n }\n return { type: 'insert', path: op.path, node: children[lastIdx] };\n }\n\n case 'replace': {\n let current: AstNode = doc;\n for (let i = 0; i < op.path.length - 1; i++) {\n const children = getContent(current);\n if (op.path[i] < 0 || op.path[i] >= children.length) {\n throw new OperationError(\n `invertOperation: path index ${op.path[i]} out of bounds at depth ${i}`,\n );\n }\n current = children[op.path[i]];\n }\n const lastIdx = op.path[op.path.length - 1];\n const children = getContent(current);\n if (lastIdx < 0 || lastIdx >= children.length) {\n throw new OperationError(\n `invertOperation: final path index ${lastIdx} out of bounds, parent has ${children.length} children`,\n );\n }\n return { type: 'replace', path: op.path, node: children[lastIdx] };\n }\n }\n}\n","/**\n * Pure text-based Jinja block scanner (no ProseMirror dependency).\n */\nimport type { JinjaBlock } from './types';\n\nconst JINJA_PATTERN = /\\{%\\s*(if|elif|else|endif)\\s*([^%]*?)\\s*%\\}/g;\n\n/**\n * Scan all Jinja blocks from plain text.\n *\n * @param text - Plain text content\n * @returns All Jinja blocks sorted by position\n */\nexport function scanJinjaBlocks(text: string): JinjaBlock[] {\n const blocks: JinjaBlock[] = [];\n\n JINJA_PATTERN.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = JINJA_PATTERN.exec(text)) !== null) {\n const type = match[1] as JinjaBlock['type'];\n const conditionRaw = match[2].trim();\n const condition = type === 'if' || type === 'elif' ? conditionRaw : undefined;\n\n // Include trailing spaces after tag\n let endIndex = match.index + match[0].length;\n while (endIndex < text.length && text[endIndex] === ' ') {\n endIndex++;\n }\n\n blocks.push({\n type,\n condition,\n startIndex: match.index,\n endIndex,\n raw: match[0],\n });\n }\n\n return blocks.sort((a, b) => a.startIndex - b.startIndex);\n}\n","import type { JinjaBlock, JinjaIfStructure } from './types';\n\nfunction buildStructure(\n partial: { ifBlock: JinjaBlock; elifBlocks: JinjaBlock[]; elseBlock?: JinjaBlock },\n endifBlock: JinjaBlock,\n): JinjaIfStructure {\n const { ifBlock, elifBlocks, elseBlock } = partial;\n const contentRanges: JinjaIfStructure['contentRanges'] = [];\n\n // if branch content\n const ifContentEnd = elifBlocks[0]?.startIndex ?? elseBlock?.startIndex ?? endifBlock.startIndex;\n contentRanges.push({\n type: 'if',\n condition: ifBlock.condition!,\n startIndex: ifBlock.endIndex,\n endIndex: ifContentEnd,\n });\n\n // elif branches\n elifBlocks.forEach((elifBlock, idx) => {\n const nextBlock = elifBlocks[idx + 1] ?? elseBlock ?? endifBlock;\n contentRanges.push({\n type: 'elif',\n condition: elifBlock.condition!,\n startIndex: elifBlock.endIndex,\n endIndex: nextBlock.startIndex,\n });\n });\n\n // else branch\n if (elseBlock) {\n contentRanges.push({\n type: 'else',\n startIndex: elseBlock.endIndex,\n endIndex: endifBlock.startIndex,\n });\n }\n\n return {\n id: `jinja-${ifBlock.startIndex}-${endifBlock.endIndex}`,\n ifBlock,\n elifBlocks,\n elseBlock,\n endifBlock,\n contentRanges,\n };\n}\n\n/**\n * Structure scanned blocks into if~endif structures using stack-based approach.\n */\nexport function structureJinjaBlocks(blocks: JinjaBlock[]): JinjaIfStructure[] {\n const structures: JinjaIfStructure[] = [];\n const stack: Array<{\n ifBlock: JinjaBlock;\n elifBlocks: JinjaBlock[];\n elseBlock?: JinjaBlock;\n }> = [];\n\n for (const block of blocks) {\n switch (block.type) {\n case 'if':\n stack.push({ ifBlock: block, elifBlocks: [] });\n break;\n case 'elif':\n if (stack.length > 0) {\n stack[stack.length - 1].elifBlocks.push(block);\n }\n break;\n case 'else':\n if (stack.length > 0) {\n stack[stack.length - 1].elseBlock = block;\n }\n break;\n case 'endif': {\n const current = stack.pop();\n if (current) {\n structures.push(buildStructure(current, block));\n }\n break;\n }\n }\n }\n\n return structures;\n}\n","import type { DocumentNode } from '../ast/types';\nimport { textContent } from '../ast/traverse';\nimport { scanJinjaBlocks } from './scanner';\nimport { structureJinjaBlocks } from './structurer';\n\nexport interface JinjaVisualBranch {\n type: 'if' | 'elif' | 'else';\n condition?: string;\n blockStartIndex: number;\n blockEndIndex: number;\n tagBlockIndex: number;\n}\n\nexport interface JinjaVisualStructure {\n id: string;\n branches: JinjaVisualBranch[];\n ifTagBlockIndex: number;\n endifTagBlockIndex: number;\n}\n\n/**\n * Single pass: builds cumulative block-end offsets AND the full document text.\n * offsets[i] = exclusive end char index of block i.\n * Avoids calling textContent() twice (once for offsets, once for fullText).\n */\nfunction buildOffsetsAndText(doc: DocumentNode): { offsets: number[]; fullText: string } {\n const offsets: number[] = [];\n const parts: string[] = [];\n let cursor = 0;\n for (const block of doc.content) {\n const t = textContent(block);\n parts.push(t);\n cursor += t.length;\n offsets.push(cursor);\n }\n return { offsets, fullText: parts.join('') };\n}\n\n/**\n * Binary search: returns the block index that contains charIndex.\n * offsets[i] is the exclusive end of block i.\n */\nfunction charIndexToBlockIndex(offsets: number[], charIndex: number): number {\n if (offsets.length === 0) return 0;\n let lo = 0;\n let hi = offsets.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (offsets[mid] <= charIndex) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/**\n * Analyze a DocumentNode for Jinja if/elif/else/endif structures\n * and map them to block-level indices.\n */\nexport function analyzeJinjaBlocks(doc: DocumentNode): JinjaVisualStructure[] {\n if (doc.content.length === 0) return [];\n\n const { offsets, fullText } = buildOffsetsAndText(doc);\n\n const scanned = scanJinjaBlocks(fullText);\n if (scanned.length === 0) return [];\n\n const structures = structureJinjaBlocks(scanned);\n\n return structures.map((structure) => {\n const ifTagBlockIdx = charIndexToBlockIndex(offsets, structure.ifBlock.startIndex);\n const endifTagBlockIdx = charIndexToBlockIndex(offsets, structure.endifBlock.startIndex);\n\n const branches: JinjaVisualBranch[] = structure.contentRanges.map((range) => {\n // Find the tag block index for this branch\n let tagCharIndex: number;\n if (range.type === 'if') {\n tagCharIndex = structure.ifBlock.startIndex;\n } else if (range.type === 'elif') {\n const elifBlock = structure.elifBlocks.find((b) => b.condition === range.condition);\n tagCharIndex = elifBlock ? elifBlock.startIndex : range.startIndex;\n } else {\n tagCharIndex = structure.elseBlock!.startIndex;\n }\n\n const tagBlockIdx = charIndexToBlockIndex(offsets, tagCharIndex);\n\n // Content block range: from the block containing the content start\n // to the block containing the content end (exclusive)\n let contentStartBlock: number;\n let contentEndBlock: number;\n\n if (range.startIndex >= range.endIndex) {\n // Empty content range\n contentStartBlock = tagBlockIdx;\n contentEndBlock = tagBlockIdx;\n } else {\n contentStartBlock = charIndexToBlockIndex(offsets, range.startIndex);\n // If the content starts in the same block as the tag, the actual content blocks start after\n // But we keep the start as-is since the tag and content may share a block\n const lastContentChar = range.endIndex - 1;\n contentEndBlock = charIndexToBlockIndex(offsets, lastContentChar) + 1;\n }\n\n return {\n type: range.type,\n condition: range.condition,\n blockStartIndex: contentStartBlock,\n blockEndIndex: contentEndBlock,\n tagBlockIndex: tagBlockIdx,\n };\n });\n\n return {\n id: structure.id,\n branches,\n ifTagBlockIndex: ifTagBlockIdx,\n endifTagBlockIndex: endifTagBlockIdx,\n };\n });\n}\n","import type { JinjaIfStructure, Variable } from './types';\n\nconst IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*$/;\nconst KEYWORDS = new Set(['None', 'True', 'False', 'true', 'false', 'null', 'undefined']);\n\nexport function extractVariables(condition: string): Variable[] {\n const variables = new Set<string>();\n\n // Remove string literals and numeric literals\n const cleanCondition = condition\n .replace(/\"[^\"]*\"/g, '\"\"')\n .replace(/'[^']*'/g, \"''\")\n .replace(/\\b\\d+(\\.\\d+)?\\b/g, '0');\n\n // Split by operators\n const operators = /[=!<>]+|\\b(?:and|or|not|in|is)\\b/g;\n const tokens = cleanCondition\n .split(operators)\n .map((t) => t.trim())\n .filter((t) => t && t !== '\"\"' && t !== \"''\");\n\n tokens.forEach((token) => {\n let cleaned = token.replace(/\\w+\\(/g, '').replace(/\\)/g, '').trim();\n cleaned = cleaned.replace(/[()]/g, '').trim();\n cleaned = cleaned.replace(/\\[.*?\\]/g, '').trim();\n\n if (cleaned && IDENTIFIER_PATTERN.test(cleaned) && !KEYWORDS.has(cleaned)) {\n variables.add(cleaned);\n }\n });\n\n return Array.from(variables).map((name) => ({ name }));\n}\n\nexport function collectAllVariables(structures: JinjaIfStructure[]): Variable[] {\n const allVars = new Set<string>();\n\n structures.forEach((structure) => {\n if (structure.ifBlock.condition) {\n extractVariables(structure.ifBlock.condition).forEach((v) => allVars.add(v.name));\n }\n structure.elifBlocks.forEach((elifBlock) => {\n if (elifBlock.condition) {\n extractVariables(elifBlock.condition).forEach((v) => allVars.add(v.name));\n }\n });\n });\n\n return Array.from(allVars)\n .sort()\n .map((name) => ({ name }));\n}\n","/**\n * Safe Jinja condition evaluator using recursive descent parsing.\n *\n * Supports:\n * Comparison: ==, !=, <, >, <=, >=\n * Logical: and, or, not\n * Identity: is, is not\n * Membership: in (value in identifier)\n * Literals: strings, numbers, booleans (True/False/true/false), None/null\n * Variables: dot-notation identifiers (e.g. context.planName)\n * Grouping: parentheses\n *\n * NO arbitrary code execution — only whitelisted operators and literal types.\n */\nimport type { VariableValue } from './types';\n\n// ── Tokenizer ──────────────────────────────────────────────────────\n\ntype TokenType =\n | 'STRING'\n | 'NUMBER'\n | 'BOOL'\n | 'NONE'\n | 'IDENT'\n | 'AND'\n | 'OR'\n | 'NOT'\n | 'IN'\n | 'IS'\n | 'EQ'\n | 'NEQ'\n | 'LT'\n | 'GT'\n | 'LTE'\n | 'GTE'\n | 'LPAREN'\n | 'RPAREN'\n | 'EOF';\n\ninterface Token {\n type: TokenType;\n value: string;\n}\n\nconst KEYWORDS: Record<string, TokenType> = {\n and: 'AND',\n or: 'OR',\n not: 'NOT',\n in: 'IN',\n is: 'IS',\n True: 'BOOL',\n False: 'BOOL',\n true: 'BOOL',\n false: 'BOOL',\n None: 'NONE',\n null: 'NONE',\n};\n\ninterface TokenizeResult {\n readonly tokens: Token[];\n readonly error?: string;\n}\n\nfunction tokenize(input: string): TokenizeResult {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < input.length) {\n // Skip whitespace\n if (/\\s/.test(input[i])) {\n i++;\n continue;\n }\n\n // String literals (single or double quoted)\n if (input[i] === '\"' || input[i] === \"'\") {\n const quote = input[i];\n let str = '';\n i++; // skip opening quote\n while (i < input.length && input[i] !== quote) {\n if (input[i] === '\\\\' && i + 1 < input.length) {\n str += input[i + 1];\n i += 2;\n } else {\n str += input[i];\n i++;\n }\n }\n if (i >= input.length) return { tokens: [], error: 'Unterminated string literal' };\n i++; // skip closing quote\n tokens.push({ type: 'STRING', value: str });\n continue;\n }\n\n // Numbers (integer and float)\n if (/[0-9]/.test(input[i]) || (input[i] === '-' && i + 1 < input.length && /[0-9]/.test(input[i + 1]) && (tokens.length === 0 || ['AND', 'OR', 'NOT', 'EQ', 'NEQ', 'LT', 'GT', 'LTE', 'GTE', 'LPAREN', 'IN', 'IS'].includes(tokens[tokens.length - 1].type)))) {\n let num = '';\n if (input[i] === '-') {\n num = '-';\n i++;\n }\n while (i < input.length && /[0-9]/.test(input[i])) {\n num += input[i];\n i++;\n }\n if (i < input.length && input[i] === '.') {\n num += '.';\n i++;\n while (i < input.length && /[0-9]/.test(input[i])) {\n num += input[i];\n i++;\n }\n }\n tokens.push({ type: 'NUMBER', value: num });\n continue;\n }\n\n // Identifiers and keywords\n if (/[a-zA-Z_]/.test(input[i])) {\n let ident = '';\n while (i < input.length && /[a-zA-Z0-9_.]/.test(input[i])) {\n ident += input[i];\n i++;\n }\n const kwType = KEYWORDS[ident];\n if (kwType) {\n tokens.push({ type: kwType, value: ident });\n } else {\n tokens.push({ type: 'IDENT', value: ident });\n }\n continue;\n }\n\n // Two-character operators\n if (i + 1 < input.length) {\n const two = input[i] + input[i + 1];\n if (two === '==') { tokens.push({ type: 'EQ', value: '==' }); i += 2; continue; }\n if (two === '!=') { tokens.push({ type: 'NEQ', value: '!=' }); i += 2; continue; }\n if (two === '<=') { tokens.push({ type: 'LTE', value: '<=' }); i += 2; continue; }\n if (two === '>=') { tokens.push({ type: 'GTE', value: '>=' }); i += 2; continue; }\n }\n\n // Single-character operators\n if (input[i] === '<') { tokens.push({ type: 'LT', value: '<' }); i++; continue; }\n if (input[i] === '>') { tokens.push({ type: 'GT', value: '>' }); i++; continue; }\n if (input[i] === '(') { tokens.push({ type: 'LPAREN', value: '(' }); i++; continue; }\n if (input[i] === ')') { tokens.push({ type: 'RPAREN', value: ')' }); i++; continue; }\n\n // Unknown character → fail\n return { tokens: [], error: `Unexpected character: ${input[i]}` };\n }\n\n tokens.push({ type: 'EOF', value: '' });\n return { tokens };\n}\n\n// ── Evaluated value ────────────────────────────────────────────────\n\ntype Value = string | number | boolean | null | Value[];\n\n// ── Recursive descent parser + evaluator ───────────────────────────\n\nclass Parser {\n private pos = 0;\n private readonly tokens: Token[];\n private readonly variables: Map<string, VariableValue>;\n\n constructor(tokens: Token[], variables: Map<string, VariableValue>) {\n this.tokens = tokens;\n this.variables = variables;\n }\n\n private peek(): Token {\n return this.tokens[this.pos] ?? { type: 'EOF', value: '' };\n }\n\n private advance(): Token {\n const t = this.tokens[this.pos];\n this.pos++;\n return t;\n }\n\n private expect(type: TokenType): Token {\n const t = this.peek();\n if (t.type !== type) {\n throw new Error(`Expected ${type}, got ${t.type}`);\n }\n return this.advance();\n }\n\n // Grammar (precedence low→high):\n // expr → or_expr\n // or_expr → and_expr ('or' and_expr)*\n // and_expr → not_expr ('and' not_expr)*\n // not_expr → 'not' not_expr | cmp_expr\n // cmp_expr → primary (('=='|'!='|'<'|'>'|'<='|'>='|'in'|'is'|'is not') primary)?\n // primary → STRING | NUMBER | BOOL | NONE | IDENT | '(' expr ')'\n\n evaluate(): Value {\n const result = this.orExpr();\n if (this.peek().type !== 'EOF') {\n throw new Error(`Unexpected token: ${this.peek().value}`);\n }\n return result;\n }\n\n private orExpr(): Value {\n let left = this.andExpr();\n while (this.peek().type === 'OR') {\n this.advance();\n const right = this.andExpr();\n left = isTruthy(left) || isTruthy(right);\n }\n return left;\n }\n\n private andExpr(): Value {\n let left = this.notExpr();\n while (this.peek().type === 'AND') {\n this.advance();\n const right = this.notExpr();\n left = isTruthy(left) && isTruthy(right);\n }\n return left;\n }\n\n private notExpr(): Value {\n if (this.peek().type === 'NOT') {\n this.advance();\n const val = this.notExpr();\n return !isTruthy(val);\n }\n return this.cmpExpr();\n }\n\n private cmpExpr(): Value {\n const left = this.primary();\n const op = this.peek().type;\n\n switch (op) {\n case 'EQ':\n this.advance();\n return looseEqual(left, this.primary());\n case 'NEQ':\n this.advance();\n return !looseEqual(left, this.primary());\n case 'LT':\n this.advance();\n return toNumber(left) < toNumber(this.primary());\n case 'GT':\n this.advance();\n return toNumber(left) > toNumber(this.primary());\n case 'LTE':\n this.advance();\n return toNumber(left) <= toNumber(this.primary());\n case 'GTE':\n this.advance();\n return toNumber(left) >= toNumber(this.primary());\n case 'IN': {\n this.advance();\n const collection = this.primary();\n if (Array.isArray(collection)) {\n return collection.some((item) => looseEqual(item, left));\n }\n if (typeof collection === 'string' && typeof left === 'string') {\n return collection.includes(left);\n }\n return false;\n }\n case 'IS': {\n this.advance();\n // \"is not\"\n if (this.peek().type === 'NOT') {\n this.advance();\n return !looseEqual(left, this.primary());\n }\n return looseEqual(left, this.primary());\n }\n default:\n return left;\n }\n }\n\n private primary(): Value {\n const t = this.peek();\n\n switch (t.type) {\n case 'STRING':\n this.advance();\n return t.value;\n case 'NUMBER':\n this.advance();\n return parseFloat(t.value);\n case 'BOOL':\n this.advance();\n return t.value === 'True' || t.value === 'true';\n case 'NONE':\n this.advance();\n return null;\n case 'IDENT': {\n this.advance();\n return this.resolveVariable(t.value);\n }\n case 'LPAREN': {\n this.advance();\n const val = this.orExpr();\n this.expect('RPAREN');\n return val;\n }\n default:\n throw new Error(`Unexpected token in primary: ${t.type} \"${t.value}\"`);\n }\n }\n\n private resolveVariable(name: string): Value {\n const entry = this.variables.get(name);\n if (entry === undefined) {\n // Check for partial dot-notation matches:\n // e.g., \"user.plan\" might be stored as \"user.plan\" directly\n // No match → treat as undefined (falsy)\n return null;\n }\n\n switch (entry.type) {\n case 'string':\n return String(entry.value);\n case 'number':\n return Number(entry.value);\n case 'boolean':\n return entry.value === true || entry.value === 'true';\n default:\n return String(entry.value);\n }\n }\n}\n\n// ── Helper functions ───────────────────────────────────────────────\n\nfunction isTruthy(v: Value): boolean {\n if (v === null || v === undefined) return false;\n if (typeof v === 'boolean') return v;\n if (typeof v === 'number') return v !== 0;\n if (typeof v === 'string') return v.length > 0;\n if (Array.isArray(v)) return v.length > 0;\n return true;\n}\n\nfunction looseEqual(a: Value, b: Value): boolean {\n if (a === b) return true;\n if (a === null || b === null) return a === b;\n\n // Coerce number↔string for Jinja compatibility\n if (typeof a === 'number' && typeof b === 'string') return a === parseFloat(b);\n if (typeof a === 'string' && typeof b === 'number') return parseFloat(a) === b;\n\n return false;\n}\n\nfunction toNumber(v: Value): number {\n if (typeof v === 'number') return v;\n if (typeof v === 'string') return parseFloat(v) || 0;\n if (typeof v === 'boolean') return v ? 1 : 0;\n return 0;\n}\n\n// ── Public API ─────────────────────────────────────────────────────\n\n/**\n * Safely evaluate a Jinja conditional expression.\n *\n * Uses a recursive-descent parser with a whitelist of allowed operators.\n * No `eval`, `new Function`, or arbitrary code execution.\n *\n * @returns true/false if evaluation succeeded, null if parsing/evaluation failed\n */\nexport function evaluateCondition(condition: string, variables: Map<string, VariableValue>): boolean | null {\n try {\n const { tokens, error } = tokenize(condition.trim());\n if (error || tokens.length === 0) return null;\n\n const parser = new Parser(tokens, variables);\n const result = parser.evaluate();\n return isTruthy(result);\n } catch {\n return null;\n }\n}\n\n// ── Condition validation ──────────────────────────────────────────\n\nexport interface ConditionValidationResult {\n readonly valid: boolean;\n readonly error?: string;\n}\n\n/**\n * Validate a Jinja conditional expression without evaluating it.\n * Returns a structured result with an error message on failure.\n */\nexport function validateCondition(condition: string): ConditionValidationResult {\n const trimmed = condition.trim();\n if (trimmed === '') return { valid: true };\n\n const { tokens, error: tokenError } = tokenize(trimmed);\n if (tokenError) return { valid: false, error: tokenError };\n if (tokens.length === 0) return { valid: false, error: 'Empty expression' };\n\n try {\n // Parse without evaluating — use an empty variable map\n const parser = new Parser(tokens, new Map());\n parser.evaluate();\n return { valid: true };\n } catch (e) {\n const msg = e instanceof Error ? e.message : 'Invalid expression';\n return { valid: false, error: msg };\n }\n}\n","type TokenType =\n | 'STRING'\n | 'NUMBER'\n | 'BOOL'\n | 'NONE'\n | 'IDENT'\n | 'AND'\n | 'OR'\n | 'NOT'\n | 'IN'\n | 'IS'\n | 'EQ'\n | 'NEQ'\n | 'LT'\n | 'GT'\n | 'LTE'\n | 'GTE'\n | 'LPAREN'\n | 'RPAREN';\n\nexport type HighlightCategory = 'variable' | 'operator' | 'value' | 'punctuation';\n\nexport interface ConditionToken {\n readonly text: string;\n readonly start: number;\n readonly end: number;\n readonly category: HighlightCategory;\n}\n\ninterface RawToken {\n readonly type: TokenType;\n readonly text: string;\n readonly start: number;\n readonly end: number;\n}\n\nconst KEYWORDS: Readonly<Record<string, TokenType>> = {\n and: 'AND',\n or: 'OR',\n not: 'NOT',\n in: 'IN',\n is: 'IS',\n True: 'BOOL',\n False: 'BOOL',\n true: 'BOOL',\n false: 'BOOL',\n None: 'NONE',\n null: 'NONE',\n};\n\nconst CATEGORY_BY_TYPE: Readonly<Record<TokenType, HighlightCategory>> = {\n STRING: 'value',\n NUMBER: 'value',\n BOOL: 'value',\n NONE: 'value',\n IDENT: 'variable',\n AND: 'operator',\n OR: 'operator',\n NOT: 'operator',\n IN: 'operator',\n IS: 'operator',\n EQ: 'operator',\n NEQ: 'operator',\n LT: 'operator',\n GT: 'operator',\n LTE: 'operator',\n GTE: 'operator',\n LPAREN: 'punctuation',\n RPAREN: 'punctuation',\n};\n\nconst NEGATIVE_NUMBER_PRECEDERS = new Set<TokenType>([\n 'AND',\n 'OR',\n 'NOT',\n 'IN',\n 'IS',\n 'EQ',\n 'NEQ',\n 'LT',\n 'GT',\n 'LTE',\n 'GTE',\n 'LPAREN',\n]);\n\nfunction canStartNegativeNumber(tokens: readonly RawToken[]): boolean {\n if (tokens.length === 0) {\n return true;\n }\n\n const previous = tokens[tokens.length - 1];\n return NEGATIVE_NUMBER_PRECEDERS.has(previous.type);\n}\n\nfunction finalizeTokens(input: string, rawTokens: readonly RawToken[]): ConditionToken[] {\n const highlighted: ConditionToken[] = [];\n\n for (let i = 0; i < rawTokens.length; i++) {\n const token = rawTokens[i];\n const next = rawTokens[i + 1];\n\n if (token.type === 'IS' && next?.type === 'NOT') {\n highlighted.push({\n text: input.slice(token.start, next.end),\n start: token.start,\n end: next.end,\n category: 'operator',\n });\n i++;\n continue;\n }\n\n highlighted.push({\n text: token.text,\n start: token.start,\n end: token.end,\n category: CATEGORY_BY_TYPE[token.type],\n });\n }\n\n return highlighted;\n}\n\nexport function tokenizeCondition(input: string): ConditionToken[] {\n const rawTokens: RawToken[] = [];\n let i = 0;\n\n while (i < input.length) {\n const char = input[i];\n\n if (/\\s/.test(char)) {\n i++;\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n const start = i;\n const quote = char;\n i++;\n\n while (i < input.length) {\n if (input[i] === '\\\\' && i + 1 < input.length) {\n i += 2;\n continue;\n }\n\n if (input[i] === quote) {\n i++;\n rawTokens.push({\n type: 'STRING',\n text: input.slice(start, i),\n start,\n end: i,\n });\n break;\n }\n\n i++;\n }\n\n if (rawTokens[rawTokens.length - 1]?.start !== start) {\n return finalizeTokens(input, rawTokens);\n }\n\n continue;\n }\n\n if (/[0-9]/.test(char) || (char === '-' && i + 1 < input.length && /[0-9]/.test(input[i + 1]) && canStartNegativeNumber(rawTokens))) {\n const start = i;\n\n if (input[i] === '-') {\n i++;\n }\n\n while (i < input.length && /[0-9]/.test(input[i])) {\n i++;\n }\n\n if (i < input.length && input[i] === '.') {\n i++;\n while (i < input.length && /[0-9]/.test(input[i])) {\n i++;\n }\n }\n\n rawTokens.push({\n type: 'NUMBER',\n text: input.slice(start, i),\n start,\n end: i,\n });\n continue;\n }\n\n if (/[a-zA-Z_]/.test(char)) {\n const start = i;\n i++;\n\n while (i < input.length && /[a-zA-Z0-9_.]/.test(input[i])) {\n i++;\n }\n\n const text = input.slice(start, i);\n rawTokens.push({\n type: KEYWORDS[text] ?? 'IDENT',\n text,\n start,\n end: i,\n });\n continue;\n }\n\n if (i + 1 < input.length) {\n const twoChar = input.slice(i, i + 2);\n\n if (twoChar === '==') {\n rawTokens.push({ type: 'EQ', text: twoChar, start: i, end: i + 2 });\n i += 2;\n continue;\n }\n\n if (twoChar === '!=') {\n rawTokens.push({ type: 'NEQ', text: twoChar, start: i, end: i + 2 });\n i += 2;\n continue;\n }\n\n if (twoChar === '<=') {\n rawTokens.push({ type: 'LTE', text: twoChar, start: i, end: i + 2 });\n i += 2;\n continue;\n }\n\n if (twoChar === '>=') {\n rawTokens.push({ type: 'GTE', text: twoChar, start: i, end: i + 2 });\n i += 2;\n continue;\n }\n }\n\n if (char === '<') {\n rawTokens.push({ type: 'LT', text: char, start: i, end: i + 1 });\n i++;\n continue;\n }\n\n if (char === '>') {\n rawTokens.push({ type: 'GT', text: char, start: i, end: i + 1 });\n i++;\n continue;\n }\n\n if (char === '(') {\n rawTokens.push({ type: 'LPAREN', text: char, start: i, end: i + 1 });\n i++;\n continue;\n }\n\n if (char === ')') {\n rawTokens.push({ type: 'RPAREN', text: char, start: i, end: i + 1 });\n i++;\n continue;\n }\n\n return finalizeTokens(input, rawTokens);\n }\n\n return finalizeTokens(input, rawTokens);\n}\n","/**\n * Evaluate Jinja if-block AST nodes by selecting the first truthy branch.\n * Post-processes adjacent same-type lists to merge and renumber.\n */\nimport type { DocumentNode, BlockNode, InlineNode, JinjaIfBlockNode, JinjaIfInlineNode, BulletListNode, OrderedListNode } from '../ast/types';\nimport type { VariableValue } from './types';\nimport { evaluateCondition } from './evaluator';\nimport { map } from '../ast/traverse';\nimport type { AstNode } from '../ast/types';\n\n/**\n * Evaluate all jinjaIfBlock and jinjaIfInline nodes in a document,\n * replacing them with the content of the first truthy branch.\n */\nexport function evaluateJinjaNodes(\n doc: DocumentNode,\n variables: Map<string, VariableValue>,\n): DocumentNode {\n // Bottom-up: map evaluates children first, then we handle the jinja node\n const evaluated = map(doc, (node: AstNode): AstNode => {\n if (node.type === 'jinjaIfBlock') {\n const jNode = node as JinjaIfBlockNode;\n const selectedContent = selectBranch(jNode.branches, variables);\n // Return a wrapper that will be flattened by the parent\n // We use a special marker node that we'll expand\n return { type: '_jinjaBlockExpanded', content: selectedContent } as unknown as AstNode;\n }\n\n if (node.type === 'jinjaIfInline') {\n const jNode = node as JinjaIfInlineNode;\n const selectedContent = selectBranch(jNode.branches, variables);\n return { type: '_jinjaInlineExpanded', content: selectedContent } as unknown as AstNode;\n }\n\n return node;\n }) as DocumentNode;\n\n // Now expand the marker nodes and merge adjacent lists\n const expanded = expandMarkers(evaluated);\n return mergeAdjacentLists(expanded);\n}\n\nfunction selectBranch<T>(\n branches: readonly { readonly branchType: string; readonly condition?: string; readonly content: readonly T[] }[],\n variables: Map<string, VariableValue>,\n): readonly T[] {\n for (const branch of branches) {\n if (branch.branchType === 'else') {\n return branch.content;\n }\n if (branch.condition) {\n const result = evaluateCondition(branch.condition, variables);\n if (result === true) {\n return branch.content;\n }\n }\n }\n return [];\n}\n\n// === Expand marker nodes ===\n\nfunction expandMarkers(doc: DocumentNode): DocumentNode {\n const content = expandBlockArray(doc.content as BlockNode[]);\n return { type: 'doc', content };\n}\n\nfunction expandBlockArray(blocks: BlockNode[]): BlockNode[] {\n const result: BlockNode[] = [];\n for (const block of blocks) {\n const b = block as unknown as { type: string; content?: unknown[] };\n if (b.type === '_jinjaBlockExpanded') {\n result.push(...expandBlockArray(b.content as BlockNode[]));\n } else {\n result.push(expandBlockNode(block));\n }\n }\n return result;\n}\n\nfunction expandBlockNode(node: BlockNode): BlockNode {\n switch (node.type) {\n case 'paragraph':\n case 'heading': {\n const content = expandInlineArray(node.content as InlineNode[]);\n if (content === node.content) return node;\n return { ...node, content } as typeof node;\n }\n case 'bulletList':\n case 'orderedList':\n return { ...node, content: node.content.map(li => expandListItem(li)) } as typeof node;\n case 'listItem': {\n const content = expandBlockArray(node.content as BlockNode[]);\n return { ...node, content };\n }\n case 'blockquote': {\n const content = expandBlockArray(node.content as BlockNode[]);\n return { ...node, content };\n }\n case 'jinjaIfBlock':\n // Should not remain after evaluation, but handle gracefully\n return node;\n default:\n return node;\n }\n}\n\nfunction expandListItem(li: { readonly type: 'listItem'; readonly checked?: boolean | null; readonly content: readonly BlockNode[] }): typeof li {\n const content = expandBlockArray(li.content as BlockNode[]);\n return { ...li, content };\n}\n\nfunction expandInlineArray(inlines: InlineNode[]): InlineNode[] {\n const result: InlineNode[] = [];\n let changed = false;\n for (const inline of inlines) {\n const i = inline as unknown as { type: string; content?: unknown[] };\n if (i.type === '_jinjaInlineExpanded') {\n result.push(...expandInlineArray(i.content as InlineNode[]));\n changed = true;\n } else {\n result.push(inline);\n }\n }\n return changed ? result : inlines;\n}\n\n// === Merge adjacent same-type lists ===\n\nfunction mergeAdjacentLists(doc: DocumentNode): DocumentNode {\n const content = mergeBlockArray(doc.content as BlockNode[]);\n return { type: 'doc', content };\n}\n\nfunction mergeBlockArray(blocks: BlockNode[]): BlockNode[] {\n if (blocks.length <= 1) return blocks;\n\n const result: BlockNode[] = [];\n for (const block of blocks) {\n // Recurse into containers\n const processed = mergeInsideBlock(block);\n const prev = result[result.length - 1];\n\n if (prev && canMergeLists(prev, processed)) {\n result[result.length - 1] = mergeTwoLists(prev, processed);\n } else {\n result.push(processed);\n }\n }\n return result;\n}\n\nfunction mergeInsideBlock(node: BlockNode): BlockNode {\n switch (node.type) {\n case 'listItem': {\n const content = mergeBlockArray(node.content as BlockNode[]);\n return { ...node, content };\n }\n case 'blockquote': {\n const content = mergeBlockArray(node.content as BlockNode[]);\n return { ...node, content };\n }\n default:\n return node;\n }\n}\n\nfunction canMergeLists(a: BlockNode, b: BlockNode): boolean {\n if (a.type === 'bulletList' && b.type === 'bulletList') return true;\n if (a.type === 'orderedList' && b.type === 'orderedList') return true;\n return false;\n}\n\nfunction mergeTwoLists(a: BlockNode, b: BlockNode): BlockNode {\n if (a.type === 'bulletList' && b.type === 'bulletList') {\n return {\n type: 'bulletList',\n content: [...a.content, ...b.content],\n };\n }\n if (a.type === 'orderedList' && b.type === 'orderedList') {\n return {\n type: 'orderedList',\n start: a.start,\n content: [...a.content, ...b.content],\n };\n }\n return a; // Should not reach here\n}\n","import type { DocumentNode } from '../ast/types';\nimport type { LintContext, LintResult, LintRule } from './types';\nimport { visit } from '../ast/traverse';\n\nexport function lint(\n doc: DocumentNode,\n rules: readonly LintRule[],\n ctx: LintContext = {},\n): LintResult[] {\n const disabled = new Set(ctx.disabledRules);\n const results: LintResult[] = [];\n\n const visitorRules: Array<{\n rule: LintRule;\n severity: LintRule['defaultSeverity'];\n visitor: ReturnType<NonNullable<LintRule['buildVisitor']>>['visitor'];\n finish: ReturnType<NonNullable<LintRule['buildVisitor']>>['finish'];\n }> = [];\n\n const legacyRules: LintRule[] = [];\n\n for (const rule of rules) {\n if (disabled.has(rule.id)) continue;\n if (rule.buildVisitor) {\n const severity = ctx.severityOverrides?.[rule.id] ?? rule.defaultSeverity;\n const { visitor, finish } = rule.buildVisitor(ctx);\n visitorRules.push({ rule, severity, visitor, finish });\n } else {\n legacyRules.push(rule);\n }\n }\n\n // Single combined traversal for all visitor-based rules\n if (visitorRules.length > 0) {\n visit(doc, (node) => {\n const type = node.type;\n for (const { visitor } of visitorRules) {\n visitor[type]?.(node);\n }\n }, { trackPath: false });\n\n for (const { rule, severity, finish } of visitorRules) {\n const ruleResults = finish(severity);\n for (const r of ruleResults) {\n results.push(r.severity === severity ? r : { ...r, severity });\n }\n }\n }\n\n // Legacy rules (no buildVisitor) — individual traversals\n for (const rule of legacyRules) {\n const severity = ctx.severityOverrides?.[rule.id] ?? rule.defaultSeverity;\n const ruleResults = rule.run(doc, ctx);\n for (const r of ruleResults) {\n results.push(r.severity === severity ? r : { ...r, severity });\n }\n }\n\n return results;\n}\n","import type { JumpPointNode } from '../../ast/types';\nimport { visit } from '../../ast/traverse';\nimport type { LintRule } from '../types';\n\nexport const duplicateJumpPoints: LintRule = {\n id: 'duplicate-jump-points',\n description: 'Detects duplicate jump point IDs within the document',\n defaultSeverity: 'error',\n run(doc, ctx) {\n // Delegate to visitor-based implementation for consistency\n const { visitor, finish } = duplicateJumpPoints.buildVisitor!(ctx);\n visit(doc, (node) => {\n visitor[node.type]?.(node);\n }, { trackPath: false });\n return finish(this.defaultSeverity);\n },\n buildVisitor(_ctx) {\n const seen = new Map<string, number>();\n\n return {\n visitor: {\n jumpPoint(node) {\n const jp = node as JumpPointNode;\n seen.set(jp.id, (seen.get(jp.id) ?? 0) + 1);\n },\n },\n finish(severity) {\n const results = [];\n for (const [id, count] of seen) {\n if (count > 1) {\n results.push({\n ruleId: 'duplicate-jump-points',\n severity,\n message: `Duplicate jump point ID: \"${id}\" appears ${count} times`,\n });\n }\n }\n return results;\n },\n };\n },\n};\n","import type { JumpPointNode, TextNode } from '../../ast/types';\nimport { visit } from '../../ast/traverse';\nimport type { LintRule } from '../types';\n\nconst JUMP_REF_PATTERN = /#([\\p{L}\\p{N}_-]+)/gu;\n\nexport const jumpPointRefValidity: LintRule = {\n id: 'jump-point-ref-validity',\n description: 'Detects references to non-existent jump point IDs',\n defaultSeverity: 'error',\n run(doc, ctx) {\n // Delegate to visitor-based implementation for consistency\n const { visitor, finish } = jumpPointRefValidity.buildVisitor!(ctx);\n visit(doc, (node) => {\n visitor[node.type]?.(node);\n }, { trackPath: false });\n return finish(this.defaultSeverity);\n },\n buildVisitor(_ctx) {\n const definedIds = new Set<string>();\n const refs: { id: string }[] = [];\n\n return {\n visitor: {\n jumpPoint(node) {\n definedIds.add((node as JumpPointNode).id);\n },\n text(node) {\n const t = node as TextNode;\n const linkMark = t.marks?.find((m) => m.type === 'link');\n if (linkMark && linkMark.type === 'link') {\n const match = /^#([\\p{L}\\p{N}_-]+)$/u.exec(linkMark.href);\n if (match) {\n refs.push({ id: match[1] });\n }\n }\n let m;\n JUMP_REF_PATTERN.lastIndex = 0;\n while ((m = JUMP_REF_PATTERN.exec(t.text)) !== null) {\n refs.push({ id: m[1] });\n }\n },\n },\n finish(severity) {\n const results = [];\n for (const ref of refs) {\n if (!definedIds.has(ref.id)) {\n results.push({\n ruleId: 'jump-point-ref-validity',\n severity,\n message: `Reference to undefined jump point: \"${ref.id}\"`,\n });\n }\n }\n return results;\n },\n };\n },\n};\n","import type { BlockNode, ListItemNode } from '../../ast/types';\nimport { textContent } from '../../ast/traverse';\nimport { visit } from '../../ast/traverse';\nimport type { LintRule } from '../types';\n\nconst ACTION_VERBS = ['Say', 'Call', 'Ask', 'Send', 'Reply', 'Respond'];\n\nfunction getLeadingVerb(item: ListItemNode): string | undefined {\n const t = textContent(item).trimStart();\n for (const verb of ACTION_VERBS) {\n if (t.startsWith(verb + ' ') || t.startsWith(verb + ':') || t === verb) {\n return verb;\n }\n }\n return undefined;\n}\n\nexport const consecutiveMergeableActions: LintRule = {\n id: 'consecutive-mergeable-actions',\n description: 'Suggests merging consecutive list items that start with the same action verb',\n defaultSeverity: 'info',\n run(doc) {\n const results: ReturnType<LintRule['run']> = [];\n\n visit(doc, (node) => {\n if (node.type !== 'bulletList' && node.type !== 'orderedList') return;\n const items = (node as { content: readonly ListItemNode[] }).content;\n\n let runVerb: string | undefined;\n let runLength = 0;\n\n for (let i = 0; i <= items.length; i++) {\n const verb = i < items.length ? getLeadingVerb(items[i]) : undefined;\n if (verb && verb === runVerb) {\n runLength++;\n } else {\n if (runVerb && runLength >= 2) {\n results.push({\n ruleId: 'consecutive-mergeable-actions',\n severity: 'info' as const,\n message: `${runLength} consecutive \"${runVerb}\" items could be merged`,\n suggestion: `Consider combining the consecutive \"${runVerb}\" steps into a single step`,\n });\n }\n runVerb = verb;\n runLength = 1;\n }\n }\n });\n\n return results;\n },\n};\n","import { duplicateJumpPoints } from './duplicateJumpPoints';\nimport { jumpPointRefValidity } from './jumpPointRefValidity';\nimport { consecutiveMergeableActions } from './consecutiveMergeableActions';\nimport type { LintRule } from '../types';\n\nexport const defaultRules: readonly LintRule[] = [\n duplicateJumpPoints,\n jumpPointRefValidity,\n consecutiveMergeableActions,\n];\n\nexport { duplicateJumpPoints, jumpPointRefValidity, consecutiveMergeableActions };\n","import type { DocumentNode, BlockNode, HeadingNode } from '../ast/types';\nimport { textContent } from '../ast/traverse';\nimport type { LintSection } from './types';\n\nfunction isHeading(node: BlockNode): node is HeadingNode {\n return node.type === 'heading';\n}\n\n/**\n * Splits a document into sections by heading boundaries.\n * Each section contains the heading text, its path in the heading hierarchy,\n * the full text content, and the block index range.\n */\nexport function chunkByHeading(doc: DocumentNode): LintSection[] {\n const blocks = doc.content;\n const sections: LintSection[] = [];\n const headingStack: string[] = [];\n\n let currentHeading = '(intro)';\n let currentPath: string[] = [];\n let sectionStart = 0;\n let sectionTexts: string[] = [];\n\n function flush(end: number) {\n if (sectionTexts.length > 0 || sectionStart < end) {\n sections.push({\n heading: currentHeading,\n headingPath: [...currentPath],\n text: sectionTexts.join('\\n'),\n blockRange: [sectionStart, end],\n });\n }\n sectionTexts = [];\n }\n\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n\n if (isHeading(block)) {\n flush(i);\n const level = block.level;\n const headingText = textContent(block);\n\n // Update heading stack for hierarchy tracking\n while (headingStack.length >= level) {\n headingStack.pop();\n }\n headingStack.push(headingText);\n\n currentHeading = headingText;\n currentPath = [...headingStack];\n sectionStart = i;\n sectionTexts.push(textContent(block));\n } else {\n sectionTexts.push(textContent(block));\n }\n }\n\n flush(blocks.length);\n return sections;\n}\n","import type { DocumentNode } from '../ast/types';\nimport type { LintContext, LintResult, LlmCompletionEndpoint, LlmLintRule } from './types';\nimport type { LintRule } from './types';\nimport { lint } from './runner';\nimport { chunkByHeading } from './chunker';\n\nexport interface LintAsyncOptions {\n rules?: readonly LintRule[];\n llmRules?: readonly LlmLintRule[];\n llmEndpoint?: LlmCompletionEndpoint;\n ctx?: LintContext;\n signal?: AbortSignal;\n onProgress?: (completed: number, total: number) => void;\n}\n\n/**\n * Runs both static lint rules and LLM-based lint rules.\n * Static rules run synchronously first, then LLM rules run per-section sequentially.\n * Returns all results combined.\n */\nexport async function lintAsync(\n doc: DocumentNode,\n options: LintAsyncOptions,\n): Promise<LintResult[]> {\n const { rules = [], llmRules = [], llmEndpoint, ctx = {}, signal, onProgress } = options;\n\n // 1. Run static rules synchronously\n const staticResults = lint(doc, rules, ctx);\n\n // 2. If no LLM rules or no endpoint, return static results only\n if (llmRules.length === 0 || !llmEndpoint) {\n return staticResults;\n }\n\n const disabled = new Set(ctx.disabledRules);\n const activeRules = llmRules.filter((r) => !disabled.has(r.id));\n if (activeRules.length === 0) return staticResults;\n\n // 3. Chunk document into sections\n const sections = chunkByHeading(doc);\n const totalTasks = activeRules.length * sections.length;\n let completed = 0;\n\n // 4. Run LLM rules per section sequentially to avoid rate limiting\n const llmResults: LintResult[] = [];\n\n for (const rule of activeRules) {\n const severity = ctx.severityOverrides?.[rule.id] ?? rule.defaultSeverity;\n\n for (const section of sections) {\n if (signal?.aborted) break;\n\n try {\n const prompt = rule.buildPrompt(section);\n const response = await llmEndpoint(prompt, { signal });\n const results = rule.parseResponse(response, section);\n\n for (const r of results) {\n llmResults.push(r.severity === severity ? r : { ...r, severity });\n }\n } catch (err) {\n if (signal?.aborted) break;\n // Non-fatal: log and continue with other sections/rules\n console.warn(`[lint] LLM rule \"${rule.id}\" failed on section \"${section.heading}\":`, err);\n }\n\n completed++;\n onProgress?.(completed, totalTasks);\n }\n }\n\n return [...staticResults, ...llmResults];\n}\n","import type { LintResult, LintSeverity } from '../../types';\n\nexport function parseIssueLines(\n response: string,\n ruleId: string,\n severity: LintSeverity,\n heading: string,\n): LintResult[] {\n const trimmed = response.trim();\n if (trimmed === 'OK' || trimmed === '') return [];\n\n const results: LintResult[] = [];\n for (const line of trimmed.split('\\n')) {\n const match = /^ISSUE:\\s*(.+)$/i.exec(line.trim());\n if (match) {\n results.push({\n ruleId,\n severity,\n message: `[${heading}] ${match[1]}`,\n });\n }\n }\n return results;\n}\n","import type { LlmLintRule } from '../../types';\nimport { parseIssueLines } from './parseIssueLines';\n\nexport const repetitionDetection: LlmLintRule = {\n id: 'llm-repetition',\n description: 'Detects repetitive or redundant instructions within a section',\n defaultSeverity: 'warning',\n buildPrompt(section) {\n return `You are an actionbook linter. Analyze the following section for repetitive or redundant instructions.\nIf you find issues, respond with one line per issue in the format: ISSUE: <description>\nIf there are no issues, respond with: OK\n\nSection \"${section.heading}\":\n${section.text}`;\n },\n parseResponse(response, section) {\n return parseIssueLines(response, 'llm-repetition', 'warning', section.heading);\n },\n};\n","import type { LlmLintRule } from '../../types';\nimport { parseIssueLines } from './parseIssueLines';\n\nexport const koreanVerbFirst: LlmLintRule = {\n id: 'llm-korean-verb-first',\n description: 'Checks that Korean action items start with an action verb (e.g., \"확인한다\", \"전송한다\")',\n defaultSeverity: 'info',\n buildPrompt(section) {\n return `You are an actionbook linter for Korean-language documents. Check if action/instruction items in this section follow the \"verb-first\" pattern (e.g., starting with action verbs like \"확인한다\", \"전송한다\", \"응답한다\").\nIf you find items that don't follow this pattern, respond with one line per issue: ISSUE: <description>\nIf all items are fine or there are no Korean action items, respond with: OK\n\nSection \"${section.heading}\":\n${section.text}`;\n },\n parseResponse(response, section) {\n return parseIssueLines(response, 'llm-korean-verb-first', 'info', section.heading);\n },\n};\n","import type { LlmLintRule } from '../../types';\nimport { parseIssueLines } from './parseIssueLines';\n\nexport const conditionGrounding: LlmLintRule = {\n id: 'llm-condition-grounding',\n description: 'Checks that conditional branches (if/else) reference concrete, observable conditions',\n defaultSeverity: 'warning',\n buildPrompt(section) {\n return `You are an actionbook linter. Check if any conditional instructions (if/else, when, in case of) in this section reference vague or ungrounded conditions instead of concrete, observable states.\nExamples of vague conditions: \"if appropriate\", \"when needed\", \"if possible\"\nExamples of grounded conditions: \"if the user's subscription is active\", \"when the API returns 404\"\nIf you find issues, respond with one line per issue: ISSUE: <description>\nIf there are no issues or no conditionals, respond with: OK\n\nSection \"${section.heading}\":\n${section.text}`;\n },\n parseResponse(response, section) {\n return parseIssueLines(response, 'llm-condition-grounding', 'warning', section.heading);\n },\n};\n","import { repetitionDetection } from './repetitionDetection';\nimport { koreanVerbFirst } from './koreanVerbFirst';\nimport { conditionGrounding } from './conditionGrounding';\nimport type { LlmLintRule } from '../../types';\n\nexport const defaultLlmRules: readonly LlmLintRule[] = [\n repetitionDetection,\n koreanVerbFirst,\n conditionGrounding,\n];\n\nexport { repetitionDetection, koreanVerbFirst, conditionGrounding };\nexport { parseIssueLines } from './parseIssueLines';\n","import type { DocumentNode, ResourceTagNode } from '../ast/types';\nimport { findAll } from '../ast/traverse';\n\nexport function extractResourceTags(doc: DocumentNode): ResourceTagNode[] {\n return findAll(doc, (n) => n.type === 'resourceTag') as ResourceTagNode[];\n}\n","import type { DocumentNode, JumpPointNode } from '../ast/types';\nimport { findAll } from '../ast/traverse';\n\nexport function findDuplicateJumpPoints(doc: DocumentNode): string[] {\n const jumpPoints = findAll(doc, (n) => n.type === 'jumpPoint') as JumpPointNode[];\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n\n for (const jp of jumpPoints) {\n if (seen.has(jp.id)) {\n duplicates.add(jp.id);\n }\n seen.add(jp.id);\n }\n\n return Array.from(duplicates);\n}\n","/**\n * Extract a hierarchical tree structure from a DocumentNode for the preview tree view.\n *\n * Walks the AST and produces a tree of:\n * - Headings (H1/H2 as sections, H3-H6 as subsections)\n * - Jump points with their IDs\n * - Jinja if blocks with condition branches\n * - Resource tags (tool, handoff, etc.)\n */\nimport type { DocumentNode, BlockNode, InlineNode } from '../ast/types';\nimport { textContent } from '../ast/traverse';\nimport { analyzeJinjaBlocks } from '../jinja/analyzer';\n\nconst MAX_DEPTH = 128;\n\nexport type DocumentTreeNodeType =\n | 'heading'\n | 'jumpPoint'\n | 'jinjaIf'\n | 'jinjaBranch'\n | 'resourceTag'\n | 'noteBlock'\n | 'endAction';\n\nexport interface DocumentTreeNode {\n readonly type: DocumentTreeNodeType;\n readonly label: string;\n readonly blockIndex: number;\n readonly children: readonly DocumentTreeNode[];\n readonly meta?: Record<string, unknown>;\n}\n\n/** Resource IDs that represent \"end action\" tools (close conversation, etc.). */\nconst END_ACTION_RESOURCE_IDS = new Set([\n 'close-happy-tiger', // PredefinedToolKey.CloseConversation\n]);\n\n/** Text labels that indicate an end action (fallback when resourceId doesn't match). */\nconst END_ACTION_TEXTS = new Set([\n 'end conversation',\n 'end_conversation',\n]);\n\nfunction isEndActionTag(tagType: string, resourceId: string, text: string): boolean {\n return tagType === 'handoff'\n || END_ACTION_RESOURCE_IDS.has(resourceId)\n || END_ACTION_TEXTS.has(text.toLowerCase());\n}\n\nfunction extractInlineItems(\n content: readonly InlineNode[],\n blockIndex: number,\n): DocumentTreeNode[] {\n const items: DocumentTreeNode[] = [];\n for (const node of content) {\n if (node.type === 'jumpPoint') {\n items.push({\n type: 'jumpPoint',\n label: node.id,\n blockIndex,\n children: [],\n });\n } else if (node.type === 'resourceTag') {\n const endAction = isEndActionTag(node.tagType, node.resourceId, node.text);\n items.push({\n type: endAction ? 'endAction' : 'resourceTag',\n label: endAction ? `End ${node.text}` : node.text,\n blockIndex,\n children: [],\n meta: { tagType: node.tagType, resourceId: node.resourceId },\n });\n }\n }\n return items;\n}\n\nfunction extractBlockItems(\n blocks: readonly BlockNode[],\n startIndex: number,\n depth: number,\n): DocumentTreeNode[] {\n if (depth > MAX_DEPTH) return [];\n\n const items: DocumentTreeNode[] = [];\n\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n const blockIndex = startIndex + i;\n\n switch (block.type) {\n case 'heading': {\n const label = textContent(block) || `Heading ${block.level}`;\n const inlineItems = extractInlineItems(block.content, blockIndex);\n items.push({\n type: 'heading',\n label,\n blockIndex,\n children: inlineItems,\n meta: { level: block.level },\n });\n break;\n }\n\n case 'paragraph': {\n const inlineItems = extractInlineItems(block.content, blockIndex);\n items.push(...inlineItems);\n break;\n }\n\n case 'jinjaIfBlock': {\n const branches: DocumentTreeNode[] = block.branches.map((branch, branchIdx) => {\n const branchLabel =\n branch.branchType === 'else'\n ? 'ELSE'\n : `${branch.branchType.toUpperCase()} ${branch.condition || ''}`.trim();\n const branchChildren = extractBlockItems(branch.content, blockIndex, depth + 1);\n return {\n type: 'jinjaBranch' as const,\n label: branchLabel,\n blockIndex,\n children: branchChildren,\n meta: { branchIndex: branchIdx },\n };\n });\n\n items.push({\n type: 'jinjaIf',\n label: 'Jinja if',\n blockIndex,\n children: branches,\n });\n break;\n }\n\n case 'noteBlock': {\n const noteContent = textContent(block);\n items.push({\n type: 'noteBlock',\n label: noteContent ? `Note: ${noteContent.slice(0, 30)}` : 'Note',\n blockIndex,\n children: [],\n });\n break;\n }\n\n case 'bulletList':\n case 'orderedList': {\n for (const li of block.content) {\n const childItems = extractBlockItems(li.content, blockIndex, depth + 1);\n items.push(...childItems);\n }\n break;\n }\n\n case 'blockquote': {\n const childItems = extractBlockItems(block.content, blockIndex, depth + 1);\n items.push(...childItems);\n break;\n }\n\n default:\n break;\n }\n }\n\n return items;\n}\n\n/**\n * Build a document outline tree from a DocumentNode.\n * Extracts both structured jinjaIfBlock nodes and text-based {% if %} patterns.\n */\nexport function buildDocumentTree(doc: DocumentNode): DocumentTreeNode[] {\n const items = extractBlockItems(doc.content, 0, 0);\n\n // Also detect text-based Jinja ({% if %} stored as plain text in paragraphs)\n try {\n const structures = analyzeJinjaBlocks(doc);\n if (structures.length > 0) {\n // Only add text-based Jinja if no structured jinjaIf was already found\n const hasStructuredJinja = items.some((n) => n.type === 'jinjaIf');\n if (!hasStructuredJinja) {\n for (const s of structures) {\n const branches: DocumentTreeNode[] = s.branches.map((b, branchIdx) => ({\n type: 'jinjaBranch' as const,\n label: b.type === 'else' ? 'ELSE' : `${b.type.toUpperCase()} ${b.condition || ''}`.trim(),\n blockIndex: b.tagBlockIndex,\n children: [],\n meta: { branchIndex: branchIdx },\n }));\n\n const jinjaNode: DocumentTreeNode = {\n type: 'jinjaIf',\n label: 'Jinja if',\n blockIndex: s.ifTagBlockIndex,\n children: branches,\n };\n\n // Insert at the correct position based on blockIndex\n let inserted = false;\n for (let i = 0; i < items.length; i++) {\n if (items[i].blockIndex > s.ifTagBlockIndex) {\n items.splice(i, 0, jinjaNode);\n inserted = true;\n break;\n }\n }\n if (!inserted) items.push(jinjaNode);\n }\n }\n }\n } catch {\n // analyzeJinjaBlocks may fail on some documents — don't break the tree\n }\n\n return items;\n}\n","/**\n * Tree Generator for Actionbook Decision Trees\n *\n * Converts an actionbook-core DocumentNode AST into a decision tree\n * by exhaustively traversing all branches (Jinja and Conditional).\n *\n * Port of aidebugger's treeGenerator.js, adapted for the actionbook-core\n * AST model (block-level nodes instead of line-level parsed objects).\n */\n\nimport type {\n DocumentNode,\n BlockNode,\n InlineNode,\n AstNode,\n ListItemNode,\n TextNode,\n} from '../ast/types';\nimport { textContent, visit } from '../ast/traverse';\nimport { analyzeJinjaBlocks } from '../jinja/analyzer';\nimport type { JinjaVisualStructure } from '../jinja/analyzer';\nimport type {\n DecisionTree,\n TreeNode,\n TreeNodeLine,\n TreeNodeClassification,\n GotoEdge,\n} from './types';\n\n// ── Helpers ──────────────────────────────────────────────\n\nlet nodeIdCounter = 0;\nfunction generateNodeId(): string {\n return `node_${++nodeIdCounter}`;\n}\n\ninterface BlockMeta {\n toolIds: string[];\n jumpTargets: string[];\n hasHandoff: boolean;\n}\n\n/**\n * Single-pass extraction of all metadata from a block node.\n * Replaces separate extractToolIds / extractJumpTargets / hasResourceTag calls.\n */\nfunction extractBlockMeta(block: AstNode): BlockMeta {\n const toolIds: string[] = [];\n const jumpTargets: string[] = [];\n let hasHandoff = false;\n\n visit(block, (node) => {\n if (node.type === 'resourceTag') {\n const n = node as any;\n if (n.tagType === 'tool') toolIds.push(n.resourceId as string);\n if (n.tagType === 'handoff') hasHandoff = true;\n } else if (node.type === 'jumpPoint') {\n jumpTargets.push((node as any).id as string);\n } else if (node.type === 'text') {\n const marks = (node as TextNode).marks;\n if (marks) {\n for (const m of marks) {\n if (m.type === 'link' && m.href.startsWith('#')) {\n jumpTargets.push(m.href.slice(1));\n }\n }\n }\n }\n }, { trackPath: false });\n\n return { toolIds, jumpTargets, hasHandoff };\n}\n\nfunction inlineSummary(content: readonly InlineNode[], maxLen = 80): string {\n const parts: string[] = [];\n for (const node of content) {\n if (node.type === 'text') {\n const linkMark = node.marks?.find((m) => m.type === 'link' && m.href.startsWith('#'));\n if (linkMark && linkMark.type === 'link') {\n parts.push(`[${node.text}](${linkMark.href})`);\n } else {\n parts.push(node.text);\n }\n } else if (node.type === 'resourceTag') {\n parts.push(`{{${node.tagType}:${node.resourceId}:${node.text}}}`);\n } else if (node.type === 'jumpPoint') {\n parts.push(`^${node.id}^`);\n }\n }\n const s = parts.join('').trim();\n return s.length > maxLen ? s.slice(0, maxLen) + '...' : s;\n}\n\nfunction blockSummary(block: BlockNode, maxLen = 80): string {\n if (block.type === 'heading' || block.type === 'paragraph') {\n return inlineSummary(block.content, maxLen);\n }\n if (block.type === 'listItem') {\n // Use first paragraph/heading content for summary\n const first = block.content[0];\n if (first && (first.type === 'paragraph' || first.type === 'heading')) {\n return inlineSummary(first.content, maxLen);\n }\n }\n if (block.type === 'blockquote') {\n const t = '> ' + textContent(block).trim();\n return t.length > maxLen ? t.slice(0, maxLen) + '...' : t;\n }\n const t = textContent(block).trim();\n return t.length > maxLen ? t.slice(0, maxLen) + '...' : t;\n}\n\n/** Check if a list item text starts with \"If ...\" conditional pattern */\nfunction parseConditionalFromItem(item: ListItemNode): string | null {\n const first = item.content[0];\n if (!first || (first.type !== 'paragraph' && first.type !== 'heading')) return null;\n const t = inlineSummary(first.content).trim();\n const condMatch = t.match(/^(?:If|if)\\s+(.+?)(?:\\s*:)?\\s*$/);\n if (condMatch) return condMatch[1];\n if (/^(?:Else|else)\\s*:?\\s*$/.test(t)) return 'else';\n return null;\n}\n\n/**\n * Classify a content node based on its lines.\n */\nfunction classifyNode(node: TreeNode): TreeNodeClassification {\n if (node.type === 'section_entry' || node.type === 'jinja_condition' || node.type === 'conditional') {\n return 'structural';\n }\n\n const hasTools = node.lines.some((l) => l.hasToolCall);\n const hasHandoff = node.lines.some((l) => l.hasHandoff);\n const hasJump = node.lines.some((l) => l.hasJumpPoint);\n\n // Blockquote content (internal action / comment / prompt)\n const allBlockquote = node.lines.length > 0 && node.lines.every((l) => l.content.startsWith('>'));\n if (allBlockquote) return 'internal_action';\n\n if (hasHandoff) return 'agent_speech';\n if (hasTools && !hasSpeechContent(node)) return 'tool_call_only';\n if (hasTools) return 'mixed_with_speech';\n if (hasJump && !hasSpeechContent(node)) return 'agent_internal';\n\n return 'agent_speech';\n}\n\nfunction hasSpeechContent(node: TreeNode): boolean {\n for (const line of node.lines) {\n // Strip tool/handoff/manual/template tags, jump points, and link gotos from content\n const stripped = line.content\n .replace(/\\{\\{[^}]+\\}\\}/g, '')\n .replace(/\\^[\\p{L}\\p{N}_-]+\\^/gu, '')\n .replace(/\\[[^\\]]*\\]\\(#[^)]+\\)/g, '')\n .trim();\n if (stripped.length > 0) return true;\n }\n return false;\n}\n\n/**\n * Extract context variable requirements from a Jinja condition string.\n */\nfunction extractContextRequirements(conditionText: string): Record<string, string> {\n if (!conditionText) return {};\n const requirements: Record<string, string> = {};\n\n // context.X == \"Y\"\n const eqMatches = conditionText.matchAll(/(?:context[.:])(\\w+)\\s*==\\s*[\"']([^\"']+)[\"']/g);\n for (const m of eqMatches) requirements[m[1]] = m[2];\n\n // context.X != \"Y\" (need value that isn't Y)\n const neqMatches = conditionText.matchAll(/(?:context[.:])(\\w+)\\s*!=\\s*[\"']([^\"']+)[\"']/g);\n for (const m of neqMatches) {\n if (!requirements[m[1]]) requirements[m[1]] = `<valid_${m[1]}>`;\n }\n\n // context.X (truthy check)\n const existMatches = conditionText.matchAll(/(?:context[.:])(\\w+)(?=\\s+and|\\s*$|\\s+(?!==|!=|>|<|is))/g);\n for (const m of existMatches) {\n if (!requirements[m[1]]) requirements[m[1]] = `<valid_${m[1]}>`;\n }\n\n // not context.X (falsy check)\n const notMatches = conditionText.matchAll(/not\\s+(?:context[.:])(\\w+)/g);\n for (const m of notMatches) {\n if (!requirements[m[1]]) requirements[m[1]] = 'null';\n }\n\n return requirements;\n}\n\n// ── Main Generator ───────────────────────────────────────\n\nexport function generateDecisionTree(doc: DocumentNode): DecisionTree {\n nodeIdCounter = 0;\n\n const jinjaStructures = analyzeJinjaBlocks(doc);\n // Map: blockIndex → JinjaVisualStructure (for the {% if %} tag block)\n const jinjaIfMap = new Map<number, JinjaVisualStructure>();\n // Set of all block indices that belong to any jinja structure\n const jinjaBlockSet = new Set<number>();\n\n for (const s of jinjaStructures) {\n jinjaIfMap.set(s.ifTagBlockIndex, s);\n for (let i = s.ifTagBlockIndex; i <= s.endifTagBlockIndex; i++) {\n jinjaBlockSet.add(i);\n }\n }\n\n const tree: DecisionTree = {\n rootNodeId: null,\n nodes: {},\n sections: {},\n gotoEdges: [],\n statistics: { totalNodes: 0, totalPaths: 0, maxDepth: 0, branchPoints: 0, sectionCount: 0 },\n };\n\n const visitedStates = new Set<string>();\n let pendingSection: string | null = null;\n let currentAncestorConditions: Array<{ condition: string; branchType: string; blockIndex: number }> = [];\n\n function registerNode(node: TreeNode): void {\n tree.nodes[node.id] = node;\n tree.statistics.totalNodes++;\n tree.statistics.maxDepth = Math.max(tree.statistics.maxDepth, node.depth);\n if (node.type === 'content' || node.type === 'end') {\n node.classification = classifyNode(node);\n }\n }\n\n function markSectionRoot(node: TreeNode): void {\n if (pendingSection && tree.sections[pendingSection]) {\n tree.sections[pendingSection].rootNodeId = node.id;\n pendingSection = null;\n }\n }\n\n function makeNodeLine(block: BlockNode, blockIndex: number): TreeNodeLine {\n const content = blockSummary(block);\n const { toolIds, jumpTargets, hasHandoff } = extractBlockMeta(block);\n return {\n blockIndex,\n content,\n hasToolCall: toolIds.length > 0,\n toolIds,\n hasJumpPoint: jumpTargets.length > 0,\n jumpTargets,\n hasHandoff,\n };\n }\n\n // ── Traversal ────────────────────────────────────────\n\n /**\n * Traverse document blocks starting from blockIndex.\n * Returns a node ID or null. May return __multipleChildren marker.\n */\n function traverse(blockIndex: number, depth: number): string | null | { __multi: true; ids: string[] } {\n if (blockIndex >= doc.content.length || blockIndex < 0) return null;\n\n const block = doc.content[blockIndex];\n\n // Skip horizontal rules\n if (block.type === 'horizontalRule') {\n return traverse(blockIndex + 1, depth);\n }\n\n // Cycle detection\n const sig = `${blockIndex}`;\n if (visitedStates.has(sig)) return null;\n visitedStates.add(sig);\n\n // ── Heading → section boundary\n if (block.type === 'heading') {\n // Extract section name from heading text only (exclude jump points)\n const sectionName = block.content\n .filter((n) => n.type !== 'jumpPoint')\n .map((n) => n.type === 'text' ? n.text : '')\n .join('')\n .trim();\n\n if (!tree.sections[sectionName]) {\n tree.sections[sectionName] = {\n headingBlockIndex: blockIndex,\n rootNodeId: null,\n ancestorConditions: [...currentAncestorConditions],\n };\n tree.statistics.sectionCount++;\n }\n pendingSection = sectionName;\n\n return traverse(blockIndex + 1, depth);\n }\n\n // ── Jinja fork\n const jinjaStart = jinjaIfMap.get(blockIndex);\n if (jinjaStart) {\n return handleJinjaFork(jinjaStart, blockIndex, depth);\n }\n\n // Skip blocks inside jinja structure (handled by handleJinjaFork)\n if (jinjaBlockSet.has(blockIndex)) {\n return traverse(blockIndex + 1, depth);\n }\n\n // ── List with potential conditionals\n if (block.type === 'orderedList' || block.type === 'bulletList') {\n return handleList(block, blockIndex, depth);\n }\n\n // ── Blockquote\n if (block.type === 'blockquote') {\n return handleContentBlocks([blockIndex], depth);\n }\n\n // ── Paragraph (skip pure jinja tags)\n if (block.type === 'paragraph') {\n const t = textContent(block).trim();\n if (/^\\{%.*%\\}$/.test(t)) {\n return traverse(blockIndex + 1, depth);\n }\n return handleContentBlocks([blockIndex], depth);\n }\n\n // Default: skip\n return traverse(blockIndex + 1, depth);\n }\n\n // ── Jinja Fork Handler ───────────────────────────────\n\n function handleJinjaFork(\n structure: JinjaVisualStructure,\n blockIndex: number,\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n tree.statistics.branchPoints++;\n\n const savedPendingSection = pendingSection;\n if (savedPendingSection) pendingSection = null;\n\n const conditionNodeIds: string[] = [];\n\n for (const branch of structure.branches) {\n // Build condition display text\n const tagBlock = doc.content[branch.tagBlockIndex];\n const tagText = tagBlock ? textContent(tagBlock).trim() : branch.type;\n const conditionDisplay = tagText;\n const label = branch.condition\n ? `${branch.type} ${branch.condition}`\n : branch.type;\n\n const condNode: TreeNode = {\n id: generateNodeId(),\n type: 'jinja_condition',\n blockRange: { start: branch.tagBlockIndex, end: branch.tagBlockIndex },\n lines: [],\n summary: label,\n children: [],\n depth,\n conditionText: conditionDisplay,\n isJinja: true,\n branchType: branch.type,\n };\n registerNode(condNode);\n if (!savedPendingSection) markSectionRoot(condNode);\n\n // Track ancestor\n currentAncestorConditions.push({\n condition: conditionDisplay,\n branchType: branch.type,\n blockIndex: branch.tagBlockIndex,\n });\n\n // Traverse branch content (blocks between tag and next tag/endif)\n const contentStart = branch.tagBlockIndex + 1;\n const contentEnd = branch.blockEndIndex;\n\n if (contentStart < contentEnd) {\n const childResult = traverseRange(contentStart, contentEnd, depth + 1);\n attachChildren(condNode, childResult);\n }\n\n currentAncestorConditions.pop();\n conditionNodeIds.push(condNode.id);\n }\n\n // Continue after endif\n const afterEndif = structure.endifTagBlockIndex + 1;\n if (afterEndif < doc.content.length) {\n const afterResult = traverse(afterEndif, depth);\n if (afterResult) {\n for (const condId of conditionNodeIds) {\n attachContinuation(tree.nodes[condId], afterResult);\n }\n }\n }\n\n // If there was a pending section, create container\n if (savedPendingSection) {\n const container: TreeNode = {\n id: generateNodeId(),\n type: 'section_entry',\n blockRange: { start: blockIndex, end: structure.endifTagBlockIndex },\n lines: [],\n summary: `Section: ${savedPendingSection}`,\n children: conditionNodeIds,\n depth,\n isContainer: true,\n };\n registerNode(container);\n if (tree.sections[savedPendingSection]) {\n tree.sections[savedPendingSection].rootNodeId = container.id;\n }\n return container.id;\n }\n\n if (conditionNodeIds.length === 1) return conditionNodeIds[0];\n return { __multi: true, ids: conditionNodeIds };\n }\n\n // ── List Handler ─────────────────────────────────────\n\n function handleList(\n block: BlockNode & { content: readonly ListItemNode[] },\n blockIndex: number,\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n // Check if list items contain conditional branching (\"If ...\")\n const conditionalItems: Array<{ item: ListItemNode; condition: string; index: number }> = [];\n const normalItems: ListItemNode[] = [];\n\n for (let i = 0; i < block.content.length; i++) {\n const item = block.content[i];\n const cond = parseConditionalFromItem(item);\n if (cond) {\n conditionalItems.push({ item, condition: cond, index: i });\n } else {\n normalItems.push(item);\n }\n }\n\n // If there are conditional branches at this level\n if (conditionalItems.length >= 2) {\n return handleConditionalBranching(conditionalItems, blockIndex, depth);\n }\n\n // Normal list — aggregate items as content\n const lines: TreeNodeLine[] = [];\n const jumpTargetsAll: string[] = [];\n\n for (const item of block.content) {\n const line = makeNodeLine(item, blockIndex);\n lines.push(line);\n jumpTargetsAll.push(...line.jumpTargets);\n\n // Check nested lists inside item for conditionals\n const nestedBranches = findNestedConditionals(item);\n if (nestedBranches.length >= 2) {\n // Flush current content first, then emit fork\n if (lines.length > 0) {\n const contentNode = createContentNode(lines, blockIndex, blockIndex, depth, jumpTargetsAll);\n const forkResult = handleConditionalBranching(\n nestedBranches.map((b, i) => ({ item: b.item, condition: b.condition, index: i })),\n blockIndex,\n depth,\n );\n if (forkResult) attachChildren(contentNode, forkResult);\n\n // Continue after this list\n const afterResult = traverse(blockIndex + 1, depth);\n if (afterResult) attachContinuation(contentNode, afterResult);\n\n return contentNode.id;\n }\n }\n }\n\n if (lines.length === 0) {\n return traverse(blockIndex + 1, depth);\n }\n\n const contentNode = createContentNode(lines, blockIndex, blockIndex, depth, jumpTargetsAll);\n\n // Continue\n const afterResult = traverse(blockIndex + 1, depth);\n if (afterResult) attachChildren(contentNode, afterResult);\n\n return contentNode.id;\n }\n\n function findNestedConditionals(item: ListItemNode): Array<{ item: ListItemNode; condition: string }> {\n const results: Array<{ item: ListItemNode; condition: string }> = [];\n for (const child of item.content) {\n if (child.type === 'bulletList' || child.type === 'orderedList') {\n for (const subItem of child.content) {\n const cond = parseConditionalFromItem(subItem);\n if (cond) results.push({ item: subItem, condition: cond });\n }\n }\n }\n return results;\n }\n\n // ── Conditional Branching ────────────────────────────\n\n function handleConditionalBranching(\n items: Array<{ item: ListItemNode; condition: string; index: number }>,\n blockIndex: number,\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n tree.statistics.branchPoints++;\n const condNodeIds: string[] = [];\n\n for (const { item, condition } of items) {\n const condNode: TreeNode = {\n id: generateNodeId(),\n type: 'conditional',\n blockRange: { start: blockIndex, end: blockIndex },\n lines: [],\n summary: condition,\n children: [],\n depth,\n conditionText: condition,\n isJinja: false,\n };\n registerNode(condNode);\n\n // Traverse child content of this conditional item\n const childBlocks = item.content.slice(1); // Skip first paragraph (the condition itself)\n if (childBlocks.length > 0) {\n const childLines: TreeNodeLine[] = [];\n const childJumps: string[] = [];\n\n for (const childBlock of childBlocks) {\n if (childBlock.type === 'bulletList' || childBlock.type === 'orderedList') {\n for (const subItem of childBlock.content) {\n const subCond = parseConditionalFromItem(subItem);\n if (!subCond) {\n const line = makeNodeLine(subItem, blockIndex);\n childLines.push(line);\n childJumps.push(...line.jumpTargets);\n }\n }\n } else {\n const line = makeNodeLine(childBlock, blockIndex);\n childLines.push(line);\n childJumps.push(...line.jumpTargets);\n }\n }\n\n if (childLines.length > 0) {\n const contentNode = createContentNode(childLines, blockIndex, blockIndex, depth + 1, childJumps);\n condNode.children.push(contentNode.id);\n }\n }\n\n condNodeIds.push(condNode.id);\n }\n\n if (condNodeIds.length === 1) return condNodeIds[0];\n return { __multi: true, ids: condNodeIds };\n }\n\n // ── Content Blocks Handler ───────────────────────────\n\n function handleContentBlocks(\n blockIndices: number[],\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n const lines: TreeNodeLine[] = [];\n const jumpTargets: string[] = [];\n\n for (const bi of blockIndices) {\n const block = doc.content[bi];\n if (!block) continue;\n const line = makeNodeLine(block, bi);\n lines.push(line);\n jumpTargets.push(...line.jumpTargets);\n }\n\n if (lines.length === 0) return null;\n\n const startBlock = blockIndices[0];\n const endBlock = blockIndices[blockIndices.length - 1];\n const contentNode = createContentNode(lines, startBlock, endBlock, depth, jumpTargets);\n\n // Continue after last block\n const afterResult = traverse(endBlock + 1, depth);\n if (afterResult) attachChildren(contentNode, afterResult);\n\n return contentNode.id;\n }\n\n function createContentNode(\n lines: TreeNodeLine[],\n startBlock: number,\n endBlock: number,\n depth: number,\n jumpTargets: string[],\n ): TreeNode {\n const node: TreeNode = {\n id: generateNodeId(),\n type: 'content',\n blockRange: { start: startBlock, end: endBlock },\n lines,\n summary: lines[0]?.content.slice(0, 60) + (lines.length > 1 ? ` (+${lines.length - 1} more)` : ''),\n children: [],\n depth,\n };\n\n registerNode(node);\n markSectionRoot(node);\n\n // Handle jump points → goto edges\n if (jumpTargets.length > 0) {\n for (const target of jumpTargets) {\n node.gotoTarget = target;\n node.hasGotoEdge = true;\n tree.gotoEdges.push({ fromNodeId: node.id, toSection: target });\n }\n }\n\n return node;\n }\n\n // ── Traverse Range ───────────────────────────────────\n\n function traverseRange(\n startBlock: number,\n endBlock: number,\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n // Process blocks within [startBlock, endBlock) independently.\n // Does NOT call traverse() or handleContentBlocks() to avoid\n // escaping the range boundary via continuation traversal.\n let firstResult: string | null | { __multi: true; ids: string[] } = null;\n let lastNodeId: string | null = null;\n\n for (let i = startBlock; i < endBlock; i++) {\n const block = doc.content[i];\n if (!block) continue;\n\n // Skip horizontal rules\n if (block.type === 'horizontalRule') continue;\n\n let result: string | null | { __multi: true; ids: string[] } = null;\n\n if (block.type === 'heading') {\n const headingName = block.content\n .filter((n) => n.type !== 'jumpPoint')\n .map((n) => n.type === 'text' ? n.text : '')\n .join('')\n .trim();\n if (!tree.sections[headingName]) {\n tree.sections[headingName] = {\n headingBlockIndex: i,\n rootNodeId: null,\n ancestorConditions: [...currentAncestorConditions],\n };\n tree.statistics.sectionCount++;\n }\n pendingSection = headingName;\n continue;\n }\n\n // Skip jinja tags ({% if %}, {% elif %}, {% else %}, {% endif %})\n if (block.type === 'paragraph') {\n const t = textContent(block).trim();\n if (/^\\{%.*%\\}$/.test(t)) continue;\n }\n\n // Handle nested jinja structures within range\n const jinjaStart = jinjaIfMap.get(i);\n if (jinjaStart && jinjaStart.endifTagBlockIndex < endBlock) {\n result = handleJinjaFork(jinjaStart, i, depth);\n i = jinjaStart.endifTagBlockIndex; // Skip past endif\n } else if (block.type === 'orderedList' || block.type === 'bulletList') {\n // Process list directly without continuation (stay in range)\n result = handleListInRange(block as any, i, depth);\n } else if (block.type === 'paragraph' || block.type === 'blockquote') {\n // Create content node without continuation\n const line = makeNodeLine(block, i);\n const jumpTargets = line.jumpTargets;\n const contentNode = createContentNode([line], i, i, depth, jumpTargets);\n result = contentNode.id;\n }\n\n if (result) {\n const ids = typeof result === 'string' ? [result]\n : result && '__multi' in result ? result.ids\n : [];\n\n if (!firstResult) {\n firstResult = result;\n } else if (lastNodeId) {\n // Chain: attach result to last node\n for (const id of ids) {\n const lastNode = tree.nodes[lastNodeId];\n if (lastNode && !lastNode.hasGotoEdge) {\n lastNode.children.push(id);\n }\n }\n }\n\n // Track last node for chaining\n if (ids.length > 0) {\n lastNodeId = findLeafNodeId(ids[ids.length - 1]);\n }\n }\n }\n\n return firstResult;\n }\n\n /**\n * handleList variant for use inside traverseRange.\n * Does NOT call traverse() for continuation — the caller handles chaining.\n */\n function handleListInRange(\n block: BlockNode & { content: readonly ListItemNode[] },\n blockIndex: number,\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n // Check if list items contain conditional branching (\"If ...\")\n const conditionalItems: Array<{ item: ListItemNode; condition: string; index: number }> = [];\n\n for (let i = 0; i < block.content.length; i++) {\n const item = block.content[i];\n const cond = parseConditionalFromItem(item);\n if (cond) {\n conditionalItems.push({ item, condition: cond, index: i });\n }\n }\n\n if (conditionalItems.length >= 2) {\n return handleConditionalBranching(conditionalItems, blockIndex, depth);\n }\n\n // Normal list\n const lines: TreeNodeLine[] = [];\n const jumpTargetsAll: string[] = [];\n\n for (const item of block.content) {\n const line = makeNodeLine(item, blockIndex);\n lines.push(line);\n jumpTargetsAll.push(...line.jumpTargets);\n\n const nestedBranches = findNestedConditionals(item);\n if (nestedBranches.length >= 2) {\n if (lines.length > 0) {\n const contentNode = createContentNode(lines, blockIndex, blockIndex, depth, jumpTargetsAll);\n const forkResult = handleConditionalBranching(\n nestedBranches.map((b, i) => ({ item: b.item, condition: b.condition, index: i })),\n blockIndex,\n depth,\n );\n if (forkResult) attachChildren(contentNode, forkResult);\n return contentNode.id;\n }\n }\n }\n\n if (lines.length === 0) return null;\n\n return createContentNode(lines, blockIndex, blockIndex, depth, jumpTargetsAll).id;\n }\n\n function findLeafNodeId(nodeId: string): string {\n const node = tree.nodes[nodeId];\n if (!node || node.children.length === 0 || node.hasGotoEdge) return nodeId;\n return findLeafNodeId(node.children[node.children.length - 1]);\n }\n\n // ── Attach helpers ───────────────────────────────────\n\n function attachChildren(\n parent: TreeNode,\n result: string | null | { __multi: true; ids: string[] },\n ): void {\n if (!result) return;\n if (typeof result === 'string') {\n parent.children.push(result);\n } else if ('__multi' in result) {\n parent.children.push(...result.ids);\n }\n }\n\n function attachContinuation(\n node: TreeNode,\n result: string | null | { __multi: true; ids: string[] },\n ): void {\n if (!result) return;\n const ids = typeof result === 'string' ? [result]\n : '__multi' in result ? result.ids\n : [];\n if (ids.length === 0) return;\n\n // Attach to all leaf nodes\n attachContinuationToLeaves(node, ids);\n }\n\n function attachContinuationToLeaves(node: TreeNode, continuationIds: string[]): void {\n if (node.children.length === 0) {\n if (node.type !== 'end' && !node.hasGotoEdge) {\n node.children.push(...continuationIds);\n }\n } else {\n for (const childId of node.children) {\n const child = tree.nodes[childId];\n if (child) attachContinuationToLeaves(child, continuationIds);\n }\n }\n }\n\n // ── Mark end nodes ───────────────────────────────────\n\n function markEndNodes(): void {\n for (const node of Object.values(tree.nodes)) {\n if (node.type === 'content' && node.children.length === 0 && !node.hasGotoEdge) {\n node.type = 'end';\n }\n }\n }\n\n // ── Main execution ───────────────────────────────────\n\n const result = traverse(0, 0);\n markEndNodes();\n\n if (result) {\n if (typeof result === 'string') {\n tree.rootNodeId = result;\n } else if ('__multi' in result) {\n // Create container\n const container: TreeNode = {\n id: generateNodeId(),\n type: 'section_entry',\n blockRange: { start: 0, end: 0 },\n lines: [],\n summary: 'Root',\n children: result.ids,\n depth: 0,\n isContainer: true,\n };\n registerNode(container);\n tree.rootNodeId = container.id;\n }\n }\n\n // Resolve section roots for sections that weren't visited\n for (const [name, section] of Object.entries(tree.sections)) {\n if (section.rootNodeId) continue;\n\n visitedStates.clear();\n pendingSection = name;\n\n const startBlock = section.headingBlockIndex + 1;\n if (startBlock < doc.content.length) {\n const sectionResult = traverse(startBlock, 0);\n if (sectionResult) {\n if (typeof sectionResult === 'string') {\n section.rootNodeId = sectionResult;\n } else if ('__multi' in sectionResult) {\n const container: TreeNode = {\n id: generateNodeId(),\n type: 'section_entry',\n blockRange: { start: startBlock, end: startBlock },\n lines: [],\n summary: `Section: ${name}`,\n children: sectionResult.ids,\n depth: 0,\n isContainer: true,\n };\n registerNode(container);\n section.rootNodeId = container.id;\n }\n }\n }\n }\n\n markEndNodes();\n\n // Count paths\n tree.statistics.totalPaths = countPaths(tree);\n\n return tree;\n}\n\n// ── Path Counting ────────────────────────────────────────\n\nfunction countPathsFromNode(tree: DecisionTree, nodeId: string, visited: Set<string>): number {\n if (visited.has(nodeId)) return 0;\n visited.add(nodeId);\n\n const node = tree.nodes[nodeId];\n if (!node) return 0;\n if (node.children.length === 0) {\n visited.delete(nodeId);\n return 1;\n }\n\n let total = 0;\n for (const childId of node.children) {\n total += countPathsFromNode(tree, childId, visited);\n }\n visited.delete(nodeId);\n return total;\n}\n\nfunction countPaths(tree: DecisionTree): number {\n if (!tree.rootNodeId) return 0;\n return countPathsFromNode(tree, tree.rootNodeId, new Set());\n}\n\n// ── Path Enumeration ─────────────────────────────────────\n\nimport type { TreePath, BranchDecision } from './types';\n\nexport function enumeratePaths(\n tree: DecisionTree,\n options: { startSection?: string; followGotoEdges?: boolean } = {},\n): TreePath[] {\n const { startSection, followGotoEdges = true } = options;\n const paths: TreePath[] = [];\n const visitedInPath = new Set<string>();\n\n function dfs(\n nodeId: string,\n currentPath: string[],\n sectionSeq: string[],\n decisions: BranchDecision[],\n ctxReqs: Record<string, string>,\n ): void {\n const node = tree.nodes[nodeId];\n if (!node) return;\n\n if (visitedInPath.has(nodeId)) {\n paths.push({\n nodeIds: [...currentPath],\n sectionSequence: [...sectionSeq],\n branchDecisions: [...decisions],\n contextRequirements: { ...ctxReqs },\n terminationReason: 'cycle',\n cycleNodeId: nodeId,\n });\n return;\n }\n\n visitedInPath.add(nodeId);\n const newPath = [...currentPath, nodeId];\n let newSectionSeq = [...sectionSeq];\n let newDecisions = [...decisions];\n let newCtxReqs = { ...ctxReqs };\n\n // Track section membership\n for (const [sectionName, sectionInfo] of Object.entries(tree.sections)) {\n if (sectionInfo.rootNodeId === nodeId && !newSectionSeq.includes(sectionName)) {\n newSectionSeq.push(sectionName);\n }\n }\n\n // Record branch decisions\n if (node.type === 'jinja_condition' || node.type === 'conditional') {\n const decision: BranchDecision = {\n nodeId,\n branchType: node.type,\n condition: node.conditionText || node.summary,\n blockIndex: node.blockRange.start,\n };\n if (node.isJinja && node.conditionText) {\n const reqs = extractContextRequirements(node.conditionText);\n newCtxReqs = { ...newCtxReqs, ...reqs };\n decision.contextRequirements = reqs;\n }\n newDecisions.push(decision);\n }\n\n // Leaf node\n if (node.children.length === 0 || node.type === 'end') {\n let terminationReason: TreePath['terminationReason'] = node.type === 'end' ? 'end' : 'leaf';\n\n if (node.hasGotoEdge && node.gotoTarget) {\n terminationReason = 'goto';\n\n if (followGotoEdges && tree.sections[node.gotoTarget]) {\n const targetRootId = tree.sections[node.gotoTarget].rootNodeId;\n if (targetRootId && !visitedInPath.has(targetRootId)) {\n visitedInPath.delete(nodeId);\n dfs(targetRootId, newPath, [...newSectionSeq, node.gotoTarget], newDecisions, newCtxReqs);\n visitedInPath.add(nodeId);\n visitedInPath.delete(nodeId);\n return;\n }\n }\n\n paths.push({\n nodeIds: newPath,\n sectionSequence: newSectionSeq,\n branchDecisions: newDecisions,\n contextRequirements: newCtxReqs,\n terminationReason,\n gotoTarget: node.gotoTarget,\n });\n } else {\n paths.push({\n nodeIds: newPath,\n sectionSequence: newSectionSeq,\n branchDecisions: newDecisions,\n contextRequirements: newCtxReqs,\n terminationReason,\n });\n }\n\n visitedInPath.delete(nodeId);\n return;\n }\n\n // Continue to children\n for (const childId of node.children) {\n dfs(childId, newPath, newSectionSeq, newDecisions, newCtxReqs);\n }\n\n visitedInPath.delete(nodeId);\n }\n\n // Determine start\n let startNodeId = tree.rootNodeId;\n if (startSection && tree.sections[startSection]) {\n startNodeId = tree.sections[startSection].rootNodeId;\n }\n\n if (!startNodeId) return paths;\n\n const startSectionName = startSection\n || Object.entries(tree.sections).find(([, s]) => s.rootNodeId === tree.rootNodeId)?.[0];\n\n dfs(startNodeId, [], startSectionName ? [startSectionName] : [], [], {});\n\n return paths;\n}\n\nexport interface EnumeratePathsIterOptions {\n startSection?: string;\n followGotoEdges?: boolean;\n /** Stop after yielding this many paths (memory guard). */\n maxPaths?: number;\n /** Skip paths deeper than this node count. */\n maxDepth?: number;\n}\n\ninterface DfsFrame {\n nodeId: string;\n currentPath: string[];\n sectionSeq: string[];\n decisions: BranchDecision[];\n ctxReqs: Record<string, string>;\n childIndex: number;\n}\n\n/**\n * Generator-based streaming API for path enumeration.\n * Yields one TreePath at a time without materializing the full list.\n * Uses an explicit stack instead of recursion to avoid call-stack overflow\n * on deep trees.\n */\nexport function* enumeratePathsIter(\n tree: DecisionTree,\n options: EnumeratePathsIterOptions = {},\n): IterableIterator<TreePath> {\n const { startSection, followGotoEdges = true, maxPaths = Infinity, maxDepth = Infinity } = options;\n\n let startNodeId = tree.rootNodeId;\n if (startSection && tree.sections[startSection]) {\n startNodeId = tree.sections[startSection].rootNodeId;\n }\n if (!startNodeId) return;\n\n const startSectionName = startSection\n || Object.entries(tree.sections).find(([, s]) => s.rootNodeId === tree.rootNodeId)?.[0];\n\n const visitedInPath = new Set<string>();\n let yieldedCount = 0;\n\n // Iterative DFS using an explicit stack\n const stack: DfsFrame[] = [];\n\n function pushFrame(\n nodeId: string,\n currentPath: string[],\n sectionSeq: string[],\n decisions: BranchDecision[],\n ctxReqs: Record<string, string>,\n ): void {\n stack.push({ nodeId, currentPath, sectionSeq, decisions, ctxReqs, childIndex: 0 });\n }\n\n pushFrame(startNodeId, [], startSectionName ? [startSectionName] : [], [], {});\n\n outer: while (stack.length > 0) {\n if (yieldedCount >= maxPaths) break;\n\n const frame = stack[stack.length - 1];\n const { nodeId } = frame;\n const node = tree.nodes[nodeId];\n\n if (!node) { stack.pop(); continue; }\n\n // First visit to this frame\n if (frame.childIndex === 0) {\n if (visitedInPath.has(nodeId)) {\n // Cycle detected — emit and unwind\n yield {\n nodeIds: [...frame.currentPath],\n sectionSequence: [...frame.sectionSeq],\n branchDecisions: [...frame.decisions],\n contextRequirements: { ...frame.ctxReqs },\n terminationReason: 'cycle',\n cycleNodeId: nodeId,\n };\n yieldedCount++;\n stack.pop();\n continue;\n }\n\n if (frame.currentPath.length >= maxDepth) {\n stack.pop();\n continue;\n }\n\n visitedInPath.add(nodeId);\n frame.currentPath = [...frame.currentPath, nodeId];\n\n // Track section membership\n for (const [sectionName, sectionInfo] of Object.entries(tree.sections)) {\n if (sectionInfo.rootNodeId === nodeId && !frame.sectionSeq.includes(sectionName)) {\n frame.sectionSeq = [...frame.sectionSeq, sectionName];\n }\n }\n\n // Record branch decisions\n if (node.type === 'jinja_condition' || node.type === 'conditional') {\n const decision: BranchDecision = {\n nodeId,\n branchType: node.type,\n condition: node.conditionText || node.summary,\n blockIndex: node.blockRange.start,\n };\n if (node.isJinja && node.conditionText) {\n const reqs = extractContextRequirements(node.conditionText);\n frame.ctxReqs = { ...frame.ctxReqs, ...reqs };\n decision.contextRequirements = reqs;\n }\n frame.decisions = [...frame.decisions, decision];\n }\n\n // Leaf / end node\n if (node.children.length === 0 || node.type === 'end') {\n let terminationReason: TreePath['terminationReason'] = node.type === 'end' ? 'end' : 'leaf';\n\n if (node.hasGotoEdge && node.gotoTarget) {\n terminationReason = 'goto';\n\n if (followGotoEdges && tree.sections[node.gotoTarget]) {\n const targetRootId = tree.sections[node.gotoTarget].rootNodeId;\n if (targetRootId && !visitedInPath.has(targetRootId)) {\n visitedInPath.delete(nodeId);\n stack.pop();\n pushFrame(\n targetRootId,\n frame.currentPath,\n [...frame.sectionSeq, node.gotoTarget],\n frame.decisions,\n frame.ctxReqs,\n );\n continue outer;\n }\n }\n\n yield {\n nodeIds: frame.currentPath,\n sectionSequence: frame.sectionSeq,\n branchDecisions: frame.decisions,\n contextRequirements: frame.ctxReqs,\n terminationReason,\n gotoTarget: node.gotoTarget,\n };\n } else {\n yield {\n nodeIds: frame.currentPath,\n sectionSequence: frame.sectionSeq,\n branchDecisions: frame.decisions,\n contextRequirements: frame.ctxReqs,\n terminationReason,\n };\n }\n\n yieldedCount++;\n visitedInPath.delete(nodeId);\n stack.pop();\n continue;\n }\n }\n\n // Process next child\n if (frame.childIndex < node.children.length) {\n const childId = node.children[frame.childIndex];\n frame.childIndex++;\n pushFrame(childId, frame.currentPath, frame.sectionSeq, frame.decisions, frame.ctxReqs);\n } else {\n // All children processed — unwind\n visitedInPath.delete(nodeId);\n stack.pop();\n }\n }\n}\n\nexport function enumeratePathsBySection(tree: DecisionTree): Record<string, TreePath[]> {\n const result: Record<string, TreePath[]> = {};\n for (const sectionName of Object.keys(tree.sections)) {\n if (!tree.sections[sectionName].rootNodeId) continue;\n result[sectionName] = enumeratePaths(tree, { startSection: sectionName, followGotoEdges: false });\n }\n return result;\n}\n\n// ── Goto Entry Resolution ────────────────────────────────\n\nimport type { VariableValue } from '../jinja/types';\nimport { evaluateCondition } from '../jinja/evaluator';\n\nexport interface GotoEntryResolution {\n entryNodeIds: string[];\n targetSection: string;\n resolved: boolean;\n}\n\nexport function resolveGotoEntryPath(\n tree: DecisionTree,\n sectionName: string,\n context: Map<string, VariableValue>,\n): GotoEntryResolution | null {\n const section = tree.sections[sectionName];\n if (!section?.rootNodeId) return null;\n\n const AGENT_ACTIONS: Set<string> = new Set(['agent_speech', 'mixed_with_speech', 'tool_call_only']);\n const entryNodeIds: string[] = [];\n const visited = new Set<string>();\n let currentId: string | null = section.rootNodeId;\n\n while (currentId && !visited.has(currentId)) {\n visited.add(currentId);\n const node: TreeNode | undefined = tree.nodes[currentId];\n if (!node) break;\n\n entryNodeIds.push(currentId);\n\n // Found agent action → resolved\n if (node.classification && AGENT_ACTIONS.has(node.classification)) {\n return { entryNodeIds, targetSection: sectionName, resolved: true };\n }\n\n // Container / section_entry → pick matching jinja branch\n if (node.isContainer || node.type === 'section_entry') {\n const matchedChild = findMatchingJinjaBranch(tree, node, context);\n if (matchedChild) {\n currentId = matchedChild;\n continue;\n }\n if (node.children.length > 0) {\n currentId = node.children[0];\n continue;\n }\n break;\n }\n\n // jinja_condition → evaluate and pick child\n if (node.type === 'jinja_condition') {\n if (node.children.length > 0) {\n currentId = node.children[0];\n continue;\n }\n break;\n }\n\n // Content node → resolved\n if (node.type === 'content' || node.type === 'end') {\n return { entryNodeIds, targetSection: sectionName, resolved: true };\n }\n\n // Default: descend\n if (node.children.length > 0) {\n currentId = node.children[0];\n continue;\n }\n break;\n }\n\n return { entryNodeIds: [], targetSection: sectionName, resolved: false };\n}\n\nfunction findMatchingJinjaBranch(\n tree: DecisionTree,\n containerNode: TreeNode,\n context: Map<string, VariableValue>,\n): string | null {\n let elseChildId: string | null = null;\n\n for (const childId of containerNode.children) {\n const child = tree.nodes[childId];\n if (!child) continue;\n\n if (child.branchType === 'else') {\n elseChildId = childId;\n continue;\n }\n\n if (child.isJinja && child.conditionText) {\n // Strip {% if/elif ... %} wrapper\n let expr = child.conditionText\n .replace(/\\{%[-\\s]*(if|elif)\\s+/, '')\n .replace(/\\s*[-\\s]*%\\}/, '')\n .trim();\n\n if (expr) {\n const result = evaluateCondition(expr, context);\n if (result === true) return childId;\n }\n }\n }\n\n return elseChildId;\n}\n","import type { BlockNode, DocumentNode } from './ast/types';\nimport { parseMarkdown } from './markdown/parser';\nimport { fromProseMirrorJSON } from './compat/prosemirror';\nimport { validate } from './schema/schema';\n\ntype LogicV2 = {\n version: 2;\n instruction: string;\n editor_data?: string;\n};\n\nconst EMPTY_DOC: DocumentNode = { type: 'doc', content: [{ type: 'paragraph', content: [] }] };\n\nconst JINJA_BLOCK_TAG_RE = /^\\s*\\{%\\s*(if|elif|else|endif)\\s/m;\n\n/** Returns true when the instruction markdown contains block-level Jinja tags\n * but the AST has no jinjaIfBlock nodes (legacy data saved before jinja support). */\nfunction needsJinjaReparse(doc: DocumentNode, instruction: string | undefined): boolean {\n if (!instruction || !JINJA_BLOCK_TAG_RE.test(instruction)) return false;\n\n function hasJinjaBlock(nodes: readonly BlockNode[]): boolean {\n for (const node of nodes) {\n if ((node as { type: string }).type === 'jinjaIfBlock') return true;\n if ('content' in node && Array.isArray((node as Record<string, unknown>).content)) {\n if (hasJinjaBlock((node as Record<string, unknown>).content as BlockNode[])) return true;\n }\n }\n return false;\n }\n\n return !hasJinjaBlock(doc.content);\n}\n\nexport class ActionbookConversionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ActionbookConversionError';\n }\n}\n\nexport function actionbookToAST(manual: { logic: LogicV2 }): DocumentNode {\n const v2 = manual.logic;\n\n if (v2.editor_data) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(v2.editor_data);\n } catch {\n throw new ActionbookConversionError('Invalid editor_data JSON');\n }\n\n if (parsed === null || typeof parsed !== 'object') {\n throw new ActionbookConversionError('editor_data must be a non-null object');\n }\n\n const obj = parsed as Record<string, unknown>;\n\n if (obj.version === 3) {\n const ast = obj.ast;\n if (ast === null || typeof ast !== 'object' || (ast as Record<string, unknown>).type !== 'doc') {\n throw new ActionbookConversionError('v3 editor_data requires ast field with type \"doc\"');\n }\n const doc = ast as DocumentNode;\n const errors = validate(doc);\n if (errors.length > 0) {\n throw new ActionbookConversionError(`Schema validation failed: ${errors[0].message}`);\n }\n // Re-parse from markdown if legacy AST lacks jinja block nodes\n if (v2.instruction && needsJinjaReparse(doc, v2.instruction)) {\n return parseMarkdown(v2.instruction, { jinjaNodes: true });\n }\n return doc;\n }\n\n const doc = fromProseMirrorJSON(obj as { type?: string });\n const errors = validate(doc);\n if (errors.length > 0) {\n throw new ActionbookConversionError(`Schema validation after PM conversion failed: ${errors[0].message}`);\n }\n // Re-parse from markdown if legacy PM data lacks jinja block nodes\n if (v2.instruction && needsJinjaReparse(doc, v2.instruction)) {\n return parseMarkdown(v2.instruction, { jinjaNodes: true });\n }\n return doc;\n }\n\n if (v2.instruction) {\n return parseMarkdown(v2.instruction, { jinjaNodes: true });\n }\n\n return EMPTY_DOC;\n}\n"],"mappings":"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","names":["doc","code","code","constructs","ok","code","markdownSpace","ok","code","markdownLineEndingOrSpace","ok","code","markdownLineEndingOrSpace","strikethrough","text","ok","code","markdownLineEnding","markdownLineEndingOrSpace","markdownSpace","ok","code","markdownLineEnding","markdownSpace","markdownLineEndingOrSpace","map","table","markdownLineEnding","markdownLineEndingOrSpace","markdownSpace","ok","code","exit","exit","table","row","sizes","columnIndex","code","exit","defaultHandlers","text","text","MAX_DEPTH","ALLOWED_URL_PROTOCOLS","doc","MAX_DEPTH","text","MAX_DEPTH","MAX_DEPTH","defaultHandlers","defaultHandlers","doc","doc","doc","MAX_DEPTH","ALLOWED_URL_PROTOCOLS","text","textContent","blocks","doc","errors","doc","children","text","doc","KEYWORDS","KEYWORDS","text","doc","doc","doc","doc","m","doc","doc","doc","heading","doc","doc","MAX_DEPTH","text","doc","t","doc","contentNode","afterResult","result","doc","errors"]}
|
|
1
|
+
{"version":3,"sources":["../src/ast/types.ts","../src/ast/builders.ts","../src/ast/traverse.ts","../src/ast/predicates.ts","../src/ast/path.ts","../src/schema/schema.ts","../src/markdown/parser.ts","../node_modules/micromark-util-chunked/index.js","../node_modules/micromark-util-combine-extensions/index.js","../node_modules/micromark-util-classify-character/index.js","../node_modules/micromark-util-resolve-all/index.js","../node_modules/micromark-factory-space/index.js","../node_modules/micromark-core-commonmark/lib/blank-line.js","../node_modules/micromark-util-normalize-identifier/index.js","../node_modules/micromark-extension-gfm-footnote/lib/syntax.js","../node_modules/micromark-extension-gfm-strikethrough/lib/syntax.js","../node_modules/micromark-extension-gfm-table/lib/syntax.js","../node_modules/micromark-extension-gfm-table/lib/edit-map.js","../node_modules/micromark-extension-gfm-table/lib/infer.js","../node_modules/micromark-extension-gfm-task-list-item/lib/syntax.js","../node_modules/devlop/lib/default.js","../node_modules/mdast-util-gfm-footnote/lib/index.js","../node_modules/mdast-util-gfm-strikethrough/lib/index.js","../node_modules/markdown-table/index.js","../node_modules/mdast-util-gfm-table/lib/index.js","../node_modules/mdast-util-gfm-task-list-item/lib/index.js","../src/markdown/plugins/resourceTag.ts","../src/markdown/plugins/jumpPoint.ts","../src/markdown/mdastAdapter.ts","../src/markdown/plugins/jinjaBlock.ts","../src/markdown/serializer.ts","../src/markdown/fragment.ts","../src/json/serialize.ts","../src/compat/prosemirror.ts","../src/json/deserialize.ts","../src/operations/apply.ts","../src/jinja/scanner.ts","../src/jinja/structurer.ts","../src/jinja/analyzer.ts","../src/jinja/variableExtractor.ts","../src/jinja/evaluator.ts","../src/jinja/conditionHighlighter.ts","../src/jinja/evaluateNodes.ts","../src/lint/runner.ts","../src/lint/rules/duplicateJumpPoints.ts","../src/lint/rules/jumpPointRefValidity.ts","../src/lint/rules/consecutiveMergeableActions.ts","../src/lint/rules/index.ts","../src/lint/chunker.ts","../src/lint/llmRunner.ts","../src/lint/rules/llm/parseIssueLines.ts","../src/lint/rules/llm/repetitionDetection.ts","../src/lint/rules/llm/koreanVerbFirst.ts","../src/lint/rules/llm/conditionGrounding.ts","../src/lint/rules/llm/index.ts","../src/utils/resourceTags.ts","../src/utils/jumpPointDuplicate.ts","../src/tree/documentTree.ts","../src/tree/generator.ts","../src/actionbookToAST.ts"],"sourcesContent":["// === Marks (인라인 서식) ===\nexport type BoldMark = { readonly type: 'bold' };\nexport type ItalicMark = { readonly type: 'italic' };\nexport type UnderlineMark = { readonly type: 'underline' };\nexport type StrikethroughMark = { readonly type: 'strikethrough' };\nexport type CodeMark = { readonly type: 'code' };\nexport type LinkMark = { readonly type: 'link'; readonly href: string; readonly title?: string };\nexport type Mark = BoldMark | ItalicMark | UnderlineMark | StrikethroughMark | CodeMark | LinkMark;\n\n// === Resource tag type values ===\nexport const RESOURCE_TAG_TYPES = ['tool', 'manual', 'agent_message_template', 'handoff', 'time_diff', 'time_difference'] as const;\nexport type ResourceTagType = (typeof RESOURCE_TAG_TYPES)[number];\n\n// === Inline Nodes ===\nexport type TextNode = {\n readonly type: 'text';\n readonly text: string;\n readonly marks?: readonly Mark[];\n};\n\nexport type ResourceTagNode = {\n readonly type: 'resourceTag';\n readonly tagType: ResourceTagType;\n readonly resourceId: string;\n readonly text: string;\n};\n\nexport type JumpPointNode = {\n readonly type: 'jumpPoint';\n readonly id: string; // /^[\\p{L}\\p{N}_-]+$/u\n};\n\nexport type HardBreakNode = { readonly type: 'hardBreak' };\n\n// === Jinja If (Inline) ===\nexport type JinjaIfBranch<T> = {\n readonly branchType: 'if' | 'elif' | 'else';\n readonly condition?: string;\n readonly content: readonly T[];\n};\n\nexport type JinjaIfInlineNode = {\n readonly type: 'jinjaIfInline';\n readonly branches: readonly JinjaIfBranch<InlineNode>[];\n};\n\nexport type InlineNode = TextNode | ResourceTagNode | JumpPointNode | HardBreakNode | JinjaIfInlineNode;\n\n// === Block Nodes ===\nexport type ParagraphNode = {\n readonly type: 'paragraph';\n readonly content: readonly InlineNode[];\n};\n\nexport type HeadingNode = {\n readonly type: 'heading';\n readonly level: 1 | 2 | 3 | 4 | 5 | 6;\n readonly content: readonly InlineNode[];\n};\n\nexport type ListItemNode = {\n readonly type: 'listItem';\n readonly checked?: boolean | null;\n readonly value?: number | null;\n readonly spread?: boolean;\n readonly content: readonly BlockNode[];\n};\n\nexport type BulletListNode = {\n readonly type: 'bulletList';\n readonly spread?: boolean;\n readonly content: readonly ListItemNode[];\n};\n\nexport type OrderedListNode = {\n readonly type: 'orderedList';\n readonly start: number;\n readonly spread?: boolean;\n readonly content: readonly ListItemNode[];\n};\n\nexport type BlockquoteNode = {\n readonly type: 'blockquote';\n readonly content: readonly BlockNode[];\n};\n\nexport type HorizontalRuleNode = { readonly type: 'horizontalRule' };\n\nexport type CodeBlockNode = {\n readonly type: 'codeBlock';\n readonly language?: string;\n readonly content: string;\n};\n\nexport type TableCellNode = {\n readonly type: 'tableCell';\n readonly header?: boolean;\n readonly content: readonly InlineNode[];\n};\n\nexport type TableRowNode = {\n readonly type: 'tableRow';\n readonly content: readonly TableCellNode[];\n};\n\nexport type TableNode = {\n readonly type: 'table';\n readonly content: readonly TableRowNode[];\n};\n\n// === Jinja If (Block) ===\nexport type JinjaIfBlockNode = {\n readonly type: 'jinjaIfBlock';\n readonly branches: readonly JinjaIfBranch<BlockNode>[];\n};\n\n// === Note Block (editor-only, not serialized to markdown) ===\nexport type NoteBlockNode = {\n readonly type: 'noteBlock';\n readonly content: readonly BlockNode[];\n};\n\nexport type BlockNode =\n | ParagraphNode\n | HeadingNode\n | BulletListNode\n | OrderedListNode\n | ListItemNode\n | BlockquoteNode\n | HorizontalRuleNode\n | CodeBlockNode\n | TableNode\n | JinjaIfBlockNode\n | NoteBlockNode;\n\n// === Document Root ===\nexport type DocumentNode = {\n readonly type: 'doc';\n readonly content: readonly BlockNode[];\n};\n\n// === Union ===\nexport type AstNode = DocumentNode | BlockNode | InlineNode | TableRowNode | TableCellNode;\n\n// === Node Path (향후 CRDT/undo-redo 지원) ===\nexport type NodePath = readonly number[];\n\n// === Jump point ID validation ===\nexport const JUMP_POINT_ID_PATTERN = /^[\\p{L}\\p{N}_-]+$/u;\n","import type {\n BoldMark,\n ItalicMark,\n UnderlineMark,\n StrikethroughMark,\n CodeMark,\n LinkMark,\n Mark,\n TextNode,\n ResourceTagNode,\n ResourceTagType,\n JumpPointNode,\n HardBreakNode,\n InlineNode,\n ParagraphNode,\n HeadingNode,\n BulletListNode,\n OrderedListNode,\n ListItemNode,\n BlockquoteNode,\n HorizontalRuleNode,\n CodeBlockNode,\n NoteBlockNode,\n TableCellNode,\n TableRowNode,\n TableNode,\n BlockNode,\n DocumentNode,\n JinjaIfBranch,\n JinjaIfBlockNode,\n JinjaIfInlineNode,\n} from './types';\nimport { JUMP_POINT_ID_PATTERN } from './types';\n\n// === Mark builders ===\nexport const bold = (): BoldMark => ({ type: 'bold' });\nexport const italic = (): ItalicMark => ({ type: 'italic' });\nexport const underline = (): UnderlineMark => ({ type: 'underline' });\nexport const strikethrough = (): StrikethroughMark => ({ type: 'strikethrough' });\nexport const code = (): CodeMark => ({ type: 'code' });\nexport const link = (href: string, title?: string): LinkMark =>\n title != null ? { type: 'link', href, title } : { type: 'link', href };\n\n// === Inline node builders ===\nexport const text = (t: string, marks?: Mark[]): TextNode =>\n marks && marks.length > 0 ? { type: 'text', text: t, marks } : { type: 'text', text: t };\n\nexport const resourceTag = (tagType: ResourceTagType, resourceId: string, displayText: string): ResourceTagNode => ({\n type: 'resourceTag',\n tagType,\n resourceId,\n text: displayText,\n});\n\nexport const jumpPoint = (id: string): JumpPointNode => {\n if (!JUMP_POINT_ID_PATTERN.test(id)) {\n throw new Error(`Invalid jump point ID: \"${id}\". Letters, numbers, underscore, and hyphen only.`);\n }\n return { type: 'jumpPoint', id };\n};\n\nexport const hardBreak = (): HardBreakNode => ({ type: 'hardBreak' });\n\n// === Block node builders ===\nexport const paragraph = (...content: InlineNode[]): ParagraphNode => ({\n type: 'paragraph',\n content,\n});\n\nexport const heading = (level: 1 | 2 | 3 | 4 | 5 | 6, ...content: InlineNode[]): HeadingNode => ({\n type: 'heading',\n level,\n content,\n});\n\nexport const bulletList = (...items: ListItemNode[]): BulletListNode => ({\n type: 'bulletList',\n content: items,\n});\n\nexport const orderedList = (start: number, ...items: ListItemNode[]): OrderedListNode => ({\n type: 'orderedList',\n start,\n content: items,\n});\n\nexport function listItem(...content: BlockNode[]): ListItemNode;\nexport function listItem(checked: boolean | null, ...content: BlockNode[]): ListItemNode;\nexport function listItem(first?: boolean | null | BlockNode, ...rest: BlockNode[]): ListItemNode {\n // If first arg is a BlockNode (has 'type' property), treat as content-only call\n if (first != null && typeof first === 'object' && 'type' in first) {\n return { type: 'listItem', content: [first as BlockNode, ...rest] };\n }\n const checked = first as boolean | null | undefined;\n const base: ListItemNode = { type: 'listItem', content: rest };\n if (typeof checked === 'boolean') return { ...base, checked };\n return base;\n}\n\nexport const todoItem = (checked: boolean, ...content: BlockNode[]): ListItemNode => ({\n type: 'listItem',\n checked,\n content,\n});\n\nexport const blockquote = (...content: BlockNode[]): BlockquoteNode => ({\n type: 'blockquote',\n content,\n});\n\nexport const horizontalRule = (): HorizontalRuleNode => ({ type: 'horizontalRule' });\n\nexport const codeBlock = (content: string, language?: string): CodeBlockNode => ({\n type: 'codeBlock',\n ...(language ? { language } : {}),\n content,\n});\n\nexport const noteBlock = (...content: BlockNode[]): NoteBlockNode => ({\n type: 'noteBlock',\n content,\n});\n\n// === Table builders ===\nexport const tableCell = (header: boolean, ...content: InlineNode[]): TableCellNode => ({\n type: 'tableCell',\n ...(header ? { header: true } : {}),\n content,\n});\n\nexport const tableRow = (...cells: TableCellNode[]): TableRowNode => ({\n type: 'tableRow',\n content: cells,\n});\n\nexport const table = (...rows: TableRowNode[]): TableNode => ({\n type: 'table',\n content: rows,\n});\n\n// === Jinja builders ===\nexport function jinjaBranch<T extends InlineNode | BlockNode>(\n branchType: 'if' | 'elif' | 'else',\n condition: string | undefined,\n ...content: T[]\n): JinjaIfBranch<T> {\n return condition != null\n ? { branchType, condition, content }\n : { branchType, content };\n}\n\nexport const jinjaIfBlock = (...branches: JinjaIfBranch<BlockNode>[]): JinjaIfBlockNode => ({\n type: 'jinjaIfBlock',\n branches,\n});\n\nexport const jinjaIfInline = (...branches: JinjaIfBranch<InlineNode>[]): JinjaIfInlineNode => ({\n type: 'jinjaIfInline',\n branches,\n});\n\n// === Document builder ===\nexport const doc = (...content: BlockNode[]): DocumentNode => ({\n type: 'doc',\n content,\n});\n","import type { AstNode, BlockNode, DocumentNode, InlineNode, JinjaIfBlockNode, JinjaIfInlineNode, NodePath } from './types';\n\n/**\n * Maximum recursion depth for all tree traversal functions.\n * Prevents stack overflow from maliciously deep or malformed input.\n */\nexport const MAX_DEPTH = 128;\n\nexport class TraversalDepthError extends Error {\n constructor(depth: number) {\n super(`Maximum traversal depth (${MAX_DEPTH}) exceeded at depth ${depth}`);\n this.name = 'TraversalDepthError';\n }\n}\n\nfunction getChildren(node: AstNode): readonly AstNode[] {\n switch (node.type) {\n case 'doc':\n case 'blockquote':\n case 'listItem':\n case 'noteBlock':\n return node.content;\n case 'paragraph':\n case 'heading':\n return node.content;\n case 'bulletList':\n case 'orderedList':\n return node.content;\n case 'jinjaIfBlock':\n return node.branches.flatMap(b => b.content as readonly AstNode[]);\n case 'jinjaIfInline':\n return node.branches.flatMap(b => b.content as readonly AstNode[]);\n default:\n return [];\n }\n}\n\n// Internal recursive implementation shared by visit()\nfunction visitInternal(\n node: AstNode,\n callback: (node: AstNode, parent?: AstNode, path?: NodePath) => void,\n parent: AstNode | undefined,\n path: NodePath,\n depth: number,\n trackPath: boolean,\n): void {\n if (depth > MAX_DEPTH) {\n throw new TraversalDepthError(depth);\n }\n callback(node, parent, trackPath ? path : undefined);\n const children = getChildren(node);\n for (let i = 0; i < children.length; i++) {\n const nextPath = trackPath ? [...path, i] : path;\n visitInternal(children[i], callback, node, nextPath, depth + 1, trackPath);\n }\n}\n\nexport interface VisitOptions {\n /**\n * Whether to compute and pass a NodePath to each callback invocation.\n * Defaults to true for backward compatibility.\n * Set to false for performance-critical traversals that don't need path info.\n */\n trackPath?: boolean;\n}\n\nexport function visit(\n node: AstNode,\n callback: (node: AstNode, parent?: AstNode, path?: NodePath) => void,\n options?: VisitOptions,\n): void {\n visitInternal(node, callback, undefined, [], 0, options?.trackPath ?? true);\n}\n\nexport function map(node: AstNode, fn: (node: AstNode) => AstNode, _depth: number = 0): AstNode {\n if (_depth > MAX_DEPTH) {\n throw new TraversalDepthError(_depth);\n }\n const mapped = fn(node);\n const children = getChildren(mapped);\n if (children.length === 0) return mapped;\n\n const newChildren = children.map((child) => map(child, fn, _depth + 1));\n const changed = newChildren.some((c, i) => c !== children[i]);\n if (!changed) return mapped;\n\n switch (mapped.type) {\n case 'doc':\n return { ...mapped, content: newChildren as BlockNode[] };\n case 'blockquote':\n case 'listItem':\n case 'noteBlock':\n return { ...mapped, content: newChildren as BlockNode[] };\n case 'paragraph':\n case 'heading':\n return { ...mapped, content: newChildren as InlineNode[] };\n case 'bulletList':\n return { ...mapped, content: newChildren as typeof mapped.content };\n case 'orderedList':\n return { ...mapped, content: newChildren as typeof mapped.content };\n case 'jinjaIfBlock': {\n const jNode = mapped as JinjaIfBlockNode;\n let offset = 0;\n const newBranches = jNode.branches.map(b => {\n const slice = newChildren.slice(offset, offset + b.content.length) as BlockNode[];\n offset += b.content.length;\n return { ...b, content: slice };\n });\n return { ...jNode, branches: newBranches };\n }\n case 'jinjaIfInline': {\n const jNode = mapped as JinjaIfInlineNode;\n let offset = 0;\n const newBranches = jNode.branches.map(b => {\n const slice = newChildren.slice(offset, offset + b.content.length) as InlineNode[];\n offset += b.content.length;\n return { ...b, content: slice };\n });\n return { ...jNode, branches: newBranches };\n }\n default:\n return mapped;\n }\n}\n\nexport function textContent(node: AstNode, _depth: number = 0): string {\n if (_depth > MAX_DEPTH) {\n throw new TraversalDepthError(_depth);\n }\n switch (node.type) {\n case 'text':\n return node.text;\n case 'resourceTag':\n return node.text;\n case 'jumpPoint':\n return `^${node.id}^`;\n case 'hardBreak':\n return '\\n';\n case 'jinjaIfInline': {\n // Reconstruct original {% %} text for analyzer compatibility\n let out = '';\n for (const branch of node.branches) {\n if (branch.branchType === 'if') out += `{% if ${branch.condition} %}`;\n else if (branch.branchType === 'elif') out += `{% elif ${branch.condition} %}`;\n else out += '{% else %}';\n for (const child of branch.content) out += textContent(child, _depth + 1);\n }\n out += '{% endif %}';\n return out;\n }\n case 'horizontalRule':\n return '';\n default: {\n const children = getChildren(node);\n let out = '';\n for (const child of children) out += textContent(child, _depth + 1);\n return out;\n }\n }\n}\n\nexport function findAll(node: AstNode, predicate: (n: AstNode) => boolean): AstNode[] {\n const results: AstNode[] = [];\n visit(node, (n) => {\n if (predicate(n)) results.push(n);\n }, { trackPath: false });\n return results;\n}\n\nexport function nodeAtPath(root: DocumentNode, path: NodePath): AstNode | undefined {\n if (path.length > MAX_DEPTH) {\n throw new TraversalDepthError(path.length);\n }\n let current: AstNode = root;\n for (const index of path) {\n const children = getChildren(current);\n if (index < 0 || index >= children.length) return undefined;\n current = children[index];\n }\n return current;\n}\n","import type { AstNode, BlockNode, InlineNode, TextNode, DocumentNode } from './types';\n\nconst BLOCK_TYPES = new Set([\n 'paragraph',\n 'heading',\n 'bulletList',\n 'orderedList',\n 'listItem',\n 'blockquote',\n 'horizontalRule',\n 'codeBlock',\n 'jinjaIfBlock',\n 'noteBlock',\n]);\n\nconst INLINE_TYPES = new Set(['text', 'resourceTag', 'jumpPoint', 'hardBreak', 'jinjaIfInline']);\n\nexport function isBlock(node: AstNode): node is BlockNode {\n return BLOCK_TYPES.has(node.type);\n}\n\nexport function isInline(node: AstNode): node is InlineNode {\n return INLINE_TYPES.has(node.type);\n}\n\nexport function isTextNode(node: AstNode): node is TextNode {\n return node.type === 'text';\n}\n\nexport function isDocument(node: AstNode): node is DocumentNode {\n return node.type === 'doc';\n}\n","import type { NodePath } from './types';\n\nexport { nodeAtPath } from './traverse';\n\nexport function parentPath(path: NodePath): NodePath {\n return path.slice(0, -1);\n}\n\nexport function pathToString(path: NodePath): string {\n return `[${path.join(',')}]`;\n}\n\nexport function pathFromString(str: string): NodePath {\n const inner = str.slice(1, -1);\n if (inner === '') return [];\n return inner.split(',').map(Number);\n}\n\nexport function comparePaths(a: NodePath, b: NodePath): number {\n const len = Math.min(a.length, b.length);\n for (let i = 0; i < len; i++) {\n if (a[i] !== b[i]) return a[i] - b[i];\n }\n return a.length - b.length;\n}\n","import type { AstNode, DocumentNode, Mark, TableNode, TableRowNode } from '../ast/types';\nimport { JUMP_POINT_ID_PATTERN } from '../ast/types';\n\nexport type ValidationError = {\n path: string;\n message: string;\n};\n\nconst MAX_VALIDATION_DEPTH = 128;\n\nconst ALLOWED_URL_PROTOCOLS = /^(https?:|mailto:|tel:|#|\\/|www\\.)/i;\n\nfunction validateMark(mark: Mark, path: string): ValidationError[] {\n const errors: ValidationError[] = [];\n switch (mark.type) {\n case 'bold':\n case 'italic':\n case 'underline':\n case 'strikethrough':\n case 'code':\n break;\n case 'link':\n if (typeof mark.href !== 'string' || mark.href.length === 0) {\n errors.push({ path: `${path}.href`, message: 'Link mark requires a non-empty href' });\n } else if (!ALLOWED_URL_PROTOCOLS.test(mark.href)) {\n errors.push({\n path: `${path}.href`,\n message: `Disallowed URL protocol in href: \"${mark.href}\". Allowed: http, https, mailto, tel, #, /`,\n });\n }\n break;\n default:\n errors.push({ path, message: `Unknown mark type: ${(mark as { type: string }).type}` });\n }\n return errors;\n}\n\nconst VALID_RESOURCE_TAG_TYPES = new Set<string>(['tool', 'manual', 'agent_message_template', 'handoff', 'end_call', 'time_diff', 'time_difference']);\nconst RESOURCE_ID_OPTIONAL_TYPES = new Set<string>(['handoff', 'end_call']);\n\nfunction validateNode(node: AstNode, path: string, depth: number): ValidationError[] {\n if (depth > MAX_VALIDATION_DEPTH) {\n return [{ path, message: `Maximum validation depth (${MAX_VALIDATION_DEPTH}) exceeded` }];\n }\n\n const errors: ValidationError[] = [];\n\n switch (node.type) {\n case 'doc':\n if (!Array.isArray(node.content)) {\n errors.push({ path, message: 'doc must have content array' });\n } else {\n node.content.forEach((child, i) => errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1)));\n }\n break;\n\n case 'paragraph':\n case 'heading':\n if (node.type === 'heading' && (node.level < 1 || node.level > 6)) {\n errors.push({ path: `${path}.level`, message: `Invalid heading level: ${node.level}` });\n }\n if (Array.isArray(node.content)) {\n node.content.forEach((child, i) => errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1)));\n }\n break;\n\n case 'bulletList':\n case 'orderedList':\n if (!Array.isArray(node.content) || node.content.length === 0) {\n errors.push({ path, message: `${node.type} must have at least one listItem` });\n } else {\n node.content.forEach((child, i) => {\n if (child.type !== 'listItem') {\n errors.push({ path: `${path}.content[${i}]`, message: `${node.type} children must be listItem` });\n }\n errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1));\n });\n }\n if (node.type === 'orderedList' && typeof node.start !== 'number') {\n errors.push({ path: `${path}.start`, message: 'orderedList requires a start number' });\n }\n break;\n\n case 'listItem':\n if (!Array.isArray(node.content)) {\n errors.push({ path, message: 'listItem must have content array' });\n } else {\n node.content.forEach((child, i) => errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1)));\n }\n break;\n\n case 'blockquote':\n if (!Array.isArray(node.content)) {\n errors.push({ path, message: 'blockquote must have content array' });\n } else {\n node.content.forEach((child, i) => errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1)));\n }\n break;\n\n case 'horizontalRule':\n break;\n\n case 'codeBlock':\n // codeBlock has string content, no children to validate\n break;\n\n case 'noteBlock':\n if (!Array.isArray(node.content)) {\n errors.push({ path, message: 'noteBlock must have content array' });\n } else {\n node.content.forEach((child, i) => errors.push(...validateNode(child, `${path}.content[${i}]`, depth + 1)));\n }\n break;\n\n case 'table': {\n const tbl = node as TableNode;\n if (!Array.isArray(tbl.content) || tbl.content.length === 0) {\n errors.push({ path, message: 'table must have at least one tableRow' });\n } else {\n tbl.content.forEach((row: TableRowNode, i: number) => {\n if (row.type !== 'tableRow') {\n errors.push({ path: `${path}.content[${i}]`, message: 'table children must be tableRow' });\n } else {\n row.content.forEach((cell, j) => {\n if (cell.type !== 'tableCell') {\n errors.push({ path: `${path}.content[${i}].content[${j}]`, message: 'tableRow children must be tableCell' });\n }\n });\n }\n });\n }\n break;\n }\n\n case 'text':\n if (typeof node.text !== 'string') {\n errors.push({ path, message: 'text node must have a string text field' });\n }\n if (node.marks) {\n node.marks.forEach((mark, i) => errors.push(...validateMark(mark, `${path}.marks[${i}]`)));\n }\n break;\n\n case 'resourceTag':\n if (!VALID_RESOURCE_TAG_TYPES.has(node.tagType)) {\n errors.push({ path: `${path}.tagType`, message: `Invalid resource tag type: ${node.tagType}` });\n }\n if (typeof node.resourceId !== 'string' || (!RESOURCE_ID_OPTIONAL_TYPES.has(node.tagType) && node.resourceId.length === 0)) {\n errors.push({ path: `${path}.resourceId`, message: 'resourceTag requires a non-empty resourceId' });\n }\n if (typeof node.text !== 'string' || node.text.length === 0) {\n errors.push({ path: `${path}.text`, message: 'resourceTag requires a non-empty text' });\n }\n break;\n\n case 'jumpPoint':\n if (!JUMP_POINT_ID_PATTERN.test(node.id)) {\n errors.push({ path: `${path}.id`, message: `Invalid jump point ID: \"${node.id}\"` });\n }\n break;\n\n case 'hardBreak':\n break;\n\n case 'jinjaIfBlock': {\n if (!Array.isArray(node.branches) || node.branches.length === 0) {\n errors.push({ path, message: 'jinjaIfBlock must have at least one branch' });\n } else {\n if (node.branches[0].branchType !== 'if') {\n errors.push({ path: `${path}.branches[0]`, message: 'First branch must be \"if\"' });\n }\n for (let bi = 0; bi < node.branches.length; bi++) {\n const b = node.branches[bi];\n const bp = `${path}.branches[${bi}]`;\n if ((b.branchType === 'if' || b.branchType === 'elif') && !b.condition) {\n errors.push({ path: bp, message: `${b.branchType} branch requires a condition` });\n }\n if (b.branchType === 'else' && b.condition) {\n errors.push({ path: bp, message: 'else branch must not have a condition' });\n }\n if (Array.isArray(b.content)) {\n b.content.forEach((child: AstNode, ci: number) => errors.push(...validateNode(child, `${bp}.content[${ci}]`, depth + 1)));\n }\n }\n }\n break;\n }\n\n case 'jinjaIfInline': {\n if (!Array.isArray(node.branches) || node.branches.length === 0) {\n errors.push({ path, message: 'jinjaIfInline must have at least one branch' });\n } else {\n if (node.branches[0].branchType !== 'if') {\n errors.push({ path: `${path}.branches[0]`, message: 'First branch must be \"if\"' });\n }\n for (let bi = 0; bi < node.branches.length; bi++) {\n const b = node.branches[bi];\n const bp = `${path}.branches[${bi}]`;\n if ((b.branchType === 'if' || b.branchType === 'elif') && !b.condition) {\n errors.push({ path: bp, message: `${b.branchType} branch requires a condition` });\n }\n if (b.branchType === 'else' && b.condition) {\n errors.push({ path: bp, message: 'else branch must not have a condition' });\n }\n if (Array.isArray(b.content)) {\n b.content.forEach((child: AstNode, ci: number) => errors.push(...validateNode(child, `${bp}.content[${ci}]`, depth + 1)));\n }\n }\n }\n break;\n }\n\n default:\n errors.push({ path, message: `Unknown node type: ${(node as { type: string }).type}` });\n }\n\n return errors;\n}\n\nexport function validate(doc: DocumentNode): ValidationError[] {\n if (doc.type !== 'doc') {\n return [{ path: '', message: 'Root node must be of type \"doc\"' }];\n }\n return validateNode(doc, 'doc', 0);\n}\n","import { fromMarkdown } from 'mdast-util-from-markdown';\nimport { combineExtensions } from 'micromark-util-combine-extensions';\nimport { gfmFootnote } from 'micromark-extension-gfm-footnote';\nimport { gfmStrikethrough } from 'micromark-extension-gfm-strikethrough';\nimport { gfmTable } from 'micromark-extension-gfm-table';\nimport { gfmTaskListItem } from 'micromark-extension-gfm-task-list-item';\nimport { gfmFootnoteFromMarkdown } from 'mdast-util-gfm-footnote';\nimport { gfmStrikethroughFromMarkdown } from 'mdast-util-gfm-strikethrough';\nimport { gfmTableFromMarkdown } from 'mdast-util-gfm-table';\nimport { gfmTaskListItemFromMarkdown } from 'mdast-util-gfm-task-list-item';\nimport { splitTextWithResourceTags } from './plugins/resourceTag';\nimport { splitTextWithJumpPoints } from './plugins/jumpPoint';\nimport type { ResourceTagMdastNode } from './plugins/resourceTag';\nimport type { JumpPointMdastNode } from './plugins/jumpPoint';\nimport { fromMdast } from './mdastAdapter';\nimport { jinjaBlockTransform } from './plugins/jinjaBlock';\nimport type { DocumentNode } from '../ast/types';\nimport type { Link, Root, Text } from 'mdast';\n\nexport interface ParseMarkdownOptions {\n jinjaNodes?: boolean;\n}\n\n// GFM without autolink literal — autolink literal converts escaped emails/URLs\n// (e.g. bookings\\@flynorse.com) into link nodes during the mdast transform pass,\n// which then serialize as <bookings@flynorse.com> instead of preserving the\n// original backslash escaping.\nconst gfmNoAutolink = () =>\n combineExtensions([gfmFootnote(), gfmStrikethrough(), gfmTable(), gfmTaskListItem()]);\n\nconst gfmNoAutolinkFromMarkdown = () => [\n gfmFootnoteFromMarkdown(),\n gfmStrikethroughFromMarkdown(),\n gfmTableFromMarkdown(),\n gfmTaskListItemFromMarkdown(),\n];\n\nconst MAX_DEPTH = 128;\n\ntype CustomNode = ResourceTagMdastNode | JumpPointMdastNode;\n\n/**\n * Recover markdown links that micromark failed to parse because the URL\n * contains spaces (e.g. `[Go to #Wrap up](#Wrap up)`). CommonMark requires\n * `<>` around such URLs, but tiptap-markdown emits the bare form.\n */\nconst BRACKET_LINK_RE = /\\[([^\\]]+)\\]\\(([^)]*\\s[^)]*)\\)/g;\n\nfunction splitTextWithBracketLinks(value: string): Array<Text | Link> {\n const results: Array<Text | Link> = [];\n let lastIndex = 0;\n for (const m of value.matchAll(BRACKET_LINK_RE)) {\n const idx = m.index!;\n if (idx > lastIndex) results.push({ type: 'text', value: value.slice(lastIndex, idx) } as Text);\n results.push({\n type: 'link',\n url: m[2],\n children: [{ type: 'text', value: m[1] } as Text],\n } as Link);\n lastIndex = idx + m[0].length;\n }\n if (lastIndex < value.length) results.push({ type: 'text', value: value.slice(lastIndex) } as Text);\n return results;\n}\n\n/**\n * Combined single-pass transform for resource tags and jump points.\n * Each text node is scanned for both patterns in one iteration,\n * avoiding two separate full-tree traversals.\n */\nfunction combinedTokensFromMarkdown(node: { children?: unknown[] }, depth: number = 0): void {\n if (depth > MAX_DEPTH) return;\n if (!node.children) return;\n for (const child of node.children) {\n combinedTokensFromMarkdown(child as { children?: unknown[] }, depth + 1);\n }\n if (Array.isArray(node.children)) {\n const newChildren: unknown[] = [];\n for (const child of node.children) {\n const c = child as { type: string };\n if (c.type === 'text') {\n // Split pipeline: bracket links → resource tags → jump points\n const afterLinks = splitTextWithBracketLinks((child as Text).value);\n for (const linkPart of afterLinks) {\n if (linkPart.type !== 'text') { newChildren.push(linkPart); continue; }\n const afterResourceTags = splitTextWithResourceTags(linkPart.value);\n for (const part of afterResourceTags) {\n if (part.type === 'text') {\n const afterJumpPoints = splitTextWithJumpPoints(part.value);\n newChildren.push(...afterJumpPoints);\n } else {\n newChildren.push(part as unknown as CustomNode);\n }\n }\n }\n } else {\n newChildren.push(child);\n }\n }\n node.children = newChildren;\n }\n}\n\nexport function parseMarkdown(markdown: string, options?: ParseMarkdownOptions): DocumentNode {\n const tree = fromMarkdown(markdown, {\n extensions: [gfmNoAutolink()],\n mdastExtensions: [gfmNoAutolinkFromMarkdown()],\n });\n\n // Single combined pass for resource tags and jump points\n combinedTokensFromMarkdown(tree as unknown as { children?: unknown[] });\n\n // Optional: transform Jinja tags into structured mdast nodes\n if (options?.jinjaNodes) {\n jinjaBlockTransform(tree as unknown as { type: string; children?: unknown[] });\n }\n\n return fromMdast(tree);\n}\n","/**\n * Like `Array#splice`, but smarter for giant arrays.\n *\n * `Array#splice` takes all items to be inserted as individual argument which\n * causes a stack overflow in V8 when trying to insert 100k items for instance.\n *\n * Otherwise, this does not return the removed items, and takes `items` as an\n * array instead of rest parameters.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {number} start\n * Index to remove/insert at (can be negative).\n * @param {number} remove\n * Number of items to remove.\n * @param {Array<T>} items\n * Items to inject into `list`.\n * @returns {undefined}\n * Nothing.\n */\nexport function splice(list, start, remove, items) {\n const end = list.length;\n let chunkStart = 0;\n /** @type {Array<unknown>} */\n let parameters;\n\n // Make start between zero and `end` (included).\n if (start < 0) {\n start = -start > end ? 0 : end + start;\n } else {\n start = start > end ? end : start;\n }\n remove = remove > 0 ? remove : 0;\n\n // No need to chunk the items if there’s only a couple (10k) items.\n if (items.length < 10000) {\n parameters = Array.from(items);\n parameters.unshift(start, remove);\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters);\n } else {\n // Delete `remove` items starting from `start`\n if (remove) list.splice(start, remove);\n\n // Insert the items in chunks to not cause stack overflows.\n while (chunkStart < items.length) {\n parameters = items.slice(chunkStart, chunkStart + 10000);\n parameters.unshift(start, 0);\n // @ts-expect-error Hush, it’s fine.\n list.splice(...parameters);\n chunkStart += 10000;\n start += 10000;\n }\n }\n}\n\n/**\n * Append `items` (an array) at the end of `list` (another array).\n * When `list` was empty, returns `items` instead.\n *\n * This prevents a potentially expensive operation when `list` is empty,\n * and adds items in batches to prevent V8 from hanging.\n *\n * @template {unknown} T\n * Item type.\n * @param {Array<T>} list\n * List to operate on.\n * @param {Array<T>} items\n * Items to add to `list`.\n * @returns {Array<T>}\n * Either `list` or `items`.\n */\nexport function push(list, items) {\n if (list.length > 0) {\n splice(list, list.length, 0, items);\n return list;\n }\n return items;\n}","/**\n * @import {\n * Extension,\n * Handles,\n * HtmlExtension,\n * NormalizedExtension\n * } from 'micromark-util-types'\n */\n\nimport {splice} from 'micromark-util-chunked'\n\nconst hasOwnProperty = {}.hasOwnProperty\n\n/**\n * Combine multiple syntax extensions into one.\n *\n * @param {ReadonlyArray<Extension>} extensions\n * List of syntax extensions.\n * @returns {NormalizedExtension}\n * A single combined extension.\n */\nexport function combineExtensions(extensions) {\n /** @type {NormalizedExtension} */\n const all = {}\n let index = -1\n\n while (++index < extensions.length) {\n syntaxExtension(all, extensions[index])\n }\n\n return all\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {NormalizedExtension} all\n * Extension to merge into.\n * @param {Extension} extension\n * Extension to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction syntaxExtension(all, extension) {\n /** @type {keyof Extension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n /** @type {Record<string, unknown>} */\n const left = maybe || (all[hook] = {})\n /** @type {Record<string, unknown> | undefined} */\n const right = extension[hook]\n /** @type {string} */\n let code\n\n if (right) {\n for (code in right) {\n if (!hasOwnProperty.call(left, code)) left[code] = []\n const value = right[code]\n constructs(\n // @ts-expect-error Looks like a list.\n left[code],\n Array.isArray(value) ? value : value ? [value] : []\n )\n }\n }\n }\n}\n\n/**\n * Merge `list` into `existing` (both lists of constructs).\n * Mutates `existing`.\n *\n * @param {Array<unknown>} existing\n * List of constructs to merge into.\n * @param {Array<unknown>} list\n * List of constructs to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction constructs(existing, list) {\n let index = -1\n /** @type {Array<unknown>} */\n const before = []\n\n while (++index < list.length) {\n // @ts-expect-error Looks like an object.\n ;(list[index].add === 'after' ? existing : before).push(list[index])\n }\n\n splice(existing, 0, 0, before)\n}\n\n/**\n * Combine multiple HTML extensions into one.\n *\n * @param {ReadonlyArray<HtmlExtension>} htmlExtensions\n * List of HTML extensions.\n * @returns {HtmlExtension}\n * Single combined HTML extension.\n */\nexport function combineHtmlExtensions(htmlExtensions) {\n /** @type {HtmlExtension} */\n const handlers = {}\n let index = -1\n\n while (++index < htmlExtensions.length) {\n htmlExtension(handlers, htmlExtensions[index])\n }\n\n return handlers\n}\n\n/**\n * Merge `extension` into `all`.\n *\n * @param {HtmlExtension} all\n * Extension to merge into.\n * @param {HtmlExtension} extension\n * Extension to merge.\n * @returns {undefined}\n * Nothing.\n */\nfunction htmlExtension(all, extension) {\n /** @type {keyof HtmlExtension} */\n let hook\n\n for (hook in extension) {\n const maybe = hasOwnProperty.call(all, hook) ? all[hook] : undefined\n const left = maybe || (all[hook] = {})\n const right = extension[hook]\n /** @type {keyof Handles} */\n let type\n\n if (right) {\n for (type in right) {\n // @ts-expect-error assume document vs regular handler are managed correctly.\n left[type] = right[type]\n }\n }\n }\n}\n","/**\n * @import {Code} from 'micromark-util-types'\n */\n\nimport { markdownLineEndingOrSpace, unicodePunctuation, unicodeWhitespace } from 'micromark-util-character';\n/**\n * Classify whether a code represents whitespace, punctuation, or something\n * else.\n *\n * Used for attention (emphasis, strong), whose sequences can open or close\n * based on the class of surrounding characters.\n *\n * > 👉 **Note**: eof (`null`) is seen as whitespace.\n *\n * @param {Code} code\n * Code.\n * @returns {typeof constants.characterGroupWhitespace | typeof constants.characterGroupPunctuation | undefined}\n * Group.\n */\nexport function classifyCharacter(code) {\n if (code === null || markdownLineEndingOrSpace(code) || unicodeWhitespace(code)) {\n return 1;\n }\n if (unicodePunctuation(code)) {\n return 2;\n }\n}","/**\n * @import {Event, Resolver, TokenizeContext} from 'micromark-util-types'\n */\n\n/**\n * Call all `resolveAll`s.\n *\n * @param {ReadonlyArray<{resolveAll?: Resolver | undefined}>} constructs\n * List of constructs, optionally with `resolveAll`s.\n * @param {Array<Event>} events\n * List of events.\n * @param {TokenizeContext} context\n * Context used by `tokenize`.\n * @returns {Array<Event>}\n * Changed events.\n */\nexport function resolveAll(constructs, events, context) {\n /** @type {Array<Resolver>} */\n const called = []\n let index = -1\n\n while (++index < constructs.length) {\n const resolve = constructs[index].resolveAll\n\n if (resolve && !called.includes(resolve)) {\n events = resolve(events, context)\n called.push(resolve)\n }\n }\n\n return events\n}\n","/**\n * @import {Effects, State, TokenType} from 'micromark-util-types'\n */\n\nimport { markdownSpace } from 'micromark-util-character';\n\n// To do: implement `spaceOrTab`, `spaceOrTabMinMax`, `spaceOrTabWithOptions`.\n\n/**\n * Parse spaces and tabs.\n *\n * There is no `nok` parameter:\n *\n * * spaces in markdown are often optional, in which case this factory can be\n * used and `ok` will be switched to whether spaces were found or not\n * * one line ending or space can be detected with `markdownSpace(code)` right\n * before using `factorySpace`\n *\n * ###### Examples\n *\n * Where `␉` represents a tab (plus how much it expands) and `␠` represents a\n * single space.\n *\n * ```markdown\n * ␉\n * ␠␠␠␠\n * ␉␠\n * ```\n *\n * @param {Effects} effects\n * Context.\n * @param {State} ok\n * State switched to when successful.\n * @param {TokenType} type\n * Type (`' \\t'`).\n * @param {number | undefined} [max=Infinity]\n * Max (exclusive).\n * @returns {State}\n * Start state.\n */\nexport function factorySpace(effects, ok, type, max) {\n const limit = max ? max - 1 : Number.POSITIVE_INFINITY;\n let size = 0;\n return start;\n\n /** @type {State} */\n function start(code) {\n if (markdownSpace(code)) {\n effects.enter(type);\n return prefix(code);\n }\n return ok(code);\n }\n\n /** @type {State} */\n function prefix(code) {\n if (markdownSpace(code) && size++ < limit) {\n effects.consume(code);\n return prefix;\n }\n effects.exit(type);\n return ok(code);\n }\n}","/**\n * @import {\n * Construct,\n * State,\n * TokenizeContext,\n * Tokenizer\n * } from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownSpace } from 'micromark-util-character';\n/** @type {Construct} */\nexport const blankLine = {\n partial: true,\n tokenize: tokenizeBlankLine\n};\n\n/**\n * @this {TokenizeContext}\n * Context.\n * @type {Tokenizer}\n */\nfunction tokenizeBlankLine(effects, ok, nok) {\n return start;\n\n /**\n * Start of blank line.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n return markdownSpace(code) ? factorySpace(effects, after, \"linePrefix\")(code) : after(code);\n }\n\n /**\n * At eof/eol, after optional whitespace.\n *\n * > 👉 **Note**: `␠` represents a space character.\n *\n * ```markdown\n * > | ␠␠␊\n * ^\n * > | ␊\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n return code === null || markdownLineEnding(code) ? ok(code) : nok(code);\n }\n}","/**\n * Normalize an identifier (as found in references, definitions).\n *\n * Collapses markdown whitespace, trim, and then lower- and uppercase.\n *\n * Some characters are considered “uppercase”, such as U+03F4 (`ϴ`), but if their\n * lowercase counterpart (U+03B8 (`θ`)) is uppercased will result in a different\n * uppercase character (U+0398 (`Θ`)).\n * So, to get a canonical form, we perform both lower- and uppercase.\n *\n * Using uppercase last makes sure keys will never interact with default\n * prototypal values (such as `constructor`): nothing in the prototype of\n * `Object` is uppercase.\n *\n * @param {string} value\n * Identifier to normalize.\n * @returns {string}\n * Normalized identifier.\n */\nexport function normalizeIdentifier(value) {\n return value\n // Collapse markdown whitespace.\n .replace(/[\\t\\n\\r ]+/g, \" \")\n // Trim.\n .replace(/^ | $/g, '')\n // Some characters are considered “uppercase”, but if their lowercase\n // counterpart is uppercased will result in a different uppercase\n // character.\n // Hence, to get that form, we perform both lower- and uppercase.\n // Upper case makes sure keys will not interact with default prototypal\n // methods: no method is uppercase.\n .toLowerCase().toUpperCase();\n}","/**\n * @import {Event, Exiter, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { blankLine } from 'micromark-core-commonmark';\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEndingOrSpace } from 'micromark-util-character';\nimport { normalizeIdentifier } from 'micromark-util-normalize-identifier';\nconst indent = {\n tokenize: tokenizeIndent,\n partial: true\n};\n\n// To do: micromark should support a `_hiddenGfmFootnoteSupport`, which only\n// affects label start (image).\n// That will let us drop `tokenizePotentialGfmFootnote*`.\n// It currently has a `_hiddenFootnoteSupport`, which affects that and more.\n// That can be removed when `micromark-extension-footnote` is archived.\n\n/**\n * Create an extension for `micromark` to enable GFM footnote syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to\n * enable GFM footnote syntax.\n */\nexport function gfmFootnote() {\n /** @type {Extension} */\n return {\n document: {\n [91]: {\n name: 'gfmFootnoteDefinition',\n tokenize: tokenizeDefinitionStart,\n continuation: {\n tokenize: tokenizeDefinitionContinuation\n },\n exit: gfmFootnoteDefinitionEnd\n }\n },\n text: {\n [91]: {\n name: 'gfmFootnoteCall',\n tokenize: tokenizeGfmFootnoteCall\n },\n [93]: {\n name: 'gfmPotentialFootnoteCall',\n add: 'after',\n tokenize: tokenizePotentialGfmFootnoteCall,\n resolveTo: resolveToPotentialGfmFootnoteCall\n }\n }\n };\n}\n\n// To do: remove after micromark update.\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizePotentialGfmFootnoteCall(effects, ok, nok) {\n const self = this;\n let index = self.events.length;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n /** @type {Token} */\n let labelStart;\n\n // Find an opening.\n while (index--) {\n const token = self.events[index][1];\n if (token.type === \"labelImage\") {\n labelStart = token;\n break;\n }\n\n // Exit if we’ve walked far enough.\n if (token.type === 'gfmFootnoteCall' || token.type === \"labelLink\" || token.type === \"label\" || token.type === \"image\" || token.type === \"link\") {\n break;\n }\n }\n return start;\n\n /**\n * @type {State}\n */\n function start(code) {\n if (!labelStart || !labelStart._balanced) {\n return nok(code);\n }\n const id = normalizeIdentifier(self.sliceSerialize({\n start: labelStart.end,\n end: self.now()\n }));\n if (id.codePointAt(0) !== 94 || !defined.includes(id.slice(1))) {\n return nok(code);\n }\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n return ok(code);\n }\n}\n\n// To do: remove after micromark update.\n/** @type {Resolver} */\nfunction resolveToPotentialGfmFootnoteCall(events, context) {\n let index = events.length;\n /** @type {Token | undefined} */\n let labelStart;\n\n // Find an opening.\n while (index--) {\n if (events[index][1].type === \"labelImage\" && events[index][0] === 'enter') {\n labelStart = events[index][1];\n break;\n }\n }\n // Change the `labelImageMarker` to a `data`.\n events[index + 1][1].type = \"data\";\n events[index + 3][1].type = 'gfmFootnoteCallLabelMarker';\n\n // The whole (without `!`):\n /** @type {Token} */\n const call = {\n type: 'gfmFootnoteCall',\n start: Object.assign({}, events[index + 3][1].start),\n end: Object.assign({}, events[events.length - 1][1].end)\n };\n // The `^` marker\n /** @type {Token} */\n const marker = {\n type: 'gfmFootnoteCallMarker',\n start: Object.assign({}, events[index + 3][1].end),\n end: Object.assign({}, events[index + 3][1].end)\n };\n // Increment the end 1 character.\n marker.end.column++;\n marker.end.offset++;\n marker.end._bufferIndex++;\n /** @type {Token} */\n const string = {\n type: 'gfmFootnoteCallString',\n start: Object.assign({}, marker.end),\n end: Object.assign({}, events[events.length - 1][1].start)\n };\n /** @type {Token} */\n const chunk = {\n type: \"chunkString\",\n contentType: 'string',\n start: Object.assign({}, string.start),\n end: Object.assign({}, string.end)\n };\n\n /** @type {Array<Event>} */\n const replacement = [\n // Take the `labelImageMarker` (now `data`, the `!`)\n events[index + 1], events[index + 2], ['enter', call, context],\n // The `[`\n events[index + 3], events[index + 4],\n // The `^`.\n ['enter', marker, context], ['exit', marker, context],\n // Everything in between.\n ['enter', string, context], ['enter', chunk, context], ['exit', chunk, context], ['exit', string, context],\n // The ending (`]`, properly parsed and labelled).\n events[events.length - 2], events[events.length - 1], ['exit', call, context]];\n events.splice(index, events.length - index + 1, ...replacement);\n return events;\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeGfmFootnoteCall(effects, ok, nok) {\n const self = this;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n let size = 0;\n /** @type {boolean} */\n let data;\n\n // Note: the implementation of `markdown-rs` is different, because it houses\n // core *and* extensions in one project.\n // Therefore, it can include footnote logic inside `label-end`.\n // We can’t do that, but luckily, we can parse footnotes in a simpler way than\n // needed for labels.\n return start;\n\n /**\n * Start of footnote label.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter('gfmFootnoteCall');\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n return callStart;\n }\n\n /**\n * After `[`, at `^`.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function callStart(code) {\n if (code !== 94) return nok(code);\n effects.enter('gfmFootnoteCallMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallMarker');\n effects.enter('gfmFootnoteCallString');\n effects.enter('chunkString').contentType = 'string';\n return callData;\n }\n\n /**\n * In label.\n *\n * ```markdown\n * > | a [^b] c\n * ^\n * ```\n *\n * @type {State}\n */\n function callData(code) {\n if (\n // Too long.\n size > 999 ||\n // Closing brace with nothing.\n code === 93 && !data ||\n // Space or tab is not supported by GFM for some reason.\n // `\\n` and `[` not being supported makes sense.\n code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n return nok(code);\n }\n if (code === 93) {\n effects.exit('chunkString');\n const token = effects.exit('gfmFootnoteCallString');\n if (!defined.includes(normalizeIdentifier(self.sliceSerialize(token)))) {\n return nok(code);\n }\n effects.enter('gfmFootnoteCallLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteCallLabelMarker');\n effects.exit('gfmFootnoteCall');\n return ok;\n }\n if (!markdownLineEndingOrSpace(code)) {\n data = true;\n }\n size++;\n effects.consume(code);\n return code === 92 ? callEscape : callData;\n }\n\n /**\n * On character after escape.\n *\n * ```markdown\n * > | a [^b\\c] d\n * ^\n * ```\n *\n * @type {State}\n */\n function callEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code);\n size++;\n return callData;\n }\n return callData(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionStart(effects, ok, nok) {\n const self = this;\n const defined = self.parser.gfmFootnotes || (self.parser.gfmFootnotes = []);\n /** @type {string} */\n let identifier;\n let size = 0;\n /** @type {boolean | undefined} */\n let data;\n return start;\n\n /**\n * Start of GFM footnote definition.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function start(code) {\n effects.enter('gfmFootnoteDefinition')._container = true;\n effects.enter('gfmFootnoteDefinitionLabel');\n effects.enter('gfmFootnoteDefinitionLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionLabelMarker');\n return labelAtMarker;\n }\n\n /**\n * In label, at caret.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAtMarker(code) {\n if (code === 94) {\n effects.enter('gfmFootnoteDefinitionMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionMarker');\n effects.enter('gfmFootnoteDefinitionLabelString');\n effects.enter('chunkString').contentType = 'string';\n return labelInside;\n }\n return nok(code);\n }\n\n /**\n * In label.\n *\n * > 👉 **Note**: `cmark-gfm` prevents whitespace from occurring in footnote\n * > definition labels.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelInside(code) {\n if (\n // Too long.\n size > 999 ||\n // Closing brace with nothing.\n code === 93 && !data ||\n // Space or tab is not supported by GFM for some reason.\n // `\\n` and `[` not being supported makes sense.\n code === null || code === 91 || markdownLineEndingOrSpace(code)) {\n return nok(code);\n }\n if (code === 93) {\n effects.exit('chunkString');\n const token = effects.exit('gfmFootnoteDefinitionLabelString');\n identifier = normalizeIdentifier(self.sliceSerialize(token));\n effects.enter('gfmFootnoteDefinitionLabelMarker');\n effects.consume(code);\n effects.exit('gfmFootnoteDefinitionLabelMarker');\n effects.exit('gfmFootnoteDefinitionLabel');\n return labelAfter;\n }\n if (!markdownLineEndingOrSpace(code)) {\n data = true;\n }\n size++;\n effects.consume(code);\n return code === 92 ? labelEscape : labelInside;\n }\n\n /**\n * After `\\`, at a special character.\n *\n * > 👉 **Note**: `cmark-gfm` currently does not support escaped brackets:\n * > <https://github.com/github/cmark-gfm/issues/240>\n *\n * ```markdown\n * > | [^a\\*b]: c\n * ^\n * ```\n *\n * @type {State}\n */\n function labelEscape(code) {\n if (code === 91 || code === 92 || code === 93) {\n effects.consume(code);\n size++;\n return labelInside;\n }\n return labelInside(code);\n }\n\n /**\n * After definition label.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function labelAfter(code) {\n if (code === 58) {\n effects.enter('definitionMarker');\n effects.consume(code);\n effects.exit('definitionMarker');\n if (!defined.includes(identifier)) {\n defined.push(identifier);\n }\n\n // Any whitespace after the marker is eaten, forming indented code\n // is not possible.\n // No space is also fine, just like a block quote marker.\n return factorySpace(effects, whitespaceAfter, 'gfmFootnoteDefinitionWhitespace');\n }\n return nok(code);\n }\n\n /**\n * After definition prefix.\n *\n * ```markdown\n * > | [^a]: b\n * ^\n * ```\n *\n * @type {State}\n */\n function whitespaceAfter(code) {\n // `markdown-rs` has a wrapping token for the prefix that is closed here.\n return ok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeDefinitionContinuation(effects, ok, nok) {\n /// Start of footnote definition continuation.\n ///\n /// ```markdown\n /// | [^a]: b\n /// > | c\n /// ^\n /// ```\n //\n // Either a blank line, which is okay, or an indented thing.\n return effects.check(blankLine, ok, effects.attempt(indent, ok, nok));\n}\n\n/** @type {Exiter} */\nfunction gfmFootnoteDefinitionEnd(effects) {\n effects.exit('gfmFootnoteDefinition');\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeIndent(effects, ok, nok) {\n const self = this;\n return factorySpace(effects, afterPrefix, 'gfmFootnoteDefinitionIndent', 4 + 1);\n\n /**\n * @type {State}\n */\n function afterPrefix(code) {\n const tail = self.events[self.events.length - 1];\n return tail && tail[1].type === 'gfmFootnoteDefinitionIndent' && tail[2].sliceSerialize(tail[1], true).length === 4 ? ok(code) : nok(code);\n }\n}","/**\n * @import {Options} from 'micromark-extension-gfm-strikethrough'\n * @import {Event, Extension, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { splice } from 'micromark-util-chunked';\nimport { classifyCharacter } from 'micromark-util-classify-character';\nimport { resolveAll } from 'micromark-util-resolve-all';\n/**\n * Create an extension for `micromark` to enable GFM strikethrough syntax.\n *\n * @param {Options | null | undefined} [options={}]\n * Configuration.\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions`, to\n * enable GFM strikethrough syntax.\n */\nexport function gfmStrikethrough(options) {\n const options_ = options || {};\n let single = options_.singleTilde;\n const tokenizer = {\n name: 'strikethrough',\n tokenize: tokenizeStrikethrough,\n resolveAll: resolveAllStrikethrough\n };\n if (single === null || single === undefined) {\n single = true;\n }\n return {\n text: {\n [126]: tokenizer\n },\n insideSpan: {\n null: [tokenizer]\n },\n attentionMarkers: {\n null: [126]\n }\n };\n\n /**\n * Take events and resolve strikethrough.\n *\n * @type {Resolver}\n */\n function resolveAllStrikethrough(events, context) {\n let index = -1;\n\n // Walk through all events.\n while (++index < events.length) {\n // Find a token that can close.\n if (events[index][0] === 'enter' && events[index][1].type === 'strikethroughSequenceTemporary' && events[index][1]._close) {\n let open = index;\n\n // Now walk back to find an opener.\n while (open--) {\n // Find a token that can open the closer.\n if (events[open][0] === 'exit' && events[open][1].type === 'strikethroughSequenceTemporary' && events[open][1]._open &&\n // If the sizes are the same:\n events[index][1].end.offset - events[index][1].start.offset === events[open][1].end.offset - events[open][1].start.offset) {\n events[index][1].type = 'strikethroughSequence';\n events[open][1].type = 'strikethroughSequence';\n\n /** @type {Token} */\n const strikethrough = {\n type: 'strikethrough',\n start: Object.assign({}, events[open][1].start),\n end: Object.assign({}, events[index][1].end)\n };\n\n /** @type {Token} */\n const text = {\n type: 'strikethroughText',\n start: Object.assign({}, events[open][1].end),\n end: Object.assign({}, events[index][1].start)\n };\n\n // Opening.\n /** @type {Array<Event>} */\n const nextEvents = [['enter', strikethrough, context], ['enter', events[open][1], context], ['exit', events[open][1], context], ['enter', text, context]];\n const insideSpan = context.parser.constructs.insideSpan.null;\n if (insideSpan) {\n // Between.\n splice(nextEvents, nextEvents.length, 0, resolveAll(insideSpan, events.slice(open + 1, index), context));\n }\n\n // Closing.\n splice(nextEvents, nextEvents.length, 0, [['exit', text, context], ['enter', events[index][1], context], ['exit', events[index][1], context], ['exit', strikethrough, context]]);\n splice(events, open - 1, index - open + 3, nextEvents);\n index = open + nextEvents.length - 2;\n break;\n }\n }\n }\n }\n index = -1;\n while (++index < events.length) {\n if (events[index][1].type === 'strikethroughSequenceTemporary') {\n events[index][1].type = \"data\";\n }\n }\n return events;\n }\n\n /**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\n function tokenizeStrikethrough(effects, ok, nok) {\n const previous = this.previous;\n const events = this.events;\n let size = 0;\n return start;\n\n /** @type {State} */\n function start(code) {\n if (previous === 126 && events[events.length - 1][1].type !== \"characterEscape\") {\n return nok(code);\n }\n effects.enter('strikethroughSequenceTemporary');\n return more(code);\n }\n\n /** @type {State} */\n function more(code) {\n const before = classifyCharacter(previous);\n if (code === 126) {\n // If this is the third marker, exit.\n if (size > 1) return nok(code);\n effects.consume(code);\n size++;\n return more;\n }\n if (size < 2 && !single) return nok(code);\n const token = effects.exit('strikethroughSequenceTemporary');\n const after = classifyCharacter(code);\n token._open = !after || after === 2 && Boolean(before);\n token._close = !before || before === 2 && Boolean(after);\n return ok(code);\n }\n }\n}","/**\n * @import {Event, Extension, Point, Resolver, State, Token, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\n/**\n * @typedef {[number, number, number, number]} Range\n * Cell info.\n *\n * @typedef {0 | 1 | 2 | 3} RowKind\n * Where we are: `1` for head row, `2` for delimiter row, `3` for body row.\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nimport { EditMap } from './edit-map.js';\nimport { gfmTableAlign } from './infer.js';\n\n/**\n * Create an HTML extension for `micromark` to support GitHub tables syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `extensions` to enable GFM\n * table syntax.\n */\nexport function gfmTable() {\n return {\n flow: {\n null: {\n name: 'table',\n tokenize: tokenizeTable,\n resolveAll: resolveTable\n }\n }\n };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTable(effects, ok, nok) {\n const self = this;\n let size = 0;\n let sizeB = 0;\n /** @type {boolean | undefined} */\n let seen;\n return start;\n\n /**\n * Start of a GFM table.\n *\n * If there is a valid table row or table head before, then we try to parse\n * another row.\n * Otherwise, we try to parse a head.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * > | | b |\n * ^\n * ```\n * @type {State}\n */\n function start(code) {\n let index = self.events.length - 1;\n while (index > -1) {\n const type = self.events[index][1].type;\n if (type === \"lineEnding\" ||\n // Note: markdown-rs uses `whitespace` instead of `linePrefix`\n type === \"linePrefix\") index--;else break;\n }\n const tail = index > -1 ? self.events[index][1].type : null;\n const next = tail === 'tableHead' || tail === 'tableRow' ? bodyRowStart : headRowBefore;\n\n // Don’t allow lazy body rows.\n if (next === bodyRowStart && self.parser.lazy[self.now().line]) {\n return nok(code);\n }\n return next(code);\n }\n\n /**\n * Before table head row.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowBefore(code) {\n effects.enter('tableHead');\n effects.enter('tableRow');\n return headRowStart(code);\n }\n\n /**\n * Before table head row, after whitespace.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowStart(code) {\n if (code === 124) {\n return headRowBreak(code);\n }\n\n // To do: micromark-js should let us parse our own whitespace in extensions,\n // like `markdown-rs`:\n //\n // ```js\n // // 4+ spaces.\n // if (markdownSpace(code)) {\n // return nok(code)\n // }\n // ```\n\n seen = true;\n // Count the first character, that isn’t a pipe, double.\n sizeB += 1;\n return headRowBreak(code);\n }\n\n /**\n * At break in table head row.\n *\n * ```markdown\n * > | | a |\n * ^\n * ^\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowBreak(code) {\n if (code === null) {\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n if (markdownLineEnding(code)) {\n // If anything other than one pipe (ignoring whitespace) was used, it’s fine.\n if (sizeB > 1) {\n sizeB = 0;\n // To do: check if this works.\n // Feel free to interrupt:\n self.interrupt = true;\n effects.exit('tableRow');\n effects.enter(\"lineEnding\");\n effects.consume(code);\n effects.exit(\"lineEnding\");\n return headDelimiterStart;\n }\n\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n if (markdownSpace(code)) {\n // To do: check if this is fine.\n // effects.attempt(State::Next(StateName::GfmTableHeadRowBreak), State::Nok)\n // State::Retry(space_or_tab(tokenizer))\n return factorySpace(effects, headRowBreak, \"whitespace\")(code);\n }\n sizeB += 1;\n if (seen) {\n seen = false;\n // Header cell count.\n size += 1;\n }\n if (code === 124) {\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n // Whether a delimiter was seen.\n seen = true;\n return headRowBreak;\n }\n\n // Anything else is cell data.\n effects.enter(\"data\");\n return headRowData(code);\n }\n\n /**\n * In table head row data.\n *\n * ```markdown\n * > | | a |\n * ^\n * | | - |\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headRowData(code) {\n if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n effects.exit(\"data\");\n return headRowBreak(code);\n }\n effects.consume(code);\n return code === 92 ? headRowEscape : headRowData;\n }\n\n /**\n * In table head row escape.\n *\n * ```markdown\n * > | | a\\-b |\n * ^\n * | | ---- |\n * | | c |\n * ```\n *\n * @type {State}\n */\n function headRowEscape(code) {\n if (code === 92 || code === 124) {\n effects.consume(code);\n return headRowData;\n }\n return headRowData(code);\n }\n\n /**\n * Before delimiter row.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headDelimiterStart(code) {\n // Reset `interrupt`.\n self.interrupt = false;\n\n // Note: in `markdown-rs`, we need to handle piercing here too.\n if (self.parser.lazy[self.now().line]) {\n return nok(code);\n }\n effects.enter('tableDelimiterRow');\n // Track if we’ve seen a `:` or `|`.\n seen = false;\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterBefore, \"linePrefix\", self.parser.constructs.disable.null.includes('codeIndented') ? undefined : 4)(code);\n }\n return headDelimiterBefore(code);\n }\n\n /**\n * Before delimiter row, after optional whitespace.\n *\n * Reused when a `|` is found later, to parse another cell.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * | | b |\n * ```\n *\n * @type {State}\n */\n function headDelimiterBefore(code) {\n if (code === 45 || code === 58) {\n return headDelimiterValueBefore(code);\n }\n if (code === 124) {\n seen = true;\n // If we start with a pipe, we open a cell marker.\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n return headDelimiterCellBefore;\n }\n\n // More whitespace / empty row not allowed at start.\n return headDelimiterNok(code);\n }\n\n /**\n * After `|`, before delimiter cell.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterCellBefore(code) {\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterValueBefore, \"whitespace\")(code);\n }\n return headDelimiterValueBefore(code);\n }\n\n /**\n * Before delimiter cell value.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterValueBefore(code) {\n // Align: left.\n if (code === 58) {\n sizeB += 1;\n seen = true;\n effects.enter('tableDelimiterMarker');\n effects.consume(code);\n effects.exit('tableDelimiterMarker');\n return headDelimiterLeftAlignmentAfter;\n }\n\n // Align: none.\n if (code === 45) {\n sizeB += 1;\n // To do: seems weird that this *isn’t* left aligned, but that state is used?\n return headDelimiterLeftAlignmentAfter(code);\n }\n if (code === null || markdownLineEnding(code)) {\n return headDelimiterCellAfter(code);\n }\n return headDelimiterNok(code);\n }\n\n /**\n * After delimiter cell left alignment marker.\n *\n * ```markdown\n * | | a |\n * > | | :- |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterLeftAlignmentAfter(code) {\n if (code === 45) {\n effects.enter('tableDelimiterFiller');\n return headDelimiterFiller(code);\n }\n\n // Anything else is not ok after the left-align colon.\n return headDelimiterNok(code);\n }\n\n /**\n * In delimiter cell filler.\n *\n * ```markdown\n * | | a |\n * > | | - |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterFiller(code) {\n if (code === 45) {\n effects.consume(code);\n return headDelimiterFiller;\n }\n\n // Align is `center` if it was `left`, `right` otherwise.\n if (code === 58) {\n seen = true;\n effects.exit('tableDelimiterFiller');\n effects.enter('tableDelimiterMarker');\n effects.consume(code);\n effects.exit('tableDelimiterMarker');\n return headDelimiterRightAlignmentAfter;\n }\n effects.exit('tableDelimiterFiller');\n return headDelimiterRightAlignmentAfter(code);\n }\n\n /**\n * After delimiter cell right alignment marker.\n *\n * ```markdown\n * | | a |\n * > | | -: |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterRightAlignmentAfter(code) {\n if (markdownSpace(code)) {\n return factorySpace(effects, headDelimiterCellAfter, \"whitespace\")(code);\n }\n return headDelimiterCellAfter(code);\n }\n\n /**\n * After delimiter cell.\n *\n * ```markdown\n * | | a |\n * > | | -: |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterCellAfter(code) {\n if (code === 124) {\n return headDelimiterBefore(code);\n }\n if (code === null || markdownLineEnding(code)) {\n // Exit when:\n // * there was no `:` or `|` at all (it’s a thematic break or setext\n // underline instead)\n // * the header cell count is not the delimiter cell count\n if (!seen || size !== sizeB) {\n return headDelimiterNok(code);\n }\n\n // Note: in markdown-rs`, a reset is needed here.\n effects.exit('tableDelimiterRow');\n effects.exit('tableHead');\n // To do: in `markdown-rs`, resolvers need to be registered manually.\n // effects.register_resolver(ResolveName::GfmTable)\n return ok(code);\n }\n return headDelimiterNok(code);\n }\n\n /**\n * In delimiter row, at a disallowed byte.\n *\n * ```markdown\n * | | a |\n * > | | x |\n * ^\n * ```\n *\n * @type {State}\n */\n function headDelimiterNok(code) {\n // Note: in `markdown-rs`, we need to reset, in `micromark-js` we don‘t.\n return nok(code);\n }\n\n /**\n * Before table body row.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowStart(code) {\n // Note: in `markdown-rs` we need to manually take care of a prefix,\n // but in `micromark-js` that is done for us, so if we’re here, we’re\n // never at whitespace.\n effects.enter('tableRow');\n return bodyRowBreak(code);\n }\n\n /**\n * At break in table body row.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ^\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowBreak(code) {\n if (code === 124) {\n effects.enter('tableCellDivider');\n effects.consume(code);\n effects.exit('tableCellDivider');\n return bodyRowBreak;\n }\n if (code === null || markdownLineEnding(code)) {\n effects.exit('tableRow');\n return ok(code);\n }\n if (markdownSpace(code)) {\n return factorySpace(effects, bodyRowBreak, \"whitespace\")(code);\n }\n\n // Anything else is cell content.\n effects.enter(\"data\");\n return bodyRowData(code);\n }\n\n /**\n * In table body row data.\n *\n * ```markdown\n * | | a |\n * | | - |\n * > | | b |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowData(code) {\n if (code === null || code === 124 || markdownLineEndingOrSpace(code)) {\n effects.exit(\"data\");\n return bodyRowBreak(code);\n }\n effects.consume(code);\n return code === 92 ? bodyRowEscape : bodyRowData;\n }\n\n /**\n * In table body row escape.\n *\n * ```markdown\n * | | a |\n * | | ---- |\n * > | | b\\-c |\n * ^\n * ```\n *\n * @type {State}\n */\n function bodyRowEscape(code) {\n if (code === 92 || code === 124) {\n effects.consume(code);\n return bodyRowData;\n }\n return bodyRowData(code);\n }\n}\n\n/** @type {Resolver} */\n\nfunction resolveTable(events, context) {\n let index = -1;\n let inFirstCellAwaitingPipe = true;\n /** @type {RowKind} */\n let rowKind = 0;\n /** @type {Range} */\n let lastCell = [0, 0, 0, 0];\n /** @type {Range} */\n let cell = [0, 0, 0, 0];\n let afterHeadAwaitingFirstBodyRow = false;\n let lastTableEnd = 0;\n /** @type {Token | undefined} */\n let currentTable;\n /** @type {Token | undefined} */\n let currentBody;\n /** @type {Token | undefined} */\n let currentCell;\n const map = new EditMap();\n while (++index < events.length) {\n const event = events[index];\n const token = event[1];\n if (event[0] === 'enter') {\n // Start of head.\n if (token.type === 'tableHead') {\n afterHeadAwaitingFirstBodyRow = false;\n\n // Inject previous (body end and) table end.\n if (lastTableEnd !== 0) {\n flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n currentBody = undefined;\n lastTableEnd = 0;\n }\n\n // Inject table start.\n currentTable = {\n type: 'table',\n start: Object.assign({}, token.start),\n // Note: correct end is set later.\n end: Object.assign({}, token.end)\n };\n map.add(index, 0, [['enter', currentTable, context]]);\n } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n inFirstCellAwaitingPipe = true;\n currentCell = undefined;\n lastCell = [0, 0, 0, 0];\n cell = [0, index + 1, 0, 0];\n\n // Inject table body start.\n if (afterHeadAwaitingFirstBodyRow) {\n afterHeadAwaitingFirstBodyRow = false;\n currentBody = {\n type: 'tableBody',\n start: Object.assign({}, token.start),\n // Note: correct end is set later.\n end: Object.assign({}, token.end)\n };\n map.add(index, 0, [['enter', currentBody, context]]);\n }\n rowKind = token.type === 'tableDelimiterRow' ? 2 : currentBody ? 3 : 1;\n }\n // Cell data.\n else if (rowKind && (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n inFirstCellAwaitingPipe = false;\n\n // First value in cell.\n if (cell[2] === 0) {\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n lastCell = [0, 0, 0, 0];\n }\n cell[2] = index;\n }\n } else if (token.type === 'tableCellDivider') {\n if (inFirstCellAwaitingPipe) {\n inFirstCellAwaitingPipe = false;\n } else {\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, undefined, currentCell);\n }\n lastCell = cell;\n cell = [lastCell[1], index, 0, 0];\n }\n }\n }\n // Exit events.\n else if (token.type === 'tableHead') {\n afterHeadAwaitingFirstBodyRow = true;\n lastTableEnd = index;\n } else if (token.type === 'tableRow' || token.type === 'tableDelimiterRow') {\n lastTableEnd = index;\n if (lastCell[1] !== 0) {\n cell[0] = cell[1];\n currentCell = flushCell(map, context, lastCell, rowKind, index, currentCell);\n } else if (cell[1] !== 0) {\n currentCell = flushCell(map, context, cell, rowKind, index, currentCell);\n }\n rowKind = 0;\n } else if (rowKind && (token.type === \"data\" || token.type === 'tableDelimiterMarker' || token.type === 'tableDelimiterFiller')) {\n cell[3] = index;\n }\n }\n if (lastTableEnd !== 0) {\n flushTableEnd(map, context, lastTableEnd, currentTable, currentBody);\n }\n map.consume(context.events);\n\n // To do: move this into `html`, when events are exposed there.\n // That’s what `markdown-rs` does.\n // That needs updates to `mdast-util-gfm-table`.\n index = -1;\n while (++index < context.events.length) {\n const event = context.events[index];\n if (event[0] === 'enter' && event[1].type === 'table') {\n event[1]._align = gfmTableAlign(context.events, index);\n }\n }\n return events;\n}\n\n/**\n * Generate a cell.\n *\n * @param {EditMap} map\n * @param {Readonly<TokenizeContext>} context\n * @param {Readonly<Range>} range\n * @param {RowKind} rowKind\n * @param {number | undefined} rowEnd\n * @param {Token | undefined} previousCell\n * @returns {Token | undefined}\n */\n// eslint-disable-next-line max-params\nfunction flushCell(map, context, range, rowKind, rowEnd, previousCell) {\n // `markdown-rs` uses:\n // rowKind === 2 ? 'tableDelimiterCell' : 'tableCell'\n const groupName = rowKind === 1 ? 'tableHeader' : rowKind === 2 ? 'tableDelimiter' : 'tableData';\n // `markdown-rs` uses:\n // rowKind === 2 ? 'tableDelimiterCellValue' : 'tableCellText'\n const valueName = 'tableContent';\n\n // Insert an exit for the previous cell, if there is one.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- exit\n // ^^^^-- this cell\n // ```\n if (range[0] !== 0) {\n previousCell.end = Object.assign({}, getPoint(context.events, range[0]));\n map.add(range[0], 0, [['exit', previousCell, context]]);\n }\n\n // Insert enter of this cell.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- enter\n // ^^^^-- this cell\n // ```\n const now = getPoint(context.events, range[1]);\n previousCell = {\n type: groupName,\n start: Object.assign({}, now),\n // Note: correct end is set later.\n end: Object.assign({}, now)\n };\n map.add(range[1], 0, [['enter', previousCell, context]]);\n\n // Insert text start at first data start and end at last data end, and\n // remove events between.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- enter\n // ^-- exit\n // ^^^^-- this cell\n // ```\n if (range[2] !== 0) {\n const relatedStart = getPoint(context.events, range[2]);\n const relatedEnd = getPoint(context.events, range[3]);\n /** @type {Token} */\n const valueToken = {\n type: valueName,\n start: Object.assign({}, relatedStart),\n end: Object.assign({}, relatedEnd)\n };\n map.add(range[2], 0, [['enter', valueToken, context]]);\n if (rowKind !== 2) {\n // Fix positional info on remaining events\n const start = context.events[range[2]];\n const end = context.events[range[3]];\n start[1].end = Object.assign({}, end[1].end);\n start[1].type = \"chunkText\";\n start[1].contentType = \"text\";\n\n // Remove if needed.\n if (range[3] > range[2] + 1) {\n const a = range[2] + 1;\n const b = range[3] - range[2] - 1;\n map.add(a, b, []);\n }\n }\n map.add(range[3] + 1, 0, [['exit', valueToken, context]]);\n }\n\n // Insert an exit for the last cell, if at the row end.\n //\n // ```markdown\n // > | | aa | bb | cc |\n // ^-- exit\n // ^^^^^^-- this cell (the last one contains two “between” parts)\n // ```\n if (rowEnd !== undefined) {\n previousCell.end = Object.assign({}, getPoint(context.events, rowEnd));\n map.add(rowEnd, 0, [['exit', previousCell, context]]);\n previousCell = undefined;\n }\n return previousCell;\n}\n\n/**\n * Generate table end (and table body end).\n *\n * @param {Readonly<EditMap>} map\n * @param {Readonly<TokenizeContext>} context\n * @param {number} index\n * @param {Token} table\n * @param {Token | undefined} tableBody\n */\n// eslint-disable-next-line max-params\nfunction flushTableEnd(map, context, index, table, tableBody) {\n /** @type {Array<Event>} */\n const exits = [];\n const related = getPoint(context.events, index);\n if (tableBody) {\n tableBody.end = Object.assign({}, related);\n exits.push(['exit', tableBody, context]);\n }\n table.end = Object.assign({}, related);\n exits.push(['exit', table, context]);\n map.add(index + 1, 0, exits);\n}\n\n/**\n * @param {Readonly<Array<Event>>} events\n * @param {number} index\n * @returns {Readonly<Point>}\n */\nfunction getPoint(events, index) {\n const event = events[index];\n const side = event[0] === 'enter' ? 'start' : 'end';\n return event[1][side];\n}","/**\n * @import {Event} from 'micromark-util-types'\n */\n\n// Port of `edit_map.rs` from `markdown-rs`.\n// This should move to `markdown-js` later.\n\n// Deal with several changes in events, batching them together.\n//\n// Preferably, changes should be kept to a minimum.\n// Sometimes, it’s needed to change the list of events, because parsing can be\n// messy, and it helps to expose a cleaner interface of events to the compiler\n// and other users.\n// It can also help to merge many adjacent similar events.\n// And, in other cases, it’s needed to parse subcontent: pass some events\n// through another tokenizer and inject the result.\n\n/**\n * @typedef {[number, number, Array<Event>]} Change\n * @typedef {[number, number, number]} Jump\n */\n\n/**\n * Tracks a bunch of edits.\n */\nexport class EditMap {\n /**\n * Create a new edit map.\n */\n constructor() {\n /**\n * Record of changes.\n *\n * @type {Array<Change>}\n */\n this.map = [];\n }\n\n /**\n * Create an edit: a remove and/or add at a certain place.\n *\n * @param {number} index\n * @param {number} remove\n * @param {Array<Event>} add\n * @returns {undefined}\n */\n add(index, remove, add) {\n addImplementation(this, index, remove, add);\n }\n\n // To do: add this when moving to `micromark`.\n // /**\n // * Create an edit: but insert `add` before existing additions.\n // *\n // * @param {number} index\n // * @param {number} remove\n // * @param {Array<Event>} add\n // * @returns {undefined}\n // */\n // addBefore(index, remove, add) {\n // addImplementation(this, index, remove, add, true)\n // }\n\n /**\n * Done, change the events.\n *\n * @param {Array<Event>} events\n * @returns {undefined}\n */\n consume(events) {\n this.map.sort(function (a, b) {\n return a[0] - b[0];\n });\n\n /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n if (this.map.length === 0) {\n return;\n }\n\n // To do: if links are added in events, like they are in `markdown-rs`,\n // this is needed.\n // // Calculate jumps: where items in the current list move to.\n // /** @type {Array<Jump>} */\n // const jumps = []\n // let index = 0\n // let addAcc = 0\n // let removeAcc = 0\n // while (index < this.map.length) {\n // const [at, remove, add] = this.map[index]\n // removeAcc += remove\n // addAcc += add.length\n // jumps.push([at, removeAcc, addAcc])\n // index += 1\n // }\n //\n // . shiftLinks(events, jumps)\n\n let index = this.map.length;\n /** @type {Array<Array<Event>>} */\n const vecs = [];\n while (index > 0) {\n index -= 1;\n vecs.push(events.slice(this.map[index][0] + this.map[index][1]), this.map[index][2]);\n\n // Truncate rest.\n events.length = this.map[index][0];\n }\n vecs.push(events.slice());\n events.length = 0;\n let slice = vecs.pop();\n while (slice) {\n for (const element of slice) {\n events.push(element);\n }\n slice = vecs.pop();\n }\n\n // Truncate everything.\n this.map.length = 0;\n }\n}\n\n/**\n * Create an edit.\n *\n * @param {EditMap} editMap\n * @param {number} at\n * @param {number} remove\n * @param {Array<Event>} add\n * @returns {undefined}\n */\nfunction addImplementation(editMap, at, remove, add) {\n let index = 0;\n\n /* c8 ignore next 3 -- `resolve` is never called without tables, so without edits. */\n if (remove === 0 && add.length === 0) {\n return;\n }\n while (index < editMap.map.length) {\n if (editMap.map[index][0] === at) {\n editMap.map[index][1] += remove;\n\n // To do: before not used by tables, use when moving to micromark.\n // if (before) {\n // add.push(...editMap.map[index][2])\n // editMap.map[index][2] = add\n // } else {\n editMap.map[index][2].push(...add);\n // }\n\n return;\n }\n index += 1;\n }\n editMap.map.push([at, remove, add]);\n}\n\n// /**\n// * Shift `previous` and `next` links according to `jumps`.\n// *\n// * This fixes links in case there are events removed or added between them.\n// *\n// * @param {Array<Event>} events\n// * @param {Array<Jump>} jumps\n// */\n// function shiftLinks(events, jumps) {\n// let jumpIndex = 0\n// let index = 0\n// let add = 0\n// let rm = 0\n\n// while (index < events.length) {\n// const rmCurr = rm\n\n// while (jumpIndex < jumps.length && jumps[jumpIndex][0] <= index) {\n// add = jumps[jumpIndex][2]\n// rm = jumps[jumpIndex][1]\n// jumpIndex += 1\n// }\n\n// // Ignore items that will be removed.\n// if (rm > rmCurr) {\n// index += rm - rmCurr\n// } else {\n// // ?\n// // if let Some(link) = &events[index].link {\n// // if let Some(next) = link.next {\n// // events[next].link.as_mut().unwrap().previous = Some(index + add - rm);\n// // while jumpIndex < jumps.len() && jumps[jumpIndex].0 <= next {\n// // add = jumps[jumpIndex].2;\n// // rm = jumps[jumpIndex].1;\n// // jumpIndex += 1;\n// // }\n// // events[index].link.as_mut().unwrap().next = Some(next + add - rm);\n// // index = next;\n// // continue;\n// // }\n// // }\n// index += 1\n// }\n// }\n// }","/**\n * @import {Event} from 'micromark-util-types'\n */\n\n/**\n * @typedef {'center' | 'left' | 'none' | 'right'} Align\n */\n\n/**\n * Figure out the alignment of a GFM table.\n *\n * @param {Readonly<Array<Event>>} events\n * List of events.\n * @param {number} index\n * Table enter event.\n * @returns {Array<Align>}\n * List of aligns.\n */\nexport function gfmTableAlign(events, index) {\n let inDelimiterRow = false;\n /** @type {Array<Align>} */\n const align = [];\n while (index < events.length) {\n const event = events[index];\n if (inDelimiterRow) {\n if (event[0] === 'enter') {\n // Start of alignment value: set a new column.\n // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n if (event[1].type === 'tableContent') {\n align.push(events[index + 1][1].type === 'tableDelimiterMarker' ? 'left' : 'none');\n }\n }\n // Exits:\n // End of alignment value: change the column.\n // To do: `markdown-rs` uses `tableDelimiterCellValue`.\n else if (event[1].type === 'tableContent') {\n if (events[index - 1][1].type === 'tableDelimiterMarker') {\n const alignIndex = align.length - 1;\n align[alignIndex] = align[alignIndex] === 'left' ? 'center' : 'right';\n }\n }\n // Done!\n else if (event[1].type === 'tableDelimiterRow') {\n break;\n }\n } else if (event[0] === 'enter' && event[1].type === 'tableDelimiterRow') {\n inDelimiterRow = true;\n }\n index += 1;\n }\n return align;\n}","/**\n * @import {Extension, State, TokenizeContext, Tokenizer} from 'micromark-util-types'\n */\n\nimport { factorySpace } from 'micromark-factory-space';\nimport { markdownLineEnding, markdownLineEndingOrSpace, markdownSpace } from 'micromark-util-character';\nconst tasklistCheck = {\n name: 'tasklistCheck',\n tokenize: tokenizeTasklistCheck\n};\n\n/**\n * Create an HTML extension for `micromark` to support GFM task list items\n * syntax.\n *\n * @returns {Extension}\n * Extension for `micromark` that can be passed in `htmlExtensions` to\n * support GFM task list items when serializing to HTML.\n */\nexport function gfmTaskListItem() {\n return {\n text: {\n [91]: tasklistCheck\n }\n };\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction tokenizeTasklistCheck(effects, ok, nok) {\n const self = this;\n return open;\n\n /**\n * At start of task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function open(code) {\n if (\n // Exit if there’s stuff before.\n self.previous !== null ||\n // Exit if not in the first content that is the first child of a list\n // item.\n !self._gfmTasklistFirstContentOfListItem) {\n return nok(code);\n }\n effects.enter('taskListCheck');\n effects.enter('taskListCheckMarker');\n effects.consume(code);\n effects.exit('taskListCheckMarker');\n return inside;\n }\n\n /**\n * In task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function inside(code) {\n // Currently we match how GH works in files.\n // To match how GH works in comments, use `markdownSpace` (`[\\t ]`) instead\n // of `markdownLineEndingOrSpace` (`[\\t\\n\\r ]`).\n if (markdownLineEndingOrSpace(code)) {\n effects.enter('taskListCheckValueUnchecked');\n effects.consume(code);\n effects.exit('taskListCheckValueUnchecked');\n return close;\n }\n if (code === 88 || code === 120) {\n effects.enter('taskListCheckValueChecked');\n effects.consume(code);\n effects.exit('taskListCheckValueChecked');\n return close;\n }\n return nok(code);\n }\n\n /**\n * At close of task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function close(code) {\n if (code === 93) {\n effects.enter('taskListCheckMarker');\n effects.consume(code);\n effects.exit('taskListCheckMarker');\n effects.exit('taskListCheck');\n return after;\n }\n return nok(code);\n }\n\n /**\n * @type {State}\n */\n function after(code) {\n // EOL in paragraph means there must be something else after it.\n if (markdownLineEnding(code)) {\n return ok(code);\n }\n\n // Space or tab?\n // Check what comes after.\n if (markdownSpace(code)) {\n return effects.check({\n tokenize: spaceThenNonSpace\n }, ok, nok)(code);\n }\n\n // EOF, or non-whitespace, both wrong.\n return nok(code);\n }\n}\n\n/**\n * @this {TokenizeContext}\n * @type {Tokenizer}\n */\nfunction spaceThenNonSpace(effects, ok, nok) {\n return factorySpace(effects, after, \"whitespace\");\n\n /**\n * After whitespace, after task list item check.\n *\n * ```markdown\n * > | * [x] y.\n * ^\n * ```\n *\n * @type {State}\n */\n function after(code) {\n // EOF means there was nothing, so bad.\n // EOL means there’s content after it, so good.\n // Impossible to have more spaces.\n // Anything else is good.\n return code === null ? nok(code) : ok(code);\n }\n}","export function deprecate(fn) {\n return fn\n}\n\nexport function equal() {}\n\nexport function ok() {}\n\nexport function unreachable() {}\n","/**\n * @import {\n * CompileContext,\n * Extension as FromMarkdownExtension,\n * Handle as FromMarkdownHandle\n * } from 'mdast-util-from-markdown'\n * @import {ToMarkdownOptions} from 'mdast-util-gfm-footnote'\n * @import {\n * Handle as ToMarkdownHandle,\n * Map,\n * Options as ToMarkdownExtension\n * } from 'mdast-util-to-markdown'\n * @import {FootnoteDefinition, FootnoteReference} from 'mdast'\n */\n\nimport {ok as assert} from 'devlop'\nimport {normalizeIdentifier} from 'micromark-util-normalize-identifier'\n\nfootnoteReference.peek = footnoteReferencePeek\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCallString() {\n this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteCall(token) {\n this.enter({type: 'footnoteReference', identifier: '', label: ''}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinitionLabelString() {\n this.buffer()\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterFootnoteDefinition(token) {\n this.enter(\n {type: 'footnoteDefinition', identifier: '', label: '', children: []},\n token\n )\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCallString(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'footnoteReference')\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteCall(token) {\n this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinitionLabelString(token) {\n const label = this.resume()\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'footnoteDefinition')\n node.identifier = normalizeIdentifier(\n this.sliceSerialize(token)\n ).toLowerCase()\n node.label = label\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitFootnoteDefinition(token) {\n this.exit(token)\n}\n\n/** @type {ToMarkdownHandle} */\nfunction footnoteReferencePeek() {\n return '['\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {FootnoteReference} node\n */\nfunction footnoteReference(node, _, state, info) {\n const tracker = state.createTracker(info)\n let value = tracker.move('[^')\n const exit = state.enter('footnoteReference')\n const subexit = state.enter('reference')\n value += tracker.move(\n state.safe(state.associationId(node), {after: ']', before: value})\n )\n subexit()\n exit()\n value += tracker.move(']')\n return value\n}\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown`.\n */\nexport function gfmFootnoteFromMarkdown() {\n return {\n enter: {\n gfmFootnoteCallString: enterFootnoteCallString,\n gfmFootnoteCall: enterFootnoteCall,\n gfmFootnoteDefinitionLabelString: enterFootnoteDefinitionLabelString,\n gfmFootnoteDefinition: enterFootnoteDefinition\n },\n exit: {\n gfmFootnoteCallString: exitFootnoteCallString,\n gfmFootnoteCall: exitFootnoteCall,\n gfmFootnoteDefinitionLabelString: exitFootnoteDefinitionLabelString,\n gfmFootnoteDefinition: exitFootnoteDefinition\n }\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM footnotes\n * in markdown.\n *\n * @param {ToMarkdownOptions | null | undefined} [options]\n * Configuration (optional).\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown`.\n */\nexport function gfmFootnoteToMarkdown(options) {\n // To do: next major: change default.\n let firstLineBlank = false\n\n if (options && options.firstLineBlank) {\n firstLineBlank = true\n }\n\n return {\n handlers: {footnoteDefinition, footnoteReference},\n // This is on by default already.\n unsafe: [{character: '[', inConstruct: ['label', 'phrasing', 'reference']}]\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {FootnoteDefinition} node\n */\n function footnoteDefinition(node, _, state, info) {\n const tracker = state.createTracker(info)\n let value = tracker.move('[^')\n const exit = state.enter('footnoteDefinition')\n const subexit = state.enter('label')\n value += tracker.move(\n state.safe(state.associationId(node), {before: value, after: ']'})\n )\n subexit()\n\n value += tracker.move(']:')\n\n if (node.children && node.children.length > 0) {\n tracker.shift(4)\n\n value += tracker.move(\n (firstLineBlank ? '\\n' : ' ') +\n state.indentLines(\n state.containerFlow(node, tracker.current()),\n firstLineBlank ? mapAll : mapExceptFirst\n )\n )\n }\n\n exit()\n\n return value\n }\n}\n\n/** @type {Map} */\nfunction mapExceptFirst(line, index, blank) {\n return index === 0 ? line : mapAll(line, index, blank)\n}\n\n/** @type {Map} */\nfunction mapAll(line, index, blank) {\n return (blank ? '' : ' ') + line\n}\n","/**\n * @typedef {import('mdast').Delete} Delete\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').ConstructName} ConstructName\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n */\n\n/**\n * List of constructs that occur in phrasing (paragraphs, headings), but cannot\n * contain strikethrough.\n * So they sort of cancel each other out.\n * Note: could use a better name.\n *\n * Note: keep in sync with: <https://github.com/syntax-tree/mdast-util-to-markdown/blob/8ce8dbf/lib/unsafe.js#L14>\n *\n * @type {Array<ConstructName>}\n */\nconst constructsWithoutStrikethrough = [\n 'autolink',\n 'destinationLiteral',\n 'destinationRaw',\n 'reference',\n 'titleQuote',\n 'titleApostrophe'\n]\n\nhandleDelete.peek = peekDelete\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughFromMarkdown() {\n return {\n canContainEols: ['delete'],\n enter: {strikethrough: enterStrikethrough},\n exit: {strikethrough: exitStrikethrough}\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM\n * strikethrough in markdown.\n *\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM strikethrough.\n */\nexport function gfmStrikethroughToMarkdown() {\n return {\n unsafe: [\n {\n character: '~',\n inConstruct: 'phrasing',\n notInConstruct: constructsWithoutStrikethrough\n }\n ],\n handlers: {delete: handleDelete}\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterStrikethrough(token) {\n this.enter({type: 'delete', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitStrikethrough(token) {\n this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {Delete} node\n */\nfunction handleDelete(node, _, state, info) {\n const tracker = state.createTracker(info)\n const exit = state.enter('strikethrough')\n let value = tracker.move('~~')\n value += state.containerPhrasing(node, {\n ...tracker.current(),\n before: value,\n after: '~'\n })\n value += tracker.move('~~')\n exit()\n return value\n}\n\n/** @type {ToMarkdownHandle} */\nfunction peekDelete() {\n return '~'\n}\n","// To do: next major: remove.\n/**\n * @typedef {Options} MarkdownTableOptions\n * Configuration.\n */\n\n/**\n * @typedef Options\n * Configuration.\n * @property {boolean | null | undefined} [alignDelimiters=true]\n * Whether to align the delimiters (default: `true`);\n * they are aligned by default:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * Pass `false` to make them staggered:\n *\n * ```markdown\n * | Alpha | B |\n * | - | - |\n * | C | Delta |\n * ```\n * @property {ReadonlyArray<string | null | undefined> | string | null | undefined} [align]\n * How to align columns (default: `''`);\n * one style for all columns or styles for their respective columns;\n * each style is either `'l'` (left), `'r'` (right), or `'c'` (center);\n * other values are treated as `''`, which doesn’t place the colon in the\n * alignment row but does align left;\n * *only the lowercased first character is used, so `Right` is fine.*\n * @property {boolean | null | undefined} [delimiterEnd=true]\n * Whether to end each row with the delimiter (default: `true`).\n *\n * > 👉 **Note**: please don’t use this: it could create fragile structures\n * > that aren’t understandable to some markdown parsers.\n *\n * When `true`, there are ending delimiters:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there are no ending delimiters:\n *\n * ```markdown\n * | Alpha | B\n * | ----- | -----\n * | C | Delta\n * ```\n * @property {boolean | null | undefined} [delimiterStart=true]\n * Whether to begin each row with the delimiter (default: `true`).\n *\n * > 👉 **Note**: please don’t use this: it could create fragile structures\n * > that aren’t understandable to some markdown parsers.\n *\n * When `true`, there are starting delimiters:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there are no starting delimiters:\n *\n * ```markdown\n * Alpha | B |\n * ----- | ----- |\n * C | Delta |\n * ```\n * @property {boolean | null | undefined} [padding=true]\n * Whether to add a space of padding between delimiters and cells\n * (default: `true`).\n *\n * When `true`, there is padding:\n *\n * ```markdown\n * | Alpha | B |\n * | ----- | ----- |\n * | C | Delta |\n * ```\n *\n * When `false`, there is no padding:\n *\n * ```markdown\n * |Alpha|B |\n * |-----|-----|\n * |C |Delta|\n * ```\n * @property {((value: string) => number) | null | undefined} [stringLength]\n * Function to detect the length of table cell content (optional);\n * this is used when aligning the delimiters (`|`) between table cells;\n * full-width characters and emoji mess up delimiter alignment when viewing\n * the markdown source;\n * to fix this, you can pass this function,\n * which receives the cell content and returns its “visible” size;\n * note that what is and isn’t visible depends on where the text is displayed.\n *\n * Without such a function, the following:\n *\n * ```js\n * markdownTable([\n * ['Alpha', 'Bravo'],\n * ['中文', 'Charlie'],\n * ['👩❤️👩', 'Delta']\n * ])\n * ```\n *\n * Yields:\n *\n * ```markdown\n * | Alpha | Bravo |\n * | - | - |\n * | 中文 | Charlie |\n * | 👩❤️👩 | Delta |\n * ```\n *\n * With [`string-width`](https://github.com/sindresorhus/string-width):\n *\n * ```js\n * import stringWidth from 'string-width'\n *\n * markdownTable(\n * [\n * ['Alpha', 'Bravo'],\n * ['中文', 'Charlie'],\n * ['👩❤️👩', 'Delta']\n * ],\n * {stringLength: stringWidth}\n * )\n * ```\n *\n * Yields:\n *\n * ```markdown\n * | Alpha | Bravo |\n * | ----- | ------- |\n * | 中文 | Charlie |\n * | 👩❤️👩 | Delta |\n * ```\n */\n\n/**\n * @param {string} value\n * Cell value.\n * @returns {number}\n * Cell size.\n */\nfunction defaultStringLength(value) {\n return value.length\n}\n\n/**\n * Generate a markdown\n * ([GFM](https://docs.github.com/en/github/writing-on-github/working-with-advanced-formatting/organizing-information-with-tables))\n * table.\n *\n * @param {ReadonlyArray<ReadonlyArray<string | null | undefined>>} table\n * Table data (matrix of strings).\n * @param {Readonly<Options> | null | undefined} [options]\n * Configuration (optional).\n * @returns {string}\n * Result.\n */\nexport function markdownTable(table, options) {\n const settings = options || {}\n // To do: next major: change to spread.\n const align = (settings.align || []).concat()\n const stringLength = settings.stringLength || defaultStringLength\n /** @type {Array<number>} Character codes as symbols for alignment per column. */\n const alignments = []\n /** @type {Array<Array<string>>} Cells per row. */\n const cellMatrix = []\n /** @type {Array<Array<number>>} Sizes of each cell per row. */\n const sizeMatrix = []\n /** @type {Array<number>} */\n const longestCellByColumn = []\n let mostCellsPerRow = 0\n let rowIndex = -1\n\n // This is a superfluous loop if we don’t align delimiters, but otherwise we’d\n // do superfluous work when aligning, so optimize for aligning.\n while (++rowIndex < table.length) {\n /** @type {Array<string>} */\n const row = []\n /** @type {Array<number>} */\n const sizes = []\n let columnIndex = -1\n\n if (table[rowIndex].length > mostCellsPerRow) {\n mostCellsPerRow = table[rowIndex].length\n }\n\n while (++columnIndex < table[rowIndex].length) {\n const cell = serialize(table[rowIndex][columnIndex])\n\n if (settings.alignDelimiters !== false) {\n const size = stringLength(cell)\n sizes[columnIndex] = size\n\n if (\n longestCellByColumn[columnIndex] === undefined ||\n size > longestCellByColumn[columnIndex]\n ) {\n longestCellByColumn[columnIndex] = size\n }\n }\n\n row.push(cell)\n }\n\n cellMatrix[rowIndex] = row\n sizeMatrix[rowIndex] = sizes\n }\n\n // Figure out which alignments to use.\n let columnIndex = -1\n\n if (typeof align === 'object' && 'length' in align) {\n while (++columnIndex < mostCellsPerRow) {\n alignments[columnIndex] = toAlignment(align[columnIndex])\n }\n } else {\n const code = toAlignment(align)\n\n while (++columnIndex < mostCellsPerRow) {\n alignments[columnIndex] = code\n }\n }\n\n // Inject the alignment row.\n columnIndex = -1\n /** @type {Array<string>} */\n const row = []\n /** @type {Array<number>} */\n const sizes = []\n\n while (++columnIndex < mostCellsPerRow) {\n const code = alignments[columnIndex]\n let before = ''\n let after = ''\n\n if (code === 99 /* `c` */) {\n before = ':'\n after = ':'\n } else if (code === 108 /* `l` */) {\n before = ':'\n } else if (code === 114 /* `r` */) {\n after = ':'\n }\n\n // There *must* be at least one hyphen-minus in each alignment cell.\n let size =\n settings.alignDelimiters === false\n ? 1\n : Math.max(\n 1,\n longestCellByColumn[columnIndex] - before.length - after.length\n )\n\n const cell = before + '-'.repeat(size) + after\n\n if (settings.alignDelimiters !== false) {\n size = before.length + size + after.length\n\n if (size > longestCellByColumn[columnIndex]) {\n longestCellByColumn[columnIndex] = size\n }\n\n sizes[columnIndex] = size\n }\n\n row[columnIndex] = cell\n }\n\n // Inject the alignment row.\n cellMatrix.splice(1, 0, row)\n sizeMatrix.splice(1, 0, sizes)\n\n rowIndex = -1\n /** @type {Array<string>} */\n const lines = []\n\n while (++rowIndex < cellMatrix.length) {\n const row = cellMatrix[rowIndex]\n const sizes = sizeMatrix[rowIndex]\n columnIndex = -1\n /** @type {Array<string>} */\n const line = []\n\n while (++columnIndex < mostCellsPerRow) {\n const cell = row[columnIndex] || ''\n let before = ''\n let after = ''\n\n if (settings.alignDelimiters !== false) {\n const size =\n longestCellByColumn[columnIndex] - (sizes[columnIndex] || 0)\n const code = alignments[columnIndex]\n\n if (code === 114 /* `r` */) {\n before = ' '.repeat(size)\n } else if (code === 99 /* `c` */) {\n if (size % 2) {\n before = ' '.repeat(size / 2 + 0.5)\n after = ' '.repeat(size / 2 - 0.5)\n } else {\n before = ' '.repeat(size / 2)\n after = before\n }\n } else {\n after = ' '.repeat(size)\n }\n }\n\n if (settings.delimiterStart !== false && !columnIndex) {\n line.push('|')\n }\n\n if (\n settings.padding !== false &&\n // Don’t add the opening space if we’re not aligning and the cell is\n // empty: there will be a closing space.\n !(settings.alignDelimiters === false && cell === '') &&\n (settings.delimiterStart !== false || columnIndex)\n ) {\n line.push(' ')\n }\n\n if (settings.alignDelimiters !== false) {\n line.push(before)\n }\n\n line.push(cell)\n\n if (settings.alignDelimiters !== false) {\n line.push(after)\n }\n\n if (settings.padding !== false) {\n line.push(' ')\n }\n\n if (\n settings.delimiterEnd !== false ||\n columnIndex !== mostCellsPerRow - 1\n ) {\n line.push('|')\n }\n }\n\n lines.push(\n settings.delimiterEnd === false\n ? line.join('').replace(/ +$/, '')\n : line.join('')\n )\n }\n\n return lines.join('\\n')\n}\n\n/**\n * @param {string | null | undefined} [value]\n * Value to serialize.\n * @returns {string}\n * Result.\n */\nfunction serialize(value) {\n return value === null || value === undefined ? '' : String(value)\n}\n\n/**\n * @param {string | null | undefined} value\n * Value.\n * @returns {number}\n * Alignment.\n */\nfunction toAlignment(value) {\n const code = typeof value === 'string' ? value.codePointAt(0) : 0\n\n return code === 67 /* `C` */ || code === 99 /* `c` */\n ? 99 /* `c` */\n : code === 76 /* `L` */ || code === 108 /* `l` */\n ? 108 /* `l` */\n : code === 82 /* `R` */ || code === 114 /* `r` */\n ? 114 /* `r` */\n : 0\n}\n","/**\n * @typedef {import('mdast').InlineCode} InlineCode\n * @typedef {import('mdast').Table} Table\n * @typedef {import('mdast').TableCell} TableCell\n * @typedef {import('mdast').TableRow} TableRow\n *\n * @typedef {import('markdown-table').Options} MarkdownTableOptions\n *\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n *\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').State} State\n * @typedef {import('mdast-util-to-markdown').Info} Info\n */\n\n/**\n * @typedef Options\n * Configuration.\n * @property {boolean | null | undefined} [tableCellPadding=true]\n * Whether to add a space of padding between delimiters and cells (default:\n * `true`).\n * @property {boolean | null | undefined} [tablePipeAlign=true]\n * Whether to align the delimiters (default: `true`).\n * @property {MarkdownTableOptions['stringLength'] | null | undefined} [stringLength]\n * Function to detect the length of table cell content, used when aligning\n * the delimiters between cells (optional).\n */\n\nimport {ok as assert} from 'devlop'\nimport {markdownTable} from 'markdown-table'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM tables in\n * markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM tables.\n */\nexport function gfmTableFromMarkdown() {\n return {\n enter: {\n table: enterTable,\n tableData: enterCell,\n tableHeader: enterCell,\n tableRow: enterRow\n },\n exit: {\n codeText: exitCodeText,\n table: exitTable,\n tableData: exit,\n tableHeader: exit,\n tableRow: exit\n }\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterTable(token) {\n const align = token._align\n assert(align, 'expected `_align` on table')\n this.enter(\n {\n type: 'table',\n align: align.map(function (d) {\n return d === 'none' ? null : d\n }),\n children: []\n },\n token\n )\n this.data.inTable = true\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitTable(token) {\n this.exit(token)\n this.data.inTable = undefined\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterRow(token) {\n this.enter({type: 'tableRow', children: []}, token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exit(token) {\n this.exit(token)\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction enterCell(token) {\n this.enter({type: 'tableCell', children: []}, token)\n}\n\n// Overwrite the default code text data handler to unescape escaped pipes when\n// they are in tables.\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCodeText(token) {\n let value = this.resume()\n\n if (this.data.inTable) {\n value = value.replace(/\\\\([\\\\|])/g, replace)\n }\n\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'inlineCode')\n node.value = value\n this.exit(token)\n}\n\n/**\n * @param {string} $0\n * @param {string} $1\n * @returns {string}\n */\nfunction replace($0, $1) {\n // Pipes work, backslashes don’t (but can’t escape pipes).\n return $1 === '|' ? $1 : $0\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM tables in\n * markdown.\n *\n * @param {Options | null | undefined} [options]\n * Configuration.\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM tables.\n */\nexport function gfmTableToMarkdown(options) {\n const settings = options || {}\n const padding = settings.tableCellPadding\n const alignDelimiters = settings.tablePipeAlign\n const stringLength = settings.stringLength\n const around = padding ? ' ' : '|'\n\n return {\n unsafe: [\n {character: '\\r', inConstruct: 'tableCell'},\n {character: '\\n', inConstruct: 'tableCell'},\n // A pipe, when followed by a tab or space (padding), or a dash or colon\n // (unpadded delimiter row), could result in a table.\n {atBreak: true, character: '|', after: '[\\t :-]'},\n // A pipe in a cell must be encoded.\n {character: '|', inConstruct: 'tableCell'},\n // A colon must be followed by a dash, in which case it could start a\n // delimiter row.\n {atBreak: true, character: ':', after: '-'},\n // A delimiter row can also start with a dash, when followed by more\n // dashes, a colon, or a pipe.\n // This is a stricter version than the built in check for lists, thematic\n // breaks, and setex heading underlines though:\n // <https://github.com/syntax-tree/mdast-util-to-markdown/blob/51a2038/lib/unsafe.js#L57>\n {atBreak: true, character: '-', after: '[:|-]'}\n ],\n handlers: {\n inlineCode: inlineCodeWithTable,\n table: handleTable,\n tableCell: handleTableCell,\n tableRow: handleTableRow\n }\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {Table} node\n */\n function handleTable(node, _, state, info) {\n return serializeData(handleTableAsData(node, state, info), node.align)\n }\n\n /**\n * This function isn’t really used normally, because we handle rows at the\n * table level.\n * But, if someone passes in a table row, this ensures we make somewhat sense.\n *\n * @type {ToMarkdownHandle}\n * @param {TableRow} node\n */\n function handleTableRow(node, _, state, info) {\n const row = handleTableRowAsData(node, state, info)\n const value = serializeData([row])\n // `markdown-table` will always add an align row\n return value.slice(0, value.indexOf('\\n'))\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {TableCell} node\n */\n function handleTableCell(node, _, state, info) {\n const exit = state.enter('tableCell')\n const subexit = state.enter('phrasing')\n const value = state.containerPhrasing(node, {\n ...info,\n before: around,\n after: around\n })\n subexit()\n exit()\n return value\n }\n\n /**\n * @param {Array<Array<string>>} matrix\n * @param {Array<string | null | undefined> | null | undefined} [align]\n */\n function serializeData(matrix, align) {\n return markdownTable(matrix, {\n align,\n // @ts-expect-error: `markdown-table` types should support `null`.\n alignDelimiters,\n // @ts-expect-error: `markdown-table` types should support `null`.\n padding,\n // @ts-expect-error: `markdown-table` types should support `null`.\n stringLength\n })\n }\n\n /**\n * @param {Table} node\n * @param {State} state\n * @param {Info} info\n */\n function handleTableAsData(node, state, info) {\n const children = node.children\n let index = -1\n /** @type {Array<Array<string>>} */\n const result = []\n const subexit = state.enter('table')\n\n while (++index < children.length) {\n result[index] = handleTableRowAsData(children[index], state, info)\n }\n\n subexit()\n\n return result\n }\n\n /**\n * @param {TableRow} node\n * @param {State} state\n * @param {Info} info\n */\n function handleTableRowAsData(node, state, info) {\n const children = node.children\n let index = -1\n /** @type {Array<string>} */\n const result = []\n const subexit = state.enter('tableRow')\n\n while (++index < children.length) {\n // Note: the positional info as used here is incorrect.\n // Making it correct would be impossible due to aligning cells?\n // And it would need copy/pasting `markdown-table` into this project.\n result[index] = handleTableCell(children[index], node, state, info)\n }\n\n subexit()\n\n return result\n }\n\n /**\n * @type {ToMarkdownHandle}\n * @param {InlineCode} node\n */\n function inlineCodeWithTable(node, parent, state) {\n let value = defaultHandlers.inlineCode(node, parent, state)\n\n if (state.stack.includes('tableCell')) {\n value = value.replace(/\\|/g, '\\\\$&')\n }\n\n return value\n }\n}\n","/**\n * @typedef {import('mdast').ListItem} ListItem\n * @typedef {import('mdast').Paragraph} Paragraph\n * @typedef {import('mdast-util-from-markdown').CompileContext} CompileContext\n * @typedef {import('mdast-util-from-markdown').Extension} FromMarkdownExtension\n * @typedef {import('mdast-util-from-markdown').Handle} FromMarkdownHandle\n * @typedef {import('mdast-util-to-markdown').Options} ToMarkdownExtension\n * @typedef {import('mdast-util-to-markdown').Handle} ToMarkdownHandle\n */\n\nimport {ok as assert} from 'devlop'\nimport {defaultHandlers} from 'mdast-util-to-markdown'\n\n/**\n * Create an extension for `mdast-util-from-markdown` to enable GFM task\n * list items in markdown.\n *\n * @returns {FromMarkdownExtension}\n * Extension for `mdast-util-from-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemFromMarkdown() {\n return {\n exit: {\n taskListCheckValueChecked: exitCheck,\n taskListCheckValueUnchecked: exitCheck,\n paragraph: exitParagraphWithTaskListItem\n }\n }\n}\n\n/**\n * Create an extension for `mdast-util-to-markdown` to enable GFM task list\n * items in markdown.\n *\n * @returns {ToMarkdownExtension}\n * Extension for `mdast-util-to-markdown` to enable GFM task list items.\n */\nexport function gfmTaskListItemToMarkdown() {\n return {\n unsafe: [{atBreak: true, character: '-', after: '[:|-]'}],\n handlers: {listItem: listItemWithTaskListItem}\n }\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitCheck(token) {\n // We’re always in a paragraph, in a list item.\n const node = this.stack[this.stack.length - 2]\n assert(node.type === 'listItem')\n node.checked = token.type === 'taskListCheckValueChecked'\n}\n\n/**\n * @this {CompileContext}\n * @type {FromMarkdownHandle}\n */\nfunction exitParagraphWithTaskListItem(token) {\n const parent = this.stack[this.stack.length - 2]\n\n if (\n parent &&\n parent.type === 'listItem' &&\n typeof parent.checked === 'boolean'\n ) {\n const node = this.stack[this.stack.length - 1]\n assert(node.type === 'paragraph')\n const head = node.children[0]\n\n if (head && head.type === 'text') {\n const siblings = parent.children\n let index = -1\n /** @type {Paragraph | undefined} */\n let firstParaghraph\n\n while (++index < siblings.length) {\n const sibling = siblings[index]\n if (sibling.type === 'paragraph') {\n firstParaghraph = sibling\n break\n }\n }\n\n if (firstParaghraph === node) {\n // Must start with a space or a tab.\n head.value = head.value.slice(1)\n\n if (head.value.length === 0) {\n node.children.shift()\n } else if (\n node.position &&\n head.position &&\n typeof head.position.start.offset === 'number'\n ) {\n head.position.start.column++\n head.position.start.offset++\n node.position.start = Object.assign({}, head.position.start)\n }\n }\n }\n }\n\n this.exit(token)\n}\n\n/**\n * @type {ToMarkdownHandle}\n * @param {ListItem} node\n */\nfunction listItemWithTaskListItem(node, parent, state, info) {\n const head = node.children[0]\n const checkable =\n typeof node.checked === 'boolean' && head && head.type === 'paragraph'\n const checkbox = '[' + (node.checked ? 'x' : ' ') + '] '\n const tracker = state.createTracker(info)\n\n if (checkable) {\n tracker.move(checkbox)\n }\n\n let value = defaultHandlers.listItem(node, parent, state, {\n ...info,\n ...tracker.current()\n })\n\n if (checkable) {\n value = value.replace(/^(?:[*+-]|\\d+\\.)([\\r\\n]| {1,3})/, check)\n }\n\n return value\n\n /**\n * @param {string} $0\n * @returns {string}\n */\n function check($0) {\n return $0 + checkbox\n }\n}\n","/**\n * Micromark syntax extension + mdast extension for resource tags: {{type:resourceId:text}}\n *\n * Instead of a full micromark extension (which requires complex token/state handling),\n * we use mdast-util-from-markdown's transform hook to post-process text nodes.\n * This is simpler and matches the existing regex approach.\n */\nimport type { Root, PhrasingContent, Text } from 'mdast';\n\nconst RESOURCE_TAG_RE = /\\{\\{([^:}]+):([^:}]*):([^}]+)\\}\\}/g;\nconst VALID_TYPES = new Set(['tool', 'manual', 'agent_message_template', 'handoff', 'end_call', 'time_diff']);\nconst MAX_DEPTH = 128;\n\nexport type ResourceTagMdastNode = {\n type: 'resourceTagMdast';\n data: {\n tagType: string;\n resourceId: string;\n };\n value: string;\n};\n\ndeclare module 'mdast' {\n interface PhrasingContentMap {\n resourceTagMdast: ResourceTagMdastNode;\n }\n\n interface RootContentMap {\n resourceTagMdast: ResourceTagMdastNode;\n }\n}\n\nfunction splitTextWithResourceTags(text: string): (Text | ResourceTagMdastNode)[] {\n const results: (Text | ResourceTagMdastNode)[] = [];\n let lastIndex = 0;\n\n RESOURCE_TAG_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = RESOURCE_TAG_RE.exec(text)) !== null) {\n const [full, tagType, resourceId, displayText] = match;\n if (!VALID_TYPES.has(tagType)) continue;\n\n if (match.index > lastIndex) {\n results.push({ type: 'text', value: text.slice(lastIndex, match.index) });\n }\n results.push({\n type: 'resourceTagMdast',\n data: { tagType, resourceId },\n value: displayText,\n });\n lastIndex = match.index + full.length;\n }\n\n if (lastIndex < text.length) {\n results.push({ type: 'text', value: text.slice(lastIndex) });\n }\n\n return results;\n}\n\nfunction visitNode(node: { children?: unknown[] }, depth: number = 0): void {\n if (depth > MAX_DEPTH) return;\n if (!node.children) return;\n for (const child of node.children) {\n visitNode(child as { children?: unknown[] }, depth + 1);\n }\n if (Array.isArray(node.children)) {\n const newChildren: unknown[] = [];\n for (const child of node.children) {\n if ((child as { type: string }).type === 'text') {\n const parts = splitTextWithResourceTags((child as Text).value);\n newChildren.push(...parts);\n } else {\n newChildren.push(child);\n }\n }\n node.children = newChildren;\n }\n}\n\nexport function resourceTagFromMarkdown() {\n return (tree: Root) => {\n visitNode(tree as unknown as { children?: unknown[] }, 0);\n };\n}\n\n/**\n * Exported for use in combined single-pass transform.\n * Returns the per-node text splitter without constructing a full plugin.\n */\nexport { splitTextWithResourceTags };\n\nexport function resourceTagToMarkdown() {\n return {\n handlers: {\n resourceTagMdast(node: ResourceTagMdastNode): string {\n return `{{${node.data.tagType}:${node.data.resourceId}:${node.value}}}`;\n },\n },\n };\n}\n","/**\n * mdast transform for jump points: ^id^\n * id must match /^[\\p{L}\\p{N}_-]+$/u\n */\nimport type { Root, Text, PhrasingContent } from 'mdast';\n\nconst JUMP_POINT_RE = /\\^([\\p{L}\\p{N}_-]+)\\^/gu;\nconst MAX_DEPTH = 128;\n\nexport type JumpPointMdastNode = {\n type: 'jumpPointMdast';\n data: {\n id: string;\n };\n value: string;\n};\n\ndeclare module 'mdast' {\n interface PhrasingContentMap {\n jumpPointMdast: JumpPointMdastNode;\n }\n\n interface RootContentMap {\n jumpPointMdast: JumpPointMdastNode;\n }\n}\n\nfunction splitTextWithJumpPoints(text: string): (Text | JumpPointMdastNode)[] {\n const results: (Text | JumpPointMdastNode)[] = [];\n let lastIndex = 0;\n\n JUMP_POINT_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = JUMP_POINT_RE.exec(text)) !== null) {\n const [full, id] = match;\n\n if (match.index > lastIndex) {\n results.push({ type: 'text', value: text.slice(lastIndex, match.index) });\n }\n results.push({\n type: 'jumpPointMdast',\n data: { id },\n value: id,\n });\n lastIndex = match.index + full.length;\n }\n\n if (lastIndex < text.length) {\n results.push({ type: 'text', value: text.slice(lastIndex) });\n }\n\n return results;\n}\n\nfunction visitNode(node: { children?: unknown[] }, depth: number = 0): void {\n if (depth > MAX_DEPTH) return;\n if (!node.children) return;\n for (const child of node.children) {\n visitNode(child as { children?: unknown[] }, depth + 1);\n }\n if (Array.isArray(node.children)) {\n const newChildren: unknown[] = [];\n for (const child of node.children) {\n if ((child as { type: string }).type === 'text') {\n const parts = splitTextWithJumpPoints((child as Text).value);\n newChildren.push(...parts);\n } else {\n newChildren.push(child);\n }\n }\n node.children = newChildren;\n }\n}\n\nexport function jumpPointFromMarkdown() {\n return (tree: Root) => {\n visitNode(tree as unknown as { children?: unknown[] }, 0);\n };\n}\n\n/**\n * Exported for use in combined single-pass transform.\n * Returns the per-node text splitter without constructing a full plugin.\n */\nexport { splitTextWithJumpPoints };\n\nexport function jumpPointToMarkdown() {\n return {\n handlers: {\n jumpPointMdast(node: JumpPointMdastNode): string {\n return `^${node.data.id}^`;\n },\n },\n };\n}\n","/**\n * Bidirectional conversion between mdast and ActionbookAST.\n */\nimport type { Root, RootContent, PhrasingContent, List, ListItem, Paragraph, Heading, Blockquote, ThematicBreak, Text as MdastText, Strong, Emphasis, InlineCode, Link, Break, Delete } from 'mdast';\nimport type { ResourceTagMdastNode } from './plugins/resourceTag';\nimport type { JumpPointMdastNode } from './plugins/jumpPoint';\nimport type { JinjaIfBlockMdastNode, JinjaIfInlineMdastNode, JinjaBranchMdast } from './plugins/jinjaBlock';\nimport type {\n DocumentNode,\n BlockNode,\n InlineNode,\n Mark,\n TextNode,\n ParagraphNode,\n HeadingNode,\n BulletListNode,\n OrderedListNode,\n ListItemNode,\n BlockquoteNode,\n HorizontalRuleNode,\n ResourceTagNode,\n JumpPointNode,\n HardBreakNode,\n TableNode,\n TableRowNode,\n TableCellNode,\n JinjaIfBlockNode,\n JinjaIfInlineNode,\n JinjaIfBranch,\n} from '../ast/types';\n\nconst MAX_DEPTH = 128;\nconst ALLOWED_URL_PROTOCOLS = /^(https?:|mailto:|tel:|#|\\/|www\\.)/i;\n\nfunction sanitizeUrl(url: string): string {\n if (ALLOWED_URL_PROTOCOLS.test(url)) return url;\n // Strip dangerous protocols (javascript:, data:, vbscript:, etc.)\n return '';\n}\n\nclass DepthError extends Error {\n constructor(depth: number) {\n super(`Maximum mdast conversion depth (${MAX_DEPTH}) exceeded at depth ${depth}`);\n this.name = 'DepthError';\n }\n}\n\n// === mdast → ActionbookAST ===\n\nfunction convertInline(node: PhrasingContent, marks: Mark[] = [], depth: number = 0): InlineNode[] {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n\n switch (node.type) {\n case 'text':\n return [marks.length > 0 ? { type: 'text', text: node.value, marks } : { type: 'text', text: node.value }];\n\n case 'strong': {\n const childMarks: Mark[] = [...marks, { type: 'bold' }];\n return (node as Strong).children.flatMap((child) => convertInline(child as PhrasingContent, childMarks, depth + 1));\n }\n\n case 'emphasis': {\n const childMarks: Mark[] = [...marks, { type: 'italic' }];\n return (node as Emphasis).children.flatMap((child) => convertInline(child as PhrasingContent, childMarks, depth + 1));\n }\n\n case 'delete': {\n const childMarks: Mark[] = [...marks, { type: 'strikethrough' }];\n return (node as Delete).children.flatMap((child) => convertInline(child as PhrasingContent, childMarks, depth + 1));\n }\n\n case 'inlineCode':\n return [\n marks.length > 0\n ? { type: 'text', text: (node as InlineCode).value, marks: [...marks, { type: 'code' }] }\n : { type: 'text', text: (node as InlineCode).value, marks: [{ type: 'code' }] },\n ];\n\n case 'link': {\n const href = sanitizeUrl((node as Link).url);\n if (!href) {\n // Dangerous URL protocol → strip the link, keep children as plain text\n return (node as Link).children.flatMap((child) => convertInline(child as PhrasingContent, marks, depth + 1));\n }\n const linkMark: Mark = { type: 'link', href, ...((node as Link).title ? { title: (node as Link).title! } : {}) };\n const childMarks: Mark[] = [...marks, linkMark];\n return (node as Link).children.flatMap((child) => convertInline(child as PhrasingContent, childMarks, depth + 1));\n }\n\n case 'break':\n return [{ type: 'hardBreak' }];\n\n case 'resourceTagMdast' as string: {\n const rtNode = node as unknown as ResourceTagMdastNode;\n return [\n {\n type: 'resourceTag',\n tagType: rtNode.data.tagType as ResourceTagNode['tagType'],\n resourceId: rtNode.data.resourceId,\n text: rtNode.value,\n },\n ];\n }\n\n case 'jumpPointMdast' as string: {\n const jpNode = node as unknown as JumpPointMdastNode;\n return [{ type: 'jumpPoint', id: jpNode.data.id }];\n }\n\n case 'jinjaIfInlineMdast' as string: {\n const jNode = node as unknown as JinjaIfInlineMdastNode;\n const branches: JinjaIfBranch<InlineNode>[] = jNode.branches.map(b => ({\n branchType: b.branchType,\n ...(b.condition ? { condition: b.condition } : {}),\n content: (b.content as PhrasingContent[]).flatMap(c => convertInline(c, [], depth + 1)),\n }));\n return [{ type: 'jinjaIfInline', branches } as InlineNode];\n }\n\n default:\n if ('value' in node && typeof (node as { value: unknown }).value === 'string') {\n return [{ type: 'text', text: (node as { value: string }).value }];\n }\n if ('children' in node && Array.isArray((node as { children: unknown[] }).children)) {\n return (node as { children: PhrasingContent[] }).children.flatMap((child) => convertInline(child, marks, depth + 1));\n }\n return [];\n }\n}\n\nfunction convertBlock(node: RootContent, depth: number = 0): BlockNode[] {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n\n switch (node.type) {\n case 'paragraph': {\n const para = node as Paragraph;\n const content = para.children.flatMap((child) => convertInline(child as PhrasingContent, [], depth + 1));\n return [{ type: 'paragraph', content }];\n }\n\n case 'heading': {\n const h = node as Heading;\n const content = h.children.flatMap((child) => convertInline(child as PhrasingContent, [], depth + 1));\n return [{ type: 'heading', level: h.depth as HeadingNode['level'], content }];\n }\n\n case 'list': {\n const list = node as List;\n const items = list.children.map((li) => convertListItem(li, depth + 1));\n const spread = list.spread ?? false;\n if (list.ordered) {\n return [{ type: 'orderedList', start: list.start ?? 1, spread, content: items }];\n }\n return [{ type: 'bulletList', spread, content: items }];\n }\n\n case 'blockquote': {\n const bq = node as Blockquote;\n const content = bq.children.flatMap((child) => convertBlock(child, depth + 1));\n return [{ type: 'blockquote', content }];\n }\n\n case 'thematicBreak':\n return [{ type: 'horizontalRule' }];\n\n case 'code': {\n const codeNode = node as import('mdast').Code;\n return [{ type: 'codeBlock', content: codeNode.value, ...(codeNode.lang ? { language: codeNode.lang } : {}) } as BlockNode];\n }\n\n case 'jinjaIfBlockMdast' as string: {\n const jNode = node as unknown as JinjaIfBlockMdastNode;\n const branches: JinjaIfBranch<BlockNode>[] = jNode.branches.map(b => ({\n branchType: b.branchType,\n ...(b.condition ? { condition: b.condition } : {}),\n content: (b.content as RootContent[]).flatMap(c => convertBlock(c, depth + 1)),\n }));\n return [{ type: 'jinjaIfBlock', branches } as BlockNode];\n }\n\n case 'table': {\n const tbl = node as { type: 'table'; children: Array<{ type: 'tableRow'; children: Array<{ type: 'tableCell'; children: PhrasingContent[] }> }>; align?: (string | null)[] };\n const rows: TableRowNode[] = tbl.children.map((row, rowIdx) => {\n const cells: TableCellNode[] = row.children.map((cell) => {\n const content = cell.children.flatMap((child) => convertInline(child as PhrasingContent, [], depth + 2));\n return {\n type: 'tableCell' as const,\n ...(rowIdx === 0 ? { header: true } : {}),\n content,\n };\n });\n return { type: 'tableRow' as const, content: cells };\n });\n return [{ type: 'table', content: rows }];\n }\n\n default:\n if ('children' in node && Array.isArray((node as { children: unknown[] }).children)) {\n const inlines = (node as { children: PhrasingContent[] }).children.flatMap((child) =>\n convertInline(child as PhrasingContent, [], depth + 1),\n );\n if (inlines.length > 0) return [{ type: 'paragraph', content: inlines }];\n }\n if ('value' in node && typeof (node as { value: unknown }).value === 'string') {\n return [{ type: 'paragraph', content: [{ type: 'text', text: (node as { value: string }).value }] }];\n }\n return [];\n }\n}\n\nfunction convertListItem(node: ListItem, depth: number = 0): ListItemNode {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n const content = node.children.flatMap((child) => convertBlock(child as RootContent, depth + 1));\n const base: ListItemNode = {\n type: 'listItem',\n spread: node.spread ?? false,\n content: content.length > 0 ? content : [{ type: 'paragraph', content: [] }],\n };\n if (typeof node.checked === 'boolean') {\n return { ...base, checked: node.checked };\n }\n return base;\n}\n\nexport function fromMdast(root: Root): DocumentNode {\n const blocks: BlockNode[] = [];\n\n for (let i = 0; i < root.children.length; i++) {\n // Detect extra blank lines between consecutive blocks and restore as empty paragraphs.\n // Standard markdown block separation = 1 blank line. Each additional blank line\n // maps to one empty paragraph (1:1), matching the serializer's join function\n // that outputs \\n (instead of \\n\\n) after empty paragraphs.\n if (i > 0) {\n const prev = root.children[i - 1] as { position?: { end?: { line?: number } } };\n const curr = root.children[i] as { position?: { start?: { line?: number } } };\n const prevEndLine = prev.position?.end?.line ?? 0;\n const currStartLine = curr.position?.start?.line ?? 0;\n const emptyCount = currStartLine - prevEndLine - 2;\n for (let j = 0; j < emptyCount; j++) {\n blocks.push({ type: 'paragraph', content: [] });\n }\n }\n\n blocks.push(...convertBlock(root.children[i], 0));\n }\n\n return { type: 'doc', content: blocks.length > 0 ? blocks : [{ type: 'paragraph', content: [] }] };\n}\n\n// === ActionbookAST → mdast ===\n\nfunction inlineToMdast(node: InlineNode, depth: number = 0): PhrasingContent[] {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n\n switch (node.type) {\n case 'text': {\n const marks = node.marks ?? [];\n let result: PhrasingContent[] = [{ type: 'text', value: node.text } as MdastText];\n\n for (const mark of marks) {\n switch (mark.type) {\n case 'bold':\n result = [{ type: 'strong', children: result as Strong['children'] }];\n break;\n case 'italic':\n result = [{ type: 'emphasis', children: result as Emphasis['children'] }];\n break;\n case 'strikethrough':\n result = [{ type: 'delete', children: result as Delete['children'] }];\n break;\n case 'underline':\n // Underline has no markdown representation; mark is lost on serialization\n break;\n case 'code':\n result = [{ type: 'inlineCode', value: node.text }];\n break;\n case 'link':\n result = [\n {\n type: 'link',\n url: mark.href,\n ...(mark.title ? { title: mark.title } : {}),\n children: result as Link['children'],\n },\n ];\n break;\n }\n }\n return result;\n }\n\n case 'resourceTag':\n return [\n {\n type: 'resourceTagMdast',\n data: { tagType: node.tagType, resourceId: node.resourceId },\n value: node.text,\n } as unknown as PhrasingContent,\n ];\n\n case 'jumpPoint':\n return [\n {\n type: 'jumpPointMdast',\n data: { id: node.id },\n value: node.id,\n } as unknown as PhrasingContent,\n ];\n\n case 'hardBreak':\n return [{ type: 'break' } as Break];\n\n case 'jinjaIfInline': {\n const jNode = node as JinjaIfInlineNode;\n const result: PhrasingContent[] = [];\n for (const branch of jNode.branches) {\n const tagText = branch.branchType === 'else'\n ? '{% else %}'\n : `{% ${branch.branchType} ${branch.condition ?? ''} %}`.trim();\n result.push({ type: 'text', value: tagText } as MdastText);\n for (const child of branch.content) {\n result.push(...inlineToMdast(child, depth + 1));\n }\n }\n result.push({ type: 'text', value: '{% endif %}' } as MdastText);\n return result;\n }\n }\n}\n\nfunction blockToMdast(node: BlockNode, depth: number = 0): RootContent[] {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n\n switch (node.type) {\n case 'paragraph':\n return [{ type: 'paragraph', children: node.content.flatMap((c) => inlineToMdast(c, depth + 1)) }];\n\n case 'heading':\n return [{ type: 'heading', depth: node.level, children: node.content.flatMap((c) => inlineToMdast(c, depth + 1)) }];\n\n case 'bulletList': {\n const items = node.content.map((li) => listItemToMdast(li, depth + 1));\n return [\n {\n type: 'list',\n ordered: false,\n spread: node.spread ?? false,\n children: items,\n },\n ];\n }\n\n case 'orderedList': {\n const spread = node.spread ?? false;\n let counter = node.start;\n const items = node.content.map((li) => {\n const mdastLi = listItemToMdast(li, depth + 1);\n if (li.value != null) counter = li.value;\n // Store the effective number on the mdast node for the serializer\n (mdastLi as any)._ordinalValue = counter;\n counter++;\n return mdastLi;\n });\n return [\n {\n type: 'list',\n ordered: true,\n start: node.content[0]?.value ?? node.start,\n spread,\n children: items,\n },\n ];\n }\n\n case 'listItem':\n return listItemToMdast(node, depth).children.flatMap((child) => [child as RootContent]);\n\n case 'blockquote':\n return [{ type: 'blockquote', children: node.content.flatMap((c) => blockToMdast(c, depth + 1)) as Blockquote['children'] }];\n\n case 'horizontalRule':\n return [{ type: 'thematicBreak' }];\n\n case 'codeBlock': {\n const cb = node as import('../ast/types').CodeBlockNode;\n return [{ type: 'code', value: cb.content, ...(cb.language ? { lang: cb.language } : {}) } as RootContent];\n }\n\n case 'jinjaIfBlock': {\n const jNode = node as JinjaIfBlockNode;\n const result: RootContent[] = [];\n for (const branch of jNode.branches) {\n const tagText = branch.branchType === 'else'\n ? '{% else %}'\n : `{% ${branch.branchType} ${branch.condition ?? ''} %}`.trim();\n result.push({ type: 'paragraph', children: [{ type: 'text', value: tagText } as MdastText] } as Paragraph);\n for (const child of branch.content) {\n result.push(...blockToMdast(child, depth + 1));\n }\n }\n result.push({ type: 'paragraph', children: [{ type: 'text', value: '{% endif %}' } as MdastText] } as Paragraph);\n return result;\n }\n\n case 'table': {\n const rows = node.content.map((row) => ({\n type: 'tableRow' as const,\n children: row.content.map((cell) => ({\n type: 'tableCell' as const,\n children: cell.content.flatMap((c) => inlineToMdast(c, depth + 2)) as PhrasingContent[],\n })),\n }));\n return [{ type: 'table', children: rows } as unknown as RootContent];\n }\n\n case 'noteBlock':\n // Note blocks are editor-only — not serialized to markdown\n return [];\n }\n}\n\nfunction listItemToMdast(node: ListItemNode, depth: number = 0): ListItem {\n if (depth > MAX_DEPTH) throw new DepthError(depth);\n const children = node.content.flatMap((child) => blockToMdast(child, depth + 1)) as ListItem['children'];\n // A list item is \"loose\" (spread) when it has nested lists or multiple\n // block-level children beyond a single paragraph. This matches the blank\n // lines that tiptap-markdown inserts in the original instruction text.\n const isSpread = node.spread ?? false;\n const result: ListItem = {\n type: 'listItem',\n spread: isSpread,\n children,\n };\n if (typeof node.checked === 'boolean') {\n result.checked = node.checked;\n }\n return result;\n}\n\nexport function toMdast(doc: DocumentNode): Root {\n return {\n type: 'root',\n children: doc.content.flatMap((c) => blockToMdast(c, 0)),\n };\n}\n","/**\n * mdast transform plugin for Jinja if/elif/else/endif blocks.\n *\n * Three passes:\n * Pass 1 — Extract Jinja tags absorbed into list item text (Case B)\n * Pass 2 — Group standalone Jinja-tag paragraphs into jinjaIfBlockMdast nodes (Case A)\n * Pass 3 — Structure inline Jinja tags into jinjaIfInlineMdast nodes\n */\n\nconst MAX_DEPTH = 128;\n\n// Regex for a standalone Jinja tag paragraph (entire paragraph is one tag)\nconst JINJA_BLOCK_RE = /^\\s*\\{%\\s*(if|elif|else|endif)\\s*([^%]*?)\\s*%\\}\\s*$/;\n\n// Regex for Jinja tags at line boundaries inside list item text\nconst JINJA_LINE_END_RE = /\\n\\s*(\\{%\\s*(?:if|elif|else|endif)\\s*[^%]*?\\s*%\\})\\s*$/;\nconst JINJA_LINE_START_RE = /^(\\{%\\s*(?:if|elif|else|endif)\\s*[^%]*?\\s*%\\})\\s*\\n/;\n\n// Regex for inline Jinja tags (non-greedy, captures tag type and condition)\nconst JINJA_INLINE_RE = /\\{%\\s*(if|elif|else|endif)\\s*([^%]*?)\\s*%\\}/g;\n\ntype BranchType = 'if' | 'elif' | 'else';\n\nexport interface JinjaBranchMdast {\n branchType: BranchType;\n condition?: string;\n content: unknown[];\n}\n\nexport interface JinjaIfBlockMdastNode {\n type: 'jinjaIfBlockMdast';\n branches: JinjaBranchMdast[];\n}\n\nexport interface JinjaIfInlineMdastNode {\n type: 'jinjaIfInlineMdast';\n branches: JinjaBranchMdast[];\n}\n\ndeclare module 'mdast' {\n interface BlockContentMap {\n jinjaIfBlockMdast: JinjaIfBlockMdastNode;\n }\n interface PhrasingContentMap {\n jinjaIfInlineMdast: JinjaIfInlineMdastNode;\n }\n interface RootContentMap {\n jinjaIfBlockMdast: JinjaIfBlockMdastNode;\n }\n}\n\nfunction parseTag(text: string): { type: 'if' | 'elif' | 'else' | 'endif'; condition?: string } | null {\n const m = text.match(/^\\s*\\{%\\s*(if|elif|else|endif)\\s*([^%]*?)\\s*%\\}\\s*$/);\n if (!m) return null;\n const type = m[1] as 'if' | 'elif' | 'else' | 'endif';\n const condition = m[2]?.trim() || undefined;\n return { type, condition };\n}\n\nfunction isTextOnlyParagraph(node: { type: string; children?: unknown[] }): string | null {\n if (node.type !== 'paragraph') return null;\n if (!node.children || node.children.length !== 1) return null;\n const child = node.children[0] as { type: string; value?: string };\n if (child.type !== 'text') return null;\n return child.value ?? null;\n}\n\n/**\n * Pass 1: Extract Jinja tags absorbed into list item text.\n * When there's no blank line between a Jinja tag and a list, mdast absorbs\n * the tag into the list item's text. We split these out.\n */\nfunction pass1ExtractFromLists(node: { type: string; children?: unknown[] }, depth: number): void {\n if (depth > MAX_DEPTH || !node.children) return;\n\n // Recurse first\n for (const child of node.children) {\n pass1ExtractFromLists(child as { type: string; children?: unknown[] }, depth + 1);\n }\n\n // Only process list nodes\n if (node.type !== 'list') return;\n\n const list = node as { type: string; ordered?: boolean; start?: number; spread?: boolean; children: unknown[] };\n const items = list.children as Array<{ type: string; children: Array<{ type: string; children?: Array<{ type: string; value?: string }> }> }>;\n\n // Scan list items for Jinja tags at text boundaries\n type ExtractedPiece =\n | { kind: 'item'; item: unknown }\n | { kind: 'tag'; raw: string };\n\n const extracted: ExtractedPiece[] = [];\n let hadSplit = false;\n\n for (const item of items) {\n if (item.type !== 'listItem' || !item.children || item.children.length === 0) {\n extracted.push({ kind: 'item', item });\n continue;\n }\n\n // Check first paragraph for leading Jinja tag\n const firstChild = item.children[0];\n if (firstChild.type === 'paragraph' && firstChild.children && firstChild.children.length === 1 && firstChild.children[0].type === 'text') {\n const text = firstChild.children[0].value ?? '';\n const startMatch = text.match(JINJA_LINE_START_RE);\n if (startMatch) {\n hadSplit = true;\n extracted.push({ kind: 'tag', raw: startMatch[1] });\n const remainder = text.slice(startMatch[0].length);\n if (remainder.trim()) {\n firstChild.children[0] = { ...firstChild.children[0], value: remainder };\n extracted.push({ kind: 'item', item });\n } else if (item.children.length > 1) {\n item.children = item.children.slice(1);\n extracted.push({ kind: 'item', item });\n }\n continue;\n }\n }\n\n // Check last paragraph for trailing Jinja tag\n const lastChild = item.children[item.children.length - 1];\n if (lastChild.type === 'paragraph' && lastChild.children && lastChild.children.length === 1 && lastChild.children[0].type === 'text') {\n const text = lastChild.children[0].value ?? '';\n const endMatch = text.match(JINJA_LINE_END_RE);\n if (endMatch) {\n hadSplit = true;\n const remainder = text.slice(0, text.length - endMatch[0].length);\n if (remainder.trim()) {\n lastChild.children[0] = { ...lastChild.children[0], value: remainder };\n extracted.push({ kind: 'item', item });\n } else if (item.children.length > 1) {\n item.children = item.children.slice(0, -1);\n extracted.push({ kind: 'item', item });\n }\n extracted.push({ kind: 'tag', raw: endMatch[1] });\n continue;\n }\n }\n\n extracted.push({ kind: 'item', item });\n }\n\n if (!hadSplit) return;\n\n // Rebuild: replace parent's list node with a sequence of lists and tag paragraphs\n // We need to modify the parent's children. Since we're in the list node itself,\n // we'll reconstruct the list into segments.\n const parent = node as { type: string; children: unknown[] };\n\n // Actually, we need to replace this list node in its parent.\n // Instead, we mark the list with a special property to be expanded later.\n // Let's use a different approach: collect consecutive items into sub-lists,\n // interleaved with tag paragraphs.\n\n const result: unknown[] = [];\n let currentItems: unknown[] = [];\n let itemIndex = 0;\n\n function flushItems(): void {\n if (currentItems.length === 0) return;\n const startNum = list.ordered ? (list.start ?? 1) + itemIndex - currentItems.length : undefined;\n const subList = {\n type: 'list',\n ordered: list.ordered ?? false,\n spread: list.spread ?? false,\n ...(list.ordered ? { start: startNum } : {}),\n children: currentItems,\n };\n result.push(subList);\n currentItems = [];\n }\n\n for (const piece of extracted) {\n if (piece.kind === 'item') {\n currentItems.push(piece.item);\n itemIndex++;\n } else {\n flushItems();\n result.push({\n type: 'paragraph',\n children: [{ type: 'text', value: piece.raw }],\n });\n }\n }\n flushItems();\n\n // Mark this node for expansion in parent\n (node as { _jinjaExpanded?: unknown[] })._jinjaExpanded = result;\n}\n\n/**\n * After pass1, expand any list nodes that were marked with _jinjaExpanded.\n */\nfunction expandMarkedLists(node: { type: string; children?: unknown[] }, depth: number): void {\n if (depth > MAX_DEPTH || !node.children) return;\n\n // Process children first (bottom-up)\n for (const child of node.children) {\n expandMarkedLists(child as { type: string; children?: unknown[] }, depth + 1);\n }\n\n const newChildren: unknown[] = [];\n let changed = false;\n for (const child of node.children) {\n const c = child as { _jinjaExpanded?: unknown[] };\n if (c._jinjaExpanded) {\n newChildren.push(...c._jinjaExpanded);\n changed = true;\n } else {\n newChildren.push(child);\n }\n }\n if (changed) {\n node.children = newChildren;\n }\n}\n\n/**\n * Pass 2: Group standalone Jinja-tag paragraphs into jinjaIfBlockMdast nodes.\n * Works on children of root, blockquote, and listItem.\n */\nfunction pass2GroupBlocks(node: { type: string; children?: unknown[] }, depth: number): void {\n if (depth > MAX_DEPTH || !node.children) return;\n\n // Recurse into children first\n for (const child of node.children) {\n pass2GroupBlocks(child as { type: string; children?: unknown[] }, depth + 1);\n }\n\n // Only process container nodes\n const containerTypes = new Set(['root', 'blockquote', 'listItem']);\n if (!containerTypes.has(node.type)) return;\n\n const children = node.children as Array<{ type: string; children?: unknown[] }>;\n const result: unknown[] = [];\n let i = 0;\n\n while (i < children.length) {\n const child = children[i];\n const text = isTextOnlyParagraph(child);\n const tag = text ? parseTag(text) : null;\n\n if (!tag || tag.type !== 'if') {\n result.push(child);\n i++;\n continue;\n }\n\n // Found {% if %} - use stack to find matching {% endif %}\n const ifParagraph = child; // save for position\n const branches: JinjaBranchMdast[] = [];\n let currentBranch: JinjaBranchMdast = {\n branchType: 'if',\n condition: tag.condition,\n content: [],\n };\n branches.push(currentBranch);\n\n let nestDepth = 1;\n i++; // skip the {% if %} paragraph\n\n let matched = false;\n let endifParagraph: { type: string; children?: unknown[]; position?: unknown } | null = null;\n while (i < children.length && nestDepth > 0) {\n const innerChild = children[i];\n const innerText = isTextOnlyParagraph(innerChild);\n const innerTag = innerText ? parseTag(innerText) : null;\n\n if (innerTag) {\n if (innerTag.type === 'if') {\n nestDepth++;\n if (nestDepth > 1) {\n currentBranch.content.push(innerChild);\n }\n } else if (innerTag.type === 'endif') {\n nestDepth--;\n if (nestDepth === 0) {\n matched = true;\n endifParagraph = innerChild;\n } else {\n currentBranch.content.push(innerChild);\n }\n } else if ((innerTag.type === 'elif' || innerTag.type === 'else') && nestDepth === 1) {\n currentBranch = {\n branchType: innerTag.type as BranchType,\n ...(innerTag.condition ? { condition: innerTag.condition } : {}),\n content: [],\n };\n branches.push(currentBranch);\n } else {\n currentBranch.content.push(innerChild);\n }\n } else {\n currentBranch.content.push(innerChild);\n }\n i++;\n }\n\n if (matched) {\n // Recursively process branch contents\n for (const branch of branches) {\n const wrapper = { type: node.type, children: branch.content };\n pass2GroupBlocks(wrapper, depth + 1);\n branch.content = wrapper.children as unknown[];\n }\n // Propagate position from {% if %} to {% endif %} for blank-line calculation\n const startPos = (ifParagraph as { position?: { start?: unknown } }).position?.start;\n const endPos = (endifParagraph as { position?: { end?: unknown } } | null)?.position?.end;\n const pos = startPos && endPos ? { position: { start: startPos, end: endPos } } : {};\n result.push({ type: 'jinjaIfBlockMdast', branches, ...pos });\n } else {\n // Unmatched {% if %} — restore as plain paragraph\n result.push({ type: 'paragraph', children: [{ type: 'text', value: text }] });\n // Rewind: the content we consumed needs to go back\n // Actually, we already advanced i, and the branches contain the consumed children.\n // We need to flatten them back.\n for (const branch of branches) {\n if (branch !== branches[0]) {\n // Re-emit the branch tag\n const tagText = branch.branchType === 'else'\n ? '{% else %}'\n : `{% ${branch.branchType} ${branch.condition ?? ''} %}`.trim();\n result.push({ type: 'paragraph', children: [{ type: 'text', value: tagText }] });\n }\n result.push(...branch.content);\n }\n }\n }\n\n node.children = result;\n}\n\n/**\n * Pass 3: Structure inline Jinja tags within paragraph/heading text nodes.\n * Only processes direct text children (not inside marks like strong/emphasis).\n */\nfunction pass3InlineJinja(node: { type: string; children?: unknown[] }, depth: number): void {\n if (depth > MAX_DEPTH || !node.children) return;\n\n // Recurse into block-level children\n for (const child of node.children) {\n pass3InlineJinja(child as { type: string; children?: unknown[] }, depth + 1);\n }\n\n // Only process paragraph and heading\n if (node.type !== 'paragraph' && node.type !== 'heading') return;\n\n const children = node.children as Array<{ type: string; value?: string }>;\n\n // Check if any text child contains Jinja tags\n let hasJinja = false;\n for (const child of children) {\n if (child.type === 'text' && child.value) {\n JINJA_INLINE_RE.lastIndex = 0;\n if (JINJA_INLINE_RE.test(child.value)) {\n hasJinja = true;\n break;\n }\n }\n }\n if (!hasJinja) return;\n\n // Split text nodes on Jinja tags, then structure with stack\n const flatParts: Array<{ kind: 'node'; node: unknown } | { kind: 'tag'; tagType: 'if' | 'elif' | 'else' | 'endif'; condition?: string }> = [];\n\n for (const child of children) {\n if (child.type !== 'text' || !child.value) {\n flatParts.push({ kind: 'node', node: child });\n continue;\n }\n\n const text = child.value;\n JINJA_INLINE_RE.lastIndex = 0;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = JINJA_INLINE_RE.exec(text)) !== null) {\n if (match.index > lastIndex) {\n flatParts.push({ kind: 'node', node: { type: 'text', value: text.slice(lastIndex, match.index) } });\n }\n flatParts.push({\n kind: 'tag',\n tagType: match[1] as 'if' | 'elif' | 'else' | 'endif',\n condition: match[2]?.trim() || undefined,\n });\n lastIndex = match.index + match[0].length;\n }\n\n if (lastIndex < text.length) {\n flatParts.push({ kind: 'node', node: { type: 'text', value: text.slice(lastIndex) } });\n }\n }\n\n // Stack-based structuring\n const result = structureInlineParts(flatParts);\n if (result) {\n node.children = result;\n }\n}\n\nfunction structureInlineParts(\n parts: Array<{ kind: 'node'; node: unknown } | { kind: 'tag'; tagType: 'if' | 'elif' | 'else' | 'endif'; condition?: string }>,\n): unknown[] | null {\n const output: unknown[] = [];\n let i = 0;\n\n while (i < parts.length) {\n const part = parts[i];\n if (part.kind === 'node') {\n output.push(part.node);\n i++;\n } else if (part.kind === 'tag' && part.tagType === 'if') {\n // Collect branches until matching endif\n const branches: JinjaBranchMdast[] = [];\n let currentBranch: JinjaBranchMdast = {\n branchType: 'if',\n condition: part.condition,\n content: [],\n };\n branches.push(currentBranch);\n i++;\n\n let nestDepth = 1;\n let matched = false;\n\n while (i < parts.length && nestDepth > 0) {\n const inner = parts[i];\n if (inner.kind === 'tag') {\n if (inner.tagType === 'if') {\n nestDepth++;\n if (nestDepth > 1) {\n // Nested if — emit as text for now\n currentBranch.content.push({ type: 'text', value: `{% if ${inner.condition ?? ''} %}`.trim() });\n }\n } else if (inner.tagType === 'endif') {\n nestDepth--;\n if (nestDepth === 0) {\n matched = true;\n } else {\n currentBranch.content.push({ type: 'text', value: '{% endif %}' });\n }\n } else if ((inner.tagType === 'elif' || inner.tagType === 'else') && nestDepth === 1) {\n currentBranch = {\n branchType: inner.tagType as BranchType,\n ...(inner.condition ? { condition: inner.condition } : {}),\n content: [],\n };\n branches.push(currentBranch);\n } else {\n // Nested elif/else\n const tagText = inner.tagType === 'else'\n ? '{% else %}'\n : `{% ${inner.tagType} ${inner.condition ?? ''} %}`.trim();\n currentBranch.content.push({ type: 'text', value: tagText });\n }\n } else {\n currentBranch.content.push(inner.node);\n }\n i++;\n }\n\n if (matched) {\n output.push({ type: 'jinjaIfInlineMdast', branches });\n } else {\n // Unmatched — restore as text\n output.push({ type: 'text', value: `{% if ${branches[0].condition ?? ''} %}`.trim() });\n for (const branch of branches) {\n if (branch !== branches[0]) {\n const tagText = branch.branchType === 'else'\n ? '{% else %}'\n : `{% ${branch.branchType} ${branch.condition ?? ''} %}`.trim();\n output.push({ type: 'text', value: tagText });\n }\n output.push(...branch.content);\n }\n }\n } else {\n // Stray elif/else/endif — keep as text\n const p = part as { tagType: string; condition?: string };\n const tagText = p.tagType === 'else'\n ? '{% else %}'\n : p.tagType === 'endif'\n ? '{% endif %}'\n : `{% ${p.tagType} ${p.condition ?? ''} %}`.trim();\n output.push({ type: 'text', value: tagText });\n i++;\n }\n }\n\n return output;\n}\n\n/**\n * Main transform: apply all three passes to an mdast tree.\n */\nexport function jinjaBlockTransform(tree: { type: string; children?: unknown[] }): void {\n // Pass 1: Extract Jinja tags from list item text\n pass1ExtractFromLists(tree, 0);\n expandMarkedLists(tree, 0);\n\n // Pass 2: Group block-level Jinja structures\n pass2GroupBlocks(tree, 0);\n\n // Pass 3: Structure inline Jinja\n pass3InlineJinja(tree, 0);\n}\n","import type { Link, List, ListItem, Parents, Text } from 'mdast';\nimport { defaultHandlers, toMarkdown } from 'mdast-util-to-markdown';\nimport type { Handle, Info, Options, State } from 'mdast-util-to-markdown';\nimport { gfmFootnoteToMarkdown } from 'mdast-util-gfm-footnote';\nimport { gfmStrikethroughToMarkdown } from 'mdast-util-gfm-strikethrough';\nimport { gfmTableToMarkdown } from 'mdast-util-gfm-table';\nimport { gfmTaskListItemToMarkdown } from 'mdast-util-gfm-task-list-item';\nimport { resourceTagToMarkdown } from './plugins/resourceTag';\nimport { jumpPointToMarkdown } from './plugins/jumpPoint';\nimport { toMdast } from './mdastAdapter';\nimport type { DocumentNode } from '../ast/types';\n\n// GFM without autolink literal — see parser.ts for rationale.\nconst gfmNoAutolinkToMarkdown = () => ({\n extensions: [\n gfmFootnoteToMarkdown(),\n gfmStrikethroughToMarkdown(),\n gfmTableToMarkdown(),\n gfmTaskListItemToMarkdown(),\n ],\n});\n\nfunction isEmptyParagraph(node: Parents | { type: string; children?: unknown[] }): boolean {\n return node.type === 'paragraph' && (!('children' in node) || !node.children || node.children.length === 0);\n}\n\nconst JINJA_TAG_RE = /^\\{%\\s*(if|elif|else|endif)\\b/;\n\nfunction isJinjaTagParagraph(node: { type: string; children?: unknown[] }): boolean {\n if (node.type !== 'paragraph') return false;\n const children = (node as Parents).children;\n if (!children || children.length !== 1) return false;\n const child = children[0] as { type: string; value?: string };\n return child.type === 'text' && typeof child.value === 'string' && JINJA_TAG_RE.test(child.value);\n}\n\n/**\n * Custom text handler that prevents unnecessary `_` escaping in inline text.\n *\n * mdast-util-to-markdown's default unsafe rules include\n * `{character: '_', inConstruct: 'phrasing'}`, which escapes every underscore\n * in paragraph/heading text (e.g. `ENUM_VALUE` → `ENUM\\_VALUE`). Since we\n * generate emphasis and strong with `*`, underscores in plain text are never\n * interpreted as emphasis markers and do not need escaping.\n *\n * The `unsafe` option in `toMarkdown` is ADDITIVE (it pushes into the default\n * list, never replaces it), so we cannot override this via options alone.\n * Instead, we temporarily remove the phrasing-`_` rule from `state.unsafe`\n * before delegating to the default text handler.\n */\nfunction textHandler(node: Text, parent: Parents | undefined, state: State, info: Info): string {\n const originalUnsafe = state.unsafe;\n state.unsafe = originalUnsafe.filter((p) => !(p.character === '_' && !p.atBreak));\n const result = (defaultHandlers.text as Options['handlers'] & ((n: Text, p: Parents | undefined, s: State, i: Info) => string))(node, parent, state, info);\n state.unsafe = originalUnsafe;\n return result;\n}\n\n/**\n * Custom link handler — emits `[text](url)` without angle brackets, even when\n * the URL contains spaces. tiptap-markdown uses this form; CommonMark would\n * require `<>` but micromark accepts both.\n */\nfunction linkHandler(node: Link, parent: Parents | undefined, state: State, info: Info): string {\n const childrenText = state.containerPhrasing(node, { ...info, before: '[', after: ']' });\n const url = node.url ?? '';\n const title = node.title;\n const titlePart = title ? ` \"${title.replace(/\"/g, '\\\\\"')}\"` : '';\n return `[${childrenText}](${url}${titlePart})`;\n}\n\n/**\n * Custom listItem handler that uses `_ordinalValue` (set by mdastAdapter)\n * to output the correct per-item number with \".\" marker.\n */\n/**\n * Custom listItem handler that uses `_ordinalValue` (set by mdastAdapter)\n * to output the correct per-item number with \".\" marker.\n * Patches `state.bulletLastUsed` / `state.options.bulletOrdered` temporarily\n * so the default handler emits \"N.\" with the right number.\n */\nfunction listItemHandler(node: ListItem, parent: Parents | undefined, state: State, info: Info): string {\n const value = (node as any)._ordinalValue as number | undefined;\n if (value != null && parent && (parent as List).ordered) {\n // Temporarily override the list start so the default handler uses our number\n const list = parent as List;\n const savedStart = list.start;\n const idx = list.children.indexOf(node);\n // The default handler computes: start + index. We want: value.\n // So set start = value - index.\n list.start = value - idx;\n const result = defaultHandlers.listItem(node, parent, state, info);\n list.start = savedStart;\n return result;\n }\n return defaultHandlers.listItem(node, parent, state, info);\n}\n\nexport function serializeToMarkdown(doc: DocumentNode): string {\n const mdastTree = toMdast(doc);\n\n const raw = toMarkdown(mdastTree, {\n bullet: '-',\n bulletOrdered: '.',\n rule: '-',\n listItemIndent: 'one',\n incrementListMarker: true,\n emphasis: '*',\n strong: '*',\n resourceLink: true,\n join: [\n // Empty paragraphs represent blank-line spacers.\n // Reduce the separator after an empty paragraph from \\n\\n to \\n\n // so that 1 empty paragraph = 1 extra blank line in the output.\n (left) => (isEmptyParagraph(left) ? 0 : null),\n // Consecutive paragraphs: single newline instead of blank line\n // (skip jinja tag paragraphs — they need blank lines for proper roundtrip)\n (left, right) =>\n left.type === 'paragraph' && right.type === 'paragraph' && !isJinjaTagParagraph(left) && !isJinjaTagParagraph(right) ? 0 : null,\n ],\n handlers: {\n text: textHandler as Handle,\n link: linkHandler as Handle,\n listItem: listItemHandler as Handle,\n ...resourceTagToMarkdown().handlers,\n ...jumpPointToMarkdown().handlers,\n },\n extensions: [gfmNoAutolinkToMarkdown()],\n });\n\n // Post-process to match tiptap-markdown's serialization conventions:\n // 1. `\\>` at break positions → `>` (entity-based escaping)\n // 2. Bare `>` in text (non-blockquote) → `>` (tiptap encodes all `>`)\n // 3. `]` after `\\[` patterns → `\\]` (tiptap escapes both brackets)\n // 4. ` ` → plain space (remark encodes leading spaces to prevent\n // markdown interpretation, but downstream consumers expect plain spaces)\n let result = raw\n .replace(/^(\\s*)\\\\>/gm, '$1>')\n .replace(/(\\S) *>/g, (match, pre) => `${pre} >`)\n .replace(/\\\\\\[([^\\]]*)\\]/g, '\\\\[$1\\\\]')\n .replace(/ /g, ' ');\n\n return result;\n}\n","import { parseMarkdown } from './parser';\nimport { serializeToMarkdown } from './serializer';\nimport type { AstNode, BlockNode, InlineNode, DocumentNode } from '../ast/types';\n\n/**\n * Serialize a list of AST nodes to markdown string (for clipboard).\n */\nexport function serializeFragment(nodes: AstNode[]): string {\n if (nodes.length === 0) return '';\n\n // Wrap in a doc for serialization\n const blocks: BlockNode[] = nodes.map((node) => {\n if (node.type === 'text' || node.type === 'resourceTag' || node.type === 'jumpPoint' || node.type === 'hardBreak') {\n return { type: 'paragraph', content: [node] };\n }\n if (node.type === 'doc') {\n // Flatten doc children\n return node.content;\n }\n return node as BlockNode;\n }).flat() as BlockNode[];\n\n const wrapper: DocumentNode = { type: 'doc', content: blocks };\n return serializeToMarkdown(wrapper);\n}\n\n/**\n * Parse a markdown string into a fragment (for clipboard paste).\n * Returns block nodes by default; if the markdown is a single paragraph,\n * returns its inline children.\n */\nexport function parseFragment(markdown: string): InlineNode[] | BlockNode[] {\n const doc = parseMarkdown(markdown);\n\n // If single paragraph, return inline content\n if (doc.content.length === 1 && doc.content[0].type === 'paragraph') {\n return doc.content[0].content as InlineNode[];\n }\n\n return doc.content as BlockNode[];\n}\n","import type { DocumentNode } from '../ast/types';\n\nexport type ActionbookJSON = {\n version: 3;\n ast: DocumentNode;\n};\n\nexport function serializeToJSON(doc: DocumentNode): string {\n const payload: ActionbookJSON = { version: 3, ast: doc };\n return JSON.stringify(payload);\n}\n","/**\n * Convert ProseMirror/Tiptap JSONContent to ActionbookAST.\n *\n * This handles the legacy editor_data format stored in LogicV2.\n */\nimport type {\n DocumentNode,\n BlockNode,\n InlineNode,\n Mark,\n ResourceTagType,\n TableNode,\n TableRowNode,\n TableCellNode,\n JinjaIfBranch,\n} from '../ast/types';\nimport { RESOURCE_TAG_TYPES } from '../ast/types';\n\nconst MAX_DEPTH = 128;\nconst ALLOWED_URL_PROTOCOLS = /^(https?:|mailto:|tel:|#|\\/|www\\.)/i;\n\nconst LIST_TYPES = new Set(['bulletList', 'orderedList']);\n\n/**\n * A list is \"loose\" (spread) if any item has multiple non-list block children.\n * Nested sub-lists don't count — a listItem with [paragraph, bulletList] is still tight.\n */\nfunction isLooseList(items: { content: BlockNode[] }[]): boolean {\n return items.some((li) => {\n const nonListBlocks = li.content.filter((b) => !LIST_TYPES.has(b.type));\n return nonListBlocks.length > 1;\n });\n}\n\n// Minimal JSONContent type (compatible with @tiptap/core)\nexport type JSONContent = {\n type?: string;\n attrs?: Record<string, unknown>;\n content?: JSONContent[];\n marks?: { type: string; attrs?: Record<string, unknown> }[];\n text?: string;\n};\n\nfunction convertPMMark(mark: { type: string; attrs?: Record<string, unknown> }): Mark | null {\n switch (mark.type) {\n case 'bold':\n return { type: 'bold' };\n case 'italic':\n return { type: 'italic' };\n case 'underline':\n return { type: 'underline' };\n case 'strikethrough':\n return { type: 'strikethrough' };\n case 'code':\n return { type: 'code' };\n case 'link': {\n const rawHref = (mark.attrs?.href as string) ?? '';\n // Strip dangerous URL protocols\n if (!ALLOWED_URL_PROTOCOLS.test(rawHref)) return null;\n const title = mark.attrs?.title as string | undefined;\n return title ? { type: 'link', href: rawHref, title } : { type: 'link', href: rawHref };\n }\n // Ignored marks (UI-only or unused)\n case 'diffMark':\n case 'inlineResource':\n case 'textStyle':\n return null;\n default:\n return null;\n }\n}\n\nfunction convertPMInline(node: JSONContent, depth: number): InlineNode[] {\n if (depth > MAX_DEPTH) return [];\n const type = node.type ?? '';\n\n switch (type) {\n case 'text': {\n const marks = (node.marks ?? []).map(convertPMMark).filter((m): m is Mark => m !== null);\n const textNode = node.text ?? '';\n return marks.length > 0 ? [{ type: 'text', text: textNode, marks }] : [{ type: 'text', text: textNode }];\n }\n\n case 'inlineToolTag': {\n const attrs = node.attrs ?? {};\n const tagType = (attrs.type as string) ?? 'tool';\n const text = (attrs.text as string) ?? '';\n // Fallback: unknown tag types become plain text to avoid validation failure\n if (!(RESOURCE_TAG_TYPES as readonly string[]).includes(tagType)) {\n return text ? [{ type: 'text', text }] : [];\n }\n return [\n {\n type: 'resourceTag',\n tagType: tagType as ResourceTagType,\n resourceId: (attrs.resourceId as string) ?? '',\n text,\n },\n ];\n }\n\n case 'jumpPoint': {\n const id = (node.attrs?.id as string) ?? '';\n return [{ type: 'jumpPoint', id }];\n }\n\n case 'hardBreak':\n return [{ type: 'hardBreak' }];\n\n default:\n if (node.text) {\n return [{ type: 'text', text: node.text }];\n }\n if (node.content) {\n return node.content.flatMap((c) => convertPMInline(c, depth + 1));\n }\n return [];\n }\n}\n\nfunction convertPMBlock(node: JSONContent, depth: number = 0): BlockNode[] {\n if (depth > MAX_DEPTH) return [];\n const type = node.type ?? '';\n const children = node.content ?? [];\n\n switch (type) {\n case 'paragraph':\n return [{ type: 'paragraph', content: children.flatMap((c) => convertPMInline(c, depth + 1)) }];\n\n case 'heading': {\n const level = ((node.attrs?.level as number) ?? 1) as 1 | 2 | 3 | 4 | 5 | 6;\n return [{ type: 'heading', level, content: children.flatMap((c) => convertPMInline(c, depth + 1)) }];\n }\n\n case 'bulletList': {\n const items = children.map((c) => convertPMListItem(c, depth + 1));\n const spread = isLooseList(items);\n return [\n {\n type: 'bulletList',\n ...(spread ? { spread: true } : {}),\n content: items.map((li) => spread ? { ...li, spread: true } : li),\n },\n ];\n }\n\n case 'orderedList': {\n const start = (node.attrs?.start as number) ?? 1;\n const items = children.map((c) => convertPMListItem(c, depth + 1));\n const spread = isLooseList(items);\n return [\n {\n type: 'orderedList',\n start,\n ...(spread ? { spread: true } : {}),\n content: items.map((li) => spread ? { ...li, spread: true } : li),\n },\n ];\n }\n\n case 'listItem': {\n return [convertPMListItem(node, depth)];\n }\n\n case 'blockquote':\n return [{ type: 'blockquote', content: children.flatMap((c) => convertPMBlock(c, depth + 1)) }];\n\n case 'horizontalRule':\n return [{ type: 'horizontalRule' }];\n\n case 'codeBlock': {\n const textContent = children.map(c => (c as any).text ?? '').join('');\n return [{ type: 'codeBlock', content: textContent, ...(node.attrs?.language ? { language: node.attrs.language } : {}) } as BlockNode];\n }\n\n case 'noteBlock':\n return [{ type: 'noteBlock', content: children.flatMap((c) => convertPMBlock(c, depth + 1)) }];\n\n case 'table': {\n const rows: TableRowNode[] = children.map((rowNode) => {\n const cells: TableCellNode[] = (rowNode.content ?? []).map((cellNode) => {\n const cellType = cellNode.type ?? '';\n const isHeader = cellType === 'tableHeader';\n const inlines = (cellNode.content ?? []).flatMap((c) => convertPMInline(c, depth + 3));\n return {\n type: 'tableCell' as const,\n ...(isHeader ? { header: true } : {}),\n content: inlines,\n };\n });\n return { type: 'tableRow' as const, content: cells };\n });\n return [{ type: 'table', content: rows }];\n }\n\n case 'jinjaIfBlock': {\n const branches: JinjaIfBranch<BlockNode>[] = children.map((branchNode) => {\n const branchType = (branchNode.attrs?.branchType ?? 'if') as 'if' | 'elif' | 'else';\n const condition = branchNode.attrs?.condition as string | undefined;\n const branchContent = (branchNode.content ?? []).flatMap((c) => convertPMBlock(c, depth + 2));\n return {\n branchType,\n ...(branchType !== 'else' && condition ? { condition } : {}),\n content: branchContent,\n };\n });\n if (branches.length === 0) return [];\n return [{ type: 'jinjaIfBlock', branches } as BlockNode];\n }\n\n case 'jinjaIfBranch':\n // Standalone jinjaIfBranch outside a jinjaIfBlock — flatten content\n return children.flatMap((c) => convertPMBlock(c, depth + 1));\n\n default:\n if (children.length > 0) {\n return children.flatMap((c) => convertPMBlock(c, depth + 1));\n }\n return [];\n }\n}\n\nfunction convertPMListItem(node: JSONContent, depth: number = 0): { type: 'listItem'; checked?: boolean | null; spread?: boolean; content: BlockNode[] } {\n if (depth > MAX_DEPTH) return { type: 'listItem', content: [{ type: 'paragraph', content: [] }] };\n const children = node.content ?? [];\n const content = children.flatMap((c) => convertPMBlock(c, depth + 1));\n const base: { type: 'listItem'; checked?: boolean | null; spread?: boolean; content: BlockNode[] } = {\n type: 'listItem',\n content: content.length > 0 ? content : [{ type: 'paragraph', content: [] }],\n };\n const checked = node.attrs?.checked as boolean | null | undefined;\n if (typeof checked === 'boolean') {\n base.checked = checked;\n }\n const value = node.attrs?.value as number | null | undefined;\n if (value != null) {\n (base as any).value = value;\n }\n return base;\n}\n\nexport function fromProseMirrorJSON(pmJSON: JSONContent): DocumentNode {\n if (pmJSON.type !== 'doc') {\n const blocks = convertPMBlock(pmJSON, 0);\n return { type: 'doc', content: blocks.length > 0 ? blocks : [{ type: 'paragraph', content: [] }] };\n }\n\n const children = pmJSON.content ?? [];\n const blocks = children.flatMap((c) => convertPMBlock(c, 0));\n return { type: 'doc', content: blocks.length > 0 ? blocks : [{ type: 'paragraph', content: [] }] };\n}\n","import type { DocumentNode } from '../ast/types';\nimport type { ActionbookJSON } from './serialize';\nimport { fromProseMirrorJSON, type JSONContent } from '../compat/prosemirror';\nimport { validate } from '../schema/schema';\n\nconst EMPTY_DOC: DocumentNode = { type: 'doc', content: [{ type: 'paragraph', content: [] }] };\n\nexport class DeserializationError extends Error {\n constructor(message: string, public readonly validationErrors?: Array<{ path: string; message: string }>) {\n super(message);\n this.name = 'DeserializationError';\n }\n}\n\nexport function deserializeFromJSON(json: string): DocumentNode {\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n throw new DeserializationError('Invalid JSON input');\n }\n\n if (parsed === null || typeof parsed !== 'object') {\n throw new DeserializationError('JSON must be a non-null object');\n }\n\n const obj = parsed as Record<string, unknown>;\n\n // New v3 format\n if (obj.version === 3) {\n const ast = obj.ast;\n if (ast === null || typeof ast !== 'object' || (ast as Record<string, unknown>).type !== 'doc') {\n throw new DeserializationError('v3 format requires ast field with type \"doc\"');\n }\n const doc = ast as DocumentNode;\n const errors = validate(doc);\n if (errors.length > 0) {\n throw new DeserializationError(`Schema validation failed: ${errors[0].message}`, errors);\n }\n return doc;\n }\n\n // Legacy ProseMirror JSON format (v2 editor_data)\n if (typeof obj.type !== 'string') {\n throw new DeserializationError('Legacy ProseMirror JSON must have a \"type\" field');\n }\n\n const doc = fromProseMirrorJSON(obj as JSONContent);\n const errors = validate(doc);\n if (errors.length > 0) {\n throw new DeserializationError(`Schema validation failed after PM conversion: ${errors[0].message}`, errors);\n }\n return doc;\n}\n","import type { AstNode, BlockNode, DocumentNode, InlineNode, NodePath } from '../ast/types';\nimport type { Operation, Transaction } from './types';\n\nconst MAX_PATH_DEPTH = 64;\n\n// ── Parent–child type matrix ───────────────────────────────────────\n\n/** Which child node types each parent type accepts. */\nconst VALID_CHILDREN: Record<string, Set<string>> = {\n doc: new Set(['paragraph', 'heading', 'bulletList', 'orderedList', 'blockquote', 'horizontalRule', 'codeBlock', 'table', 'jinjaIfBlock', 'noteBlock']),\n paragraph: new Set(['text', 'resourceTag', 'jumpPoint', 'hardBreak', 'jinjaIfInline']),\n heading: new Set(['text', 'resourceTag', 'jumpPoint', 'hardBreak', 'jinjaIfInline']),\n bulletList: new Set(['listItem']),\n orderedList: new Set(['listItem']),\n listItem: new Set(['paragraph', 'heading', 'bulletList', 'orderedList', 'blockquote', 'horizontalRule', 'codeBlock', 'table', 'jinjaIfBlock', 'noteBlock']),\n blockquote: new Set(['paragraph', 'heading', 'bulletList', 'orderedList', 'blockquote', 'horizontalRule', 'codeBlock', 'table', 'jinjaIfBlock', 'noteBlock']),\n noteBlock: new Set(['paragraph', 'heading', 'bulletList', 'orderedList', 'blockquote', 'horizontalRule', 'table', 'jinjaIfBlock']),\n table: new Set(['tableRow']),\n tableRow: new Set(['tableCell']),\n tableCell: new Set(['text', 'resourceTag', 'jumpPoint', 'hardBreak', 'jinjaIfInline']),\n};\n\nfunction assertValidChild(parentType: string, childNode: AstNode): void {\n const allowed = VALID_CHILDREN[parentType];\n if (!allowed) {\n throw new OperationError(`Parent type \"${parentType}\" does not accept children`);\n }\n if (!allowed.has(childNode.type)) {\n throw new OperationError(\n `Cannot place \"${childNode.type}\" inside \"${parentType}\". ` +\n `Allowed children: [${[...allowed].join(', ')}]`,\n );\n }\n}\n\n// ── Error class ────────────────────────────────────────────────────\n\nexport class OperationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OperationError';\n }\n}\n\n// ── Node content helpers ───────────────────────────────────────────\n\ntype NodeWithContent = { content: readonly AstNode[] };\n\nfunction hasContent(node: AstNode): node is AstNode & NodeWithContent {\n return 'content' in node && Array.isArray((node as NodeWithContent).content);\n}\n\nfunction getContent(node: AstNode): readonly AstNode[] {\n return hasContent(node) ? (node as NodeWithContent).content : [];\n}\n\nfunction setContent(node: AstNode, content: AstNode[]): AstNode {\n return { ...node, content } as unknown as AstNode;\n}\n\n// ── Path validation ────────────────────────────────────────────────\n\nfunction validatePath(path: NodePath): void {\n if (path.length === 0) {\n throw new OperationError('Cannot apply operation at empty path');\n }\n if (path.length > MAX_PATH_DEPTH) {\n throw new OperationError(`Path depth ${path.length} exceeds maximum ${MAX_PATH_DEPTH}`);\n }\n for (let i = 0; i < path.length; i++) {\n if (typeof path[i] !== 'number' || !Number.isInteger(path[i]) || path[i] < 0) {\n throw new OperationError(`Invalid path index at position ${i}: ${path[i]}`);\n }\n }\n}\n\n// ── Core apply logic ───────────────────────────────────────────────\n\nfunction applyAtPath(root: DocumentNode, path: NodePath, fn: (parent: AstNode, index: number) => AstNode): DocumentNode {\n validatePath(path);\n\n function recurse(node: AstNode, depth: number): AstNode {\n const index = path[depth];\n const children = [...getContent(node)];\n\n if (depth === path.length - 1) {\n return fn(node, index);\n }\n\n if (index < 0 || index >= children.length) {\n throw new OperationError(\n `Path index out of bounds: index ${index} at depth ${depth}, parent \"${node.type}\" has ${children.length} children`,\n );\n }\n\n children[index] = recurse(children[index], depth + 1);\n return setContent(node, children);\n }\n\n return recurse(root, 0) as DocumentNode;\n}\n\nexport function applyOperation(doc: DocumentNode, op: Operation): DocumentNode {\n switch (op.type) {\n case 'insert':\n validatePath(op.path);\n return applyAtPath(doc, op.path, (parent, index) => {\n const children = [...getContent(parent)];\n if (index < 0 || index > children.length) {\n throw new OperationError(\n `Insert: index ${index} out of bounds for parent \"${parent.type}\" with ${children.length} children`,\n );\n }\n assertValidChild(parent.type, op.node);\n children.splice(index, 0, op.node);\n return setContent(parent, children);\n });\n\n case 'delete':\n validatePath(op.path);\n return applyAtPath(doc, op.path, (parent, index) => {\n const children = [...getContent(parent)];\n if (index < 0 || index >= children.length) {\n throw new OperationError(\n `Delete: index ${index} out of bounds for parent \"${parent.type}\" with ${children.length} children`,\n );\n }\n children.splice(index, 1);\n return setContent(parent, children);\n });\n\n case 'replace':\n validatePath(op.path);\n return applyAtPath(doc, op.path, (parent, index) => {\n const children = [...getContent(parent)];\n if (index < 0 || index >= children.length) {\n throw new OperationError(\n `Replace: index ${index} out of bounds for parent \"${parent.type}\" with ${children.length} children`,\n );\n }\n assertValidChild(parent.type, op.node);\n children[index] = op.node;\n return setContent(parent, children);\n });\n }\n}\n\nexport function applyTransaction(doc: DocumentNode, tx: Transaction): DocumentNode {\n let result = doc;\n for (const op of tx.operations) {\n result = applyOperation(result, op);\n }\n return result;\n}\n\nexport function invertOperation(doc: DocumentNode, op: Operation): Operation {\n validatePath(op.path);\n\n switch (op.type) {\n case 'insert':\n return { type: 'delete', path: op.path };\n\n case 'delete': {\n let current: AstNode = doc;\n for (let i = 0; i < op.path.length - 1; i++) {\n const children = getContent(current);\n if (op.path[i] < 0 || op.path[i] >= children.length) {\n throw new OperationError(\n `invertOperation: path index ${op.path[i]} out of bounds at depth ${i}`,\n );\n }\n current = children[op.path[i]];\n }\n const lastIdx = op.path[op.path.length - 1];\n const children = getContent(current);\n if (lastIdx < 0 || lastIdx >= children.length) {\n throw new OperationError(\n `invertOperation: final path index ${lastIdx} out of bounds, parent has ${children.length} children`,\n );\n }\n return { type: 'insert', path: op.path, node: children[lastIdx] };\n }\n\n case 'replace': {\n let current: AstNode = doc;\n for (let i = 0; i < op.path.length - 1; i++) {\n const children = getContent(current);\n if (op.path[i] < 0 || op.path[i] >= children.length) {\n throw new OperationError(\n `invertOperation: path index ${op.path[i]} out of bounds at depth ${i}`,\n );\n }\n current = children[op.path[i]];\n }\n const lastIdx = op.path[op.path.length - 1];\n const children = getContent(current);\n if (lastIdx < 0 || lastIdx >= children.length) {\n throw new OperationError(\n `invertOperation: final path index ${lastIdx} out of bounds, parent has ${children.length} children`,\n );\n }\n return { type: 'replace', path: op.path, node: children[lastIdx] };\n }\n }\n}\n","/**\n * Pure text-based Jinja block scanner (no ProseMirror dependency).\n */\nimport type { JinjaBlock } from './types';\n\nconst JINJA_PATTERN = /\\{%\\s*(if|elif|else|endif)\\s*([^%]*?)\\s*%\\}/g;\n\n/**\n * Scan all Jinja blocks from plain text.\n *\n * @param text - Plain text content\n * @returns All Jinja blocks sorted by position\n */\nexport function scanJinjaBlocks(text: string): JinjaBlock[] {\n const blocks: JinjaBlock[] = [];\n\n JINJA_PATTERN.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = JINJA_PATTERN.exec(text)) !== null) {\n const type = match[1] as JinjaBlock['type'];\n const conditionRaw = match[2].trim();\n const condition = type === 'if' || type === 'elif' ? conditionRaw : undefined;\n\n // Include trailing spaces after tag\n let endIndex = match.index + match[0].length;\n while (endIndex < text.length && text[endIndex] === ' ') {\n endIndex++;\n }\n\n blocks.push({\n type,\n condition,\n startIndex: match.index,\n endIndex,\n raw: match[0],\n });\n }\n\n return blocks.sort((a, b) => a.startIndex - b.startIndex);\n}\n","import type { JinjaBlock, JinjaIfStructure } from './types';\n\nfunction buildStructure(\n partial: { ifBlock: JinjaBlock; elifBlocks: JinjaBlock[]; elseBlock?: JinjaBlock },\n endifBlock: JinjaBlock,\n): JinjaIfStructure {\n const { ifBlock, elifBlocks, elseBlock } = partial;\n const contentRanges: JinjaIfStructure['contentRanges'] = [];\n\n // if branch content\n const ifContentEnd = elifBlocks[0]?.startIndex ?? elseBlock?.startIndex ?? endifBlock.startIndex;\n contentRanges.push({\n type: 'if',\n condition: ifBlock.condition!,\n startIndex: ifBlock.endIndex,\n endIndex: ifContentEnd,\n });\n\n // elif branches\n elifBlocks.forEach((elifBlock, idx) => {\n const nextBlock = elifBlocks[idx + 1] ?? elseBlock ?? endifBlock;\n contentRanges.push({\n type: 'elif',\n condition: elifBlock.condition!,\n startIndex: elifBlock.endIndex,\n endIndex: nextBlock.startIndex,\n });\n });\n\n // else branch\n if (elseBlock) {\n contentRanges.push({\n type: 'else',\n startIndex: elseBlock.endIndex,\n endIndex: endifBlock.startIndex,\n });\n }\n\n return {\n id: `jinja-${ifBlock.startIndex}-${endifBlock.endIndex}`,\n ifBlock,\n elifBlocks,\n elseBlock,\n endifBlock,\n contentRanges,\n };\n}\n\n/**\n * Structure scanned blocks into if~endif structures using stack-based approach.\n */\nexport function structureJinjaBlocks(blocks: JinjaBlock[]): JinjaIfStructure[] {\n const structures: JinjaIfStructure[] = [];\n const stack: Array<{\n ifBlock: JinjaBlock;\n elifBlocks: JinjaBlock[];\n elseBlock?: JinjaBlock;\n }> = [];\n\n for (const block of blocks) {\n switch (block.type) {\n case 'if':\n stack.push({ ifBlock: block, elifBlocks: [] });\n break;\n case 'elif':\n if (stack.length > 0) {\n stack[stack.length - 1].elifBlocks.push(block);\n }\n break;\n case 'else':\n if (stack.length > 0) {\n stack[stack.length - 1].elseBlock = block;\n }\n break;\n case 'endif': {\n const current = stack.pop();\n if (current) {\n structures.push(buildStructure(current, block));\n }\n break;\n }\n }\n }\n\n return structures;\n}\n","import type { DocumentNode } from '../ast/types';\nimport { textContent } from '../ast/traverse';\nimport { scanJinjaBlocks } from './scanner';\nimport { structureJinjaBlocks } from './structurer';\n\nexport interface JinjaVisualBranch {\n type: 'if' | 'elif' | 'else';\n condition?: string;\n blockStartIndex: number;\n blockEndIndex: number;\n tagBlockIndex: number;\n}\n\nexport interface JinjaVisualStructure {\n id: string;\n branches: JinjaVisualBranch[];\n ifTagBlockIndex: number;\n endifTagBlockIndex: number;\n}\n\n/**\n * Single pass: builds cumulative block-end offsets AND the full document text.\n * offsets[i] = exclusive end char index of block i.\n * Avoids calling textContent() twice (once for offsets, once for fullText).\n */\nfunction buildOffsetsAndText(doc: DocumentNode): { offsets: number[]; fullText: string } {\n const offsets: number[] = [];\n const parts: string[] = [];\n let cursor = 0;\n for (const block of doc.content) {\n const t = textContent(block);\n parts.push(t);\n cursor += t.length;\n offsets.push(cursor);\n }\n return { offsets, fullText: parts.join('') };\n}\n\n/**\n * Binary search: returns the block index that contains charIndex.\n * offsets[i] is the exclusive end of block i.\n */\nfunction charIndexToBlockIndex(offsets: number[], charIndex: number): number {\n if (offsets.length === 0) return 0;\n let lo = 0;\n let hi = offsets.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (offsets[mid] <= charIndex) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/**\n * Analyze a DocumentNode for Jinja if/elif/else/endif structures\n * and map them to block-level indices.\n */\nexport function analyzeJinjaBlocks(doc: DocumentNode): JinjaVisualStructure[] {\n if (doc.content.length === 0) return [];\n\n const { offsets, fullText } = buildOffsetsAndText(doc);\n\n const scanned = scanJinjaBlocks(fullText);\n if (scanned.length === 0) return [];\n\n const structures = structureJinjaBlocks(scanned);\n\n return structures.map((structure) => {\n const ifTagBlockIdx = charIndexToBlockIndex(offsets, structure.ifBlock.startIndex);\n const endifTagBlockIdx = charIndexToBlockIndex(offsets, structure.endifBlock.startIndex);\n\n const branches: JinjaVisualBranch[] = structure.contentRanges.map((range) => {\n // Find the tag block index for this branch\n let tagCharIndex: number;\n if (range.type === 'if') {\n tagCharIndex = structure.ifBlock.startIndex;\n } else if (range.type === 'elif') {\n const elifBlock = structure.elifBlocks.find((b) => b.condition === range.condition);\n tagCharIndex = elifBlock ? elifBlock.startIndex : range.startIndex;\n } else {\n tagCharIndex = structure.elseBlock!.startIndex;\n }\n\n const tagBlockIdx = charIndexToBlockIndex(offsets, tagCharIndex);\n\n // Content block range: from the block containing the content start\n // to the block containing the content end (exclusive)\n let contentStartBlock: number;\n let contentEndBlock: number;\n\n if (range.startIndex >= range.endIndex) {\n // Empty content range\n contentStartBlock = tagBlockIdx;\n contentEndBlock = tagBlockIdx;\n } else {\n contentStartBlock = charIndexToBlockIndex(offsets, range.startIndex);\n // If the content starts in the same block as the tag, the actual content blocks start after\n // But we keep the start as-is since the tag and content may share a block\n const lastContentChar = range.endIndex - 1;\n contentEndBlock = charIndexToBlockIndex(offsets, lastContentChar) + 1;\n }\n\n return {\n type: range.type,\n condition: range.condition,\n blockStartIndex: contentStartBlock,\n blockEndIndex: contentEndBlock,\n tagBlockIndex: tagBlockIdx,\n };\n });\n\n return {\n id: structure.id,\n branches,\n ifTagBlockIndex: ifTagBlockIdx,\n endifTagBlockIndex: endifTagBlockIdx,\n };\n });\n}\n","import type { JinjaIfStructure, Variable } from './types';\n\nconst IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*(\\.[a-zA-Z_][a-zA-Z0-9_]*)*$/;\nconst KEYWORDS = new Set(['None', 'True', 'False', 'true', 'false', 'null', 'undefined']);\n\nexport function extractVariables(condition: string): Variable[] {\n const variables = new Set<string>();\n\n // Remove string literals and numeric literals\n const cleanCondition = condition\n .replace(/\"[^\"]*\"/g, '\"\"')\n .replace(/'[^']*'/g, \"''\")\n .replace(/\\b\\d+(\\.\\d+)?\\b/g, '0');\n\n // Split by operators\n const operators = /[=!<>]+|\\b(?:and|or|not|in|is)\\b/g;\n const tokens = cleanCondition\n .split(operators)\n .map((t) => t.trim())\n .filter((t) => t && t !== '\"\"' && t !== \"''\");\n\n tokens.forEach((token) => {\n let cleaned = token.replace(/\\w+\\(/g, '').replace(/\\)/g, '').trim();\n cleaned = cleaned.replace(/[()]/g, '').trim();\n cleaned = cleaned.replace(/\\[.*?\\]/g, '').trim();\n\n if (cleaned && IDENTIFIER_PATTERN.test(cleaned) && !KEYWORDS.has(cleaned)) {\n variables.add(cleaned);\n }\n });\n\n return Array.from(variables).map((name) => ({ name }));\n}\n\nexport function collectAllVariables(structures: JinjaIfStructure[]): Variable[] {\n const allVars = new Set<string>();\n\n structures.forEach((structure) => {\n if (structure.ifBlock.condition) {\n extractVariables(structure.ifBlock.condition).forEach((v) => allVars.add(v.name));\n }\n structure.elifBlocks.forEach((elifBlock) => {\n if (elifBlock.condition) {\n extractVariables(elifBlock.condition).forEach((v) => allVars.add(v.name));\n }\n });\n });\n\n return Array.from(allVars)\n .sort()\n .map((name) => ({ name }));\n}\n","/**\n * Safe Jinja condition evaluator using recursive descent parsing.\n *\n * Supports:\n * Comparison: ==, !=, <, >, <=, >=\n * Logical: and, or, not\n * Identity: is, is not\n * Membership: in (value in identifier)\n * Literals: strings, numbers, booleans (True/False/true/false), None/null\n * Variables: dot-notation identifiers (e.g. context.planName)\n * Grouping: parentheses\n *\n * NO arbitrary code execution — only whitelisted operators and literal types.\n */\nimport type { VariableValue } from './types';\n\n// ── Tokenizer ──────────────────────────────────────────────────────\n\ntype TokenType =\n | 'STRING'\n | 'NUMBER'\n | 'BOOL'\n | 'NONE'\n | 'IDENT'\n | 'AND'\n | 'OR'\n | 'NOT'\n | 'IN'\n | 'IS'\n | 'EQ'\n | 'NEQ'\n | 'LT'\n | 'GT'\n | 'LTE'\n | 'GTE'\n | 'LPAREN'\n | 'RPAREN'\n | 'COMMA'\n | 'EOF';\n\ninterface Token {\n type: TokenType;\n value: string;\n}\n\nconst KEYWORDS: Record<string, TokenType> = {\n and: 'AND',\n or: 'OR',\n not: 'NOT',\n in: 'IN',\n is: 'IS',\n True: 'BOOL',\n False: 'BOOL',\n true: 'BOOL',\n false: 'BOOL',\n None: 'NONE',\n null: 'NONE',\n};\n\ninterface TokenizeResult {\n readonly tokens: Token[];\n readonly error?: string;\n}\n\nfunction tokenize(input: string): TokenizeResult {\n const tokens: Token[] = [];\n let i = 0;\n\n while (i < input.length) {\n // Skip whitespace\n if (/\\s/.test(input[i])) {\n i++;\n continue;\n }\n\n // String literals (single or double quoted)\n if (input[i] === '\"' || input[i] === \"'\") {\n const quote = input[i];\n let str = '';\n i++; // skip opening quote\n while (i < input.length && input[i] !== quote) {\n if (input[i] === '\\\\' && i + 1 < input.length) {\n str += input[i + 1];\n i += 2;\n } else {\n str += input[i];\n i++;\n }\n }\n if (i >= input.length) return { tokens: [], error: 'Unterminated string literal' };\n i++; // skip closing quote\n tokens.push({ type: 'STRING', value: str });\n continue;\n }\n\n // Numbers (integer and float)\n if (/[0-9]/.test(input[i]) || (input[i] === '-' && i + 1 < input.length && /[0-9]/.test(input[i + 1]) && (tokens.length === 0 || ['AND', 'OR', 'NOT', 'EQ', 'NEQ', 'LT', 'GT', 'LTE', 'GTE', 'LPAREN', 'IN', 'IS'].includes(tokens[tokens.length - 1].type)))) {\n let num = '';\n if (input[i] === '-') {\n num = '-';\n i++;\n }\n while (i < input.length && /[0-9]/.test(input[i])) {\n num += input[i];\n i++;\n }\n if (i < input.length && input[i] === '.') {\n num += '.';\n i++;\n while (i < input.length && /[0-9]/.test(input[i])) {\n num += input[i];\n i++;\n }\n }\n tokens.push({ type: 'NUMBER', value: num });\n continue;\n }\n\n // Identifiers and keywords\n if (/[a-zA-Z_]/.test(input[i])) {\n let ident = '';\n while (i < input.length && /[a-zA-Z0-9_.]/.test(input[i])) {\n ident += input[i];\n i++;\n }\n const kwType = KEYWORDS[ident];\n if (kwType) {\n tokens.push({ type: kwType, value: ident });\n } else {\n tokens.push({ type: 'IDENT', value: ident });\n }\n continue;\n }\n\n // Two-character operators\n if (i + 1 < input.length) {\n const two = input[i] + input[i + 1];\n if (two === '==') { tokens.push({ type: 'EQ', value: '==' }); i += 2; continue; }\n if (two === '!=') { tokens.push({ type: 'NEQ', value: '!=' }); i += 2; continue; }\n if (two === '<=') { tokens.push({ type: 'LTE', value: '<=' }); i += 2; continue; }\n if (two === '>=') { tokens.push({ type: 'GTE', value: '>=' }); i += 2; continue; }\n }\n\n // Single-character operators\n if (input[i] === '<') { tokens.push({ type: 'LT', value: '<' }); i++; continue; }\n if (input[i] === '>') { tokens.push({ type: 'GT', value: '>' }); i++; continue; }\n if (input[i] === '(') { tokens.push({ type: 'LPAREN', value: '(' }); i++; continue; }\n if (input[i] === ')') { tokens.push({ type: 'RPAREN', value: ')' }); i++; continue; }\n if (input[i] === ',') { tokens.push({ type: 'COMMA', value: ',' }); i++; continue; }\n\n // Unknown character → fail\n return { tokens: [], error: `Unexpected character: ${input[i]}` };\n }\n\n tokens.push({ type: 'EOF', value: '' });\n return { tokens };\n}\n\n// ── Evaluated value ────────────────────────────────────────────────\n\ntype Value = string | number | boolean | null | Value[];\n\n// ── Recursive descent parser + evaluator ───────────────────────────\n\nclass Parser {\n private pos = 0;\n private readonly tokens: Token[];\n private readonly variables: Map<string, VariableValue>;\n\n constructor(tokens: Token[], variables: Map<string, VariableValue>) {\n this.tokens = tokens;\n this.variables = variables;\n }\n\n private peek(): Token {\n return this.tokens[this.pos] ?? { type: 'EOF', value: '' };\n }\n\n private advance(): Token {\n const t = this.tokens[this.pos];\n this.pos++;\n return t;\n }\n\n private expect(type: TokenType): Token {\n const t = this.peek();\n if (t.type !== type) {\n throw new Error(`Expected ${type}, got ${t.type}`);\n }\n return this.advance();\n }\n\n // Grammar (precedence low→high):\n // expr → or_expr\n // or_expr → and_expr ('or' and_expr)*\n // and_expr → not_expr ('and' not_expr)*\n // not_expr → 'not' not_expr | cmp_expr\n // cmp_expr → primary (('=='|'!='|'<'|'>'|'<='|'>='|'in'|'is'|'is not') primary)?\n // primary → STRING | NUMBER | BOOL | NONE | IDENT | '(' expr ')'\n\n evaluate(): Value {\n const result = this.orExpr();\n if (this.peek().type !== 'EOF') {\n throw new Error(`Unexpected token: ${this.peek().value}`);\n }\n return result;\n }\n\n private orExpr(): Value {\n let left = this.andExpr();\n while (this.peek().type === 'OR') {\n this.advance();\n const right = this.andExpr();\n left = isTruthy(left) || isTruthy(right);\n }\n return left;\n }\n\n private andExpr(): Value {\n let left = this.notExpr();\n while (this.peek().type === 'AND') {\n this.advance();\n const right = this.notExpr();\n left = isTruthy(left) && isTruthy(right);\n }\n return left;\n }\n\n private notExpr(): Value {\n if (this.peek().type === 'NOT') {\n this.advance();\n const val = this.notExpr();\n return !isTruthy(val);\n }\n return this.cmpExpr();\n }\n\n private cmpExpr(): Value {\n const left = this.primary();\n const op = this.peek().type;\n\n switch (op) {\n case 'EQ':\n this.advance();\n return looseEqual(left, this.primary());\n case 'NEQ':\n this.advance();\n return !looseEqual(left, this.primary());\n case 'LT':\n this.advance();\n return toNumber(left) < toNumber(this.primary());\n case 'GT':\n this.advance();\n return toNumber(left) > toNumber(this.primary());\n case 'LTE':\n this.advance();\n return toNumber(left) <= toNumber(this.primary());\n case 'GTE':\n this.advance();\n return toNumber(left) >= toNumber(this.primary());\n case 'IN': {\n this.advance();\n const collection = this.primary();\n if (Array.isArray(collection)) {\n return collection.some((item) => looseEqual(item, left));\n }\n if (typeof collection === 'string' && typeof left === 'string') {\n return collection.includes(left);\n }\n return false;\n }\n case 'IS': {\n this.advance();\n // \"is not\"\n if (this.peek().type === 'NOT') {\n this.advance();\n return !looseEqual(left, this.primary());\n }\n return looseEqual(left, this.primary());\n }\n default:\n return left;\n }\n }\n\n private primary(): Value {\n const t = this.peek();\n\n switch (t.type) {\n case 'STRING':\n this.advance();\n return t.value;\n case 'NUMBER':\n this.advance();\n return parseFloat(t.value);\n case 'BOOL':\n this.advance();\n return t.value === 'True' || t.value === 'true';\n case 'NONE':\n this.advance();\n return null;\n case 'IDENT': {\n this.advance();\n // Function/method call: ident(...) or obj.method(...)\n if (this.peek().type === 'LPAREN') {\n this.advance(); // consume '('\n // Parse arguments (may be empty)\n while (this.peek().type !== 'RPAREN' && this.peek().type !== 'EOF') {\n this.orExpr(); // evaluate and discard each argument\n if (this.peek().type === 'COMMA') {\n this.advance(); // consume ','\n }\n }\n this.expect('RPAREN');\n // Can't evaluate function calls — return null (falsy) for validation\n return null;\n }\n return this.resolveVariable(t.value);\n }\n case 'LPAREN': {\n this.advance();\n const val = this.orExpr();\n this.expect('RPAREN');\n return val;\n }\n default:\n throw new Error(`Unexpected token in primary: ${t.type} \"${t.value}\"`);\n }\n }\n\n private resolveVariable(name: string): Value {\n const entry = this.variables.get(name);\n if (entry === undefined) {\n // Check for partial dot-notation matches:\n // e.g., \"user.plan\" might be stored as \"user.plan\" directly\n // No match → treat as undefined (falsy)\n return null;\n }\n\n switch (entry.type) {\n case 'string':\n return String(entry.value);\n case 'number':\n return Number(entry.value);\n case 'boolean':\n return entry.value === true || entry.value === 'true';\n default:\n return String(entry.value);\n }\n }\n}\n\n// ── Helper functions ───────────────────────────────────────────────\n\nfunction isTruthy(v: Value): boolean {\n if (v === null || v === undefined) return false;\n if (typeof v === 'boolean') return v;\n if (typeof v === 'number') return v !== 0;\n if (typeof v === 'string') return v.length > 0;\n if (Array.isArray(v)) return v.length > 0;\n return true;\n}\n\nfunction looseEqual(a: Value, b: Value): boolean {\n if (a === b) return true;\n if (a === null || b === null) return a === b;\n\n // Coerce number↔string for Jinja compatibility\n if (typeof a === 'number' && typeof b === 'string') return a === parseFloat(b);\n if (typeof a === 'string' && typeof b === 'number') return parseFloat(a) === b;\n\n return false;\n}\n\nfunction toNumber(v: Value): number {\n if (typeof v === 'number') return v;\n if (typeof v === 'string') return parseFloat(v) || 0;\n if (typeof v === 'boolean') return v ? 1 : 0;\n return 0;\n}\n\n// ── Public API ─────────────────────────────────────────────────────\n\n/**\n * Safely evaluate a Jinja conditional expression.\n *\n * Uses a recursive-descent parser with a whitelist of allowed operators.\n * No `eval`, `new Function`, or arbitrary code execution.\n *\n * @returns true/false if evaluation succeeded, null if parsing/evaluation failed\n */\nexport function evaluateCondition(condition: string, variables: Map<string, VariableValue>): boolean | null {\n try {\n const { tokens, error } = tokenize(condition.trim());\n if (error || tokens.length === 0) return null;\n\n const parser = new Parser(tokens, variables);\n const result = parser.evaluate();\n return isTruthy(result);\n } catch {\n return null;\n }\n}\n\n// ── Condition validation ──────────────────────────────────────────\n\nexport interface ConditionValidationResult {\n readonly valid: boolean;\n readonly error?: string;\n}\n\n/**\n * Validate a Jinja conditional expression without evaluating it.\n * Returns a structured result with an error message on failure.\n */\nexport function validateCondition(condition: string): ConditionValidationResult {\n const trimmed = condition.trim();\n if (trimmed === '') return { valid: true };\n\n const { tokens, error: tokenError } = tokenize(trimmed);\n if (tokenError) return { valid: false, error: tokenError };\n if (tokens.length === 0) return { valid: false, error: 'Empty expression' };\n\n try {\n // Parse without evaluating — use an empty variable map\n const parser = new Parser(tokens, new Map());\n parser.evaluate();\n return { valid: true };\n } catch (e) {\n const msg = e instanceof Error ? e.message : 'Invalid expression';\n return { valid: false, error: msg };\n }\n}\n","type TokenType =\n | 'STRING'\n | 'NUMBER'\n | 'BOOL'\n | 'NONE'\n | 'IDENT'\n | 'AND'\n | 'OR'\n | 'NOT'\n | 'IN'\n | 'IS'\n | 'EQ'\n | 'NEQ'\n | 'LT'\n | 'GT'\n | 'LTE'\n | 'GTE'\n | 'LPAREN'\n | 'RPAREN';\n\nexport type HighlightCategory = 'variable' | 'operator' | 'value' | 'punctuation';\n\nexport interface ConditionToken {\n readonly text: string;\n readonly start: number;\n readonly end: number;\n readonly category: HighlightCategory;\n}\n\ninterface RawToken {\n readonly type: TokenType;\n readonly text: string;\n readonly start: number;\n readonly end: number;\n}\n\nconst KEYWORDS: Readonly<Record<string, TokenType>> = {\n and: 'AND',\n or: 'OR',\n not: 'NOT',\n in: 'IN',\n is: 'IS',\n True: 'BOOL',\n False: 'BOOL',\n true: 'BOOL',\n false: 'BOOL',\n None: 'NONE',\n null: 'NONE',\n};\n\nconst CATEGORY_BY_TYPE: Readonly<Record<TokenType, HighlightCategory>> = {\n STRING: 'value',\n NUMBER: 'value',\n BOOL: 'value',\n NONE: 'value',\n IDENT: 'variable',\n AND: 'operator',\n OR: 'operator',\n NOT: 'operator',\n IN: 'operator',\n IS: 'operator',\n EQ: 'operator',\n NEQ: 'operator',\n LT: 'operator',\n GT: 'operator',\n LTE: 'operator',\n GTE: 'operator',\n LPAREN: 'punctuation',\n RPAREN: 'punctuation',\n};\n\nconst NEGATIVE_NUMBER_PRECEDERS = new Set<TokenType>([\n 'AND',\n 'OR',\n 'NOT',\n 'IN',\n 'IS',\n 'EQ',\n 'NEQ',\n 'LT',\n 'GT',\n 'LTE',\n 'GTE',\n 'LPAREN',\n]);\n\nfunction canStartNegativeNumber(tokens: readonly RawToken[]): boolean {\n if (tokens.length === 0) {\n return true;\n }\n\n const previous = tokens[tokens.length - 1];\n return NEGATIVE_NUMBER_PRECEDERS.has(previous.type);\n}\n\nfunction finalizeTokens(input: string, rawTokens: readonly RawToken[]): ConditionToken[] {\n const highlighted: ConditionToken[] = [];\n\n for (let i = 0; i < rawTokens.length; i++) {\n const token = rawTokens[i];\n const next = rawTokens[i + 1];\n\n if (token.type === 'IS' && next?.type === 'NOT') {\n highlighted.push({\n text: input.slice(token.start, next.end),\n start: token.start,\n end: next.end,\n category: 'operator',\n });\n i++;\n continue;\n }\n\n highlighted.push({\n text: token.text,\n start: token.start,\n end: token.end,\n category: CATEGORY_BY_TYPE[token.type],\n });\n }\n\n return highlighted;\n}\n\nexport function tokenizeCondition(input: string): ConditionToken[] {\n const rawTokens: RawToken[] = [];\n let i = 0;\n\n while (i < input.length) {\n const char = input[i];\n\n if (/\\s/.test(char)) {\n i++;\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n const start = i;\n const quote = char;\n i++;\n\n while (i < input.length) {\n if (input[i] === '\\\\' && i + 1 < input.length) {\n i += 2;\n continue;\n }\n\n if (input[i] === quote) {\n i++;\n rawTokens.push({\n type: 'STRING',\n text: input.slice(start, i),\n start,\n end: i,\n });\n break;\n }\n\n i++;\n }\n\n if (rawTokens[rawTokens.length - 1]?.start !== start) {\n return finalizeTokens(input, rawTokens);\n }\n\n continue;\n }\n\n if (/[0-9]/.test(char) || (char === '-' && i + 1 < input.length && /[0-9]/.test(input[i + 1]) && canStartNegativeNumber(rawTokens))) {\n const start = i;\n\n if (input[i] === '-') {\n i++;\n }\n\n while (i < input.length && /[0-9]/.test(input[i])) {\n i++;\n }\n\n if (i < input.length && input[i] === '.') {\n i++;\n while (i < input.length && /[0-9]/.test(input[i])) {\n i++;\n }\n }\n\n rawTokens.push({\n type: 'NUMBER',\n text: input.slice(start, i),\n start,\n end: i,\n });\n continue;\n }\n\n if (/[a-zA-Z_]/.test(char)) {\n const start = i;\n i++;\n\n while (i < input.length && /[a-zA-Z0-9_.]/.test(input[i])) {\n i++;\n }\n\n const text = input.slice(start, i);\n rawTokens.push({\n type: KEYWORDS[text] ?? 'IDENT',\n text,\n start,\n end: i,\n });\n continue;\n }\n\n if (i + 1 < input.length) {\n const twoChar = input.slice(i, i + 2);\n\n if (twoChar === '==') {\n rawTokens.push({ type: 'EQ', text: twoChar, start: i, end: i + 2 });\n i += 2;\n continue;\n }\n\n if (twoChar === '!=') {\n rawTokens.push({ type: 'NEQ', text: twoChar, start: i, end: i + 2 });\n i += 2;\n continue;\n }\n\n if (twoChar === '<=') {\n rawTokens.push({ type: 'LTE', text: twoChar, start: i, end: i + 2 });\n i += 2;\n continue;\n }\n\n if (twoChar === '>=') {\n rawTokens.push({ type: 'GTE', text: twoChar, start: i, end: i + 2 });\n i += 2;\n continue;\n }\n }\n\n if (char === '<') {\n rawTokens.push({ type: 'LT', text: char, start: i, end: i + 1 });\n i++;\n continue;\n }\n\n if (char === '>') {\n rawTokens.push({ type: 'GT', text: char, start: i, end: i + 1 });\n i++;\n continue;\n }\n\n if (char === '(') {\n rawTokens.push({ type: 'LPAREN', text: char, start: i, end: i + 1 });\n i++;\n continue;\n }\n\n if (char === ')') {\n rawTokens.push({ type: 'RPAREN', text: char, start: i, end: i + 1 });\n i++;\n continue;\n }\n\n return finalizeTokens(input, rawTokens);\n }\n\n return finalizeTokens(input, rawTokens);\n}\n","/**\n * Evaluate Jinja if-block AST nodes by selecting the first truthy branch.\n * Post-processes adjacent same-type lists to merge and renumber.\n */\nimport type { DocumentNode, BlockNode, InlineNode, JinjaIfBlockNode, JinjaIfInlineNode, BulletListNode, OrderedListNode } from '../ast/types';\nimport type { VariableValue } from './types';\nimport { evaluateCondition } from './evaluator';\nimport { map } from '../ast/traverse';\nimport type { AstNode } from '../ast/types';\n\n/**\n * Evaluate all jinjaIfBlock and jinjaIfInline nodes in a document,\n * replacing them with the content of the first truthy branch.\n */\nexport function evaluateJinjaNodes(\n doc: DocumentNode,\n variables: Map<string, VariableValue>,\n): DocumentNode {\n // Bottom-up: map evaluates children first, then we handle the jinja node\n const evaluated = map(doc, (node: AstNode): AstNode => {\n if (node.type === 'jinjaIfBlock') {\n const jNode = node as JinjaIfBlockNode;\n const selectedContent = selectBranch(jNode.branches, variables);\n // Return a wrapper that will be flattened by the parent\n // We use a special marker node that we'll expand\n return { type: '_jinjaBlockExpanded', content: selectedContent } as unknown as AstNode;\n }\n\n if (node.type === 'jinjaIfInline') {\n const jNode = node as JinjaIfInlineNode;\n const selectedContent = selectBranch(jNode.branches, variables);\n return { type: '_jinjaInlineExpanded', content: selectedContent } as unknown as AstNode;\n }\n\n return node;\n }) as DocumentNode;\n\n // Now expand the marker nodes and merge adjacent lists\n const expanded = expandMarkers(evaluated);\n return mergeAdjacentLists(expanded);\n}\n\nfunction selectBranch<T>(\n branches: readonly { readonly branchType: string; readonly condition?: string; readonly content: readonly T[] }[],\n variables: Map<string, VariableValue>,\n): readonly T[] {\n for (const branch of branches) {\n if (branch.branchType === 'else') {\n return branch.content;\n }\n if (branch.condition) {\n const result = evaluateCondition(branch.condition, variables);\n if (result === true) {\n return branch.content;\n }\n }\n }\n return [];\n}\n\n// === Expand marker nodes ===\n\nfunction expandMarkers(doc: DocumentNode): DocumentNode {\n const content = expandBlockArray(doc.content as BlockNode[]);\n return { type: 'doc', content };\n}\n\nfunction expandBlockArray(blocks: BlockNode[]): BlockNode[] {\n const result: BlockNode[] = [];\n for (const block of blocks) {\n const b = block as unknown as { type: string; content?: unknown[] };\n if (b.type === '_jinjaBlockExpanded') {\n result.push(...expandBlockArray(b.content as BlockNode[]));\n } else {\n result.push(expandBlockNode(block));\n }\n }\n return result;\n}\n\nfunction expandBlockNode(node: BlockNode): BlockNode {\n switch (node.type) {\n case 'paragraph':\n case 'heading': {\n const content = expandInlineArray(node.content as InlineNode[]);\n if (content === node.content) return node;\n return { ...node, content } as typeof node;\n }\n case 'bulletList':\n case 'orderedList':\n return { ...node, content: node.content.map(li => expandListItem(li)) } as typeof node;\n case 'listItem': {\n const content = expandBlockArray(node.content as BlockNode[]);\n return { ...node, content };\n }\n case 'blockquote': {\n const content = expandBlockArray(node.content as BlockNode[]);\n return { ...node, content };\n }\n case 'jinjaIfBlock':\n // Should not remain after evaluation, but handle gracefully\n return node;\n default:\n return node;\n }\n}\n\nfunction expandListItem(li: { readonly type: 'listItem'; readonly checked?: boolean | null; readonly content: readonly BlockNode[] }): typeof li {\n const content = expandBlockArray(li.content as BlockNode[]);\n return { ...li, content };\n}\n\nfunction expandInlineArray(inlines: InlineNode[]): InlineNode[] {\n const result: InlineNode[] = [];\n let changed = false;\n for (const inline of inlines) {\n const i = inline as unknown as { type: string; content?: unknown[] };\n if (i.type === '_jinjaInlineExpanded') {\n result.push(...expandInlineArray(i.content as InlineNode[]));\n changed = true;\n } else {\n result.push(inline);\n }\n }\n return changed ? result : inlines;\n}\n\n// === Merge adjacent same-type lists ===\n\nfunction mergeAdjacentLists(doc: DocumentNode): DocumentNode {\n const content = mergeBlockArray(doc.content as BlockNode[]);\n return { type: 'doc', content };\n}\n\nfunction mergeBlockArray(blocks: BlockNode[]): BlockNode[] {\n if (blocks.length <= 1) return blocks;\n\n const result: BlockNode[] = [];\n for (const block of blocks) {\n // Recurse into containers\n const processed = mergeInsideBlock(block);\n const prev = result[result.length - 1];\n\n if (prev && canMergeLists(prev, processed)) {\n result[result.length - 1] = mergeTwoLists(prev, processed);\n } else {\n result.push(processed);\n }\n }\n return result;\n}\n\nfunction mergeInsideBlock(node: BlockNode): BlockNode {\n switch (node.type) {\n case 'listItem': {\n const content = mergeBlockArray(node.content as BlockNode[]);\n return { ...node, content };\n }\n case 'blockquote': {\n const content = mergeBlockArray(node.content as BlockNode[]);\n return { ...node, content };\n }\n default:\n return node;\n }\n}\n\nfunction canMergeLists(a: BlockNode, b: BlockNode): boolean {\n if (a.type === 'bulletList' && b.type === 'bulletList') return true;\n if (a.type === 'orderedList' && b.type === 'orderedList') return true;\n return false;\n}\n\nfunction mergeTwoLists(a: BlockNode, b: BlockNode): BlockNode {\n if (a.type === 'bulletList' && b.type === 'bulletList') {\n return {\n type: 'bulletList',\n content: [...a.content, ...b.content],\n };\n }\n if (a.type === 'orderedList' && b.type === 'orderedList') {\n return {\n type: 'orderedList',\n start: a.start,\n content: [...a.content, ...b.content],\n };\n }\n return a; // Should not reach here\n}\n","import type { DocumentNode } from '../ast/types';\nimport type { LintContext, LintResult, LintRule } from './types';\nimport { visit } from '../ast/traverse';\n\nexport function lint(\n doc: DocumentNode,\n rules: readonly LintRule[],\n ctx: LintContext = {},\n): LintResult[] {\n const disabled = new Set(ctx.disabledRules);\n const results: LintResult[] = [];\n\n const visitorRules: Array<{\n rule: LintRule;\n severity: LintRule['defaultSeverity'];\n visitor: ReturnType<NonNullable<LintRule['buildVisitor']>>['visitor'];\n finish: ReturnType<NonNullable<LintRule['buildVisitor']>>['finish'];\n }> = [];\n\n const legacyRules: LintRule[] = [];\n\n for (const rule of rules) {\n if (disabled.has(rule.id)) continue;\n if (rule.buildVisitor) {\n const severity = ctx.severityOverrides?.[rule.id] ?? rule.defaultSeverity;\n const { visitor, finish } = rule.buildVisitor(ctx);\n visitorRules.push({ rule, severity, visitor, finish });\n } else {\n legacyRules.push(rule);\n }\n }\n\n // Single combined traversal for all visitor-based rules\n if (visitorRules.length > 0) {\n visit(doc, (node) => {\n const type = node.type;\n for (const { visitor } of visitorRules) {\n visitor[type]?.(node);\n }\n }, { trackPath: false });\n\n for (const { rule, severity, finish } of visitorRules) {\n const ruleResults = finish(severity);\n for (const r of ruleResults) {\n results.push(r.severity === severity ? r : { ...r, severity });\n }\n }\n }\n\n // Legacy rules (no buildVisitor) — individual traversals\n for (const rule of legacyRules) {\n const severity = ctx.severityOverrides?.[rule.id] ?? rule.defaultSeverity;\n const ruleResults = rule.run(doc, ctx);\n for (const r of ruleResults) {\n results.push(r.severity === severity ? r : { ...r, severity });\n }\n }\n\n return results;\n}\n","import type { JumpPointNode } from '../../ast/types';\nimport { visit } from '../../ast/traverse';\nimport type { LintRule } from '../types';\n\nexport const duplicateJumpPoints: LintRule = {\n id: 'duplicate-jump-points',\n description: 'Detects duplicate jump point IDs within the document',\n defaultSeverity: 'error',\n run(doc, ctx) {\n // Delegate to visitor-based implementation for consistency\n const { visitor, finish } = duplicateJumpPoints.buildVisitor!(ctx);\n visit(doc, (node) => {\n visitor[node.type]?.(node);\n }, { trackPath: false });\n return finish(this.defaultSeverity);\n },\n buildVisitor(_ctx) {\n const seen = new Map<string, number>();\n\n return {\n visitor: {\n jumpPoint(node) {\n const jp = node as JumpPointNode;\n seen.set(jp.id, (seen.get(jp.id) ?? 0) + 1);\n },\n },\n finish(severity) {\n const results = [];\n for (const [id, count] of seen) {\n if (count > 1) {\n results.push({\n ruleId: 'duplicate-jump-points',\n severity,\n message: `Duplicate jump point ID: \"${id}\" appears ${count} times`,\n });\n }\n }\n return results;\n },\n };\n },\n};\n","import type { JumpPointNode, TextNode } from '../../ast/types';\nimport { visit } from '../../ast/traverse';\nimport type { LintRule } from '../types';\n\nconst JUMP_REF_PATTERN = /#([\\p{L}\\p{N}_-]+)/gu;\n\nexport const jumpPointRefValidity: LintRule = {\n id: 'jump-point-ref-validity',\n description: 'Detects references to non-existent jump point IDs',\n defaultSeverity: 'error',\n run(doc, ctx) {\n // Delegate to visitor-based implementation for consistency\n const { visitor, finish } = jumpPointRefValidity.buildVisitor!(ctx);\n visit(doc, (node) => {\n visitor[node.type]?.(node);\n }, { trackPath: false });\n return finish(this.defaultSeverity);\n },\n buildVisitor(_ctx) {\n const definedIds = new Set<string>();\n const refs: { id: string }[] = [];\n\n return {\n visitor: {\n jumpPoint(node) {\n definedIds.add((node as JumpPointNode).id);\n },\n text(node) {\n const t = node as TextNode;\n const linkMark = t.marks?.find((m) => m.type === 'link');\n if (linkMark && linkMark.type === 'link') {\n const match = /^#([\\p{L}\\p{N}_-]+)$/u.exec(linkMark.href);\n if (match) {\n refs.push({ id: match[1] });\n }\n }\n let m;\n JUMP_REF_PATTERN.lastIndex = 0;\n while ((m = JUMP_REF_PATTERN.exec(t.text)) !== null) {\n refs.push({ id: m[1] });\n }\n },\n },\n finish(severity) {\n const results = [];\n for (const ref of refs) {\n if (!definedIds.has(ref.id)) {\n results.push({\n ruleId: 'jump-point-ref-validity',\n severity,\n message: `Reference to undefined jump point: \"${ref.id}\"`,\n });\n }\n }\n return results;\n },\n };\n },\n};\n","import type { BlockNode, ListItemNode } from '../../ast/types';\nimport { textContent } from '../../ast/traverse';\nimport { visit } from '../../ast/traverse';\nimport type { LintRule } from '../types';\n\nconst ACTION_VERBS = ['Say', 'Call', 'Ask', 'Send', 'Reply', 'Respond'];\n\nfunction getLeadingVerb(item: ListItemNode): string | undefined {\n const t = textContent(item).trimStart();\n for (const verb of ACTION_VERBS) {\n if (t.startsWith(verb + ' ') || t.startsWith(verb + ':') || t === verb) {\n return verb;\n }\n }\n return undefined;\n}\n\nexport const consecutiveMergeableActions: LintRule = {\n id: 'consecutive-mergeable-actions',\n description: 'Suggests merging consecutive list items that start with the same action verb',\n defaultSeverity: 'info',\n run(doc) {\n const results: ReturnType<LintRule['run']> = [];\n\n visit(doc, (node) => {\n if (node.type !== 'bulletList' && node.type !== 'orderedList') return;\n const items = (node as { content: readonly ListItemNode[] }).content;\n\n let runVerb: string | undefined;\n let runLength = 0;\n\n for (let i = 0; i <= items.length; i++) {\n const verb = i < items.length ? getLeadingVerb(items[i]) : undefined;\n if (verb && verb === runVerb) {\n runLength++;\n } else {\n if (runVerb && runLength >= 2) {\n results.push({\n ruleId: 'consecutive-mergeable-actions',\n severity: 'info' as const,\n message: `${runLength} consecutive \"${runVerb}\" items could be merged`,\n suggestion: `Consider combining the consecutive \"${runVerb}\" steps into a single step`,\n });\n }\n runVerb = verb;\n runLength = 1;\n }\n }\n });\n\n return results;\n },\n};\n","import { duplicateJumpPoints } from './duplicateJumpPoints';\nimport { jumpPointRefValidity } from './jumpPointRefValidity';\nimport { consecutiveMergeableActions } from './consecutiveMergeableActions';\nimport type { LintRule } from '../types';\n\nexport const defaultRules: readonly LintRule[] = [\n duplicateJumpPoints,\n jumpPointRefValidity,\n consecutiveMergeableActions,\n];\n\nexport { duplicateJumpPoints, jumpPointRefValidity, consecutiveMergeableActions };\n","import type { DocumentNode, BlockNode, HeadingNode } from '../ast/types';\nimport { textContent } from '../ast/traverse';\nimport type { LintSection } from './types';\n\nfunction isHeading(node: BlockNode): node is HeadingNode {\n return node.type === 'heading';\n}\n\n/**\n * Splits a document into sections by heading boundaries.\n * Each section contains the heading text, its path in the heading hierarchy,\n * the full text content, and the block index range.\n */\nexport function chunkByHeading(doc: DocumentNode): LintSection[] {\n const blocks = doc.content;\n const sections: LintSection[] = [];\n const headingStack: string[] = [];\n\n let currentHeading = '(intro)';\n let currentPath: string[] = [];\n let sectionStart = 0;\n let sectionTexts: string[] = [];\n\n function flush(end: number) {\n if (sectionTexts.length > 0 || sectionStart < end) {\n sections.push({\n heading: currentHeading,\n headingPath: [...currentPath],\n text: sectionTexts.join('\\n'),\n blockRange: [sectionStart, end],\n });\n }\n sectionTexts = [];\n }\n\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n\n if (isHeading(block)) {\n flush(i);\n const level = block.level;\n const headingText = textContent(block);\n\n // Update heading stack for hierarchy tracking\n while (headingStack.length >= level) {\n headingStack.pop();\n }\n headingStack.push(headingText);\n\n currentHeading = headingText;\n currentPath = [...headingStack];\n sectionStart = i;\n sectionTexts.push(textContent(block));\n } else {\n sectionTexts.push(textContent(block));\n }\n }\n\n flush(blocks.length);\n return sections;\n}\n","import type { DocumentNode } from '../ast/types';\nimport type { LintContext, LintResult, LlmCompletionEndpoint, LlmLintRule } from './types';\nimport type { LintRule } from './types';\nimport { lint } from './runner';\nimport { chunkByHeading } from './chunker';\n\nexport interface LintAsyncOptions {\n rules?: readonly LintRule[];\n llmRules?: readonly LlmLintRule[];\n llmEndpoint?: LlmCompletionEndpoint;\n ctx?: LintContext;\n signal?: AbortSignal;\n onProgress?: (completed: number, total: number) => void;\n}\n\n/**\n * Runs both static lint rules and LLM-based lint rules.\n * Static rules run synchronously first, then LLM rules run per-section sequentially.\n * Returns all results combined.\n */\nexport async function lintAsync(\n doc: DocumentNode,\n options: LintAsyncOptions,\n): Promise<LintResult[]> {\n const { rules = [], llmRules = [], llmEndpoint, ctx = {}, signal, onProgress } = options;\n\n // 1. Run static rules synchronously\n const staticResults = lint(doc, rules, ctx);\n\n // 2. If no LLM rules or no endpoint, return static results only\n if (llmRules.length === 0 || !llmEndpoint) {\n return staticResults;\n }\n\n const disabled = new Set(ctx.disabledRules);\n const activeRules = llmRules.filter((r) => !disabled.has(r.id));\n if (activeRules.length === 0) return staticResults;\n\n // 3. Chunk document into sections\n const sections = chunkByHeading(doc);\n const totalTasks = activeRules.length * sections.length;\n let completed = 0;\n\n // 4. Run LLM rules per section sequentially to avoid rate limiting\n const llmResults: LintResult[] = [];\n\n for (const rule of activeRules) {\n const severity = ctx.severityOverrides?.[rule.id] ?? rule.defaultSeverity;\n\n for (const section of sections) {\n if (signal?.aborted) break;\n\n try {\n const prompt = rule.buildPrompt(section);\n const response = await llmEndpoint(prompt, { signal });\n const results = rule.parseResponse(response, section);\n\n for (const r of results) {\n llmResults.push(r.severity === severity ? r : { ...r, severity });\n }\n } catch (err) {\n if (signal?.aborted) break;\n // Non-fatal: log and continue with other sections/rules\n console.warn(`[lint] LLM rule \"${rule.id}\" failed on section \"${section.heading}\":`, err);\n }\n\n completed++;\n onProgress?.(completed, totalTasks);\n }\n }\n\n return [...staticResults, ...llmResults];\n}\n","import type { LintResult, LintSeverity } from '../../types';\n\nexport function parseIssueLines(\n response: string,\n ruleId: string,\n severity: LintSeverity,\n heading: string,\n): LintResult[] {\n const trimmed = response.trim();\n if (trimmed === 'OK' || trimmed === '') return [];\n\n const results: LintResult[] = [];\n for (const line of trimmed.split('\\n')) {\n const match = /^ISSUE:\\s*(.+)$/i.exec(line.trim());\n if (match) {\n results.push({\n ruleId,\n severity,\n message: `[${heading}] ${match[1]}`,\n });\n }\n }\n return results;\n}\n","import type { LlmLintRule } from '../../types';\nimport { parseIssueLines } from './parseIssueLines';\n\nexport const repetitionDetection: LlmLintRule = {\n id: 'llm-repetition',\n description: 'Detects repetitive or redundant instructions within a section',\n defaultSeverity: 'warning',\n buildPrompt(section) {\n return `You are an actionbook linter. Analyze the following section for repetitive or redundant instructions.\nIf you find issues, respond with one line per issue in the format: ISSUE: <description>\nIf there are no issues, respond with: OK\n\nSection \"${section.heading}\":\n${section.text}`;\n },\n parseResponse(response, section) {\n return parseIssueLines(response, 'llm-repetition', 'warning', section.heading);\n },\n};\n","import type { LlmLintRule } from '../../types';\nimport { parseIssueLines } from './parseIssueLines';\n\nexport const koreanVerbFirst: LlmLintRule = {\n id: 'llm-korean-verb-first',\n description: 'Checks that Korean action items start with an action verb (e.g., \"확인한다\", \"전송한다\")',\n defaultSeverity: 'info',\n buildPrompt(section) {\n return `You are an actionbook linter for Korean-language documents. Check if action/instruction items in this section follow the \"verb-first\" pattern (e.g., starting with action verbs like \"확인한다\", \"전송한다\", \"응답한다\").\nIf you find items that don't follow this pattern, respond with one line per issue: ISSUE: <description>\nIf all items are fine or there are no Korean action items, respond with: OK\n\nSection \"${section.heading}\":\n${section.text}`;\n },\n parseResponse(response, section) {\n return parseIssueLines(response, 'llm-korean-verb-first', 'info', section.heading);\n },\n};\n","import type { LlmLintRule } from '../../types';\nimport { parseIssueLines } from './parseIssueLines';\n\nexport const conditionGrounding: LlmLintRule = {\n id: 'llm-condition-grounding',\n description: 'Checks that conditional branches (if/else) reference concrete, observable conditions',\n defaultSeverity: 'warning',\n buildPrompt(section) {\n return `You are an actionbook linter. Check if any conditional instructions (if/else, when, in case of) in this section reference vague or ungrounded conditions instead of concrete, observable states.\nExamples of vague conditions: \"if appropriate\", \"when needed\", \"if possible\"\nExamples of grounded conditions: \"if the user's subscription is active\", \"when the API returns 404\"\nIf you find issues, respond with one line per issue: ISSUE: <description>\nIf there are no issues or no conditionals, respond with: OK\n\nSection \"${section.heading}\":\n${section.text}`;\n },\n parseResponse(response, section) {\n return parseIssueLines(response, 'llm-condition-grounding', 'warning', section.heading);\n },\n};\n","import { repetitionDetection } from './repetitionDetection';\nimport { koreanVerbFirst } from './koreanVerbFirst';\nimport { conditionGrounding } from './conditionGrounding';\nimport type { LlmLintRule } from '../../types';\n\nexport const defaultLlmRules: readonly LlmLintRule[] = [\n repetitionDetection,\n koreanVerbFirst,\n conditionGrounding,\n];\n\nexport { repetitionDetection, koreanVerbFirst, conditionGrounding };\nexport { parseIssueLines } from './parseIssueLines';\n","import type { DocumentNode, ResourceTagNode } from '../ast/types';\nimport { findAll } from '../ast/traverse';\n\nexport function extractResourceTags(doc: DocumentNode): ResourceTagNode[] {\n return findAll(doc, (n) => n.type === 'resourceTag') as ResourceTagNode[];\n}\n","import type { DocumentNode, JumpPointNode } from '../ast/types';\nimport { findAll } from '../ast/traverse';\n\nexport function findDuplicateJumpPoints(doc: DocumentNode): string[] {\n const jumpPoints = findAll(doc, (n) => n.type === 'jumpPoint') as JumpPointNode[];\n const seen = new Set<string>();\n const duplicates = new Set<string>();\n\n for (const jp of jumpPoints) {\n if (seen.has(jp.id)) {\n duplicates.add(jp.id);\n }\n seen.add(jp.id);\n }\n\n return Array.from(duplicates);\n}\n","/**\n * Extract a hierarchical tree structure from a DocumentNode for the preview tree view.\n *\n * Walks the AST and produces a tree of:\n * - Headings (H1/H2 as sections, H3-H6 as subsections)\n * - Jump points with their IDs\n * - Jinja if blocks with condition branches\n * - Resource tags (tool, handoff, etc.)\n */\nimport type { DocumentNode, BlockNode, InlineNode } from '../ast/types';\nimport { textContent } from '../ast/traverse';\nimport { analyzeJinjaBlocks } from '../jinja/analyzer';\n\nconst MAX_DEPTH = 128;\n\nexport type DocumentTreeNodeType =\n | 'heading'\n | 'jumpPoint'\n | 'jinjaIf'\n | 'jinjaBranch'\n | 'resourceTag'\n | 'noteBlock'\n | 'endAction';\n\nexport interface DocumentTreeNode {\n readonly type: DocumentTreeNodeType;\n readonly label: string;\n readonly blockIndex: number;\n readonly children: readonly DocumentTreeNode[];\n readonly meta?: Record<string, unknown>;\n}\n\n/** Resource IDs that represent \"end action\" tools (close conversation, etc.). */\nconst END_ACTION_RESOURCE_IDS = new Set([\n 'close-happy-tiger', // PredefinedToolKey.CloseConversation\n]);\n\n/** Text labels that indicate an end action (fallback when resourceId doesn't match). */\nconst END_ACTION_TEXTS = new Set([\n 'end conversation',\n 'end_conversation',\n]);\n\nfunction isEndActionTag(tagType: string, resourceId: string, text: string): boolean {\n return tagType === 'handoff'\n || END_ACTION_RESOURCE_IDS.has(resourceId)\n || END_ACTION_TEXTS.has(text.toLowerCase());\n}\n\nfunction extractInlineItems(\n content: readonly InlineNode[],\n blockIndex: number,\n): DocumentTreeNode[] {\n const items: DocumentTreeNode[] = [];\n for (const node of content) {\n if (node.type === 'jumpPoint') {\n items.push({\n type: 'jumpPoint',\n label: node.id,\n blockIndex,\n children: [],\n });\n } else if (node.type === 'resourceTag') {\n const endAction = isEndActionTag(node.tagType, node.resourceId, node.text);\n items.push({\n type: endAction ? 'endAction' : 'resourceTag',\n label: endAction ? `End ${node.text}` : node.text,\n blockIndex,\n children: [],\n meta: { tagType: node.tagType, resourceId: node.resourceId },\n });\n }\n }\n return items;\n}\n\nfunction extractBlockItems(\n blocks: readonly BlockNode[],\n startIndex: number,\n depth: number,\n): DocumentTreeNode[] {\n if (depth > MAX_DEPTH) return [];\n\n const items: DocumentTreeNode[] = [];\n\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n const blockIndex = startIndex + i;\n\n switch (block.type) {\n case 'heading': {\n const label = textContent(block) || `Heading ${block.level}`;\n const inlineItems = extractInlineItems(block.content, blockIndex);\n items.push({\n type: 'heading',\n label,\n blockIndex,\n children: inlineItems,\n meta: { level: block.level },\n });\n break;\n }\n\n case 'paragraph': {\n const inlineItems = extractInlineItems(block.content, blockIndex);\n items.push(...inlineItems);\n break;\n }\n\n case 'jinjaIfBlock': {\n const branches: DocumentTreeNode[] = block.branches.map((branch, branchIdx) => {\n const branchLabel =\n branch.branchType === 'else'\n ? 'ELSE'\n : `${branch.branchType.toUpperCase()} ${branch.condition || ''}`.trim();\n const branchChildren = extractBlockItems(branch.content, blockIndex, depth + 1);\n return {\n type: 'jinjaBranch' as const,\n label: branchLabel,\n blockIndex,\n children: branchChildren,\n meta: { branchIndex: branchIdx },\n };\n });\n\n items.push({\n type: 'jinjaIf',\n label: 'Jinja if',\n blockIndex,\n children: branches,\n });\n break;\n }\n\n case 'noteBlock': {\n const noteContent = textContent(block);\n items.push({\n type: 'noteBlock',\n label: noteContent ? `Note: ${noteContent.slice(0, 30)}` : 'Note',\n blockIndex,\n children: [],\n });\n break;\n }\n\n case 'bulletList':\n case 'orderedList': {\n for (const li of block.content) {\n const childItems = extractBlockItems(li.content, blockIndex, depth + 1);\n items.push(...childItems);\n }\n break;\n }\n\n case 'blockquote': {\n const childItems = extractBlockItems(block.content, blockIndex, depth + 1);\n items.push(...childItems);\n break;\n }\n\n default:\n break;\n }\n }\n\n return items;\n}\n\n/**\n * Build a document outline tree from a DocumentNode.\n * Extracts both structured jinjaIfBlock nodes and text-based {% if %} patterns.\n */\nexport function buildDocumentTree(doc: DocumentNode): DocumentTreeNode[] {\n const items = extractBlockItems(doc.content, 0, 0);\n\n // Also detect text-based Jinja ({% if %} stored as plain text in paragraphs)\n try {\n const structures = analyzeJinjaBlocks(doc);\n if (structures.length > 0) {\n // Only add text-based Jinja if no structured jinjaIf was already found\n const hasStructuredJinja = items.some((n) => n.type === 'jinjaIf');\n if (!hasStructuredJinja) {\n for (const s of structures) {\n const branches: DocumentTreeNode[] = s.branches.map((b, branchIdx) => ({\n type: 'jinjaBranch' as const,\n label: b.type === 'else' ? 'ELSE' : `${b.type.toUpperCase()} ${b.condition || ''}`.trim(),\n blockIndex: b.tagBlockIndex,\n children: [],\n meta: { branchIndex: branchIdx },\n }));\n\n const jinjaNode: DocumentTreeNode = {\n type: 'jinjaIf',\n label: 'Jinja if',\n blockIndex: s.ifTagBlockIndex,\n children: branches,\n };\n\n // Insert at the correct position based on blockIndex\n let inserted = false;\n for (let i = 0; i < items.length; i++) {\n if (items[i].blockIndex > s.ifTagBlockIndex) {\n items.splice(i, 0, jinjaNode);\n inserted = true;\n break;\n }\n }\n if (!inserted) items.push(jinjaNode);\n }\n }\n }\n } catch {\n // analyzeJinjaBlocks may fail on some documents — don't break the tree\n }\n\n return items;\n}\n","/**\n * Tree Generator for Actionbook Decision Trees\n *\n * Converts an actionbook-core DocumentNode AST into a decision tree\n * by exhaustively traversing all branches (Jinja and Conditional).\n *\n * Port of aidebugger's treeGenerator.js, adapted for the actionbook-core\n * AST model (block-level nodes instead of line-level parsed objects).\n */\n\nimport type {\n DocumentNode,\n BlockNode,\n InlineNode,\n AstNode,\n ListItemNode,\n TextNode,\n} from '../ast/types';\nimport { textContent, visit } from '../ast/traverse';\nimport { analyzeJinjaBlocks } from '../jinja/analyzer';\nimport type { JinjaVisualStructure } from '../jinja/analyzer';\nimport type {\n DecisionTree,\n TreeNode,\n TreeNodeLine,\n TreeNodeClassification,\n GotoEdge,\n} from './types';\n\n// ── Helpers ──────────────────────────────────────────────\n\nlet nodeIdCounter = 0;\nfunction generateNodeId(): string {\n return `node_${++nodeIdCounter}`;\n}\n\ninterface BlockMeta {\n toolIds: string[];\n jumpTargets: string[];\n hasHandoff: boolean;\n}\n\n/**\n * Single-pass extraction of all metadata from a block node.\n * Replaces separate extractToolIds / extractJumpTargets / hasResourceTag calls.\n */\nfunction extractBlockMeta(block: AstNode): BlockMeta {\n const toolIds: string[] = [];\n const jumpTargets: string[] = [];\n let hasHandoff = false;\n\n visit(block, (node) => {\n if (node.type === 'resourceTag') {\n const n = node as any;\n if (n.tagType === 'tool') toolIds.push(n.resourceId as string);\n if (n.tagType === 'handoff') hasHandoff = true;\n } else if (node.type === 'jumpPoint') {\n jumpTargets.push((node as any).id as string);\n } else if (node.type === 'text') {\n const marks = (node as TextNode).marks;\n if (marks) {\n for (const m of marks) {\n if (m.type === 'link' && m.href.startsWith('#')) {\n jumpTargets.push(m.href.slice(1));\n }\n }\n }\n }\n }, { trackPath: false });\n\n return { toolIds, jumpTargets, hasHandoff };\n}\n\nfunction inlineSummary(content: readonly InlineNode[], maxLen = 80): string {\n const parts: string[] = [];\n for (const node of content) {\n if (node.type === 'text') {\n const linkMark = node.marks?.find((m) => m.type === 'link' && m.href.startsWith('#'));\n if (linkMark && linkMark.type === 'link') {\n parts.push(`[${node.text}](${linkMark.href})`);\n } else {\n parts.push(node.text);\n }\n } else if (node.type === 'resourceTag') {\n parts.push(`{{${node.tagType}:${node.resourceId}:${node.text}}}`);\n } else if (node.type === 'jumpPoint') {\n parts.push(`^${node.id}^`);\n }\n }\n const s = parts.join('').trim();\n return s.length > maxLen ? s.slice(0, maxLen) + '...' : s;\n}\n\nfunction blockSummary(block: BlockNode, maxLen = 80): string {\n if (block.type === 'heading' || block.type === 'paragraph') {\n return inlineSummary(block.content, maxLen);\n }\n if (block.type === 'listItem') {\n // Use first paragraph/heading content for summary\n const first = block.content[0];\n if (first && (first.type === 'paragraph' || first.type === 'heading')) {\n return inlineSummary(first.content, maxLen);\n }\n }\n if (block.type === 'blockquote') {\n const t = '> ' + textContent(block).trim();\n return t.length > maxLen ? t.slice(0, maxLen) + '...' : t;\n }\n const t = textContent(block).trim();\n return t.length > maxLen ? t.slice(0, maxLen) + '...' : t;\n}\n\n/** Check if a list item text starts with \"If ...\" conditional pattern */\nfunction parseConditionalFromItem(item: ListItemNode): string | null {\n const first = item.content[0];\n if (!first || (first.type !== 'paragraph' && first.type !== 'heading')) return null;\n const t = inlineSummary(first.content).trim();\n const condMatch = t.match(/^(?:If|if)\\s+(.+?)(?:\\s*:)?\\s*$/);\n if (condMatch) return condMatch[1];\n if (/^(?:Else|else)\\s*:?\\s*$/.test(t)) return 'else';\n return null;\n}\n\n/**\n * Classify a content node based on its lines.\n */\nfunction classifyNode(node: TreeNode): TreeNodeClassification {\n if (node.type === 'section_entry' || node.type === 'jinja_condition' || node.type === 'conditional') {\n return 'structural';\n }\n\n const hasTools = node.lines.some((l) => l.hasToolCall);\n const hasHandoff = node.lines.some((l) => l.hasHandoff);\n const hasJump = node.lines.some((l) => l.hasJumpPoint);\n\n // Blockquote content (internal action / comment / prompt)\n const allBlockquote = node.lines.length > 0 && node.lines.every((l) => l.content.startsWith('>'));\n if (allBlockquote) return 'internal_action';\n\n if (hasHandoff) return 'agent_speech';\n if (hasTools && !hasSpeechContent(node)) return 'tool_call_only';\n if (hasTools) return 'mixed_with_speech';\n if (hasJump && !hasSpeechContent(node)) return 'agent_internal';\n\n return 'agent_speech';\n}\n\nfunction hasSpeechContent(node: TreeNode): boolean {\n for (const line of node.lines) {\n // Strip tool/handoff/manual/template tags, jump points, and link gotos from content\n const stripped = line.content\n .replace(/\\{\\{[^}]+\\}\\}/g, '')\n .replace(/\\^[\\p{L}\\p{N}_-]+\\^/gu, '')\n .replace(/\\[[^\\]]*\\]\\(#[^)]+\\)/g, '')\n .trim();\n if (stripped.length > 0) return true;\n }\n return false;\n}\n\n/**\n * Extract context variable requirements from a Jinja condition string.\n */\nfunction extractContextRequirements(conditionText: string): Record<string, string> {\n if (!conditionText) return {};\n const requirements: Record<string, string> = {};\n\n // context.X == \"Y\"\n const eqMatches = conditionText.matchAll(/(?:context[.:])(\\w+)\\s*==\\s*[\"']([^\"']+)[\"']/g);\n for (const m of eqMatches) requirements[m[1]] = m[2];\n\n // context.X != \"Y\" (need value that isn't Y)\n const neqMatches = conditionText.matchAll(/(?:context[.:])(\\w+)\\s*!=\\s*[\"']([^\"']+)[\"']/g);\n for (const m of neqMatches) {\n if (!requirements[m[1]]) requirements[m[1]] = `<valid_${m[1]}>`;\n }\n\n // context.X (truthy check)\n const existMatches = conditionText.matchAll(/(?:context[.:])(\\w+)(?=\\s+and|\\s*$|\\s+(?!==|!=|>|<|is))/g);\n for (const m of existMatches) {\n if (!requirements[m[1]]) requirements[m[1]] = `<valid_${m[1]}>`;\n }\n\n // not context.X (falsy check)\n const notMatches = conditionText.matchAll(/not\\s+(?:context[.:])(\\w+)/g);\n for (const m of notMatches) {\n if (!requirements[m[1]]) requirements[m[1]] = 'null';\n }\n\n return requirements;\n}\n\n// ── Main Generator ───────────────────────────────────────\n\nexport function generateDecisionTree(doc: DocumentNode): DecisionTree {\n nodeIdCounter = 0;\n\n const jinjaStructures = analyzeJinjaBlocks(doc);\n // Map: blockIndex → JinjaVisualStructure (for the {% if %} tag block)\n const jinjaIfMap = new Map<number, JinjaVisualStructure>();\n // Set of all block indices that belong to any jinja structure\n const jinjaBlockSet = new Set<number>();\n\n for (const s of jinjaStructures) {\n jinjaIfMap.set(s.ifTagBlockIndex, s);\n for (let i = s.ifTagBlockIndex; i <= s.endifTagBlockIndex; i++) {\n jinjaBlockSet.add(i);\n }\n }\n\n const tree: DecisionTree = {\n rootNodeId: null,\n nodes: {},\n sections: {},\n gotoEdges: [],\n statistics: { totalNodes: 0, totalPaths: 0, maxDepth: 0, branchPoints: 0, sectionCount: 0 },\n };\n\n const visitedStates = new Set<string>();\n let pendingSection: string | null = null;\n let currentAncestorConditions: Array<{ condition: string; branchType: string; blockIndex: number }> = [];\n\n function registerNode(node: TreeNode): void {\n tree.nodes[node.id] = node;\n tree.statistics.totalNodes++;\n tree.statistics.maxDepth = Math.max(tree.statistics.maxDepth, node.depth);\n if (node.type === 'content' || node.type === 'end') {\n node.classification = classifyNode(node);\n }\n }\n\n function markSectionRoot(node: TreeNode): void {\n if (pendingSection && tree.sections[pendingSection]) {\n tree.sections[pendingSection].rootNodeId = node.id;\n pendingSection = null;\n }\n }\n\n function makeNodeLine(block: BlockNode, blockIndex: number): TreeNodeLine {\n const content = blockSummary(block);\n const { toolIds, jumpTargets, hasHandoff } = extractBlockMeta(block);\n return {\n blockIndex,\n content,\n hasToolCall: toolIds.length > 0,\n toolIds,\n hasJumpPoint: jumpTargets.length > 0,\n jumpTargets,\n hasHandoff,\n };\n }\n\n // ── Traversal ────────────────────────────────────────\n\n /**\n * Traverse document blocks starting from blockIndex.\n * Returns a node ID or null. May return __multipleChildren marker.\n */\n function traverse(blockIndex: number, depth: number): string | null | { __multi: true; ids: string[] } {\n if (blockIndex >= doc.content.length || blockIndex < 0) return null;\n\n const block = doc.content[blockIndex];\n\n // Skip horizontal rules\n if (block.type === 'horizontalRule') {\n return traverse(blockIndex + 1, depth);\n }\n\n // Cycle detection\n const sig = `${blockIndex}`;\n if (visitedStates.has(sig)) return null;\n visitedStates.add(sig);\n\n // ── Heading → section boundary\n if (block.type === 'heading') {\n // Extract section name from heading text only (exclude jump points)\n const sectionName = block.content\n .filter((n) => n.type !== 'jumpPoint')\n .map((n) => n.type === 'text' ? n.text : '')\n .join('')\n .trim();\n\n if (!tree.sections[sectionName]) {\n tree.sections[sectionName] = {\n headingBlockIndex: blockIndex,\n rootNodeId: null,\n ancestorConditions: [...currentAncestorConditions],\n };\n tree.statistics.sectionCount++;\n }\n pendingSection = sectionName;\n\n return traverse(blockIndex + 1, depth);\n }\n\n // ── Jinja fork\n const jinjaStart = jinjaIfMap.get(blockIndex);\n if (jinjaStart) {\n return handleJinjaFork(jinjaStart, blockIndex, depth);\n }\n\n // Skip blocks inside jinja structure (handled by handleJinjaFork)\n if (jinjaBlockSet.has(blockIndex)) {\n return traverse(blockIndex + 1, depth);\n }\n\n // ── List with potential conditionals\n if (block.type === 'orderedList' || block.type === 'bulletList') {\n return handleList(block, blockIndex, depth);\n }\n\n // ── Blockquote\n if (block.type === 'blockquote') {\n return handleContentBlocks([blockIndex], depth);\n }\n\n // ── Paragraph (skip pure jinja tags)\n if (block.type === 'paragraph') {\n const t = textContent(block).trim();\n if (/^\\{%.*%\\}$/.test(t)) {\n return traverse(blockIndex + 1, depth);\n }\n return handleContentBlocks([blockIndex], depth);\n }\n\n // Default: skip\n return traverse(blockIndex + 1, depth);\n }\n\n // ── Jinja Fork Handler ───────────────────────────────\n\n function handleJinjaFork(\n structure: JinjaVisualStructure,\n blockIndex: number,\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n tree.statistics.branchPoints++;\n\n const savedPendingSection = pendingSection;\n if (savedPendingSection) pendingSection = null;\n\n const conditionNodeIds: string[] = [];\n\n for (const branch of structure.branches) {\n // Build condition display text\n const tagBlock = doc.content[branch.tagBlockIndex];\n const tagText = tagBlock ? textContent(tagBlock).trim() : branch.type;\n const conditionDisplay = tagText;\n const label = branch.condition\n ? `${branch.type} ${branch.condition}`\n : branch.type;\n\n const condNode: TreeNode = {\n id: generateNodeId(),\n type: 'jinja_condition',\n blockRange: { start: branch.tagBlockIndex, end: branch.tagBlockIndex },\n lines: [],\n summary: label,\n children: [],\n depth,\n conditionText: conditionDisplay,\n isJinja: true,\n branchType: branch.type,\n };\n registerNode(condNode);\n if (!savedPendingSection) markSectionRoot(condNode);\n\n // Track ancestor\n currentAncestorConditions.push({\n condition: conditionDisplay,\n branchType: branch.type,\n blockIndex: branch.tagBlockIndex,\n });\n\n // Traverse branch content (blocks between tag and next tag/endif)\n const contentStart = branch.tagBlockIndex + 1;\n const contentEnd = branch.blockEndIndex;\n\n if (contentStart < contentEnd) {\n const childResult = traverseRange(contentStart, contentEnd, depth + 1);\n attachChildren(condNode, childResult);\n }\n\n currentAncestorConditions.pop();\n conditionNodeIds.push(condNode.id);\n }\n\n // Continue after endif\n const afterEndif = structure.endifTagBlockIndex + 1;\n if (afterEndif < doc.content.length) {\n const afterResult = traverse(afterEndif, depth);\n if (afterResult) {\n for (const condId of conditionNodeIds) {\n attachContinuation(tree.nodes[condId], afterResult);\n }\n }\n }\n\n // If there was a pending section, create container\n if (savedPendingSection) {\n const container: TreeNode = {\n id: generateNodeId(),\n type: 'section_entry',\n blockRange: { start: blockIndex, end: structure.endifTagBlockIndex },\n lines: [],\n summary: `Section: ${savedPendingSection}`,\n children: conditionNodeIds,\n depth,\n isContainer: true,\n };\n registerNode(container);\n if (tree.sections[savedPendingSection]) {\n tree.sections[savedPendingSection].rootNodeId = container.id;\n }\n return container.id;\n }\n\n if (conditionNodeIds.length === 1) return conditionNodeIds[0];\n return { __multi: true, ids: conditionNodeIds };\n }\n\n // ── List Handler ─────────────────────────────────────\n\n function handleList(\n block: BlockNode & { content: readonly ListItemNode[] },\n blockIndex: number,\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n // Check if list items contain conditional branching (\"If ...\")\n const conditionalItems: Array<{ item: ListItemNode; condition: string; index: number }> = [];\n const normalItems: ListItemNode[] = [];\n\n for (let i = 0; i < block.content.length; i++) {\n const item = block.content[i];\n const cond = parseConditionalFromItem(item);\n if (cond) {\n conditionalItems.push({ item, condition: cond, index: i });\n } else {\n normalItems.push(item);\n }\n }\n\n // If there are conditional branches at this level\n if (conditionalItems.length >= 2) {\n return handleConditionalBranching(conditionalItems, blockIndex, depth);\n }\n\n // Normal list — aggregate items as content\n const lines: TreeNodeLine[] = [];\n const jumpTargetsAll: string[] = [];\n\n for (const item of block.content) {\n const line = makeNodeLine(item, blockIndex);\n lines.push(line);\n jumpTargetsAll.push(...line.jumpTargets);\n\n // Check nested lists inside item for conditionals\n const nestedBranches = findNestedConditionals(item);\n if (nestedBranches.length >= 2) {\n // Flush current content first, then emit fork\n if (lines.length > 0) {\n const contentNode = createContentNode(lines, blockIndex, blockIndex, depth, jumpTargetsAll);\n const forkResult = handleConditionalBranching(\n nestedBranches.map((b, i) => ({ item: b.item, condition: b.condition, index: i })),\n blockIndex,\n depth,\n );\n if (forkResult) attachChildren(contentNode, forkResult);\n\n // Continue after this list\n const afterResult = traverse(blockIndex + 1, depth);\n if (afterResult) attachContinuation(contentNode, afterResult);\n\n return contentNode.id;\n }\n }\n }\n\n if (lines.length === 0) {\n return traverse(blockIndex + 1, depth);\n }\n\n const contentNode = createContentNode(lines, blockIndex, blockIndex, depth, jumpTargetsAll);\n\n // Continue\n const afterResult = traverse(blockIndex + 1, depth);\n if (afterResult) attachChildren(contentNode, afterResult);\n\n return contentNode.id;\n }\n\n function findNestedConditionals(item: ListItemNode): Array<{ item: ListItemNode; condition: string }> {\n const results: Array<{ item: ListItemNode; condition: string }> = [];\n for (const child of item.content) {\n if (child.type === 'bulletList' || child.type === 'orderedList') {\n for (const subItem of child.content) {\n const cond = parseConditionalFromItem(subItem);\n if (cond) results.push({ item: subItem, condition: cond });\n }\n }\n }\n return results;\n }\n\n // ── Conditional Branching ────────────────────────────\n\n function handleConditionalBranching(\n items: Array<{ item: ListItemNode; condition: string; index: number }>,\n blockIndex: number,\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n tree.statistics.branchPoints++;\n const condNodeIds: string[] = [];\n\n for (const { item, condition } of items) {\n const condNode: TreeNode = {\n id: generateNodeId(),\n type: 'conditional',\n blockRange: { start: blockIndex, end: blockIndex },\n lines: [],\n summary: condition,\n children: [],\n depth,\n conditionText: condition,\n isJinja: false,\n };\n registerNode(condNode);\n\n // Traverse child content of this conditional item\n const childBlocks = item.content.slice(1); // Skip first paragraph (the condition itself)\n if (childBlocks.length > 0) {\n const childLines: TreeNodeLine[] = [];\n const childJumps: string[] = [];\n\n for (const childBlock of childBlocks) {\n if (childBlock.type === 'bulletList' || childBlock.type === 'orderedList') {\n for (const subItem of childBlock.content) {\n const subCond = parseConditionalFromItem(subItem);\n if (!subCond) {\n const line = makeNodeLine(subItem, blockIndex);\n childLines.push(line);\n childJumps.push(...line.jumpTargets);\n }\n }\n } else {\n const line = makeNodeLine(childBlock, blockIndex);\n childLines.push(line);\n childJumps.push(...line.jumpTargets);\n }\n }\n\n if (childLines.length > 0) {\n const contentNode = createContentNode(childLines, blockIndex, blockIndex, depth + 1, childJumps);\n condNode.children.push(contentNode.id);\n }\n }\n\n condNodeIds.push(condNode.id);\n }\n\n if (condNodeIds.length === 1) return condNodeIds[0];\n return { __multi: true, ids: condNodeIds };\n }\n\n // ── Content Blocks Handler ───────────────────────────\n\n function handleContentBlocks(\n blockIndices: number[],\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n const lines: TreeNodeLine[] = [];\n const jumpTargets: string[] = [];\n\n for (const bi of blockIndices) {\n const block = doc.content[bi];\n if (!block) continue;\n const line = makeNodeLine(block, bi);\n lines.push(line);\n jumpTargets.push(...line.jumpTargets);\n }\n\n if (lines.length === 0) return null;\n\n const startBlock = blockIndices[0];\n const endBlock = blockIndices[blockIndices.length - 1];\n const contentNode = createContentNode(lines, startBlock, endBlock, depth, jumpTargets);\n\n // Continue after last block\n const afterResult = traverse(endBlock + 1, depth);\n if (afterResult) attachChildren(contentNode, afterResult);\n\n return contentNode.id;\n }\n\n function createContentNode(\n lines: TreeNodeLine[],\n startBlock: number,\n endBlock: number,\n depth: number,\n jumpTargets: string[],\n ): TreeNode {\n const node: TreeNode = {\n id: generateNodeId(),\n type: 'content',\n blockRange: { start: startBlock, end: endBlock },\n lines,\n summary: lines[0]?.content.slice(0, 60) + (lines.length > 1 ? ` (+${lines.length - 1} more)` : ''),\n children: [],\n depth,\n };\n\n registerNode(node);\n markSectionRoot(node);\n\n // Handle jump points → goto edges\n if (jumpTargets.length > 0) {\n for (const target of jumpTargets) {\n node.gotoTarget = target;\n node.hasGotoEdge = true;\n tree.gotoEdges.push({ fromNodeId: node.id, toSection: target });\n }\n }\n\n return node;\n }\n\n // ── Traverse Range ───────────────────────────────────\n\n function traverseRange(\n startBlock: number,\n endBlock: number,\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n // Process blocks within [startBlock, endBlock) independently.\n // Does NOT call traverse() or handleContentBlocks() to avoid\n // escaping the range boundary via continuation traversal.\n let firstResult: string | null | { __multi: true; ids: string[] } = null;\n let lastNodeId: string | null = null;\n\n for (let i = startBlock; i < endBlock; i++) {\n const block = doc.content[i];\n if (!block) continue;\n\n // Skip horizontal rules\n if (block.type === 'horizontalRule') continue;\n\n let result: string | null | { __multi: true; ids: string[] } = null;\n\n if (block.type === 'heading') {\n const headingName = block.content\n .filter((n) => n.type !== 'jumpPoint')\n .map((n) => n.type === 'text' ? n.text : '')\n .join('')\n .trim();\n if (!tree.sections[headingName]) {\n tree.sections[headingName] = {\n headingBlockIndex: i,\n rootNodeId: null,\n ancestorConditions: [...currentAncestorConditions],\n };\n tree.statistics.sectionCount++;\n }\n pendingSection = headingName;\n continue;\n }\n\n // Skip jinja tags ({% if %}, {% elif %}, {% else %}, {% endif %})\n if (block.type === 'paragraph') {\n const t = textContent(block).trim();\n if (/^\\{%.*%\\}$/.test(t)) continue;\n }\n\n // Handle nested jinja structures within range\n const jinjaStart = jinjaIfMap.get(i);\n if (jinjaStart && jinjaStart.endifTagBlockIndex < endBlock) {\n result = handleJinjaFork(jinjaStart, i, depth);\n i = jinjaStart.endifTagBlockIndex; // Skip past endif\n } else if (block.type === 'orderedList' || block.type === 'bulletList') {\n // Process list directly without continuation (stay in range)\n result = handleListInRange(block as any, i, depth);\n } else if (block.type === 'paragraph' || block.type === 'blockquote') {\n // Create content node without continuation\n const line = makeNodeLine(block, i);\n const jumpTargets = line.jumpTargets;\n const contentNode = createContentNode([line], i, i, depth, jumpTargets);\n result = contentNode.id;\n }\n\n if (result) {\n const ids = typeof result === 'string' ? [result]\n : result && '__multi' in result ? result.ids\n : [];\n\n if (!firstResult) {\n firstResult = result;\n } else if (lastNodeId) {\n // Chain: attach result to last node\n for (const id of ids) {\n const lastNode = tree.nodes[lastNodeId];\n if (lastNode && !lastNode.hasGotoEdge) {\n lastNode.children.push(id);\n }\n }\n }\n\n // Track last node for chaining\n if (ids.length > 0) {\n lastNodeId = findLeafNodeId(ids[ids.length - 1]);\n }\n }\n }\n\n return firstResult;\n }\n\n /**\n * handleList variant for use inside traverseRange.\n * Does NOT call traverse() for continuation — the caller handles chaining.\n */\n function handleListInRange(\n block: BlockNode & { content: readonly ListItemNode[] },\n blockIndex: number,\n depth: number,\n ): string | null | { __multi: true; ids: string[] } {\n // Check if list items contain conditional branching (\"If ...\")\n const conditionalItems: Array<{ item: ListItemNode; condition: string; index: number }> = [];\n\n for (let i = 0; i < block.content.length; i++) {\n const item = block.content[i];\n const cond = parseConditionalFromItem(item);\n if (cond) {\n conditionalItems.push({ item, condition: cond, index: i });\n }\n }\n\n if (conditionalItems.length >= 2) {\n return handleConditionalBranching(conditionalItems, blockIndex, depth);\n }\n\n // Normal list\n const lines: TreeNodeLine[] = [];\n const jumpTargetsAll: string[] = [];\n\n for (const item of block.content) {\n const line = makeNodeLine(item, blockIndex);\n lines.push(line);\n jumpTargetsAll.push(...line.jumpTargets);\n\n const nestedBranches = findNestedConditionals(item);\n if (nestedBranches.length >= 2) {\n if (lines.length > 0) {\n const contentNode = createContentNode(lines, blockIndex, blockIndex, depth, jumpTargetsAll);\n const forkResult = handleConditionalBranching(\n nestedBranches.map((b, i) => ({ item: b.item, condition: b.condition, index: i })),\n blockIndex,\n depth,\n );\n if (forkResult) attachChildren(contentNode, forkResult);\n return contentNode.id;\n }\n }\n }\n\n if (lines.length === 0) return null;\n\n return createContentNode(lines, blockIndex, blockIndex, depth, jumpTargetsAll).id;\n }\n\n function findLeafNodeId(nodeId: string): string {\n const node = tree.nodes[nodeId];\n if (!node || node.children.length === 0 || node.hasGotoEdge) return nodeId;\n return findLeafNodeId(node.children[node.children.length - 1]);\n }\n\n // ── Attach helpers ───────────────────────────────────\n\n function attachChildren(\n parent: TreeNode,\n result: string | null | { __multi: true; ids: string[] },\n ): void {\n if (!result) return;\n if (typeof result === 'string') {\n parent.children.push(result);\n } else if ('__multi' in result) {\n parent.children.push(...result.ids);\n }\n }\n\n function attachContinuation(\n node: TreeNode,\n result: string | null | { __multi: true; ids: string[] },\n ): void {\n if (!result) return;\n const ids = typeof result === 'string' ? [result]\n : '__multi' in result ? result.ids\n : [];\n if (ids.length === 0) return;\n\n // Attach to all leaf nodes\n attachContinuationToLeaves(node, ids);\n }\n\n function attachContinuationToLeaves(node: TreeNode, continuationIds: string[]): void {\n if (node.children.length === 0) {\n if (node.type !== 'end' && !node.hasGotoEdge) {\n node.children.push(...continuationIds);\n }\n } else {\n for (const childId of node.children) {\n const child = tree.nodes[childId];\n if (child) attachContinuationToLeaves(child, continuationIds);\n }\n }\n }\n\n // ── Mark end nodes ───────────────────────────────────\n\n function markEndNodes(): void {\n for (const node of Object.values(tree.nodes)) {\n if (node.type === 'content' && node.children.length === 0 && !node.hasGotoEdge) {\n node.type = 'end';\n }\n }\n }\n\n // ── Main execution ───────────────────────────────────\n\n const result = traverse(0, 0);\n markEndNodes();\n\n if (result) {\n if (typeof result === 'string') {\n tree.rootNodeId = result;\n } else if ('__multi' in result) {\n // Create container\n const container: TreeNode = {\n id: generateNodeId(),\n type: 'section_entry',\n blockRange: { start: 0, end: 0 },\n lines: [],\n summary: 'Root',\n children: result.ids,\n depth: 0,\n isContainer: true,\n };\n registerNode(container);\n tree.rootNodeId = container.id;\n }\n }\n\n // Resolve section roots for sections that weren't visited\n for (const [name, section] of Object.entries(tree.sections)) {\n if (section.rootNodeId) continue;\n\n visitedStates.clear();\n pendingSection = name;\n\n const startBlock = section.headingBlockIndex + 1;\n if (startBlock < doc.content.length) {\n const sectionResult = traverse(startBlock, 0);\n if (sectionResult) {\n if (typeof sectionResult === 'string') {\n section.rootNodeId = sectionResult;\n } else if ('__multi' in sectionResult) {\n const container: TreeNode = {\n id: generateNodeId(),\n type: 'section_entry',\n blockRange: { start: startBlock, end: startBlock },\n lines: [],\n summary: `Section: ${name}`,\n children: sectionResult.ids,\n depth: 0,\n isContainer: true,\n };\n registerNode(container);\n section.rootNodeId = container.id;\n }\n }\n }\n }\n\n markEndNodes();\n\n // Count paths\n tree.statistics.totalPaths = countPaths(tree);\n\n return tree;\n}\n\n// ── Path Counting ────────────────────────────────────────\n\nfunction countPathsFromNode(tree: DecisionTree, nodeId: string, visited: Set<string>): number {\n if (visited.has(nodeId)) return 0;\n visited.add(nodeId);\n\n const node = tree.nodes[nodeId];\n if (!node) return 0;\n if (node.children.length === 0) {\n visited.delete(nodeId);\n return 1;\n }\n\n let total = 0;\n for (const childId of node.children) {\n total += countPathsFromNode(tree, childId, visited);\n }\n visited.delete(nodeId);\n return total;\n}\n\nfunction countPaths(tree: DecisionTree): number {\n if (!tree.rootNodeId) return 0;\n return countPathsFromNode(tree, tree.rootNodeId, new Set());\n}\n\n// ── Path Enumeration ─────────────────────────────────────\n\nimport type { TreePath, BranchDecision } from './types';\n\nexport function enumeratePaths(\n tree: DecisionTree,\n options: { startSection?: string; followGotoEdges?: boolean } = {},\n): TreePath[] {\n const { startSection, followGotoEdges = true } = options;\n const paths: TreePath[] = [];\n const visitedInPath = new Set<string>();\n\n function dfs(\n nodeId: string,\n currentPath: string[],\n sectionSeq: string[],\n decisions: BranchDecision[],\n ctxReqs: Record<string, string>,\n ): void {\n const node = tree.nodes[nodeId];\n if (!node) return;\n\n if (visitedInPath.has(nodeId)) {\n paths.push({\n nodeIds: [...currentPath],\n sectionSequence: [...sectionSeq],\n branchDecisions: [...decisions],\n contextRequirements: { ...ctxReqs },\n terminationReason: 'cycle',\n cycleNodeId: nodeId,\n });\n return;\n }\n\n visitedInPath.add(nodeId);\n const newPath = [...currentPath, nodeId];\n let newSectionSeq = [...sectionSeq];\n let newDecisions = [...decisions];\n let newCtxReqs = { ...ctxReqs };\n\n // Track section membership\n for (const [sectionName, sectionInfo] of Object.entries(tree.sections)) {\n if (sectionInfo.rootNodeId === nodeId && !newSectionSeq.includes(sectionName)) {\n newSectionSeq.push(sectionName);\n }\n }\n\n // Record branch decisions\n if (node.type === 'jinja_condition' || node.type === 'conditional') {\n const decision: BranchDecision = {\n nodeId,\n branchType: node.type,\n condition: node.conditionText || node.summary,\n blockIndex: node.blockRange.start,\n };\n if (node.isJinja && node.conditionText) {\n const reqs = extractContextRequirements(node.conditionText);\n newCtxReqs = { ...newCtxReqs, ...reqs };\n decision.contextRequirements = reqs;\n }\n newDecisions.push(decision);\n }\n\n // Leaf node\n if (node.children.length === 0 || node.type === 'end') {\n let terminationReason: TreePath['terminationReason'] = node.type === 'end' ? 'end' : 'leaf';\n\n if (node.hasGotoEdge && node.gotoTarget) {\n terminationReason = 'goto';\n\n if (followGotoEdges && tree.sections[node.gotoTarget]) {\n const targetRootId = tree.sections[node.gotoTarget].rootNodeId;\n if (targetRootId && !visitedInPath.has(targetRootId)) {\n visitedInPath.delete(nodeId);\n dfs(targetRootId, newPath, [...newSectionSeq, node.gotoTarget], newDecisions, newCtxReqs);\n visitedInPath.add(nodeId);\n visitedInPath.delete(nodeId);\n return;\n }\n }\n\n paths.push({\n nodeIds: newPath,\n sectionSequence: newSectionSeq,\n branchDecisions: newDecisions,\n contextRequirements: newCtxReqs,\n terminationReason,\n gotoTarget: node.gotoTarget,\n });\n } else {\n paths.push({\n nodeIds: newPath,\n sectionSequence: newSectionSeq,\n branchDecisions: newDecisions,\n contextRequirements: newCtxReqs,\n terminationReason,\n });\n }\n\n visitedInPath.delete(nodeId);\n return;\n }\n\n // Continue to children\n for (const childId of node.children) {\n dfs(childId, newPath, newSectionSeq, newDecisions, newCtxReqs);\n }\n\n visitedInPath.delete(nodeId);\n }\n\n // Determine start\n let startNodeId = tree.rootNodeId;\n if (startSection && tree.sections[startSection]) {\n startNodeId = tree.sections[startSection].rootNodeId;\n }\n\n if (!startNodeId) return paths;\n\n const startSectionName = startSection\n || Object.entries(tree.sections).find(([, s]) => s.rootNodeId === tree.rootNodeId)?.[0];\n\n dfs(startNodeId, [], startSectionName ? [startSectionName] : [], [], {});\n\n return paths;\n}\n\nexport interface EnumeratePathsIterOptions {\n startSection?: string;\n followGotoEdges?: boolean;\n /** Stop after yielding this many paths (memory guard). */\n maxPaths?: number;\n /** Skip paths deeper than this node count. */\n maxDepth?: number;\n}\n\ninterface DfsFrame {\n nodeId: string;\n currentPath: string[];\n sectionSeq: string[];\n decisions: BranchDecision[];\n ctxReqs: Record<string, string>;\n childIndex: number;\n}\n\n/**\n * Generator-based streaming API for path enumeration.\n * Yields one TreePath at a time without materializing the full list.\n * Uses an explicit stack instead of recursion to avoid call-stack overflow\n * on deep trees.\n */\nexport function* enumeratePathsIter(\n tree: DecisionTree,\n options: EnumeratePathsIterOptions = {},\n): IterableIterator<TreePath> {\n const { startSection, followGotoEdges = true, maxPaths = Infinity, maxDepth = Infinity } = options;\n\n let startNodeId = tree.rootNodeId;\n if (startSection && tree.sections[startSection]) {\n startNodeId = tree.sections[startSection].rootNodeId;\n }\n if (!startNodeId) return;\n\n const startSectionName = startSection\n || Object.entries(tree.sections).find(([, s]) => s.rootNodeId === tree.rootNodeId)?.[0];\n\n const visitedInPath = new Set<string>();\n let yieldedCount = 0;\n\n // Iterative DFS using an explicit stack\n const stack: DfsFrame[] = [];\n\n function pushFrame(\n nodeId: string,\n currentPath: string[],\n sectionSeq: string[],\n decisions: BranchDecision[],\n ctxReqs: Record<string, string>,\n ): void {\n stack.push({ nodeId, currentPath, sectionSeq, decisions, ctxReqs, childIndex: 0 });\n }\n\n pushFrame(startNodeId, [], startSectionName ? [startSectionName] : [], [], {});\n\n outer: while (stack.length > 0) {\n if (yieldedCount >= maxPaths) break;\n\n const frame = stack[stack.length - 1];\n const { nodeId } = frame;\n const node = tree.nodes[nodeId];\n\n if (!node) { stack.pop(); continue; }\n\n // First visit to this frame\n if (frame.childIndex === 0) {\n if (visitedInPath.has(nodeId)) {\n // Cycle detected — emit and unwind\n yield {\n nodeIds: [...frame.currentPath],\n sectionSequence: [...frame.sectionSeq],\n branchDecisions: [...frame.decisions],\n contextRequirements: { ...frame.ctxReqs },\n terminationReason: 'cycle',\n cycleNodeId: nodeId,\n };\n yieldedCount++;\n stack.pop();\n continue;\n }\n\n if (frame.currentPath.length >= maxDepth) {\n stack.pop();\n continue;\n }\n\n visitedInPath.add(nodeId);\n frame.currentPath = [...frame.currentPath, nodeId];\n\n // Track section membership\n for (const [sectionName, sectionInfo] of Object.entries(tree.sections)) {\n if (sectionInfo.rootNodeId === nodeId && !frame.sectionSeq.includes(sectionName)) {\n frame.sectionSeq = [...frame.sectionSeq, sectionName];\n }\n }\n\n // Record branch decisions\n if (node.type === 'jinja_condition' || node.type === 'conditional') {\n const decision: BranchDecision = {\n nodeId,\n branchType: node.type,\n condition: node.conditionText || node.summary,\n blockIndex: node.blockRange.start,\n };\n if (node.isJinja && node.conditionText) {\n const reqs = extractContextRequirements(node.conditionText);\n frame.ctxReqs = { ...frame.ctxReqs, ...reqs };\n decision.contextRequirements = reqs;\n }\n frame.decisions = [...frame.decisions, decision];\n }\n\n // Leaf / end node\n if (node.children.length === 0 || node.type === 'end') {\n let terminationReason: TreePath['terminationReason'] = node.type === 'end' ? 'end' : 'leaf';\n\n if (node.hasGotoEdge && node.gotoTarget) {\n terminationReason = 'goto';\n\n if (followGotoEdges && tree.sections[node.gotoTarget]) {\n const targetRootId = tree.sections[node.gotoTarget].rootNodeId;\n if (targetRootId && !visitedInPath.has(targetRootId)) {\n visitedInPath.delete(nodeId);\n stack.pop();\n pushFrame(\n targetRootId,\n frame.currentPath,\n [...frame.sectionSeq, node.gotoTarget],\n frame.decisions,\n frame.ctxReqs,\n );\n continue outer;\n }\n }\n\n yield {\n nodeIds: frame.currentPath,\n sectionSequence: frame.sectionSeq,\n branchDecisions: frame.decisions,\n contextRequirements: frame.ctxReqs,\n terminationReason,\n gotoTarget: node.gotoTarget,\n };\n } else {\n yield {\n nodeIds: frame.currentPath,\n sectionSequence: frame.sectionSeq,\n branchDecisions: frame.decisions,\n contextRequirements: frame.ctxReqs,\n terminationReason,\n };\n }\n\n yieldedCount++;\n visitedInPath.delete(nodeId);\n stack.pop();\n continue;\n }\n }\n\n // Process next child\n if (frame.childIndex < node.children.length) {\n const childId = node.children[frame.childIndex];\n frame.childIndex++;\n pushFrame(childId, frame.currentPath, frame.sectionSeq, frame.decisions, frame.ctxReqs);\n } else {\n // All children processed — unwind\n visitedInPath.delete(nodeId);\n stack.pop();\n }\n }\n}\n\nexport function enumeratePathsBySection(tree: DecisionTree): Record<string, TreePath[]> {\n const result: Record<string, TreePath[]> = {};\n for (const sectionName of Object.keys(tree.sections)) {\n if (!tree.sections[sectionName].rootNodeId) continue;\n result[sectionName] = enumeratePaths(tree, { startSection: sectionName, followGotoEdges: false });\n }\n return result;\n}\n\n// ── Goto Entry Resolution ────────────────────────────────\n\nimport type { VariableValue } from '../jinja/types';\nimport { evaluateCondition } from '../jinja/evaluator';\n\nexport interface GotoEntryResolution {\n entryNodeIds: string[];\n targetSection: string;\n resolved: boolean;\n}\n\nexport function resolveGotoEntryPath(\n tree: DecisionTree,\n sectionName: string,\n context: Map<string, VariableValue>,\n): GotoEntryResolution | null {\n const section = tree.sections[sectionName];\n if (!section?.rootNodeId) return null;\n\n const AGENT_ACTIONS: Set<string> = new Set(['agent_speech', 'mixed_with_speech', 'tool_call_only']);\n const entryNodeIds: string[] = [];\n const visited = new Set<string>();\n let currentId: string | null = section.rootNodeId;\n\n while (currentId && !visited.has(currentId)) {\n visited.add(currentId);\n const node: TreeNode | undefined = tree.nodes[currentId];\n if (!node) break;\n\n entryNodeIds.push(currentId);\n\n // Found agent action → resolved\n if (node.classification && AGENT_ACTIONS.has(node.classification)) {\n return { entryNodeIds, targetSection: sectionName, resolved: true };\n }\n\n // Container / section_entry → pick matching jinja branch\n if (node.isContainer || node.type === 'section_entry') {\n const matchedChild = findMatchingJinjaBranch(tree, node, context);\n if (matchedChild) {\n currentId = matchedChild;\n continue;\n }\n if (node.children.length > 0) {\n currentId = node.children[0];\n continue;\n }\n break;\n }\n\n // jinja_condition → evaluate and pick child\n if (node.type === 'jinja_condition') {\n if (node.children.length > 0) {\n currentId = node.children[0];\n continue;\n }\n break;\n }\n\n // Content node → resolved\n if (node.type === 'content' || node.type === 'end') {\n return { entryNodeIds, targetSection: sectionName, resolved: true };\n }\n\n // Default: descend\n if (node.children.length > 0) {\n currentId = node.children[0];\n continue;\n }\n break;\n }\n\n return { entryNodeIds: [], targetSection: sectionName, resolved: false };\n}\n\nfunction findMatchingJinjaBranch(\n tree: DecisionTree,\n containerNode: TreeNode,\n context: Map<string, VariableValue>,\n): string | null {\n let elseChildId: string | null = null;\n\n for (const childId of containerNode.children) {\n const child = tree.nodes[childId];\n if (!child) continue;\n\n if (child.branchType === 'else') {\n elseChildId = childId;\n continue;\n }\n\n if (child.isJinja && child.conditionText) {\n // Strip {% if/elif ... %} wrapper\n let expr = child.conditionText\n .replace(/\\{%[-\\s]*(if|elif)\\s+/, '')\n .replace(/\\s*[-\\s]*%\\}/, '')\n .trim();\n\n if (expr) {\n const result = evaluateCondition(expr, context);\n if (result === true) return childId;\n }\n }\n }\n\n return elseChildId;\n}\n","import type { BlockNode, DocumentNode } from './ast/types';\nimport { parseMarkdown } from './markdown/parser';\nimport { fromProseMirrorJSON } from './compat/prosemirror';\nimport { validate } from './schema/schema';\n\ntype LogicV2 = {\n version: 2;\n instruction: string;\n editor_data?: string;\n};\n\nconst EMPTY_DOC: DocumentNode = { type: 'doc', content: [{ type: 'paragraph', content: [] }] };\n\nconst JINJA_BLOCK_TAG_RE = /^\\s*\\{%\\s*(if|elif|else|endif)\\s/m;\n\n/** Returns true when the instruction markdown contains block-level Jinja tags\n * but the AST has no jinjaIfBlock nodes (legacy data saved before jinja support). */\nfunction needsJinjaReparse(doc: DocumentNode, instruction: string | undefined): boolean {\n if (!instruction || !JINJA_BLOCK_TAG_RE.test(instruction)) return false;\n\n function hasJinjaBlock(nodes: readonly BlockNode[]): boolean {\n for (const node of nodes) {\n if ((node as { type: string }).type === 'jinjaIfBlock') return true;\n if ('content' in node && Array.isArray((node as Record<string, unknown>).content)) {\n if (hasJinjaBlock((node as Record<string, unknown>).content as BlockNode[])) return true;\n }\n }\n return false;\n }\n\n return !hasJinjaBlock(doc.content);\n}\n\nexport class ActionbookConversionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ActionbookConversionError';\n }\n}\n\nexport function actionbookToAST(manual: { logic: LogicV2 }): DocumentNode {\n const v2 = manual.logic;\n\n if (v2.editor_data) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(v2.editor_data);\n } catch {\n throw new ActionbookConversionError('Invalid editor_data JSON');\n }\n\n if (parsed === null || typeof parsed !== 'object') {\n throw new ActionbookConversionError('editor_data must be a non-null object');\n }\n\n const obj = parsed as Record<string, unknown>;\n\n if (obj.version === 3) {\n const ast = obj.ast;\n if (ast === null || typeof ast !== 'object' || (ast as Record<string, unknown>).type !== 'doc') {\n throw new ActionbookConversionError('v3 editor_data requires ast field with type \"doc\"');\n }\n const doc = ast as DocumentNode;\n const errors = validate(doc);\n if (errors.length > 0) {\n throw new ActionbookConversionError(`Schema validation failed: ${errors[0].message}`);\n }\n // Re-parse from markdown if legacy AST lacks jinja block nodes\n if (v2.instruction && needsJinjaReparse(doc, v2.instruction)) {\n return parseMarkdown(v2.instruction, { jinjaNodes: true });\n }\n return doc;\n }\n\n const doc = fromProseMirrorJSON(obj as { type?: string });\n const errors = validate(doc);\n if (errors.length > 0) {\n throw new ActionbookConversionError(`Schema validation after PM conversion failed: ${errors[0].message}`);\n }\n // Re-parse from markdown if legacy PM data lacks jinja block nodes\n if (v2.instruction && needsJinjaReparse(doc, v2.instruction)) {\n return parseMarkdown(v2.instruction, { jinjaNodes: true });\n }\n return doc;\n }\n\n if (v2.instruction) {\n return parseMarkdown(v2.instruction, { jinjaNodes: true });\n }\n\n return EMPTY_DOC;\n}\n"],"mappings":"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","names":["doc","code","code","constructs","ok","code","markdownSpace","ok","code","markdownLineEndingOrSpace","ok","code","markdownLineEndingOrSpace","strikethrough","text","ok","code","markdownLineEnding","markdownLineEndingOrSpace","markdownSpace","ok","code","markdownLineEnding","markdownSpace","markdownLineEndingOrSpace","map","table","markdownLineEnding","markdownLineEndingOrSpace","markdownSpace","ok","code","exit","exit","table","row","sizes","columnIndex","code","exit","defaultHandlers","text","text","MAX_DEPTH","ALLOWED_URL_PROTOCOLS","doc","MAX_DEPTH","text","MAX_DEPTH","MAX_DEPTH","defaultHandlers","defaultHandlers","doc","doc","doc","MAX_DEPTH","ALLOWED_URL_PROTOCOLS","text","textContent","blocks","doc","errors","doc","children","text","doc","KEYWORDS","KEYWORDS","text","doc","doc","doc","doc","m","doc","doc","doc","heading","doc","doc","MAX_DEPTH","text","doc","t","doc","contentNode","afterResult","result","doc","errors"]}
|