tradeblocks-mcp 3.0.3 → 3.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +3 -12
  2. package/dist/{chunk-C6LL746C.js → chunk-2I3S2ZLT.js} +259 -1
  3. package/dist/chunk-2I3S2ZLT.js.map +1 -0
  4. package/dist/{chunk-UBUC5A66.js → chunk-4HZLVUOZ.js} +81 -76
  5. package/dist/chunk-4HZLVUOZ.js.map +1 -0
  6. package/dist/{chunk-VDU25Z6X.js → chunk-NWNSKALN.js} +2 -2
  7. package/dist/{chunk-AP7IHUUR.js → chunk-WNTYA7ER.js} +2 -2
  8. package/dist/{chunk-6S37CXUA.js → chunk-YZA4RS76.js} +14 -6
  9. package/dist/chunk-YZA4RS76.js.map +1 -0
  10. package/dist/{chunk-SEUZYQGQ.js → chunk-ZTJXC3LS.js} +2 -2
  11. package/dist/daily-log-processor-MZW2XBZY.js +9 -0
  12. package/dist/market-provider-6U33TQUT.js +16 -0
  13. package/dist/{sync-EVLKB3ZJ.js → sync-3UBC37VW.js} +6 -6
  14. package/dist/test-exports.js +560 -271
  15. package/dist/test-exports.js.map +1 -1
  16. package/dist/trade-processor-DKDCWGKD.js +9 -0
  17. package/package.json +2 -6
  18. package/server/{chunk-YUCOAJ4Z.js → chunk-536NSFED.js} +2 -2
  19. package/server/{chunk-GH2552SE.js → chunk-A3UKD64A.js} +2 -2
  20. package/server/{chunk-ZBJCF4ZG.js → chunk-OMUDNJBJ.js} +2 -2
  21. package/server/{chunk-BOPHW5M6.js → chunk-RJDJHZ5Y.js} +414 -101
  22. package/server/chunk-RJDJHZ5Y.js.map +1 -0
  23. package/server/{chunk-4P7D7YZP.js → chunk-RM4B2VKS.js} +72 -71
  24. package/server/chunk-RM4B2VKS.js.map +1 -0
  25. package/server/{chunk-OBYKFW2B.js → chunk-SY6GDNVI.js} +14 -6
  26. package/server/chunk-SY6GDNVI.js.map +1 -0
  27. package/server/daily-log-processor-B2VPU2FQ.js +10 -0
  28. package/server/index.js +787 -552
  29. package/server/index.js.map +1 -1
  30. package/server/market-provider-L56RFHAC.js +17 -0
  31. package/server/{sync-V25UQJA3.js → sync-CENKDN53.js} +6 -6
  32. package/server/trade-processor-3PI4LHZI.js +10 -0
  33. package/src/db/backtest-schemas.ts +26 -4
  34. package/src/db/data-root.ts +22 -0
  35. package/src/test-exports.ts +12 -0
  36. package/src/tools/blocks/index.ts +2 -0
  37. package/src/tools/blocks/paired-comparison.ts +425 -0
  38. package/src/tools/imports.ts +2 -2
  39. package/src/utils/block-loader.ts +1 -1
  40. package/src/utils/calibration-probe.ts +2 -2
  41. package/dist/chunk-6S37CXUA.js.map +0 -1
  42. package/dist/chunk-C6LL746C.js.map +0 -1
  43. package/dist/chunk-UBUC5A66.js.map +0 -1
  44. package/dist/daily-log-processor-BY3ISY6K.js +0 -9
  45. package/dist/market-provider-H3ARIVZ4.js +0 -16
  46. package/dist/trade-processor-EYA3I3XB.js +0 -9
  47. package/manifest.json +0 -133
  48. package/server/chunk-4P7D7YZP.js.map +0 -1
  49. package/server/chunk-BOPHW5M6.js.map +0 -1
  50. package/server/chunk-OBYKFW2B.js.map +0 -1
  51. package/server/daily-log-processor-ENEUT22A.js +0 -10
  52. package/server/market-provider-B437HKLW.js +0 -17
  53. package/server/trade-processor-L3PIQ5TG.js +0 -10
  54. /package/dist/{chunk-VDU25Z6X.js.map → chunk-NWNSKALN.js.map} +0 -0
  55. /package/dist/{chunk-AP7IHUUR.js.map → chunk-WNTYA7ER.js.map} +0 -0
  56. /package/dist/{chunk-SEUZYQGQ.js.map → chunk-ZTJXC3LS.js.map} +0 -0
  57. /package/dist/{daily-log-processor-BY3ISY6K.js.map → daily-log-processor-MZW2XBZY.js.map} +0 -0
  58. /package/dist/{market-provider-H3ARIVZ4.js.map → market-provider-6U33TQUT.js.map} +0 -0
  59. /package/dist/{sync-EVLKB3ZJ.js.map → sync-3UBC37VW.js.map} +0 -0
  60. /package/dist/{trade-processor-EYA3I3XB.js.map → trade-processor-DKDCWGKD.js.map} +0 -0
  61. /package/server/{chunk-YUCOAJ4Z.js.map → chunk-536NSFED.js.map} +0 -0
  62. /package/server/{chunk-GH2552SE.js.map → chunk-A3UKD64A.js.map} +0 -0
  63. /package/server/{chunk-ZBJCF4ZG.js.map → chunk-OMUDNJBJ.js.map} +0 -0
  64. /package/server/{daily-log-processor-ENEUT22A.js.map → daily-log-processor-B2VPU2FQ.js.map} +0 -0
  65. /package/server/{market-provider-B437HKLW.js.map → market-provider-L56RFHAC.js.map} +0 -0
  66. /package/server/{sync-V25UQJA3.js.map → sync-CENKDN53.js.map} +0 -0
  67. /package/server/{trade-processor-L3PIQ5TG.js.map → trade-processor-3PI4LHZI.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getSofrRateByKey
3
- } from "./chunk-C6LL746C.js";
3
+ } from "./chunk-2I3S2ZLT.js";
4
4
  import {
5
5
  loadMddsProtoRoot
6
6
  } from "./chunk-2E63THNI.js";
@@ -3288,4 +3288,4 @@ export {
3288
3288
  getProvider,
3289
3289
  _resetProvider
3290
3290
  };
3291
- //# sourceMappingURL=chunk-VDU25Z6X.js.map
3291
+ //# sourceMappingURL=chunk-NWNSKALN.js.map
@@ -4,7 +4,7 @@ import {
4
4
  normalizeHeaders,
5
5
  rawTradeDataSchema,
6
6
  tradeSchema
7
- } from "./chunk-6S37CXUA.js";
7
+ } from "./chunk-YZA4RS76.js";
8
8
 
9
9
  // ../lib/models/trade.ts
10
10
  var TRADE_COLUMN_MAPPING = {
@@ -403,4 +403,4 @@ var TradeProcessor = class {
403
403
  export {
404
404
  TradeProcessor
405
405
  };
406
- //# sourceMappingURL=chunk-AP7IHUUR.js.map
406
+ //# sourceMappingURL=chunk-WNTYA7ER.js.map
@@ -83,8 +83,9 @@ var CSVParser = class _CSVParser {
83
83
  return {
84
84
  data,
85
85
  headers: cleanHeaders,
86
- totalRows: totalRows - 1,
87
- // Excluding header
86
+ // Count data records actually encountered. Physical line count includes
87
+ // trailing blank lines, which are not CSV records when skipEmptyLines is on.
88
+ totalRows: processedRows,
88
89
  validRows,
89
90
  errors,
90
91
  warnings
@@ -313,6 +314,7 @@ var tradeSchema = z.object({
313
314
  });
314
315
  var rawReportingTradeDataSchema = z.object({
315
316
  Strategy: z.string().min(1, "Strategy is required"),
317
+ Account: z.string().optional(),
316
318
  "Date Opened": z.string().min(1, "Date Opened is required"),
317
319
  "Time Opened": z.string().optional(),
318
320
  "Opening Price": z.string().min(1, "Opening Price is required"),
@@ -324,12 +326,15 @@ var rawReportingTradeDataSchema = z.object({
324
326
  "Date Closed": z.string().optional(),
325
327
  "Time Closed": z.string().optional(),
326
328
  "Avg. Closing Cost": z.string().optional(),
327
- "Reason For Close": z.string().optional()
328
- });
329
+ "Reason For Close": z.string().optional(),
330
+ "Days in Trade": z.string().optional()
331
+ }).catchall(z.string());
329
332
  var reportingTradeSchema = z.object({
330
333
  strategy: z.string().min(1),
334
+ account: z.string().optional(),
331
335
  dateOpened: z.date(),
332
336
  timeOpened: z.string().optional(),
337
+ rawTimeOpened: z.string().optional(),
333
338
  openingPrice: z.number().finite(),
334
339
  legs: z.string().min(1),
335
340
  initialPremium: z.number().finite(),
@@ -338,8 +343,11 @@ var reportingTradeSchema = z.object({
338
343
  closingPrice: z.number().finite().optional(),
339
344
  dateClosed: z.date().optional(),
340
345
  timeClosed: z.string().optional(),
346
+ rawTimeClosed: z.string().optional(),
347
+ daysInTrade: z.number().finite().nonnegative().optional(),
341
348
  avgClosingCost: z.number().finite().optional(),
342
- reasonForClose: z.string().optional()
349
+ reasonForClose: z.string().optional(),
350
+ sourceFields: z.record(z.string(), z.string()).optional()
343
351
  });
344
352
  var rawDailyLogDataSchema = z.object({
345
353
  Date: z.string().min(1, "Date is required"),
@@ -437,4 +445,4 @@ export {
437
445
  normalizeHeaders,
438
446
  findMissingHeaders
439
447
  };
440
- //# sourceMappingURL=chunk-6S37CXUA.js.map
448
+ //# sourceMappingURL=chunk-YZA4RS76.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../lib/processing/csv-parser.ts","../../lib/models/validators.ts","../../lib/utils/csv-headers.ts"],"sourcesContent":["/**\n * CSV Parser Service\n *\n * Handles CSV file parsing with progress tracking, error handling,\n * and validation for TradeBlocks data.\n */\n\nimport type { ParsingError } from \"../models/index.ts\";\n// import { ProcessingError } from '../models/index.ts'\n\n/**\n * CSV parsing configuration\n */\nexport interface CSVParseConfig {\n delimiter?: string;\n quote?: string;\n escape?: string;\n skipEmptyLines?: boolean;\n trimValues?: boolean;\n maxRows?: number;\n progressCallback?: (progress: number, rowsProcessed: number) => void;\n}\n\n/**\n * CSV parsing result\n */\nexport interface CSVParseResult<T = Record<string, string>> {\n data: T[];\n headers: string[];\n totalRows: number;\n validRows: number;\n errors: ParsingError[];\n warnings: string[];\n}\n\n/**\n * CSV parsing progress info\n */\nexport interface ParseProgress {\n stage: \"reading\" | \"parsing\" | \"validating\" | \"converting\" | \"completed\";\n progress: number; // 0-100\n rowsProcessed: number;\n totalRows: number;\n errors: number;\n}\n\n/**\n * Base CSV parser class with streaming support for large files\n */\nexport class CSVParser {\n private config: Required<CSVParseConfig>;\n\n constructor(config: CSVParseConfig = {}) {\n this.config = {\n delimiter: \",\",\n quote: '\"',\n escape: '\"',\n skipEmptyLines: true,\n trimValues: true,\n maxRows: 100000, // Safety limit\n progressCallback: () => {},\n ...config,\n };\n }\n\n /**\n * Parse CSV file content\n */\n async parseFile<T = Record<string, string>>(\n fileContent: string,\n validator?: (row: Record<string, string>, rowIndex: number) => T | null,\n ): Promise<CSVParseResult<T>> {\n const errors: ParsingError[] = [];\n const warnings: string[] = [];\n const data: T[] = [];\n\n try {\n // Split into lines and handle different line endings\n const lines = fileContent.split(/\\r?\\n/);\n const totalRows = lines.length;\n\n if (totalRows === 0) {\n throw new Error(\"Empty CSV file\");\n }\n\n // Parse headers\n const headerLine = lines[0];\n if (!headerLine || headerLine.trim() === \"\") {\n throw new Error(\"Missing CSV headers\");\n }\n\n const headers = this.parseLine(headerLine);\n if (headers.length === 0) {\n throw new Error(\"No valid headers found\");\n }\n\n // Clean headers (remove BOM, trim whitespace)\n const cleanHeaders = headers.map((header) => header.replace(/^\\ufeff/, \"\").trim());\n\n let validRows = 0;\n let processedRows = 0;\n\n // Process data rows\n for (let i = 1; i < lines.length && processedRows < this.config.maxRows; i++) {\n const line = lines[i];\n\n // Skip empty lines if configured\n if (this.config.skipEmptyLines && (!line || line.trim() === \"\")) {\n continue;\n }\n\n processedRows++;\n\n try {\n const values = this.parseLine(line);\n\n // Create row object\n const row: Record<string, string> = {};\n cleanHeaders.forEach((header, index) => {\n const value = values[index] || \"\";\n row[header] = this.config.trimValues ? value.trim() : value;\n });\n\n // Validate row if validator provided\n if (validator) {\n const validatedRow = validator(row, i);\n if (validatedRow) {\n data.push(validatedRow);\n validRows++;\n }\n } else {\n data.push(row as T);\n validRows++;\n }\n } catch (error) {\n const parsingError: ParsingError = {\n type: \"parsing\",\n message: `Error parsing line ${i + 1}: ${error instanceof Error ? error.message : String(error)}`,\n details: { lineNumber: i + 1, line },\n line: i + 1,\n raw: line,\n };\n errors.push(parsingError);\n }\n\n // Report progress\n if (processedRows % 100 === 0 || processedRows === totalRows - 1) {\n const progress = Math.round((processedRows / (totalRows - 1)) * 100);\n this.config.progressCallback(progress, processedRows);\n }\n }\n\n // Check for truncation\n if (processedRows >= this.config.maxRows && lines.length > this.config.maxRows + 1) {\n warnings.push(`File truncated at ${this.config.maxRows} rows for performance`);\n }\n\n return {\n data,\n headers: cleanHeaders,\n // Count data records actually encountered. Physical line count includes\n // trailing blank lines, which are not CSV records when skipEmptyLines is on.\n totalRows: processedRows,\n validRows,\n errors,\n warnings,\n };\n } catch (error) {\n const parsingError: ParsingError = {\n type: \"parsing\",\n message: `CSV parsing failed: ${error instanceof Error ? error.message : String(error)}`,\n details: { fileContent: fileContent.substring(0, 500) + \"...\" },\n line: 0,\n raw: \"\",\n };\n\n return {\n data: [],\n headers: [],\n totalRows: 0,\n validRows: 0,\n errors: [parsingError],\n warnings,\n };\n }\n }\n\n /**\n * Parse CSV from File object with progress tracking\n */\n async parseFileObject<T = Record<string, string>>(\n file: File,\n validator?: (row: Record<string, string>, rowIndex: number) => T | null,\n progressCallback?: (progress: ParseProgress) => void,\n ): Promise<CSVParseResult<T>> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onprogress = (event) => {\n if (event.lengthComputable && progressCallback) {\n const progress = Math.round((event.loaded / event.total) * 100);\n progressCallback({\n stage: \"reading\",\n progress,\n rowsProcessed: 0,\n totalRows: 0,\n errors: 0,\n });\n }\n };\n\n reader.onload = async (event) => {\n try {\n const content = event.target?.result as string;\n if (!content) {\n throw new Error(\"Failed to read file content\");\n }\n\n // Update progress callback for parsing stage\n const parseConfig = {\n ...this.config,\n progressCallback: (progress: number, rowsProcessed: number) => {\n if (progressCallback) {\n progressCallback({\n stage: \"parsing\",\n progress,\n rowsProcessed,\n totalRows: content.split(/\\r?\\n/).length - 1,\n errors: 0,\n });\n }\n },\n };\n\n const parser = new CSVParser(parseConfig);\n const result = await parser.parseFile(content, validator);\n\n if (progressCallback) {\n progressCallback({\n stage: \"completed\",\n progress: 100,\n rowsProcessed: result.validRows,\n totalRows: result.totalRows,\n errors: result.errors.length,\n });\n }\n\n resolve(result);\n } catch (error) {\n reject(error);\n }\n };\n\n reader.onerror = () => {\n reject(new Error(\"Failed to read file\"));\n };\n\n reader.readAsText(file);\n });\n }\n\n /**\n * Parse a single CSV line, handling quoted values and escapes\n */\n private parseLine(line: string): string[] {\n const result: string[] = [];\n const { delimiter, quote, escape } = this.config;\n\n let current = \"\";\n let inQuotes = false;\n let i = 0;\n\n while (i < line.length) {\n const char = line[i];\n const nextChar = line[i + 1];\n\n if (!inQuotes) {\n if (char === delimiter) {\n result.push(current);\n current = \"\";\n } else if (char === quote) {\n inQuotes = true;\n } else {\n current += char;\n }\n } else {\n if (char === escape && nextChar === quote) {\n // Escaped quote\n current += quote;\n i++; // Skip next character\n } else if (char === quote) {\n inQuotes = false;\n } else {\n current += char;\n }\n }\n\n i++;\n }\n\n // Add the last field\n result.push(current);\n\n return result;\n }\n\n /**\n * Validate CSV file format before parsing\n */\n static validateCSVFile(file: File): { valid: boolean; error?: string } {\n // Check file type\n const validTypes = [\"text/csv\", \"application/vnd.ms-excel\", \"text/plain\"];\n if (!validTypes.includes(file.type) && !file.name.toLowerCase().endsWith(\".csv\")) {\n return { valid: false, error: \"File must be a CSV file (.csv extension)\" };\n }\n\n // Check file size (50MB limit)\n const maxSize = 50 * 1024 * 1024;\n if (file.size > maxSize) {\n return { valid: false, error: \"File size must be less than 50MB\" };\n }\n\n // Check for empty file\n if (file.size === 0) {\n return { valid: false, error: \"File is empty\" };\n }\n\n return { valid: true };\n }\n\n /**\n * Detect CSV delimiter from sample content\n */\n static detectDelimiter(sampleContent: string): string {\n const delimiters = [\",\", \";\", \"\\t\", \"|\"];\n const lines = sampleContent.split(/\\r?\\n/).slice(0, 5); // Check first 5 lines\n\n let bestDelimiter = \",\";\n let maxScore = 0;\n\n for (const delimiter of delimiters) {\n let score = 0;\n let consistentCounts = true;\n let expectedCount = -1;\n\n for (const line of lines) {\n if (!line.trim()) continue;\n\n const count = line.split(delimiter).length - 1;\n if (expectedCount === -1) {\n expectedCount = count;\n } else if (count !== expectedCount) {\n consistentCounts = false;\n break;\n }\n score += count;\n }\n\n if (consistentCounts && score > maxScore) {\n maxScore = score;\n bestDelimiter = delimiter;\n }\n }\n\n return bestDelimiter;\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Zod schema for validating raw trade data from CSV\n */\nexport const rawTradeDataSchema = z\n .object({\n \"Date Opened\": z.string().min(1, \"Date Opened is required\"),\n \"Time Opened\": z.string().min(1, \"Time Opened is required\"),\n \"Opening Price\": z.string().min(1, \"Opening Price is required\"),\n Legs: z.string().min(1, \"Legs description is required\"),\n Premium: z.string().min(1, \"Premium is required\"),\n \"Closing Price\": z.string().optional(),\n \"Date Closed\": z.string().optional(),\n \"Time Closed\": z.string().optional(),\n \"Avg. Closing Cost\": z.string().optional(),\n \"Reason For Close\": z.string().optional(),\n \"P/L\": z.string().min(1, \"P/L is required\"),\n \"No. of Contracts\": z.string().min(1, \"Number of Contracts is required\"),\n \"Funds at Close\": z.string().min(1, \"Funds at Close is required\"),\n \"Margin Req.\": z.string().min(1, \"Margin Requirement is required\"),\n Strategy: z.string().min(1, \"Strategy is required\"),\n \"Opening Commissions + Fees\": z.string().default(\"0\"),\n \"Closing Commissions + Fees\": z.string().optional(),\n \"Opening Short/Long Ratio\": z.string().default(\"0\"),\n \"Closing Short/Long Ratio\": z.string().optional(),\n \"Opening VIX\": z.string().optional(),\n \"Closing VIX\": z.string().optional(),\n Gap: z.string().optional(),\n Movement: z.string().optional(),\n \"Max Profit\": z.string().optional(),\n \"Max Loss\": z.string().optional(),\n })\n .passthrough(); // Allow custom columns to pass through validation\n\n/**\n * Zod schema for validating processed trade data\n */\nexport const tradeSchema = z.object({\n dateOpened: z.date(),\n timeOpened: z\n .string()\n .regex(/^\\d{1,2}:\\d{2}:\\d{2}$/, \"Time must be in H:mm:ss or HH:mm:ss format\"),\n openingPrice: z.number().finite(),\n legs: z.string().min(1),\n premium: z.number().finite(),\n premiumPrecision: z.enum([\"dollars\", \"cents\"]).optional(),\n closingPrice: z.number().finite().optional(),\n dateClosed: z.date().optional(),\n timeClosed: z\n .string()\n .regex(/^\\d{1,2}:\\d{2}:\\d{2}$/)\n .optional(),\n avgClosingCost: z.number().finite().optional(),\n reasonForClose: z.string().optional(),\n pl: z.number().finite(),\n numContracts: z.number().int().positive(),\n fundsAtClose: z.number().finite(),\n marginReq: z.number().finite().min(0),\n strategy: z.string().min(1),\n openingCommissionsFees: z.number().finite().min(0),\n closingCommissionsFees: z.number().finite().min(0),\n openingShortLongRatio: z.number().finite().min(0),\n closingShortLongRatio: z.number().finite().min(0).optional(),\n openingVix: z.number().finite().min(0).optional(),\n closingVix: z.number().finite().min(0).optional(),\n gap: z.number().finite().optional(),\n movement: z.number().finite().optional(),\n maxProfit: z.number().finite().optional(),\n maxLoss: z.number().finite().optional(),\n syntheticCapitalRatio: z.number().finite().optional(),\n customFields: z.record(z.string(), z.union([z.number(), z.string()])).optional(),\n});\n\n/**\n * Zod schema for validating raw reporting trade data from strategy logs\n */\nexport const rawReportingTradeDataSchema = z\n .object({\n Strategy: z.string().min(1, \"Strategy is required\"),\n Account: z.string().optional(),\n \"Date Opened\": z.string().min(1, \"Date Opened is required\"),\n \"Time Opened\": z.string().optional(),\n \"Opening Price\": z.string().min(1, \"Opening Price is required\"),\n Legs: z.string().min(1, \"Legs description is required\"),\n \"Initial Premium\": z.string().min(1, \"Initial Premium is required\"),\n \"No. of Contracts\": z.string().min(1, \"Number of Contracts is required\"),\n \"P/L\": z.string().min(1, \"P/L is required\"),\n \"Closing Price\": z.string().optional(),\n \"Date Closed\": z.string().optional(),\n \"Time Closed\": z.string().optional(),\n \"Avg. Closing Cost\": z.string().optional(),\n \"Reason For Close\": z.string().optional(),\n \"Days in Trade\": z.string().optional(),\n })\n .catchall(z.string());\n\n/**\n * Zod schema for validating processed reporting trade data\n */\nexport const reportingTradeSchema = z.object({\n strategy: z.string().min(1),\n account: z.string().optional(),\n dateOpened: z.date(),\n timeOpened: z.string().optional(),\n rawTimeOpened: z.string().optional(),\n openingPrice: z.number().finite(),\n legs: z.string().min(1),\n initialPremium: z.number().finite(),\n numContracts: z.number().finite(),\n pl: z.number().finite(),\n closingPrice: z.number().finite().optional(),\n dateClosed: z.date().optional(),\n timeClosed: z.string().optional(),\n rawTimeClosed: z.string().optional(),\n daysInTrade: z.number().finite().nonnegative().optional(),\n avgClosingCost: z.number().finite().optional(),\n reasonForClose: z.string().optional(),\n sourceFields: z.record(z.string(), z.string()).optional(),\n});\n\n/**\n * Zod schema for validating raw daily log data from CSV\n */\nexport const rawDailyLogDataSchema = z\n .object({\n Date: z.string().min(1, \"Date is required\"),\n \"Net Liquidity\": z.string().min(1, \"Net Liquidity is required\"),\n \"Current Funds\": z.string().min(1, \"Current Funds is required\"),\n Withdrawn: z.string().default(\"0\"),\n \"Trading Funds\": z.string().min(1, \"Trading Funds is required\"),\n \"P/L\": z.string().min(1, \"P/L is required\"),\n \"P/L %\": z.string().min(1, \"P/L % is required\"),\n \"Drawdown %\": z.string().min(1, \"Drawdown % is required\"),\n })\n .passthrough(); // Allow custom columns to pass through validation\n\n/**\n * Zod schema for validating processed daily log entry\n */\nexport const dailyLogEntrySchema = z.object({\n date: z.date(),\n netLiquidity: z.number().finite(),\n currentFunds: z.number().finite(),\n withdrawn: z.number().finite().min(0),\n tradingFunds: z.number().finite().min(0),\n dailyPl: z.number().finite(),\n dailyPlPct: z.number().finite(),\n drawdownPct: z.number().finite().max(0), // Drawdown should be negative or zero\n blockId: z.string().optional(),\n customFields: z.record(z.string(), z.union([z.number(), z.string()])).optional(),\n});\n\n/**\n * Zod schema for portfolio statistics\n */\nexport const portfolioStatsSchema = z.object({\n totalTrades: z.number().int().min(0),\n totalPl: z.number().finite(),\n winRate: z.number().min(0).max(1),\n avgWin: z.number().finite().min(0),\n avgLoss: z.number().finite().max(0),\n maxWin: z.number().finite().min(0),\n maxLoss: z.number().finite().max(0),\n sharpeRatio: z.number().finite().optional(),\n maxDrawdown: z.number().finite().max(0),\n avgDailyPl: z.number().finite(),\n totalCommissions: z.number().finite().min(0),\n netPl: z.number().finite(),\n profitFactor: z.number().finite().min(0),\n});\n\n/**\n * Zod schema for strategy statistics\n */\nexport const strategyStatsSchema = z.object({\n strategyName: z.string().min(1),\n tradeCount: z.number().int().min(0),\n totalPl: z.number().finite(),\n winRate: z.number().min(0).max(1),\n avgWin: z.number().finite().min(0),\n avgLoss: z.number().finite().max(0),\n maxWin: z.number().finite().min(0),\n maxLoss: z.number().finite().max(0),\n avgDte: z.number().finite().min(0).optional(),\n successRate: z.number().min(0).max(1),\n profitFactor: z.number().finite().min(0),\n});\n\n/**\n * Zod schema for analysis configuration\n */\nexport const analysisConfigSchema = z.object({\n useBusinessDaysOnly: z.boolean(),\n annualizationFactor: z.number().int().min(200).max(365),\n confidenceLevel: z.number().min(0.8).max(0.99),\n});\n\n/**\n * Zod schema for file validation\n */\nexport const fileSchema = z.object({\n name: z.string().min(1),\n size: z.number().int().positive(),\n type: z\n .string()\n .refine(\n (type) => type === \"text/csv\" || type === \"application/vnd.ms-excel\",\n \"File must be a CSV file\",\n ),\n});\n\n/**\n * Zod schema for block creation request\n */\nexport const createBlockRequestSchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n analysisConfig: analysisConfigSchema.partial().optional(),\n});\n\n/**\n * Type exports for use with TypeScript\n */\nexport type RawTradeData = z.infer<typeof rawTradeDataSchema>;\nexport type ValidatedTrade = z.infer<typeof tradeSchema>;\nexport type RawReportingTradeData = z.infer<typeof rawReportingTradeDataSchema>;\nexport type ValidatedReportingTrade = z.infer<typeof reportingTradeSchema>;\nexport type RawDailyLogData = z.infer<typeof rawDailyLogDataSchema>;\nexport type ValidatedDailyLogEntry = z.infer<typeof dailyLogEntrySchema>;\nexport type ValidatedPortfolioStats = z.infer<typeof portfolioStatsSchema>;\nexport type ValidatedStrategyStats = z.infer<typeof strategyStatsSchema>;\nexport type ValidatedAnalysisConfig = z.infer<typeof analysisConfigSchema>;\nexport type ValidatedFile = z.infer<typeof fileSchema>;\nexport type ValidatedCreateBlockRequest = z.infer<typeof createBlockRequestSchema>;\n","/**\n * CSV header utilities\n */\n\nexport interface HeaderValidationOptions {\n /** Optional map of alternate header names to canonical names */\n aliases?: Record<string, string> | Readonly<Record<string, string>>;\n /** Human-readable label used in error messages */\n contextLabel?: string;\n}\n\nconst BOM = \"\\uFEFF\";\n\n/**\n * Remove UTF-8 byte order mark from a string if present\n */\nexport function stripBom(value: string): string {\n return value.startsWith(BOM) ? value.slice(1) : value;\n}\n\n/**\n * Parse a single CSV line into values, handling quoted fields and commas\n */\nexport function parseCsvLine(line: string): string[] {\n const result: string[] = [];\n let current = \"\";\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n\n if (char === '\"') {\n const nextChar = line[i + 1];\n if (inQuotes && nextChar === '\"') {\n // Escaped quote inside quoted value\n current += '\"';\n i++;\n } else {\n inQuotes = !inQuotes;\n }\n continue;\n }\n\n if (char === \",\" && !inQuotes) {\n result.push(current.trim());\n current = \"\";\n } else {\n current += char;\n }\n }\n\n result.push(current.trim());\n\n if (result.length > 0) {\n result[0] = stripBom(result[0]);\n }\n\n return result;\n}\n\n/**\n * Normalize a CSV header by trimming whitespace, stripping BOM, and applying aliases\n */\nexport function normalizeHeader(\n header: string,\n aliases?: Record<string, string> | Readonly<Record<string, string>>,\n): string {\n const trimmed = stripBom(header).trim();\n return aliases?.[trimmed] ?? trimmed;\n}\n\n/**\n * Normalize an array of headers\n */\nexport function normalizeHeaders(\n headers: string[],\n aliases?: Record<string, string> | Readonly<Record<string, string>>,\n): string[] {\n return headers.map((header) => normalizeHeader(header, aliases));\n}\n\n/**\n * Validate that required headers are present. Returns the missing headers without throwing.\n */\nexport function findMissingHeaders(headers: string[], required: readonly string[]): string[] {\n const headerSet = new Set(headers);\n return required.filter((requiredHeader) => !headerSet.has(requiredHeader));\n}\n\n/**\n * Ensure required headers are present, throwing an Error with a helpful message when missing.\n */\nexport function assertRequiredHeaders(\n headers: string[],\n required: readonly string[],\n options: HeaderValidationOptions = {},\n): void {\n const missing = findMissingHeaders(headers, required);\n if (missing.length === 0) {\n return;\n }\n\n const label = options.contextLabel ? `${options.contextLabel} ` : \"\";\n throw new Error(`Missing required ${label}columns: ${missing.join(\", \")}`);\n}\n"],"mappings":";AAiDO,IAAM,YAAN,MAAM,WAAU;AAAA,EACb;AAAA,EAER,YAAY,SAAyB,CAAC,GAAG;AACvC,SAAK,SAAS;AAAA,MACZ,WAAW;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,SAAS;AAAA;AAAA,MACT,kBAAkB,MAAM;AAAA,MAAC;AAAA,MACzB,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,aACA,WAC4B;AAC5B,UAAM,SAAyB,CAAC;AAChC,UAAM,WAAqB,CAAC;AAC5B,UAAM,OAAY,CAAC;AAEnB,QAAI;AAEF,YAAM,QAAQ,YAAY,MAAM,OAAO;AACvC,YAAM,YAAY,MAAM;AAExB,UAAI,cAAc,GAAG;AACnB,cAAM,IAAI,MAAM,gBAAgB;AAAA,MAClC;AAGA,YAAM,aAAa,MAAM,CAAC;AAC1B,UAAI,CAAC,cAAc,WAAW,KAAK,MAAM,IAAI;AAC3C,cAAM,IAAI,MAAM,qBAAqB;AAAA,MACvC;AAEA,YAAM,UAAU,KAAK,UAAU,UAAU;AACzC,UAAI,QAAQ,WAAW,GAAG;AACxB,cAAM,IAAI,MAAM,wBAAwB;AAAA,MAC1C;AAGA,YAAM,eAAe,QAAQ,IAAI,CAAC,WAAW,OAAO,QAAQ,WAAW,EAAE,EAAE,KAAK,CAAC;AAEjF,UAAI,YAAY;AAChB,UAAI,gBAAgB;AAGpB,eAAS,IAAI,GAAG,IAAI,MAAM,UAAU,gBAAgB,KAAK,OAAO,SAAS,KAAK;AAC5E,cAAM,OAAO,MAAM,CAAC;AAGpB,YAAI,KAAK,OAAO,mBAAmB,CAAC,QAAQ,KAAK,KAAK,MAAM,KAAK;AAC/D;AAAA,QACF;AAEA;AAEA,YAAI;AACF,gBAAM,SAAS,KAAK,UAAU,IAAI;AAGlC,gBAAM,MAA8B,CAAC;AACrC,uBAAa,QAAQ,CAAC,QAAQ,UAAU;AACtC,kBAAM,QAAQ,OAAO,KAAK,KAAK;AAC/B,gBAAI,MAAM,IAAI,KAAK,OAAO,aAAa,MAAM,KAAK,IAAI;AAAA,UACxD,CAAC;AAGD,cAAI,WAAW;AACb,kBAAM,eAAe,UAAU,KAAK,CAAC;AACrC,gBAAI,cAAc;AAChB,mBAAK,KAAK,YAAY;AACtB;AAAA,YACF;AAAA,UACF,OAAO;AACL,iBAAK,KAAK,GAAQ;AAClB;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,eAA6B;AAAA,YACjC,MAAM;AAAA,YACN,SAAS,sBAAsB,IAAI,CAAC,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YAC/F,SAAS,EAAE,YAAY,IAAI,GAAG,KAAK;AAAA,YACnC,MAAM,IAAI;AAAA,YACV,KAAK;AAAA,UACP;AACA,iBAAO,KAAK,YAAY;AAAA,QAC1B;AAGA,YAAI,gBAAgB,QAAQ,KAAK,kBAAkB,YAAY,GAAG;AAChE,gBAAM,WAAW,KAAK,MAAO,iBAAiB,YAAY,KAAM,GAAG;AACnE,eAAK,OAAO,iBAAiB,UAAU,aAAa;AAAA,QACtD;AAAA,MACF;AAGA,UAAI,iBAAiB,KAAK,OAAO,WAAW,MAAM,SAAS,KAAK,OAAO,UAAU,GAAG;AAClF,iBAAS,KAAK,qBAAqB,KAAK,OAAO,OAAO,uBAAuB;AAAA,MAC/E;AAEA,aAAO;AAAA,QACL;AAAA,QACA,SAAS;AAAA;AAAA;AAAA,QAGT,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eAA6B;AAAA,QACjC,MAAM;AAAA,QACN,SAAS,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACtF,SAAS,EAAE,aAAa,YAAY,UAAU,GAAG,GAAG,IAAI,MAAM;AAAA,QAC9D,MAAM;AAAA,QACN,KAAK;AAAA,MACP;AAEA,aAAO;AAAA,QACL,MAAM,CAAC;AAAA,QACP,SAAS,CAAC;AAAA,QACV,WAAW;AAAA,QACX,WAAW;AAAA,QACX,QAAQ,CAAC,YAAY;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,MACA,WACA,kBAC4B;AAC5B,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,SAAS,IAAI,WAAW;AAE9B,aAAO,aAAa,CAAC,UAAU;AAC7B,YAAI,MAAM,oBAAoB,kBAAkB;AAC9C,gBAAM,WAAW,KAAK,MAAO,MAAM,SAAS,MAAM,QAAS,GAAG;AAC9D,2BAAiB;AAAA,YACf,OAAO;AAAA,YACP;AAAA,YACA,eAAe;AAAA,YACf,WAAW;AAAA,YACX,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO,SAAS,OAAO,UAAU;AAC/B,YAAI;AACF,gBAAM,UAAU,MAAM,QAAQ;AAC9B,cAAI,CAAC,SAAS;AACZ,kBAAM,IAAI,MAAM,6BAA6B;AAAA,UAC/C;AAGA,gBAAM,cAAc;AAAA,YAClB,GAAG,KAAK;AAAA,YACR,kBAAkB,CAAC,UAAkB,kBAA0B;AAC7D,kBAAI,kBAAkB;AACpB,iCAAiB;AAAA,kBACf,OAAO;AAAA,kBACP;AAAA,kBACA;AAAA,kBACA,WAAW,QAAQ,MAAM,OAAO,EAAE,SAAS;AAAA,kBAC3C,QAAQ;AAAA,gBACV,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,SAAS,IAAI,WAAU,WAAW;AACxC,gBAAM,SAAS,MAAM,OAAO,UAAU,SAAS,SAAS;AAExD,cAAI,kBAAkB;AACpB,6BAAiB;AAAA,cACf,OAAO;AAAA,cACP,UAAU;AAAA,cACV,eAAe,OAAO;AAAA,cACtB,WAAW,OAAO;AAAA,cAClB,QAAQ,OAAO,OAAO;AAAA,YACxB,CAAC;AAAA,UACH;AAEA,kBAAQ,MAAM;AAAA,QAChB,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAEA,aAAO,UAAU,MAAM;AACrB,eAAO,IAAI,MAAM,qBAAqB,CAAC;AAAA,MACzC;AAEA,aAAO,WAAW,IAAI;AAAA,IACxB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,MAAwB;AACxC,UAAM,SAAmB,CAAC;AAC1B,UAAM,EAAE,WAAW,OAAO,OAAO,IAAI,KAAK;AAE1C,QAAI,UAAU;AACd,QAAI,WAAW;AACf,QAAI,IAAI;AAER,WAAO,IAAI,KAAK,QAAQ;AACtB,YAAM,OAAO,KAAK,CAAC;AACnB,YAAM,WAAW,KAAK,IAAI,CAAC;AAE3B,UAAI,CAAC,UAAU;AACb,YAAI,SAAS,WAAW;AACtB,iBAAO,KAAK,OAAO;AACnB,oBAAU;AAAA,QACZ,WAAW,SAAS,OAAO;AACzB,qBAAW;AAAA,QACb,OAAO;AACL,qBAAW;AAAA,QACb;AAAA,MACF,OAAO;AACL,YAAI,SAAS,UAAU,aAAa,OAAO;AAEzC,qBAAW;AACX;AAAA,QACF,WAAW,SAAS,OAAO;AACzB,qBAAW;AAAA,QACb,OAAO;AACL,qBAAW;AAAA,QACb;AAAA,MACF;AAEA;AAAA,IACF;AAGA,WAAO,KAAK,OAAO;AAEnB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gBAAgB,MAAgD;AAErE,UAAM,aAAa,CAAC,YAAY,4BAA4B,YAAY;AACxE,QAAI,CAAC,WAAW,SAAS,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY,EAAE,SAAS,MAAM,GAAG;AAChF,aAAO,EAAE,OAAO,OAAO,OAAO,2CAA2C;AAAA,IAC3E;AAGA,UAAM,UAAU,KAAK,OAAO;AAC5B,QAAI,KAAK,OAAO,SAAS;AACvB,aAAO,EAAE,OAAO,OAAO,OAAO,mCAAmC;AAAA,IACnE;AAGA,QAAI,KAAK,SAAS,GAAG;AACnB,aAAO,EAAE,OAAO,OAAO,OAAO,gBAAgB;AAAA,IAChD;AAEA,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gBAAgB,eAA+B;AACpD,UAAM,aAAa,CAAC,KAAK,KAAK,KAAM,GAAG;AACvC,UAAM,QAAQ,cAAc,MAAM,OAAO,EAAE,MAAM,GAAG,CAAC;AAErD,QAAI,gBAAgB;AACpB,QAAI,WAAW;AAEf,eAAW,aAAa,YAAY;AAClC,UAAI,QAAQ;AACZ,UAAI,mBAAmB;AACvB,UAAI,gBAAgB;AAEpB,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,KAAK,EAAG;AAElB,cAAM,QAAQ,KAAK,MAAM,SAAS,EAAE,SAAS;AAC7C,YAAI,kBAAkB,IAAI;AACxB,0BAAgB;AAAA,QAClB,WAAW,UAAU,eAAe;AAClC,6BAAmB;AACnB;AAAA,QACF;AACA,iBAAS;AAAA,MACX;AAEA,UAAI,oBAAoB,QAAQ,UAAU;AACxC,mBAAW;AACX,wBAAgB;AAAA,MAClB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AC9WA,SAAS,SAAS;AAKX,IAAM,qBAAqB,EAC/B,OAAO;AAAA,EACN,eAAe,EAAE,OAAO,EAAE,IAAI,GAAG,yBAAyB;AAAA,EAC1D,eAAe,EAAE,OAAO,EAAE,IAAI,GAAG,yBAAyB;AAAA,EAC1D,iBAAiB,EAAE,OAAO,EAAE,IAAI,GAAG,2BAA2B;AAAA,EAC9D,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,8BAA8B;AAAA,EACtD,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,qBAAqB;AAAA,EAChD,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EACzC,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,iBAAiB;AAAA,EAC1C,oBAAoB,EAAE,OAAO,EAAE,IAAI,GAAG,iCAAiC;AAAA,EACvE,kBAAkB,EAAE,OAAO,EAAE,IAAI,GAAG,4BAA4B;AAAA,EAChE,eAAe,EAAE,OAAO,EAAE,IAAI,GAAG,gCAAgC;AAAA,EACjE,UAAU,EAAE,OAAO,EAAE,IAAI,GAAG,sBAAsB;AAAA,EAClD,8BAA8B,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EACpD,8BAA8B,EAAE,OAAO,EAAE,SAAS;AAAA,EAClD,4BAA4B,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EAClD,4BAA4B,EAAE,OAAO,EAAE,SAAS;AAAA,EAChD,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,YAAY,EAAE,OAAO,EAAE,SAAS;AAClC,CAAC,EACA,YAAY;AAKR,IAAM,cAAc,EAAE,OAAO;AAAA,EAClC,YAAY,EAAE,KAAK;AAAA,EACnB,YAAY,EACT,OAAO,EACP,MAAM,yBAAyB,4CAA4C;AAAA,EAC9E,cAAc,EAAE,OAAO,EAAE,OAAO;AAAA,EAChC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,SAAS,EAAE,OAAO,EAAE,OAAO;AAAA,EAC3B,kBAAkB,EAAE,KAAK,CAAC,WAAW,OAAO,CAAC,EAAE,SAAS;AAAA,EACxD,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3C,YAAY,EAAE,KAAK,EAAE,SAAS;AAAA,EAC9B,YAAY,EACT,OAAO,EACP,MAAM,uBAAuB,EAC7B,SAAS;AAAA,EACZ,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7C,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,IAAI,EAAE,OAAO,EAAE,OAAO;AAAA,EACtB,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACxC,cAAc,EAAE,OAAO,EAAE,OAAO;AAAA,EAChC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,wBAAwB,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACjD,wBAAwB,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACjD,uBAAuB,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAChD,uBAAuB,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC3D,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAChD,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAChD,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,uBAAuB,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EACpD,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS;AACjF,CAAC;AAKM,IAAM,8BAA8B,EACxC,OAAO;AAAA,EACN,UAAU,EAAE,OAAO,EAAE,IAAI,GAAG,sBAAsB;AAAA,EAClD,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,eAAe,EAAE,OAAO,EAAE,IAAI,GAAG,yBAAyB;AAAA,EAC1D,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,iBAAiB,EAAE,OAAO,EAAE,IAAI,GAAG,2BAA2B;AAAA,EAC9D,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,8BAA8B;AAAA,EACtD,mBAAmB,EAAE,OAAO,EAAE,IAAI,GAAG,6BAA6B;AAAA,EAClE,oBAAoB,EAAE,OAAO,EAAE,IAAI,GAAG,iCAAiC;AAAA,EACvE,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,iBAAiB;AAAA,EAC1C,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EACzC,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AACvC,CAAC,EACA,SAAS,EAAE,OAAO,CAAC;AAKf,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAY,EAAE,KAAK;AAAA,EACnB,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,cAAc,EAAE,OAAO,EAAE,OAAO;AAAA,EAChC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,gBAAgB,EAAE,OAAO,EAAE,OAAO;AAAA,EAClC,cAAc,EAAE,OAAO,EAAE,OAAO;AAAA,EAChC,IAAI,EAAE,OAAO,EAAE,OAAO;AAAA,EACtB,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3C,YAAY,EAAE,KAAK,EAAE,SAAS;AAAA,EAC9B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS;AAAA,EACxD,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7C,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AAC1D,CAAC;AAKM,IAAM,wBAAwB,EAClC,OAAO;AAAA,EACN,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AAAA,EAC1C,iBAAiB,EAAE,OAAO,EAAE,IAAI,GAAG,2BAA2B;AAAA,EAC9D,iBAAiB,EAAE,OAAO,EAAE,IAAI,GAAG,2BAA2B;AAAA,EAC9D,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EACjC,iBAAiB,EAAE,OAAO,EAAE,IAAI,GAAG,2BAA2B;AAAA,EAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,iBAAiB;AAAA,EAC1C,SAAS,EAAE,OAAO,EAAE,IAAI,GAAG,mBAAmB;AAAA,EAC9C,cAAc,EAAE,OAAO,EAAE,IAAI,GAAG,wBAAwB;AAC1D,CAAC,EACA,YAAY;AAKR,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,MAAM,EAAE,KAAK;AAAA,EACb,cAAc,EAAE,OAAO,EAAE,OAAO;AAAA,EAChC,cAAc,EAAE,OAAO,EAAE,OAAO;AAAA,EAChC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpC,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvC,SAAS,EAAE,OAAO,EAAE,OAAO;AAAA,EAC3B,YAAY,EAAE,OAAO,EAAE,OAAO;AAAA,EAC9B,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA;AAAA,EACtC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,cAAc,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS;AACjF,CAAC;AAKM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EACnC,SAAS,EAAE,OAAO,EAAE,OAAO;AAAA,EAC3B,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAChC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAClC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAClC,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtC,YAAY,EAAE,OAAO,EAAE,OAAO;AAAA,EAC9B,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3C,OAAO,EAAE,OAAO,EAAE,OAAO;AAAA,EACzB,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AACzC,CAAC;AAKM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EAClC,SAAS,EAAE,OAAO,EAAE,OAAO;AAAA,EAC3B,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EAChC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAClC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAClC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC5C,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACpC,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AACzC,CAAC;AAKM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,qBAAqB,EAAE,QAAQ;AAAA,EAC/B,qBAAqB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,GAAG;AAAA,EACtD,iBAAiB,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI;AAC/C,CAAC;AAKM,IAAM,aAAa,EAAE,OAAO;AAAA,EACjC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,MAAM,EACH,OAAO,EACP;AAAA,IACC,CAAC,SAAS,SAAS,cAAc,SAAS;AAAA,IAC1C;AAAA,EACF;AACJ,CAAC;AAKM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC/B,aAAa,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EAC1C,gBAAgB,qBAAqB,QAAQ,EAAE,SAAS;AAC1D,CAAC;;;AChND,IAAM,MAAM;AAKL,SAAS,SAAS,OAAuB;AAC9C,SAAO,MAAM,WAAW,GAAG,IAAI,MAAM,MAAM,CAAC,IAAI;AAClD;AA6CO,SAAS,gBACd,QACA,SACQ;AACR,QAAM,UAAU,SAAS,MAAM,EAAE,KAAK;AACtC,SAAO,UAAU,OAAO,KAAK;AAC/B;AAKO,SAAS,iBACd,SACA,SACU;AACV,SAAO,QAAQ,IAAI,CAAC,WAAW,gBAAgB,QAAQ,OAAO,CAAC;AACjE;AAKO,SAAS,mBAAmB,SAAmB,UAAuC;AAC3F,QAAM,YAAY,IAAI,IAAI,OAAO;AACjC,SAAO,SAAS,OAAO,CAAC,mBAAmB,CAAC,UAAU,IAAI,cAAc,CAAC;AAC3E;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  dailyLogEntrySchema,
4
4
  findMissingHeaders,
5
5
  rawDailyLogDataSchema
6
- } from "./chunk-6S37CXUA.js";
6
+ } from "./chunk-YZA4RS76.js";
7
7
 
8
8
  // ../lib/models/daily-log.ts
9
9
  var DAILY_LOG_COLUMN_MAPPING = {
@@ -326,4 +326,4 @@ var DailyLogProcessor = class {
326
326
  export {
327
327
  DailyLogProcessor
328
328
  };
329
- //# sourceMappingURL=chunk-SEUZYQGQ.js.map
329
+ //# sourceMappingURL=chunk-ZTJXC3LS.js.map
@@ -0,0 +1,9 @@
1
+ import {
2
+ DailyLogProcessor
3
+ } from "./chunk-ZTJXC3LS.js";
4
+ import "./chunk-YZA4RS76.js";
5
+ import "./chunk-5WRI5ZAA.js";
6
+ export {
7
+ DailyLogProcessor
8
+ };
9
+ //# sourceMappingURL=daily-log-processor-MZW2XBZY.js.map
@@ -0,0 +1,16 @@
1
+ import {
2
+ _resetProvider,
3
+ getProvider
4
+ } from "./chunk-NWNSKALN.js";
5
+ import "./chunk-2I3S2ZLT.js";
6
+ import "./chunk-WNTYA7ER.js";
7
+ import "./chunk-ZTJXC3LS.js";
8
+ import "./chunk-YZA4RS76.js";
9
+ import "./chunk-27S67XW3.js";
10
+ import "./chunk-2E63THNI.js";
11
+ import "./chunk-5WRI5ZAA.js";
12
+ export {
13
+ _resetProvider,
14
+ getProvider
15
+ };
16
+ //# sourceMappingURL=market-provider-6U33TQUT.js.map
@@ -8,11 +8,11 @@ import {
8
8
  syncAllBlocks,
9
9
  syncBlock,
10
10
  upsertSyncMetadata
11
- } from "./chunk-UBUC5A66.js";
12
- import "./chunk-C6LL746C.js";
13
- import "./chunk-AP7IHUUR.js";
14
- import "./chunk-SEUZYQGQ.js";
15
- import "./chunk-6S37CXUA.js";
11
+ } from "./chunk-4HZLVUOZ.js";
12
+ import "./chunk-2I3S2ZLT.js";
13
+ import "./chunk-WNTYA7ER.js";
14
+ import "./chunk-ZTJXC3LS.js";
15
+ import "./chunk-YZA4RS76.js";
16
16
  import "./chunk-27S67XW3.js";
17
17
  import "./chunk-5WRI5ZAA.js";
18
18
  export {
@@ -26,4 +26,4 @@ export {
26
26
  syncBlock,
27
27
  upsertSyncMetadata
28
28
  };
29
- //# sourceMappingURL=sync-EVLKB3ZJ.js.map
29
+ //# sourceMappingURL=sync-3UBC37VW.js.map