@nathanvale/chatline 0.0.1 → 0.0.2-next.0

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 +6 -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,251 +0,0 @@
1
- /**
2
- * Configuration Loader for iMessage Timeline
3
- *
4
- * Implements CONFIG--T02: Implement Config Loader
5
- * Loads config from YAML/JSON files with env var substitution and precedence
6
- */
7
- import { constants } from 'node:fs';
8
- import { access, readFile } from 'node:fs/promises';
9
- import yaml from 'js-yaml';
10
- import { detectConfigFormat, validateConfig } from './schema.js';
11
- /**
12
- * In-memory cache for loaded configurations
13
- * CONFIG-T02-AC05: Cache loaded config to avoid repeated file reads
14
- */
15
- let configCache = null;
16
- let configCachePath = null;
17
- /**
18
- * CONFIG-T02-AC01: Discover config file in directory
19
- *
20
- * Checks files in order:
21
- * 1. imessage-config.yaml
22
- * 2. imessage-config.yml
23
- * 3. imessage-config.json
24
- *
25
- * @param baseDir - Directory to search in (defaults to current directory)
26
- * @returns Path to first existing config file, or null if none found
27
- */
28
- export async function discoverConfigFile(baseDir = process.cwd()) {
29
- const fileNames = [
30
- 'imessage-config.yaml',
31
- 'imessage-config.yml',
32
- 'imessage-config.json',
33
- ];
34
- for (const fileName of fileNames) {
35
- const filePath = baseDir.startsWith('/')
36
- ? `${baseDir}/${fileName}`
37
- : `./${baseDir}/${fileName}`.replace(/\/\.\//g, '/');
38
- try {
39
- await access(filePath, constants.R_OK);
40
- return filePath;
41
- }
42
- catch {
43
- // File doesn't exist or not readable, try next
44
- }
45
- }
46
- return null;
47
- }
48
- /**
49
- * CONFIG-T02-AC01: Load and parse config file
50
- *
51
- * Supports JSON and YAML formats with auto-detection
52
- *
53
- * @param filePath - Path to config file
54
- * @returns Parsed config object (unvalidated)
55
- * @throws Error if file cannot be read or parsed
56
- */
57
- export async function loadConfigFile(filePath) {
58
- const content = await readFile(filePath, 'utf-8');
59
- const format = detectConfigFormat(filePath);
60
- if (format === 'json') {
61
- try {
62
- return JSON.parse(content);
63
- }
64
- catch (error) {
65
- throw new Error(`Failed to parse JSON config file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
66
- }
67
- }
68
- else if (format === 'yaml') {
69
- try {
70
- // js-yaml v4+ is safe by default - use JSON_SCHEMA for extra safety
71
- return yaml.load(content, { schema: yaml.JSON_SCHEMA });
72
- }
73
- catch (error) {
74
- throw new Error(`Failed to parse YAML config file ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
75
- }
76
- }
77
- throw new Error(`Unsupported config format: ${filePath}`);
78
- }
79
- /**
80
- * CONFIG-T02-AC03: Substitute environment variables in config
81
- *
82
- * Recursively replaces ${VAR_NAME} patterns with environment variable values
83
- *
84
- * @param obj - Config object (or primitive)
85
- * @returns Object with env vars substituted
86
- *
87
- * @example
88
- * ```typescript
89
- * // With process.env.GEMINI_API_KEY = 'secret123'
90
- * substituteEnvVars({ apiKey: '${GEMINI_API_KEY}' })
91
- * // => { apiKey: 'secret123' }
92
- * ```
93
- */
94
- export function substituteEnvVars(obj) {
95
- // Handle strings - replace ${VAR} patterns
96
- if (typeof obj === 'string') {
97
- return obj.replace(/\$\{(\w+)\}/g, (_match, envVar) => {
98
- const value = process.env[envVar];
99
- if (value === undefined) {
100
- throw new Error(`Environment variable ${envVar} is not set but referenced in config`);
101
- }
102
- return value;
103
- });
104
- }
105
- // Handle arrays - recursively substitute each element
106
- if (Array.isArray(obj)) {
107
- return obj.map(substituteEnvVars);
108
- }
109
- // Handle objects - recursively substitute each value
110
- if (typeof obj === 'object' && obj !== null) {
111
- return Object.fromEntries(Object.entries(obj).map(([key, value]) => [
112
- key,
113
- substituteEnvVars(value),
114
- ]));
115
- }
116
- // Primitives (numbers, booleans, null) pass through unchanged
117
- return obj;
118
- }
119
- /**
120
- * CONFIG-T02-AC02: Merge configuration with precedence
121
- *
122
- * Precedence (highest to lowest):
123
- * 1. CLI options
124
- * 2. Config file
125
- * 3. Defaults (applied by Zod schema)
126
- *
127
- * @param fileConfig - Config loaded from file
128
- * @param cliOptions - Options from CLI flags
129
- * @returns Merged config object
130
- */
131
- export function mergeConfig(fileConfig, cliOptions = {}) {
132
- // Deep merge: CLI options override file config
133
- // Note: Zod schema will apply defaults for missing fields
134
- const merged = {
135
- ...fileConfig,
136
- ...cliOptions,
137
- };
138
- // Deep merge nested objects if they exist
139
- if (fileConfig.gemini || cliOptions.gemini) {
140
- merged.gemini = {
141
- ...fileConfig.gemini,
142
- ...cliOptions.gemini,
143
- // biome-ignore lint/suspicious/noExplicitAny: Zod schema mismatch with spread
144
- };
145
- }
146
- if (cliOptions.firecrawl !== undefined) {
147
- merged.firecrawl = cliOptions.firecrawl;
148
- }
149
- else if (fileConfig.firecrawl !== undefined) {
150
- merged.firecrawl = fileConfig.firecrawl;
151
- }
152
- if (fileConfig.enrichment || cliOptions.enrichment) {
153
- merged.enrichment = {
154
- ...fileConfig.enrichment,
155
- ...cliOptions.enrichment,
156
- // biome-ignore lint/suspicious/noExplicitAny: Zod schema mismatch with spread
157
- };
158
- }
159
- if (fileConfig.render || cliOptions.render) {
160
- merged.render = {
161
- ...fileConfig.render,
162
- ...cliOptions.render,
163
- // biome-ignore lint/suspicious/noExplicitAny: Zod schema mismatch with spread
164
- };
165
- }
166
- return merged;
167
- }
168
- /**
169
- * CONFIG-T02: Main config loading function
170
- *
171
- * Loads configuration with the following precedence:
172
- * 1. CLI options (highest priority)
173
- * 2. Config file
174
- * 3. Defaults from schema (lowest priority)
175
- *
176
- * @param options - Loading options
177
- * @param options.configPath - Explicit config file path (optional)
178
- * @param options.cliOptions - CLI options to merge (optional)
179
- * @param options.skipCache - Force reload even if cached (optional)
180
- * @returns Validated and merged configuration
181
- * @throws Error if config is invalid or cannot be loaded
182
- *
183
- * @example
184
- * ```typescript
185
- * // Load with auto-discovery
186
- * const config = await loadConfig()
187
- *
188
- * // Load specific file
189
- * const config = await loadConfig({ configPath: './custom-config.yaml' })
190
- *
191
- * // Override with CLI options
192
- * const config = await loadConfig({
193
- * cliOptions: {
194
- * gemini: { apiKey: 'override-key' }
195
- * }
196
- * })
197
- * ```
198
- */
199
- export async function loadConfig(options = {}) {
200
- const { configPath, cliOptions = {}, skipCache = false } = options;
201
- // CONFIG-T02-AC05: Return cached config if available
202
- if (!skipCache && configCache && configCachePath === configPath) {
203
- return configCache;
204
- }
205
- // 1. Discover or use provided config file path
206
- const filePath = configPath || (await discoverConfigFile());
207
- // 2. Load config from file (if exists)
208
- let fileConfig = {};
209
- if (filePath) {
210
- try {
211
- const rawConfig = await loadConfigFile(filePath);
212
- // 3. CONFIG-T02-AC03: Substitute environment variables
213
- const withEnvVars = substituteEnvVars(rawConfig);
214
- fileConfig = withEnvVars;
215
- }
216
- catch (error) {
217
- throw new Error(`Failed to load config from ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
218
- }
219
- }
220
- // 4. CONFIG-T02-AC02: Merge with CLI options (CLI > file)
221
- const merged = mergeConfig(fileConfig, cliOptions);
222
- // 5. CONFIG-T02-AC04: Validate with schema and apply defaults
223
- try {
224
- const validated = validateConfig(merged);
225
- // Cache the result
226
- configCache = validated;
227
- configCachePath = configPath || null;
228
- return validated;
229
- }
230
- catch (error) {
231
- throw new Error(`Config validation failed: ${error instanceof Error ? error.message : String(error)}`);
232
- }
233
- }
234
- /**
235
- * Clear the config cache
236
- *
237
- * Useful for testing or when config needs to be reloaded
238
- */
239
- export function clearConfigCache() {
240
- configCache = null;
241
- configCachePath = null;
242
- }
243
- /**
244
- * Check if a config is currently cached
245
- *
246
- * @returns True if config is cached
247
- */
248
- export function isConfigCached() {
249
- return configCache !== null;
250
- }
251
- //# sourceMappingURL=loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -1,107 +0,0 @@
1
- /**
2
- * Configuration Schema for iMessage Timeline
3
- *
4
- * Implements CONFIG--T01: Define Config Schema
5
- * Supports both JSON and YAML formats with Zod validation
6
- */
7
- import { z } from 'zod';
8
- /**
9
- * TypeScript type for the full configuration
10
- * Explicitly defined for DTS generation compatibility
11
- */
12
- export type Config = {
13
- version: string;
14
- attachmentRoots: string[];
15
- gemini: {
16
- apiKey: string;
17
- model: string;
18
- rateLimitDelay: number;
19
- maxRetries: number;
20
- };
21
- firecrawl?: {
22
- apiKey?: string;
23
- enabled: boolean;
24
- };
25
- enrichment: {
26
- enableVisionAnalysis: boolean;
27
- enableAudioTranscription: boolean;
28
- enableLinkEnrichment: boolean;
29
- imageCacheDir: string;
30
- checkpointInterval: number;
31
- forceRefresh: boolean;
32
- };
33
- render: {
34
- groupByTimeOfDay: boolean;
35
- renderRepliesAsNested: boolean;
36
- renderTapbacksAsEmoji: boolean;
37
- maxNestingDepth: number;
38
- };
39
- };
40
- /**
41
- * CONFIG-T01-AC01: Main configuration schema
42
- *
43
- * Supports:
44
- * - CONFIG-T01-AC02: JSON and YAML formats
45
- * - CONFIG-T01-AC03: Environment variable interpolation via ${ENV_VAR}
46
- * - CONFIG-T01-AC05: Validation errors with field paths
47
- */
48
- export declare const ConfigSchema: z.ZodType<Config, z.ZodTypeDef, unknown>;
49
- /**
50
- * CONFIG-T01-AC05: Validate config with detailed error messages
51
- *
52
- * @param config - Raw config object (parsed from JSON/YAML)
53
- * @returns Validated and typed config object
54
- * @throws ZodError with field paths and expected types
55
- *
56
- * @example
57
- * ```typescript
58
- * try {
59
- * const config = validateConfig(rawConfig)
60
- * } catch (error) {
61
- * if (error instanceof z.ZodError) {
62
- * error.errors.forEach(err => {
63
- * console.error(`${err.path.join('.')}: ${err.message}`)
64
- * })
65
- * }
66
- * }
67
- * ```
68
- */
69
- export declare function validateConfig(config: unknown): Config;
70
- /**
71
- * Validate config and return result with detailed errors
72
- *
73
- * @param config - Raw config object
74
- * @returns Validation result with success flag and data/errors
75
- */
76
- export declare function validateConfigSafe(config: unknown): {
77
- success: boolean;
78
- data?: Config;
79
- errors?: Array<{
80
- path: string;
81
- message: string;
82
- }>;
83
- };
84
- /**
85
- * Default configuration values
86
- *
87
- * Used as fallback when no config file is present
88
- */
89
- export declare const DEFAULT_CONFIG: Partial<Config>;
90
- /**
91
- * CONFIG-T01-AC04: Config file discovery patterns
92
- *
93
- * Checked in order:
94
- * 1. ./imessage-config.yaml
95
- * 2. ./imessage-config.yml
96
- * 3. ./imessage-config.json
97
- */
98
- export declare const CONFIG_FILE_PATTERNS: readonly ["./imessage-config.yaml", "./imessage-config.yml", "./imessage-config.json"];
99
- /**
100
- * CONFIG-T01-AC02: Supported config file formats
101
- */
102
- export type ConfigFormat = 'json' | 'yaml';
103
- /**
104
- * Detect config file format from file extension
105
- */
106
- export declare function detectConfigFormat(filePath: string): ConfigFormat;
107
- //# sourceMappingURL=schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AA8CvB;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,EAAE;QACP,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,MAAM,CAAA;QACb,cAAc,EAAE,MAAM,CAAA;QACtB,UAAU,EAAE,MAAM,CAAA;KAClB,CAAA;IACD,SAAS,CAAC,EAAE;QACX,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,OAAO,CAAA;KAChB,CAAA;IACD,UAAU,EAAE;QACX,oBAAoB,EAAE,OAAO,CAAA;QAC7B,wBAAwB,EAAE,OAAO,CAAA;QACjC,oBAAoB,EAAE,OAAO,CAAA;QAC7B,aAAa,EAAE,MAAM,CAAA;QACrB,kBAAkB,EAAE,MAAM,CAAA;QAC1B,YAAY,EAAE,OAAO,CAAA;KACrB,CAAA;IACD,MAAM,EAAE;QACP,gBAAgB,EAAE,OAAO,CAAA;QACzB,qBAAqB,EAAE,OAAO,CAAA;QAC9B,qBAAqB,EAAE,OAAO,CAAA;QAC9B,eAAe,EAAE,MAAM,CAAA;KACvB,CAAA;CACD,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,OAAO,CAsBhE,CAAA;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG;IACpD,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACjD,CAcA;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,MAAM,CAiB1C,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,wFAIvB,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAA;AAE1C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAWjE"}
@@ -1,169 +0,0 @@
1
- /**
2
- * Configuration Schema for iMessage Timeline
3
- *
4
- * Implements CONFIG--T01: Define Config Schema
5
- * Supports both JSON and YAML formats with Zod validation
6
- */
7
- import { z } from 'zod';
8
- /**
9
- * CONFIG-T01-AC01: Config schema with Zod validation
10
- *
11
- * Gemini API configuration for AI-powered enrichment
12
- */
13
- const GeminiConfigSchema = z.object({
14
- apiKey: z.string().min(1, 'Gemini API key is required'),
15
- model: z.string().default('gemini-1.5-pro'),
16
- rateLimitDelay: z.number().min(0).default(1000),
17
- maxRetries: z.number().min(0).max(10).default(3),
18
- });
19
- /**
20
- * Firecrawl API configuration for link enrichment (optional)
21
- */
22
- const FirecrawlConfigSchema = z
23
- .object({
24
- apiKey: z.string().optional(),
25
- enabled: z.boolean().default(true),
26
- })
27
- .optional();
28
- /**
29
- * Enrichment pipeline configuration
30
- */
31
- const EnrichmentConfigSchema = z.object({
32
- enableVisionAnalysis: z.boolean().default(true),
33
- enableAudioTranscription: z.boolean().default(true),
34
- enableLinkEnrichment: z.boolean().default(true),
35
- imageCacheDir: z.string().default('./.cache/images'),
36
- checkpointInterval: z.number().min(1).max(10000).default(100),
37
- forceRefresh: z.boolean().default(false),
38
- });
39
- /**
40
- * Markdown rendering configuration
41
- */
42
- const RenderConfigSchema = z.object({
43
- groupByTimeOfDay: z.boolean().default(true),
44
- renderRepliesAsNested: z.boolean().default(true),
45
- renderTapbacksAsEmoji: z.boolean().default(true),
46
- maxNestingDepth: z.number().min(1).max(100).default(10),
47
- });
48
- /**
49
- * CONFIG-T01-AC01: Main configuration schema
50
- *
51
- * Supports:
52
- * - CONFIG-T01-AC02: JSON and YAML formats
53
- * - CONFIG-T01-AC03: Environment variable interpolation via ${ENV_VAR}
54
- * - CONFIG-T01-AC05: Validation errors with field paths
55
- */
56
- export const ConfigSchema = z.object({
57
- version: z.string().default('1.0'),
58
- attachmentRoots: z
59
- .array(z.string().min(1, 'Attachment root path cannot be empty'))
60
- .min(1, 'At least one attachment root is required')
61
- .default(['~/Library/Messages/Attachments']),
62
- gemini: GeminiConfigSchema,
63
- firecrawl: FirecrawlConfigSchema,
64
- enrichment: EnrichmentConfigSchema.default({
65
- enableVisionAnalysis: true,
66
- enableAudioTranscription: true,
67
- enableLinkEnrichment: true,
68
- imageCacheDir: './.cache/images',
69
- checkpointInterval: 100,
70
- forceRefresh: false,
71
- }),
72
- render: RenderConfigSchema.default({
73
- groupByTimeOfDay: true,
74
- renderRepliesAsNested: true,
75
- renderTapbacksAsEmoji: true,
76
- maxNestingDepth: 10,
77
- }),
78
- });
79
- /**
80
- * CONFIG-T01-AC05: Validate config with detailed error messages
81
- *
82
- * @param config - Raw config object (parsed from JSON/YAML)
83
- * @returns Validated and typed config object
84
- * @throws ZodError with field paths and expected types
85
- *
86
- * @example
87
- * ```typescript
88
- * try {
89
- * const config = validateConfig(rawConfig)
90
- * } catch (error) {
91
- * if (error instanceof z.ZodError) {
92
- * error.errors.forEach(err => {
93
- * console.error(`${err.path.join('.')}: ${err.message}`)
94
- * })
95
- * }
96
- * }
97
- * ```
98
- */
99
- export function validateConfig(config) {
100
- return ConfigSchema.parse(config);
101
- }
102
- /**
103
- * Validate config and return result with detailed errors
104
- *
105
- * @param config - Raw config object
106
- * @returns Validation result with success flag and data/errors
107
- */
108
- export function validateConfigSafe(config) {
109
- const result = ConfigSchema.safeParse(config);
110
- if (result.success) {
111
- return { success: true, data: result.data };
112
- }
113
- return {
114
- success: false,
115
- errors: result.error.errors.map((err) => ({
116
- path: err.path.join('.'),
117
- message: err.message,
118
- })),
119
- };
120
- }
121
- /**
122
- * Default configuration values
123
- *
124
- * Used as fallback when no config file is present
125
- */
126
- export const DEFAULT_CONFIG = {
127
- version: '1.0',
128
- attachmentRoots: ['~/Library/Messages/Attachments'],
129
- enrichment: {
130
- enableVisionAnalysis: true,
131
- enableAudioTranscription: true,
132
- enableLinkEnrichment: true,
133
- imageCacheDir: './.cache/images',
134
- checkpointInterval: 100,
135
- forceRefresh: false,
136
- },
137
- render: {
138
- groupByTimeOfDay: true,
139
- renderRepliesAsNested: true,
140
- renderTapbacksAsEmoji: true,
141
- maxNestingDepth: 10,
142
- },
143
- };
144
- /**
145
- * CONFIG-T01-AC04: Config file discovery patterns
146
- *
147
- * Checked in order:
148
- * 1. ./imessage-config.yaml
149
- * 2. ./imessage-config.yml
150
- * 3. ./imessage-config.json
151
- */
152
- export const CONFIG_FILE_PATTERNS = [
153
- './imessage-config.yaml',
154
- './imessage-config.yml',
155
- './imessage-config.json',
156
- ];
157
- /**
158
- * Detect config file format from file extension
159
- */
160
- export function detectConfigFormat(filePath) {
161
- if (filePath.endsWith('.json')) {
162
- return 'json';
163
- }
164
- if (filePath.endsWith('.yaml') || filePath.endsWith('.yml')) {
165
- return 'yaml';
166
- }
167
- throw new Error(`Unsupported config file format: ${filePath}. Supported formats: .json, .yaml, .yml`);
168
- }
169
- //# sourceMappingURL=schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -1,77 +0,0 @@
1
- /**
2
- * Audio Transcription Module (ENRICH--T02)
3
- *
4
- * Implements audio transcription with structured output:
5
- * - AC01: Structured prompt requesting timestamps and speaker identification
6
- * - AC02: Extract speaker labels (Speaker 1, Speaker 2, etc.)
7
- * - AC03: Generate short description (1-2 sentences)
8
- * - AC04: Store under media.enrichment with kind='transcription'
9
- * - AC05: Handle long audio files (>10min) with streaming/chunking
10
- *
11
- * Architecture:
12
- * - transcribeAudioChunk: Transcribe single chunk with Gemini API
13
- * - handleLongAudio: Split large files and process chunks
14
- * - transcribeAudio: Call Gemini Audio API with structured prompt
15
- * - analyzeAudio: Main entry point, handles single message enrichment
16
- * - analyzeAudios: Batch processing wrapper
17
- *
18
- * Error Handling:
19
- * - Non-fatal errors are logged and original message is returned
20
- * - Transcription failures don't block enrichment pipeline
21
- * - Pipeline never crashes on enrichment errors
22
- */
23
- import type { MediaEnrichment, Message } from '#schema/message';
24
- type AudioTranscriptionConfig = {
25
- enableAudioTranscription: boolean;
26
- geminiApiKey: string;
27
- geminiModel?: string;
28
- maxAudioChunkDuration?: number;
29
- rateLimitDelay?: number;
30
- maxRetries?: number;
31
- };
32
- type TranscriptionData = {
33
- transcription: string;
34
- speakers: string[];
35
- timestamps: Array<{
36
- time: string;
37
- speaker: string;
38
- content: string;
39
- }>;
40
- shortDescription: string;
41
- };
42
- /**
43
- * AC01: Call Gemini Audio API with structured prompt for single chunk
44
- * AC02, AC03: Parse response into transcription, speakers, and description
45
- * AC04: Create enrichment with provenance
46
- */
47
- export declare function transcribeAudioChunk(audioPath: string, chunkIndex: number, config: Partial<AudioTranscriptionConfig>): Promise<TranscriptionData>;
48
- /**
49
- * AC05: Handle long audio files by splitting and processing chunks
50
- * Merges results from all chunks into single transcription
51
- */
52
- export declare function handleLongAudio(audioPath: string, durationSeconds: number, config: Partial<AudioTranscriptionConfig>): Promise<TranscriptionData>;
53
- /**
54
- * AC01-AC05: Main transcription orchestrator
55
- * Handles chunk detection, API calls, and response parsing
56
- */
57
- export declare function transcribeAudio(audioPath: string, config: Partial<AudioTranscriptionConfig>): Promise<MediaEnrichment>;
58
- /**
59
- * Main entry point - analyze audio media message and enrich it
60
- * Handles all ACs (AC01-AC05) through helper functions
61
- *
62
- * Responsibilities:
63
- * 1. Check if media is audio type (skip non-audio)
64
- * 2. Check if path is available
65
- * 3. Call transcription with chunking support (AC05)
66
- * 4. Parse response and extract data (AC01-AC03)
67
- * 5. Add enrichment with provenance (AC04)
68
- */
69
- export declare function analyzeAudio(message: Message, config: Partial<AudioTranscriptionConfig>): Promise<Message>;
70
- /**
71
- * Batch analyze multiple messages
72
- * Useful for enrichment stage that processes arrays of messages
73
- * Each message is processed independently; errors don't stop the batch
74
- */
75
- export declare function analyzeAudios(messages: Message[], config: Partial<AudioTranscriptionConfig>): Promise<Message[]>;
76
- export {};
77
- //# sourceMappingURL=audio-transcription.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audio-transcription.d.ts","sourceRoot":"","sources":["../../src/enrich/audio-transcription.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAa,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAI1E,KAAK,wBAAwB,GAAG;IAC/B,wBAAwB,EAAE,OAAO,CAAA;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,KAAK,iBAAiB,GAAG;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACrE,gBAAgB,EAAE,MAAM,CAAA;CACxB,CAAA;AA6DD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACzC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,CA6F5B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACpC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,CA6D5B;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACvC,OAAO,CAAC,eAAe,CAAC,CA4C1B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CACjC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACvC,OAAO,CAAC,OAAO,CAAC,CA+ElB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAClC,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,OAAO,CAAC,wBAAwB,CAAC,GACvC,OAAO,CAAC,OAAO,EAAE,CAAC,CAsCpB"}