{"version":3,"sources":["/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-3NYCJYY3.cjs","../../src/services/workflow-table/definition-builder.ts"],"names":["target"],"mappings":"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","file":"/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-3NYCJYY3.cjs","sourcesContent":[null,"import {\n\tlooksPercentLike,\n\ttype MatrixDefinition,\n\ttype ParsedMatrixFormula,\n\ttype ParsedRecordFormula,\n\ttype RecordDefinition,\n\ttype RecordExpressionOperand,\n} from \"@/services/workflow-table/shared.js\";\nimport type { WorkflowTableBlock } from \"@/types/memory.js\";\n\nexport class WorkflowTableDefinitionBuilder {\n\tisDeterministicTableBlock(block: WorkflowTableBlock): boolean {\n\t\tif (block.layout === \"matrix\") {\n\t\t\treturn Array.isArray(block.rows) && block.rows.length > 0;\n\t\t}\n\n\t\treturn block.layout === \"records\";\n\t}\n\n\tbuildExtractionPrompt(\n\t\tblock: WorkflowTableBlock,\n\t\tresultsText: string,\n\t): string {\n\t\tif (!this.isDeterministicTableBlock(block)) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Workflow table blocks must use the simplified deterministic DSL.\",\n\t\t\t);\n\t\t}\n\n\t\treturn block.layout === \"matrix\"\n\t\t\t? this.buildMatrixExtractionPrompt(block, resultsText)\n\t\t\t: this.buildRecordExtractionPrompt(block, resultsText);\n\t}\n\n\tbuildMatrixDefinition(block: WorkflowTableBlock): MatrixDefinition {\n\t\tif (block.layout !== \"matrix\" || !block.rows?.length) {\n\t\t\tthrow new Error(\"Matrix table block requires rows.\");\n\t\t}\n\n\t\tconst rows = [...block.rows];\n\t\tconst columns = [...block.columns];\n\t\tconst hiddenRows = this.resolveHiddenItems(\n\t\t\tblock.hiddenRows,\n\t\t\trows,\n\t\t\t\"row\",\n\t\t\tblock.blockId,\n\t\t);\n\t\tconst hiddenColumns = this.resolveHiddenItems(\n\t\t\tblock.hiddenColumns,\n\t\t\tcolumns,\n\t\t\t\"column\",\n\t\t\tblock.blockId,\n\t\t);\n\t\tconst formulas = (block.formulas || []).map((formula) =>\n\t\t\tthis.parseMatrixFormula(formula, rows, columns),\n\t\t);\n\t\tconst computedRowTargets = new Set(\n\t\t\tformulas\n\t\t\t\t.filter(\n\t\t\t\t\t(formula) =>\n\t\t\t\t\t\t(formula.type === \"row_sum\" ||\n\t\t\t\t\t\t\tformula.type === \"row_share\" ||\n\t\t\t\t\t\t\tformula.type === \"row_ratio\" ||\n\t\t\t\t\t\t\tformula.type === \"row_delta\" ||\n\t\t\t\t\t\t\tformula.type === \"row_rate\" ||\n\t\t\t\t\t\t\tformula.type === \"row_growth\") &&\n\t\t\t\t\t\trows.includes(formula.target),\n\t\t\t\t)\n\t\t\t\t.map((formula) => formula.target),\n\t\t);\n\t\tconst computedColumnTargets = new Set(\n\t\t\tformulas\n\t\t\t\t.filter(\n\t\t\t\t\t(formula) =>\n\t\t\t\t\t\t(formula.type === \"col_sum\" ||\n\t\t\t\t\t\t\tformula.type === \"col_share\" ||\n\t\t\t\t\t\t\tformula.type === \"col_ratio\" ||\n\t\t\t\t\t\t\tformula.type === \"col_delta\" ||\n\t\t\t\t\t\t\tformula.type === \"col_rate\" ||\n\t\t\t\t\t\t\tformula.type === \"col_growth\") &&\n\t\t\t\t\t\tcolumns.includes(formula.target),\n\t\t\t\t)\n\t\t\t\t.map((formula) => formula.target),\n\t\t);\n\t\tconst comparisonRowTargets = new Set(\n\t\t\tformulas\n\t\t\t\t.filter(\n\t\t\t\t\t(formula) =>\n\t\t\t\t\t\t(formula.type === \"row_delta\" ||\n\t\t\t\t\t\t\tformula.type === \"row_rate\" ||\n\t\t\t\t\t\t\tformula.type === \"row_growth\") &&\n\t\t\t\t\t\trows.includes(formula.target),\n\t\t\t\t)\n\t\t\t\t.map((formula) => formula.target),\n\t\t);\n\t\tconst comparisonColumnTargets = new Set(\n\t\t\tformulas\n\t\t\t\t.filter(\n\t\t\t\t\t(formula) =>\n\t\t\t\t\t\t(formula.type === \"col_delta\" ||\n\t\t\t\t\t\t\tformula.type === \"col_rate\" ||\n\t\t\t\t\t\t\tformula.type === \"col_growth\") &&\n\t\t\t\t\t\tcolumns.includes(formula.target),\n\t\t\t\t)\n\t\t\t\t.map((formula) => formula.target),\n\t\t);\n\t\tconst percentRows = new Set(\n\t\t\trows\n\t\t\t\t.filter(looksPercentLike)\n\t\t\t\t.concat(\n\t\t\t\t\tformulas\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(formula) =>\n\t\t\t\t\t\t\t\tformula.type === \"row_share\" ||\n\t\t\t\t\t\t\t\tformula.type === \"row_rate\" ||\n\t\t\t\t\t\t\t\tformula.type === \"row_growth\",\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((formula) => formula.target),\n\t\t\t\t),\n\t\t);\n\t\tconst percentColumns = new Set(\n\t\t\tcolumns\n\t\t\t\t.filter(looksPercentLike)\n\t\t\t\t.concat(\n\t\t\t\t\tformulas\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(formula) =>\n\t\t\t\t\t\t\t\tformula.type === \"col_share\" ||\n\t\t\t\t\t\t\t\tformula.type === \"col_rate\" ||\n\t\t\t\t\t\t\t\tformula.type === \"col_growth\",\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((formula) => formula.target),\n\t\t\t\t),\n\t\t);\n\n\t\treturn {\n\t\t\tlayout: \"matrix\",\n\t\t\trowHeader: block.rowHeader || \"구분\",\n\t\t\trows,\n\t\t\tvisibleRows: rows.filter((row) => !hiddenRows.has(row)),\n\t\t\tcolumns,\n\t\t\tvisibleColumns: columns.filter((column) => !hiddenColumns.has(column)),\n\t\t\tcolumnFormats: block.columnFormats || {},\n\t\t\trowFormats: block.rowFormats || {},\n\t\t\tsourceRows: rows.filter((row) => !computedRowTargets.has(row)),\n\t\t\tsourceColumns: columns.filter(\n\t\t\t\t(column) => !computedColumnTargets.has(column),\n\t\t\t),\n\t\t\tcomputedRowTargets,\n\t\t\tcomputedColumnTargets,\n\t\t\tcomparisonRowTargets,\n\t\t\tcomparisonColumnTargets,\n\t\t\tpercentRows,\n\t\t\tpercentColumns,\n\t\t\tformulas,\n\t\t};\n\t}\n\n\tbuildRecordDefinition(block: WorkflowTableBlock): RecordDefinition {\n\t\tif (block.layout !== \"records\") {\n\t\t\tthrow new Error(\"Record table block requires layout: records.\");\n\t\t}\n\n\t\tconst columns = [...block.columns];\n\t\tconst hiddenColumns = this.resolveHiddenItems(\n\t\t\tblock.hiddenColumns,\n\t\t\tcolumns,\n\t\t\t\"column\",\n\t\t\tblock.blockId,\n\t\t);\n\t\tif (block.hiddenRows?.length) {\n\t\t\tthrow new Error(\n\t\t\t\t`Record table block \"${block.blockId}\" does not support hiddenRows because record rows are extracted data.`,\n\t\t\t);\n\t\t}\n\t\tif (block.rowFormats && Object.keys(block.rowFormats).length) {\n\t\t\tthrow new Error(\n\t\t\t\t`Record table block \"${block.blockId}\" does not support rowFormats because record rows are extracted data.`,\n\t\t\t);\n\t\t}\n\t\tconst formulas = (block.formulas || []).map((formula) =>\n\t\t\tthis.parseRecordFormula(formula, columns),\n\t\t);\n\t\tconst totalFormulas = formulas.filter(\n\t\t\t(formula): formula is Extract<ParsedRecordFormula, { type: \"total\" }> =>\n\t\t\t\tformula.type === \"total\",\n\t\t);\n\t\tif (totalFormulas.length > 1) {\n\t\t\tthrow new Error(\"Record table block supports only one @total formula.\");\n\t\t}\n\n\t\tconst computedColumns = new Set(\n\t\t\tformulas\n\t\t\t\t.filter(\n\t\t\t\t\t(\n\t\t\t\t\t\tformula,\n\t\t\t\t\t): formula is Exclude<ParsedRecordFormula, { type: \"total\" }> =>\n\t\t\t\t\t\tformula.type !== \"total\",\n\t\t\t\t)\n\t\t\t\t.map((formula) => formula.target),\n\t\t);\n\t\tconst percentColumns = new Set(\n\t\t\tcolumns\n\t\t\t\t.filter(looksPercentLike)\n\t\t\t\t.concat(\n\t\t\t\t\tformulas\n\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tformula,\n\t\t\t\t\t\t\t): formula is Exclude<ParsedRecordFormula, { type: \"total\" }> =>\n\t\t\t\t\t\t\t\tformula.type !== \"total\" && looksPercentLike(formula.target),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.map((formula) => formula.target),\n\t\t\t\t),\n\t\t);\n\n\t\treturn {\n\t\t\tlayout: \"records\",\n\t\t\tcolumns,\n\t\t\tvisibleColumns: columns.filter((column) => !hiddenColumns.has(column)),\n\t\t\tcolumnFormats: block.columnFormats || {},\n\t\t\tsourceColumns: columns.filter((column) => !computedColumns.has(column)),\n\t\t\tcomputedColumns,\n\t\t\tpercentColumns,\n\t\t\tformulas,\n\t\t\ttotalFormula: totalFormulas[0],\n\t\t};\n\t}\n\n\tprivate resolveHiddenItems(\n\t\thiddenItems: string[] | undefined,\n\t\tallowedItems: string[],\n\t\titemKind: \"column\" | \"row\",\n\t\tblockId: string,\n\t): Set<string> {\n\t\tconst hiddenSet = new Set(hiddenItems || []);\n\t\tfor (const item of hiddenSet) {\n\t\t\tif (!allowedItems.includes(item)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Table block \"${blockId}\" hidden ${itemKind} \"${item}\" must be listed in ${itemKind === \"row\" ? \"rows\" : \"columns\"}.`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn hiddenSet;\n\t}\n\n\tprivate buildMatrixExtractionPrompt(\n\t\tblock: WorkflowTableBlock,\n\t\tresultsText: string,\n\t): string {\n\t\tconst definition = this.buildMatrixDefinition(block);\n\t\tconst jsonShape = JSON.stringify(\n\t\t\tObject.fromEntries(\n\t\t\t\tdefinition.sourceRows.map((row) => [\n\t\t\t\t\trow,\n\t\t\t\t\tObject.fromEntries(\n\t\t\t\t\t\tdefinition.sourceColumns.map((column) => [column, \"number | null\"]),\n\t\t\t\t\t),\n\t\t\t\t]),\n\t\t\t),\n\t\t\tnull,\n\t\t\t2,\n\t\t);\n\n\t\treturn `Task results:\n${resultsText}\n\nExtract only the source matrix values for this workflow table.\nReturn only a valid JSON object with this exact row and column structure.\nUse numbers when values are available.\nUse null when a value is missing.\nDo not calculate formula rows or formula columns.\nDo not include markdown fences or prose.\n\nTable title: ${block.title || \"\"}\n${block.prompt ? `Extra extraction instructions: ${block.prompt}\\n` : \"\"}Row header: ${definition.rowHeader}\nRows to extract:\n${definition.sourceRows.map((row) => `- ${row}`).join(\"\\n\")}\n\nColumns to extract:\n${definition.sourceColumns.map((column) => `- ${column}`).join(\"\\n\")}\n\nFormulas for later calculation:\n${(block.formulas || []).map((formula) => `- ${formula}`).join(\"\\n\") || \"- none\"}\n\nExpected JSON shape:\n${jsonShape}`;\n\t}\n\n\tprivate buildRecordExtractionPrompt(\n\t\tblock: WorkflowTableBlock,\n\t\tresultsText: string,\n\t): string {\n\t\tconst definition = this.buildRecordDefinition(block);\n\t\tconst formatGuidance = definition.sourceColumns\n\t\t\t.map((column) => {\n\t\t\t\tconst format = definition.columnFormats[column];\n\t\t\t\tif (format?.kind === \"text\") {\n\t\t\t\t\treturn `- ${column}: treat as text/identifier. Preserve the source text exactly and never add digit grouping commas or numeric formatting.`;\n\t\t\t\t}\n\t\t\t\tif (format?.kind === \"currency\") {\n\t\t\t\t\treturn `- ${column}: return a raw number or null, without currency symbols or display formatting.`;\n\t\t\t\t}\n\t\t\t\tif (format?.kind === \"percent\") {\n\t\t\t\t\treturn `- ${column}: return a raw numeric value or null. Do not append the % symbol.`;\n\t\t\t\t}\n\t\t\t\treturn `- ${column}: return a raw ${format?.kind === \"number\" ? \"number\" : \"string, number,\"} or null without display formatting.`;\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\tconst jsonShape = JSON.stringify(\n\t\t\t[\n\t\t\t\tObject.fromEntries(\n\t\t\t\t\tdefinition.sourceColumns.map((column) => [\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\t\"string | number | null\",\n\t\t\t\t\t]),\n\t\t\t\t),\n\t\t\t],\n\t\t\tnull,\n\t\t\t2,\n\t\t);\n\n\t\treturn `Task results:\n${resultsText}\n\nExtract only the source rows for this workflow table.\nReturn only a valid JSON array of objects.\nUse string, number, or null values.\nDo not calculate computed columns.\nDo not add total rows.\nDo not apply display formatting such as digit grouping commas, currency symbols, unit suffixes, or percent signs unless the source text itself already contains them and the column is plain text.\nDo not include markdown fences or prose.\n\nTable title: ${block.title || \"\"}\n${block.prompt ? `Extra extraction instructions: ${block.prompt}\\n` : \"\"}Columns to extract:\n${definition.sourceColumns.map((column) => `- ${column}`).join(\"\\n\")}\n\nColumn format guidance:\n${formatGuidance}\n\nFormulas for later calculation:\n${(block.formulas || []).map((formula) => `- ${formula}`).join(\"\\n\") || \"- none\"}\n\nExpected JSON shape:\n${jsonShape}`;\n\t}\n\n\tprivate parseMatrixFormula(\n\t\tformula: string,\n\t\trows: string[],\n\t\tcolumns: string[],\n\t): ParsedMatrixFormula {\n\t\tconst separatorIndex = formula.indexOf(\"=\");\n\t\tif (separatorIndex <= 0) {\n\t\t\tthrow new Error(`Invalid table formula: ${formula}`);\n\t\t}\n\n\t\tconst target = formula.slice(0, separatorIndex).trim();\n\t\tconst targetIsRow = rows.includes(target);\n\t\tconst targetIsColumn = columns.includes(target);\n\t\tif (!targetIsRow && !targetIsColumn) {\n\t\t\tthrow new Error(\n\t\t\t\t`Table formula target \"${target}\" must be listed in rows or columns.`,\n\t\t\t);\n\t\t}\n\n\t\tconst expression = formula.slice(separatorIndex + 1).trim();\n\t\tconst match = expression.match(/^([a-zA-Z_]+)\\((.*)\\)$/);\n\t\tif (!match) {\n\t\t\tthrow new Error(`Unsupported matrix table formula: ${formula}`);\n\t\t}\n\n\t\tconst fn = match[1];\n\t\tconst args = match[2]\n\t\t\t.split(\",\")\n\t\t\t.map((arg) => arg.trim())\n\t\t\t.filter(Boolean);\n\n\t\tif (fn === \"sum\" || fn === \"col_sum\") {\n\t\t\tif (!targetIsColumn) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Matrix formula \"${formula}\" uses ${fn}, which requires a column target.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn { raw: formula, target, type: \"col_sum\", args };\n\t\t}\n\n\t\tif (fn === \"row_sum\") {\n\t\t\tif (!targetIsRow) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Matrix formula \"${formula}\" uses ${fn}, which requires a row target.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tfor (const arg of args) {\n\t\t\t\tif (!rows.includes(arg)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Matrix formula \"${formula}\" references unknown row \"${arg}\".`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn { raw: formula, target, type: \"row_sum\", args };\n\t\t}\n\n\t\tif (args.length !== 2) {\n\t\t\tthrow new Error(`Unsupported matrix table formula: ${formula}`);\n\t\t}\n\n\t\tconst prefixedTypes: Record<string, ParsedMatrixFormula[\"type\"]> = {\n\t\t\trow_share: \"row_share\",\n\t\t\trow_ratio: \"row_ratio\",\n\t\t\trow_delta: \"row_delta\",\n\t\t\trow_rate: \"row_rate\",\n\t\t\trow_growth: \"row_growth\",\n\t\t\tcol_share: \"col_share\",\n\t\t\tcol_ratio: \"col_ratio\",\n\t\t\tcol_delta: \"col_delta\",\n\t\t\tcol_rate: \"col_rate\",\n\t\t\tcol_growth: \"col_growth\",\n\t\t};\n\t\tif (prefixedTypes[fn]) {\n\t\t\tconst mappedType = prefixedTypes[fn];\n\t\t\tif (mappedType.startsWith(\"row_\") && !targetIsRow) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Matrix formula \"${formula}\" uses ${fn}, which requires a row target.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (mappedType.startsWith(\"col_\") && !targetIsColumn) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Matrix formula \"${formula}\" uses ${fn}, which requires a column target.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\traw: formula,\n\t\t\t\ttarget,\n\t\t\t\ttype: mappedType,\n\t\t\t\targs: [args[0], args[1]],\n\t\t\t};\n\t\t}\n\n\t\tswitch (fn) {\n\t\t\tcase \"share\":\n\t\t\tcase \"ratio\":\n\t\t\tcase \"delta\":\n\t\t\tcase \"rate\":\n\t\t\tcase \"growth\":\n\t\t\t\treturn {\n\t\t\t\t\traw: formula,\n\t\t\t\t\ttarget,\n\t\t\t\t\ttype: `${targetIsRow ? \"row\" : \"col\"}_${fn}` as ParsedMatrixFormula[\"type\"],\n\t\t\t\t\targs: [args[0], args[1]],\n\t\t\t\t};\n\t\t}\n\n\t\tthrow new Error(`Unsupported matrix table formula: ${formula}`);\n\t}\n\n\tprivate parseRecordFormula(\n\t\tformula: string,\n\t\tcolumns: string[],\n\t): ParsedRecordFormula {\n\t\tconst totalMatch = formula.match(/^@total\\s*=\\s*sum\\((.*)\\)$/i);\n\t\tif (totalMatch) {\n\t\t\tconst totalColumns = totalMatch[1]\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((value) => value.trim())\n\t\t\t\t.filter(Boolean);\n\t\t\tfor (const column of totalColumns) {\n\t\t\t\tif (!columns.includes(column)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unknown column \"${column}\" in record total formula: ${formula}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\traw: formula,\n\t\t\t\ttype: \"total\",\n\t\t\t\tcolumns: totalColumns,\n\t\t\t};\n\t\t}\n\n\t\tconst sumMatch = formula.match(/^(.+?)\\s*=\\s*sum\\((.*)\\)$/);\n\t\tif (sumMatch) {\n\t\t\tconst [, rawTarget, rawColumns] = sumMatch;\n\t\t\tconst target = rawTarget.trim();\n\t\t\tif (!columns.includes(target)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Unknown column \"${target}\" in record formula: ${formula}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst requestedColumns = rawColumns\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((value) => value.trim())\n\t\t\t\t.filter(Boolean);\n\t\t\tconst resolvedColumns =\n\t\t\t\trequestedColumns.length === 1 && requestedColumns[0] === \"*\"\n\t\t\t\t\t? columns.filter((column) => column !== target)\n\t\t\t\t\t: requestedColumns;\n\n\t\t\tfor (const column of resolvedColumns) {\n\t\t\t\tif (!columns.includes(column)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unknown column \"${column}\" in record formula: ${formula}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\traw: formula,\n\t\t\t\ttype: \"sum\",\n\t\t\t\ttarget,\n\t\t\t\tcolumns: resolvedColumns,\n\t\t\t};\n\t\t}\n\n\t\tconst assignmentMatch = formula.match(/^(.+?)\\s*=\\s*(.+)$/);\n\t\tif (!assignmentMatch) {\n\t\t\tthrow new Error(`Unsupported record table formula: ${formula}`);\n\t\t}\n\n\t\tconst [, rawTarget, rawExpression] = assignmentMatch;\n\t\tconst target = rawTarget.trim();\n\t\tif (!columns.includes(target)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Unknown column \"${target}\" in record formula: ${formula}`,\n\t\t\t);\n\t\t}\n\n\t\tconst { operands, operators } = this.parseRecordExpression(\n\t\t\trawExpression,\n\t\t\tcolumns,\n\t\t\tformula,\n\t\t);\n\n\t\treturn {\n\t\t\traw: formula,\n\t\t\ttype: \"expression\",\n\t\t\ttarget,\n\t\t\toperands,\n\t\t\toperators,\n\t\t};\n\t}\n\n\tprivate parseRecordExpression(\n\t\texpression: string,\n\t\tcolumns: string[],\n\t\tformula: string,\n\t): {\n\t\toperands: RecordExpressionOperand[];\n\t\toperators: Array<\"+\" | \"-\" | \"*\" | \"/\">;\n\t} {\n\t\tconst operands: RecordExpressionOperand[] = [];\n\t\tconst operators: Array<\"+\" | \"-\" | \"*\" | \"/\"> = [];\n\t\tconst sortedColumns = [...columns].sort(\n\t\t\t(left, right) => right.length - left.length,\n\t\t);\n\t\tconst numberPattern = /\\d+(?:\\.\\d+)?/y;\n\t\tlet index = 0;\n\n\t\twhile (index < expression.length) {\n\t\t\twhile (index < expression.length && /\\s/.test(expression[index])) {\n\t\t\t\tindex += 1;\n\t\t\t}\n\n\t\t\tconst matchedColumn = sortedColumns.find((column) =>\n\t\t\t\texpression.startsWith(column, index),\n\t\t\t);\n\t\t\tif (matchedColumn) {\n\t\t\t\toperands.push({ kind: \"column\", name: matchedColumn });\n\t\t\t\tindex += matchedColumn.length;\n\t\t\t} else {\n\t\t\t\tnumberPattern.lastIndex = index;\n\t\t\t\tconst numericMatch = numberPattern.exec(expression);\n\t\t\t\tif (!numericMatch || numericMatch.index !== index) {\n\t\t\t\t\tthrow new Error(`Unsupported record table formula: ${formula}`);\n\t\t\t\t}\n\t\t\t\tconst value = Number(numericMatch[0]);\n\t\t\t\tif (!Number.isFinite(value)) {\n\t\t\t\t\tthrow new Error(`Unsupported record table formula: ${formula}`);\n\t\t\t\t}\n\t\t\t\toperands.push({ kind: \"number\", value });\n\t\t\t\tindex += numericMatch[0].length;\n\t\t\t}\n\n\t\t\twhile (index < expression.length && /\\s/.test(expression[index])) {\n\t\t\t\tindex += 1;\n\t\t\t}\n\n\t\t\tif (index >= expression.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst operator = expression[index];\n\t\t\tif (![\"+\", \"-\", \"*\", \"/\"].includes(operator)) {\n\t\t\t\tthrow new Error(`Unsupported record table formula: ${formula}`);\n\t\t\t}\n\t\t\toperators.push(operator as \"+\" | \"-\" | \"*\" | \"/\");\n\t\t\tindex += 1;\n\t\t}\n\n\t\tif (operands.length < 2 || operators.length !== operands.length - 1) {\n\t\t\tthrow new Error(`Unsupported record table formula: ${formula}`);\n\t\t}\n\n\t\treturn { operands, operators };\n\t}\n}\n"]}