@nathanvale/chatline 0.0.1 → 0.0.2-next.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 (213) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/bin/index.js +1 -1
  3. package/dist/index.js +1 -1
  4. package/package.json +1 -1
  5. package/dist/cli/commands/clean.d.ts +0 -17
  6. package/dist/cli/commands/clean.d.ts.map +0 -1
  7. package/dist/cli/commands/clean.js +0 -142
  8. package/dist/cli/commands/clean.js.map +0 -1
  9. package/dist/cli/commands/doctor.d.ts +0 -17
  10. package/dist/cli/commands/doctor.d.ts.map +0 -1
  11. package/dist/cli/commands/doctor.js +0 -202
  12. package/dist/cli/commands/doctor.js.map +0 -1
  13. package/dist/cli/commands/enrich-ai.d.ts +0 -17
  14. package/dist/cli/commands/enrich-ai.d.ts.map +0 -1
  15. package/dist/cli/commands/enrich-ai.js +0 -371
  16. package/dist/cli/commands/enrich-ai.js.map +0 -1
  17. package/dist/cli/commands/index.d.ts +0 -16
  18. package/dist/cli/commands/index.d.ts.map +0 -1
  19. package/dist/cli/commands/index.js +0 -16
  20. package/dist/cli/commands/index.js.map +0 -1
  21. package/dist/cli/commands/ingest-csv.d.ts +0 -17
  22. package/dist/cli/commands/ingest-csv.d.ts.map +0 -1
  23. package/dist/cli/commands/ingest-csv.js +0 -138
  24. package/dist/cli/commands/ingest-csv.js.map +0 -1
  25. package/dist/cli/commands/ingest-db.d.ts +0 -17
  26. package/dist/cli/commands/ingest-db.d.ts.map +0 -1
  27. package/dist/cli/commands/ingest-db.js +0 -159
  28. package/dist/cli/commands/ingest-db.js.map +0 -1
  29. package/dist/cli/commands/init.d.ts +0 -17
  30. package/dist/cli/commands/init.d.ts.map +0 -1
  31. package/dist/cli/commands/init.js +0 -110
  32. package/dist/cli/commands/init.js.map +0 -1
  33. package/dist/cli/commands/normalize-link.d.ts +0 -16
  34. package/dist/cli/commands/normalize-link.d.ts.map +0 -1
  35. package/dist/cli/commands/normalize-link.js +0 -144
  36. package/dist/cli/commands/normalize-link.js.map +0 -1
  37. package/dist/cli/commands/render-markdown.d.ts +0 -17
  38. package/dist/cli/commands/render-markdown.d.ts.map +0 -1
  39. package/dist/cli/commands/render-markdown.js +0 -218
  40. package/dist/cli/commands/render-markdown.js.map +0 -1
  41. package/dist/cli/commands/stats.d.ts +0 -17
  42. package/dist/cli/commands/stats.d.ts.map +0 -1
  43. package/dist/cli/commands/stats.js +0 -175
  44. package/dist/cli/commands/stats.js.map +0 -1
  45. package/dist/cli/commands/validate.d.ts +0 -17
  46. package/dist/cli/commands/validate.d.ts.map +0 -1
  47. package/dist/cli/commands/validate.js +0 -152
  48. package/dist/cli/commands/validate.js.map +0 -1
  49. package/dist/cli/index.d.ts +0 -13
  50. package/dist/cli/index.d.ts.map +0 -1
  51. package/dist/cli/index.js +0 -121
  52. package/dist/cli/index.js.map +0 -1
  53. package/dist/cli/types.d.ts +0 -93
  54. package/dist/cli/types.d.ts.map +0 -1
  55. package/dist/cli/types.js +0 -7
  56. package/dist/cli/types.js.map +0 -1
  57. package/dist/cli/utils.d.ts +0 -29
  58. package/dist/cli/utils.d.ts.map +0 -1
  59. package/dist/cli/utils.js +0 -53
  60. package/dist/cli/utils.js.map +0 -1
  61. package/dist/cli.d.ts +0 -9
  62. package/dist/cli.d.ts.map +0 -1
  63. package/dist/cli.js +0 -1805
  64. package/dist/config/generator.d.ts +0 -90
  65. package/dist/config/generator.d.ts.map +0 -1
  66. package/dist/config/generator.js +0 -320
  67. package/dist/config/generator.js.map +0 -1
  68. package/dist/config/loader.d.ts +0 -107
  69. package/dist/config/loader.d.ts.map +0 -1
  70. package/dist/config/loader.js +0 -251
  71. package/dist/config/loader.js.map +0 -1
  72. package/dist/config/schema.d.ts +0 -107
  73. package/dist/config/schema.d.ts.map +0 -1
  74. package/dist/config/schema.js +0 -169
  75. package/dist/config/schema.js.map +0 -1
  76. package/dist/enrich/audio-transcription.d.ts +0 -77
  77. package/dist/enrich/audio-transcription.d.ts.map +0 -1
  78. package/dist/enrich/audio-transcription.js +0 -370
  79. package/dist/enrich/audio-transcription.js.map +0 -1
  80. package/dist/enrich/checkpoint.d.ts +0 -137
  81. package/dist/enrich/checkpoint.d.ts.map +0 -1
  82. package/dist/enrich/checkpoint.js +0 -205
  83. package/dist/enrich/checkpoint.js.map +0 -1
  84. package/dist/enrich/idempotency.d.ts +0 -90
  85. package/dist/enrich/idempotency.d.ts.map +0 -1
  86. package/dist/enrich/idempotency.js +0 -188
  87. package/dist/enrich/idempotency.js.map +0 -1
  88. package/dist/enrich/image-analysis.d.ts +0 -62
  89. package/dist/enrich/image-analysis.d.ts.map +0 -1
  90. package/dist/enrich/image-analysis.js +0 -264
  91. package/dist/enrich/image-analysis.js.map +0 -1
  92. package/dist/enrich/index.d.ts +0 -60
  93. package/dist/enrich/index.d.ts.map +0 -1
  94. package/dist/enrich/index.js +0 -74
  95. package/dist/enrich/index.js.map +0 -1
  96. package/dist/enrich/link-enrichment.d.ts +0 -37
  97. package/dist/enrich/link-enrichment.d.ts.map +0 -1
  98. package/dist/enrich/link-enrichment.js +0 -202
  99. package/dist/enrich/link-enrichment.js.map +0 -1
  100. package/dist/enrich/pdf-video-handling.d.ts +0 -49
  101. package/dist/enrich/pdf-video-handling.d.ts.map +0 -1
  102. package/dist/enrich/pdf-video-handling.js +0 -325
  103. package/dist/enrich/pdf-video-handling.js.map +0 -1
  104. package/dist/enrich/progress-tracker.d.ts +0 -120
  105. package/dist/enrich/progress-tracker.d.ts.map +0 -1
  106. package/dist/enrich/progress-tracker.js +0 -220
  107. package/dist/enrich/progress-tracker.js.map +0 -1
  108. package/dist/enrich/providers/firecrawl.d.ts +0 -18
  109. package/dist/enrich/providers/firecrawl.d.ts.map +0 -1
  110. package/dist/enrich/providers/firecrawl.js +0 -48
  111. package/dist/enrich/providers/firecrawl.js.map +0 -1
  112. package/dist/enrich/providers/generic.d.ts +0 -16
  113. package/dist/enrich/providers/generic.d.ts.map +0 -1
  114. package/dist/enrich/providers/generic.js +0 -36
  115. package/dist/enrich/providers/generic.js.map +0 -1
  116. package/dist/enrich/providers/index.d.ts +0 -14
  117. package/dist/enrich/providers/index.d.ts.map +0 -1
  118. package/dist/enrich/providers/index.js +0 -13
  119. package/dist/enrich/providers/index.js.map +0 -1
  120. package/dist/enrich/providers/instagram.d.ts +0 -16
  121. package/dist/enrich/providers/instagram.d.ts.map +0 -1
  122. package/dist/enrich/providers/instagram.js +0 -43
  123. package/dist/enrich/providers/instagram.js.map +0 -1
  124. package/dist/enrich/providers/spotify.d.ts +0 -16
  125. package/dist/enrich/providers/spotify.d.ts.map +0 -1
  126. package/dist/enrich/providers/spotify.js +0 -45
  127. package/dist/enrich/providers/spotify.js.map +0 -1
  128. package/dist/enrich/providers/twitter.d.ts +0 -16
  129. package/dist/enrich/providers/twitter.d.ts.map +0 -1
  130. package/dist/enrich/providers/twitter.js +0 -43
  131. package/dist/enrich/providers/twitter.js.map +0 -1
  132. package/dist/enrich/providers/types.d.ts +0 -47
  133. package/dist/enrich/providers/types.d.ts.map +0 -1
  134. package/dist/enrich/providers/types.js +0 -15
  135. package/dist/enrich/providers/types.js.map +0 -1
  136. package/dist/enrich/providers/youtube.d.ts +0 -16
  137. package/dist/enrich/providers/youtube.d.ts.map +0 -1
  138. package/dist/enrich/providers/youtube.js +0 -43
  139. package/dist/enrich/providers/youtube.js.map +0 -1
  140. package/dist/enrich/rate-limiting.d.ts +0 -118
  141. package/dist/enrich/rate-limiting.d.ts.map +0 -1
  142. package/dist/enrich/rate-limiting.js +0 -258
  143. package/dist/enrich/rate-limiting.js.map +0 -1
  144. package/dist/index.d.ts.map +0 -1
  145. package/dist/index.js.map +0 -1
  146. package/dist/ingest/dedup-merge.d.ts +0 -82
  147. package/dist/ingest/dedup-merge.d.ts.map +0 -1
  148. package/dist/ingest/dedup-merge.js +0 -262
  149. package/dist/ingest/dedup-merge.js.map +0 -1
  150. package/dist/ingest/ingest-csv.d.ts +0 -62
  151. package/dist/ingest/ingest-csv.d.ts.map +0 -1
  152. package/dist/ingest/ingest-csv.js +0 -300
  153. package/dist/ingest/ingest-csv.js.map +0 -1
  154. package/dist/ingest/ingest-db.d.ts +0 -64
  155. package/dist/ingest/ingest-db.d.ts.map +0 -1
  156. package/dist/ingest/ingest-db.js +0 -172
  157. package/dist/ingest/ingest-db.js.map +0 -1
  158. package/dist/ingest/link-replies-and-tapbacks.d.ts +0 -53
  159. package/dist/ingest/link-replies-and-tapbacks.d.ts.map +0 -1
  160. package/dist/ingest/link-replies-and-tapbacks.js +0 -381
  161. package/dist/ingest/link-replies-and-tapbacks.js.map +0 -1
  162. package/dist/normalize/date-converters.d.ts +0 -45
  163. package/dist/normalize/date-converters.d.ts.map +0 -1
  164. package/dist/normalize/date-converters.js +0 -166
  165. package/dist/normalize/date-converters.js.map +0 -1
  166. package/dist/normalize/path-validator.d.ts +0 -65
  167. package/dist/normalize/path-validator.d.ts.map +0 -1
  168. package/dist/normalize/path-validator.js +0 -221
  169. package/dist/normalize/path-validator.js.map +0 -1
  170. package/dist/normalize/validate-normalized.d.ts +0 -45
  171. package/dist/normalize/validate-normalized.d.ts.map +0 -1
  172. package/dist/normalize/validate-normalized.js +0 -144
  173. package/dist/normalize/validate-normalized.js.map +0 -1
  174. package/dist/render/embeds-blockquotes.d.ts +0 -84
  175. package/dist/render/embeds-blockquotes.d.ts.map +0 -1
  176. package/dist/render/embeds-blockquotes.js +0 -204
  177. package/dist/render/embeds-blockquotes.js.map +0 -1
  178. package/dist/render/grouping.d.ts +0 -78
  179. package/dist/render/grouping.d.ts.map +0 -1
  180. package/dist/render/grouping.js +0 -134
  181. package/dist/render/grouping.js.map +0 -1
  182. package/dist/render/index.d.ts +0 -47
  183. package/dist/render/index.d.ts.map +0 -1
  184. package/dist/render/index.js +0 -245
  185. package/dist/render/index.js.map +0 -1
  186. package/dist/render/reply-rendering.d.ts +0 -88
  187. package/dist/render/reply-rendering.d.ts.map +0 -1
  188. package/dist/render/reply-rendering.js +0 -196
  189. package/dist/render/reply-rendering.js.map +0 -1
  190. package/dist/schema/message.d.ts +0 -125
  191. package/dist/schema/message.d.ts.map +0 -1
  192. package/dist/schema/message.js +0 -331
  193. package/dist/schema/message.js.map +0 -1
  194. package/dist/utils/delta-detection.d.ts +0 -107
  195. package/dist/utils/delta-detection.d.ts.map +0 -1
  196. package/dist/utils/delta-detection.js +0 -199
  197. package/dist/utils/delta-detection.js.map +0 -1
  198. package/dist/utils/enrichment-merge.d.ts +0 -135
  199. package/dist/utils/enrichment-merge.d.ts.map +0 -1
  200. package/dist/utils/enrichment-merge.js +0 -280
  201. package/dist/utils/enrichment-merge.js.map +0 -1
  202. package/dist/utils/human.d.ts +0 -15
  203. package/dist/utils/human.d.ts.map +0 -1
  204. package/dist/utils/human.js +0 -27
  205. package/dist/utils/human.js.map +0 -1
  206. package/dist/utils/incremental-state.d.ts +0 -133
  207. package/dist/utils/incremental-state.d.ts.map +0 -1
  208. package/dist/utils/incremental-state.js +0 -237
  209. package/dist/utils/incremental-state.js.map +0 -1
  210. package/dist/utils/logger.d.ts +0 -40
  211. package/dist/utils/logger.d.ts.map +0 -1
  212. package/dist/utils/logger.js +0 -176
  213. package/dist/utils/logger.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-replies-and-tapbacks.js","sourceRoot":"","sources":["../../src/ingest/link-replies-and-tapbacks.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- /**
2
- * AC02: Convert Apple epoch (seconds since 2001-01-01 UTC) to ISO 8601 UTC string
3
- * @param appleEpochSeconds - Seconds since 2001-01-01 00:00:00 UTC (may have fractional part)
4
- * @returns ISO 8601 UTC string with Z suffix (e.g., "2001-01-01T00:00:00.000Z")
5
- */
6
- export declare function convertAppleEpochToUTC(appleEpochSeconds: number): string;
7
- /**
8
- * AC01 & AC03: Normalize CSV UTC timestamp to ISO 8601 with Z suffix
9
- * Preserves timezone information and ensures consistent format
10
- * @param csvDate - CSV timestamp (typically already UTC with Z suffix)
11
- * @returns Normalized ISO 8601 UTC string with Z suffix
12
- */
13
- export declare function normalizeCSVDate(csvDate: string): string;
14
- /**
15
- * AC01: Validate date format is ISO 8601 UTC with Z suffix
16
- * Strict validation rejects malformed dates and non-UTC timezones
17
- * @param dateString - Date string to validate
18
- * @returns Object with valid flag and optional error message
19
- */
20
- export declare function validateDateFormat(dateString: string): {
21
- valid: boolean;
22
- error?: string;
23
- };
24
- /**
25
- * AC04: Detect timezone drift between two timestamps
26
- * Returns true if timestamps differ by more than a reasonable margin
27
- * @param original - Original timestamp
28
- * @param converted - Converted/processed timestamp
29
- * @returns true if drift detected (timestamps differ significantly)
30
- */
31
- export declare function detectTimezoneDrift(original: string, converted: string): boolean;
32
- /**
33
- * AC04: End-to-end round-trip validation
34
- * Validates that a date can be parsed, normalized, and validated without drift
35
- * @param dateString - Input date string
36
- * @returns Validation result with drift detection
37
- */
38
- export declare function roundTripDateValidation(dateString: string): {
39
- valid: boolean;
40
- driftDetected: boolean;
41
- input: string;
42
- normalized: string;
43
- error?: string;
44
- };
45
- //# sourceMappingURL=date-converters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"date-converters.d.ts","sourceRoot":"","sources":["../../src/normalize/date-converters.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAOxE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWxD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG;IACvD,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACd,CAoEA;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GACf,OAAO,CAST;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG;IAC5D,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,EAAE,OAAO,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACd,CAwDA"}
@@ -1,166 +0,0 @@
1
- // src/normalize/date-converters.ts
2
- // Apple epoch and CSV UTC converters with end-to-end validation
3
- // Spec §13: Dates & Timezones, Risks & Mitigations
4
- /**
5
- * Apple epoch constant: seconds since 2001-01-01 00:00:00 UTC
6
- * Used by macOS for timestamps
7
- */
8
- const APPLE_EPOCH_SECONDS = 978_307_200;
9
- /**
10
- * AC02: Convert Apple epoch (seconds since 2001-01-01 UTC) to ISO 8601 UTC string
11
- * @param appleEpochSeconds - Seconds since 2001-01-01 00:00:00 UTC (may have fractional part)
12
- * @returns ISO 8601 UTC string with Z suffix (e.g., "2001-01-01T00:00:00.000Z")
13
- */
14
- export function convertAppleEpochToUTC(appleEpochSeconds) {
15
- // Convert Apple epoch seconds to Unix epoch milliseconds
16
- const unixMs = (appleEpochSeconds + APPLE_EPOCH_SECONDS) * 1000;
17
- // Create date and convert to ISO 8601 UTC
18
- const date = new Date(unixMs);
19
- return date.toISOString();
20
- }
21
- /**
22
- * AC01 & AC03: Normalize CSV UTC timestamp to ISO 8601 with Z suffix
23
- * Preserves timezone information and ensures consistent format
24
- * @param csvDate - CSV timestamp (typically already UTC with Z suffix)
25
- * @returns Normalized ISO 8601 UTC string with Z suffix
26
- */
27
- export function normalizeCSVDate(csvDate) {
28
- // Parse the CSV date string
29
- const date = new Date(csvDate);
30
- // Check if parse was successful
31
- if (Number.isNaN(date.getTime())) {
32
- throw new Error(`Invalid CSV date format: ${csvDate}`);
33
- }
34
- // Return ISO 8601 UTC string with Z suffix
35
- return date.toISOString();
36
- }
37
- /**
38
- * AC01: Validate date format is ISO 8601 UTC with Z suffix
39
- * Strict validation rejects malformed dates and non-UTC timezones
40
- * @param dateString - Date string to validate
41
- * @returns Object with valid flag and optional error message
42
- */
43
- export function validateDateFormat(dateString) {
44
- // Check if empty or whitespace
45
- if (!dateString || typeof dateString !== 'string' || !dateString.trim()) {
46
- return { valid: false, error: 'Date string is empty or whitespace' };
47
- }
48
- // Check for Z suffix
49
- if (!dateString.endsWith('Z')) {
50
- return { valid: false, error: 'Date must end with Z suffix (UTC)' };
51
- }
52
- // Check for timezone offset (should not be present)
53
- if (dateString.includes('+') || dateString.match(/-\d{2}:\d{2}$/)) {
54
- return { valid: false, error: 'Date must be UTC only (no timezone offset)' };
55
- }
56
- // ISO 8601 requires T separator, not space
57
- if (dateString.includes(' ')) {
58
- return {
59
- valid: false,
60
- error: 'Date must use T separator (ISO 8601), not space',
61
- };
62
- }
63
- // Strict ISO 8601 format check: YYYY-MM-DDTHH:mm:ss.sssZ
64
- const iso8601Regex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/;
65
- if (!iso8601Regex.test(dateString)) {
66
- return {
67
- valid: false,
68
- error: 'Date must match ISO 8601 format (YYYY-MM-DDTHH:mm:ss[.sss]Z)',
69
- };
70
- }
71
- // Attempt to parse
72
- const date = new Date(dateString);
73
- if (Number.isNaN(date.getTime())) {
74
- return { valid: false, error: 'Invalid ISO 8601 date format' };
75
- }
76
- // Validate the date is actually valid (e.g., Feb 29 in non-leap year)
77
- // Re-stringify and compare to ensure components match
78
- const isoString = date.toISOString();
79
- // Extract components from original and reformed
80
- const originalParts = dateString.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/);
81
- const reformedParts = isoString.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/);
82
- if (!originalParts || !reformedParts) {
83
- return { valid: false, error: 'Failed to parse date components' };
84
- }
85
- // Check year, month, day, hour, minute, second match
86
- // If they don't match, it means the date was invalid (like Feb 30)
87
- for (let i = 1; i <= 6; i++) {
88
- if (originalParts[i] !== reformedParts[i]) {
89
- return {
90
- valid: false,
91
- error: `Invalid date values: component mismatch at index ${i}`,
92
- };
93
- }
94
- }
95
- return { valid: true };
96
- }
97
- /**
98
- * AC04: Detect timezone drift between two timestamps
99
- * Returns true if timestamps differ by more than a reasonable margin
100
- * @param original - Original timestamp
101
- * @param converted - Converted/processed timestamp
102
- * @returns true if drift detected (timestamps differ significantly)
103
- */
104
- export function detectTimezoneDrift(original, converted) {
105
- const origTime = new Date(original).getTime();
106
- const convTime = new Date(converted).getTime();
107
- // Allow 1 second tolerance for rounding/processing differences
108
- const toleranceMs = 1000;
109
- const diffMs = Math.abs(origTime - convTime);
110
- return diffMs > toleranceMs;
111
- }
112
- /**
113
- * AC04: End-to-end round-trip validation
114
- * Validates that a date can be parsed, normalized, and validated without drift
115
- * @param dateString - Input date string
116
- * @returns Validation result with drift detection
117
- */
118
- export function roundTripDateValidation(dateString) {
119
- try {
120
- // Step 1: Validate original format
121
- const formatValidation = validateDateFormat(dateString);
122
- if (!formatValidation.valid) {
123
- const result = {
124
- valid: false,
125
- driftDetected: false,
126
- input: dateString,
127
- normalized: '',
128
- };
129
- if (formatValidation.error) {
130
- result.error = formatValidation.error;
131
- }
132
- return result;
133
- }
134
- // Step 2: Normalize (re-parse to ensure consistent formatting)
135
- const normalized = normalizeCSVDate(dateString);
136
- // Step 3: Validate normalized format
137
- const normalizedValidation = validateDateFormat(normalized);
138
- if (!normalizedValidation.valid) {
139
- return {
140
- valid: false,
141
- driftDetected: false,
142
- input: dateString,
143
- normalized,
144
- error: `Normalized date failed validation: ${normalizedValidation.error}`,
145
- };
146
- }
147
- // Step 4: Detect drift
148
- const driftDetected = detectTimezoneDrift(dateString, normalized);
149
- return {
150
- valid: true,
151
- driftDetected,
152
- input: dateString,
153
- normalized,
154
- };
155
- }
156
- catch (error) {
157
- return {
158
- valid: false,
159
- driftDetected: false,
160
- input: dateString,
161
- normalized: '',
162
- error: error instanceof Error ? error.message : 'Unknown error',
163
- };
164
- }
165
- }
166
- //# sourceMappingURL=date-converters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"date-converters.js","sourceRoot":"","sources":["../../src/normalize/date-converters.ts"],"names":[],"mappings":"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"}
@@ -1,65 +0,0 @@
1
- import type { MediaProvenance, Message } from '../schema/message';
2
- export type PathValidationConfig = {
3
- attachmentRoots: string[];
4
- source: 'csv' | 'db' | 'merged';
5
- };
6
- export type PathValidationStats = {
7
- total: number;
8
- found: number;
9
- missing: number;
10
- notAbsolute: number;
11
- errors: Array<{
12
- guid: string;
13
- filename: string;
14
- error: string;
15
- }>;
16
- };
17
- export type PathValidationResult = {
18
- messages: Message[];
19
- stats: PathValidationStats;
20
- };
21
- /**
22
- * Validate that a path is absolute (starts with /)
23
- * AC01: All media.path fields are absolute paths when files exist on disk
24
- */
25
- export declare function isAbsolutePath(filePath: string | null | undefined): boolean;
26
- /**
27
- * Check if a file exists on the filesystem
28
- */
29
- export declare function fileExists(filePath: string | null | undefined): boolean;
30
- /**
31
- * Expand tilde in paths to home directory
32
- */
33
- export declare function expandTildeInPath(filePath: string): string;
34
- /**
35
- * Search for an attachment file in configured root directories
36
- * AC04: Support multiple attachment root directories from config
37
- * Tries multiple strategies:
38
- * 1. If filename is absolute and exists, return it
39
- * 2. Try direct join of root + filename
40
- * 3. Search for basename in root
41
- */
42
- export declare function searchAttachmentInRoots(filename: string, attachmentRoots: string[]): string | null;
43
- /**
44
- * Infer the source (csv/db) from message metadata or GUID pattern
45
- */
46
- export declare function inferSource(message: Message, defaultSource: 'csv' | 'db' | 'merged'): 'csv' | 'db';
47
- /**
48
- * Create provenance metadata for a media file
49
- * AC02: Missing files retain original filename with provenance metadata
50
- */
51
- export declare function createProvenance(message: Message, source: 'csv' | 'db' | 'merged'): MediaProvenance;
52
- /**
53
- * Validate and enforce absolute paths for all media messages
54
- *
55
- * AC01: All media.path fields are absolute paths when files exist on disk
56
- * AC02: Missing files retain original filename with provenance metadata
57
- * AC03: Path validation errors reported with counters (found vs missing)
58
- * AC04: Support multiple attachment root directories from config
59
- */
60
- export declare function validateAndEnforcePaths(messages: Message[], config: PathValidationConfig): PathValidationResult;
61
- /**
62
- * Format path validation statistics as human-readable string for logging
63
- */
64
- export declare function formatPathValidationStats(stats: PathValidationStats): string;
65
- //# sourceMappingURL=path-validator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-validator.d.ts","sourceRoot":"","sources":["../../src/normalize/path-validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAIjE,MAAM,MAAM,oBAAoB,GAAG;IAClC,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,EAAE,MAAM,CAAA;KACb,CAAC,CAAA;CACF,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,KAAK,EAAE,mBAAmB,CAAA;CAC1B,CAAA;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAK3E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CASvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EAAE,GACvB,MAAM,GAAG,IAAI,CA4Bf;AAED;;GAEG;AACH,wBAAgB,WAAW,CAC1B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,KAAK,GAAG,IAAI,GAAG,QAAQ,GACpC,KAAK,GAAG,IAAI,CAqBd;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,KAAK,GAAG,IAAI,GAAG,QAAQ,GAC7B,eAAe,CAOjB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,oBAAoB,GAC1B,oBAAoB,CA8FtB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,mBAAmB,GAAG,MAAM,CAoB5E"}
@@ -1,221 +0,0 @@
1
- import { existsSync } from 'node:fs';
2
- import * as os from 'node:os';
3
- import * as path from 'node:path';
4
- /**
5
- * Validate that a path is absolute (starts with /)
6
- * AC01: All media.path fields are absolute paths when files exist on disk
7
- */
8
- export function isAbsolutePath(filePath) {
9
- if (!filePath || typeof filePath !== 'string') {
10
- return false;
11
- }
12
- return filePath.startsWith('/');
13
- }
14
- /**
15
- * Check if a file exists on the filesystem
16
- */
17
- export function fileExists(filePath) {
18
- if (!filePath || typeof filePath !== 'string') {
19
- return false;
20
- }
21
- try {
22
- return existsSync(filePath);
23
- }
24
- catch {
25
- return false;
26
- }
27
- }
28
- /**
29
- * Expand tilde in paths to home directory
30
- */
31
- export function expandTildeInPath(filePath) {
32
- if (filePath.startsWith('~')) {
33
- return filePath.replace('~', os.homedir());
34
- }
35
- return filePath;
36
- }
37
- /**
38
- * Search for an attachment file in configured root directories
39
- * AC04: Support multiple attachment root directories from config
40
- * Tries multiple strategies:
41
- * 1. If filename is absolute and exists, return it
42
- * 2. Try direct join of root + filename
43
- * 3. Search for basename in root
44
- */
45
- export function searchAttachmentInRoots(filename, attachmentRoots) {
46
- if (!filename || attachmentRoots.length === 0) {
47
- return null;
48
- }
49
- for (const root of attachmentRoots) {
50
- // Expand tilde in root directory
51
- const expandedRoot = expandTildeInPath(root);
52
- // Try direct file join
53
- const directPath = path.join(expandedRoot, filename);
54
- if (fileExists(directPath)) {
55
- return directPath;
56
- }
57
- // Try basename matching (file in any subdirectory of root)
58
- try {
59
- const basename = path.basename(filename);
60
- const basenameOnly = path.join(expandedRoot, basename);
61
- if (fileExists(basenameOnly)) {
62
- return basenameOnly;
63
- }
64
- }
65
- catch {
66
- // Continue to next root
67
- }
68
- }
69
- return null;
70
- }
71
- /**
72
- * Infer the source (csv/db) from message metadata or GUID pattern
73
- */
74
- export function inferSource(message, defaultSource) {
75
- // Check guid pattern
76
- if (message.guid?.startsWith('p:')) {
77
- // Part GUID format: p:index/guid
78
- return 'db';
79
- }
80
- if (message.guid?.startsWith('csv:')) {
81
- return 'csv';
82
- }
83
- // Check if there's explicit metadata
84
- const msgWithMeta = message;
85
- if (msgWithMeta.exportMetadata?.source === 'csv') {
86
- return 'csv';
87
- }
88
- if (msgWithMeta.exportMetadata?.source === 'db') {
89
- return 'db';
90
- }
91
- // Default fallback
92
- return defaultSource === 'csv' ? 'csv' : 'db';
93
- }
94
- /**
95
- * Create provenance metadata for a media file
96
- * AC02: Missing files retain original filename with provenance metadata
97
- */
98
- export function createProvenance(message, source) {
99
- const now = new Date().toISOString();
100
- return {
101
- source: source,
102
- lastSeen: message.date,
103
- resolvedAt: now,
104
- };
105
- }
106
- /**
107
- * Validate and enforce absolute paths for all media messages
108
- *
109
- * AC01: All media.path fields are absolute paths when files exist on disk
110
- * AC02: Missing files retain original filename with provenance metadata
111
- * AC03: Path validation errors reported with counters (found vs missing)
112
- * AC04: Support multiple attachment root directories from config
113
- */
114
- export function validateAndEnforcePaths(messages, config) {
115
- const result = {
116
- messages: [],
117
- stats: {
118
- total: 0,
119
- found: 0,
120
- missing: 0,
121
- notAbsolute: 0,
122
- errors: [],
123
- },
124
- };
125
- for (const message of messages) {
126
- // Only process media messages
127
- if (message.messageKind !== 'media' || !message.media) {
128
- result.messages.push(message);
129
- continue;
130
- }
131
- const updatedMessage = { ...message };
132
- const media = { ...message.media };
133
- result.stats.total++;
134
- let resolvedPath = media.path;
135
- let pathAbsolute = isAbsolutePath(resolvedPath);
136
- let pathExists = fileExists(resolvedPath);
137
- // If path is not absolute, try to resolve it
138
- if (!pathAbsolute && resolvedPath) {
139
- // Try expanding tilde
140
- const expanded = expandTildeInPath(resolvedPath);
141
- if (fileExists(expanded)) {
142
- resolvedPath = expanded;
143
- pathAbsolute = true;
144
- pathExists = true;
145
- }
146
- }
147
- // If still not absolute, try searching in attachment roots
148
- if (!pathAbsolute && media.filename) {
149
- const found = searchAttachmentInRoots(media.filename, config.attachmentRoots);
150
- if (found) {
151
- resolvedPath = found;
152
- pathAbsolute = true;
153
- pathExists = true;
154
- }
155
- }
156
- // Update statistics and path
157
- if (pathAbsolute && pathExists) {
158
- result.stats.found++;
159
- media.path = resolvedPath;
160
- }
161
- else if (pathAbsolute && !pathExists) {
162
- // Path is absolute but file not found
163
- result.stats.missing++;
164
- const error = `File not found at path: ${resolvedPath}`;
165
- result.stats.errors.push({
166
- guid: message.guid,
167
- filename: media.filename,
168
- error,
169
- });
170
- }
171
- else if (!pathAbsolute) {
172
- // Path is not absolute
173
- result.stats.notAbsolute++;
174
- const error = `Path is not absolute: ${resolvedPath || '(empty)'}`;
175
- result.stats.errors.push({
176
- guid: message.guid,
177
- filename: media.filename,
178
- error,
179
- });
180
- }
181
- else {
182
- // Unknown state
183
- result.stats.missing++;
184
- const error = 'Could not resolve path';
185
- result.stats.errors.push({
186
- guid: message.guid,
187
- filename: media.filename,
188
- error,
189
- });
190
- }
191
- // AC02: Add provenance metadata
192
- const _source = inferSource(message, config.source);
193
- media.provenance = createProvenance(message, config.source);
194
- updatedMessage.media = media;
195
- result.messages.push(updatedMessage);
196
- }
197
- return result;
198
- }
199
- /**
200
- * Format path validation statistics as human-readable string for logging
201
- */
202
- export function formatPathValidationStats(stats) {
203
- const lines = [
204
- '📁 Path Validation Report',
205
- ` Total media files: ${stats.total}`,
206
- ` ✓ Found (absolute & exists): ${stats.found}`,
207
- ` ✗ Missing (absolute but no file): ${stats.missing}`,
208
- ` ⚠ Not absolute: ${stats.notAbsolute}`,
209
- ];
210
- if (stats.errors.length > 0) {
211
- lines.push(` Errors (${stats.errors.length}):`);
212
- stats.errors.slice(0, 5).forEach((err) => {
213
- lines.push(` - ${err.filename} (${err.guid}): ${err.error}`);
214
- });
215
- if (stats.errors.length > 5) {
216
- lines.push(` ... and ${stats.errors.length - 5} more`);
217
- }
218
- }
219
- return lines.join('\n');
220
- }
221
- //# sourceMappingURL=path-validator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"path-validator.js","sourceRoot":"","sources":["../../src/normalize/path-validator.ts"],"names":[],"mappings":"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"}
@@ -1,45 +0,0 @@
1
- import type { ZodIssue } from 'zod';
2
- import type { Message } from '../schema/message';
3
- export type ValidationError = {
4
- index: number;
5
- fieldPath: string;
6
- message: string;
7
- };
8
- /**
9
- * AC01: Validate all normalized messages against MessageSchema
10
- * AC02: Include field paths in error messages
11
- * AC03: Batch validation - collect all errors before throwing
12
- * @param messages - Array of messages to validate
13
- * @returns Array of validated messages if all pass
14
- * @throws Error with formatted error messages if any validation fails
15
- */
16
- export declare function validateNormalizedMessages(messages: unknown[]): Message[];
17
- /**
18
- * AC02: Format Zod validation errors with field paths
19
- * Converts Zod error array into readable messages with paths
20
- * @param messageIndex - Index of the message in the array
21
- * @param zodErrors - Zod validation errors
22
- * @returns Formatted error message string
23
- */
24
- export declare function formatValidationErrors(_messageIndex: number, zodErrors: ZodIssue[]): string;
25
- /**
26
- * AC04: Detect if message has snake_case fields
27
- * Recursively checks for snake_case field names
28
- * @param obj - Object to check
29
- * @returns true if any snake_case fields found
30
- */
31
- export declare function hasSnakeCaseFields(obj: unknown, depth?: number): boolean;
32
- /**
33
- * Get all snake_case fields in an object (for error reporting)
34
- * @param obj - Object to check
35
- * @returns Array of field names that use snake_case
36
- */
37
- export declare function getSnakeCaseFields(obj: unknown, prefix?: string, depth?: number): string[];
38
- /**
39
- * AC03: Collect validation errors from multiple messages
40
- * Helper to aggregate errors with message index
41
- * @param errorList - List of validation errors
42
- * @returns Formatted error messages with indices
43
- */
44
- export declare function collectValidationErrors(errorList: ValidationError[]): string[];
45
- //# sourceMappingURL=validate-normalized.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate-normalized.d.ts","sourceRoot":"","sources":["../../src/normalize/validate-normalized.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAGhD,MAAM,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAuDzE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACrC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,QAAQ,EAAE,GACnB,MAAM,CAeR;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,OAAO,CAsBnE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,GAAG,EAAE,OAAO,EACZ,MAAM,SAAK,EACX,KAAK,SAAI,GACP,MAAM,EAAE,CAuBV;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACtC,SAAS,EAAE,eAAe,EAAE,GAC1B,MAAM,EAAE,CAIV"}