@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.
- package/CHANGELOG.md +12 -0
- package/dist/bin/index.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/cli/commands/clean.d.ts +0 -17
- package/dist/cli/commands/clean.d.ts.map +0 -1
- package/dist/cli/commands/clean.js +0 -142
- package/dist/cli/commands/clean.js.map +0 -1
- package/dist/cli/commands/doctor.d.ts +0 -17
- package/dist/cli/commands/doctor.d.ts.map +0 -1
- package/dist/cli/commands/doctor.js +0 -202
- package/dist/cli/commands/doctor.js.map +0 -1
- package/dist/cli/commands/enrich-ai.d.ts +0 -17
- package/dist/cli/commands/enrich-ai.d.ts.map +0 -1
- package/dist/cli/commands/enrich-ai.js +0 -371
- package/dist/cli/commands/enrich-ai.js.map +0 -1
- package/dist/cli/commands/index.d.ts +0 -16
- package/dist/cli/commands/index.d.ts.map +0 -1
- package/dist/cli/commands/index.js +0 -16
- package/dist/cli/commands/index.js.map +0 -1
- package/dist/cli/commands/ingest-csv.d.ts +0 -17
- package/dist/cli/commands/ingest-csv.d.ts.map +0 -1
- package/dist/cli/commands/ingest-csv.js +0 -138
- package/dist/cli/commands/ingest-csv.js.map +0 -1
- package/dist/cli/commands/ingest-db.d.ts +0 -17
- package/dist/cli/commands/ingest-db.d.ts.map +0 -1
- package/dist/cli/commands/ingest-db.js +0 -159
- package/dist/cli/commands/ingest-db.js.map +0 -1
- package/dist/cli/commands/init.d.ts +0 -17
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -110
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/normalize-link.d.ts +0 -16
- package/dist/cli/commands/normalize-link.d.ts.map +0 -1
- package/dist/cli/commands/normalize-link.js +0 -144
- package/dist/cli/commands/normalize-link.js.map +0 -1
- package/dist/cli/commands/render-markdown.d.ts +0 -17
- package/dist/cli/commands/render-markdown.d.ts.map +0 -1
- package/dist/cli/commands/render-markdown.js +0 -218
- package/dist/cli/commands/render-markdown.js.map +0 -1
- package/dist/cli/commands/stats.d.ts +0 -17
- package/dist/cli/commands/stats.d.ts.map +0 -1
- package/dist/cli/commands/stats.js +0 -175
- package/dist/cli/commands/stats.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -17
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -152
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/index.d.ts +0 -13
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -121
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/types.d.ts +0 -93
- package/dist/cli/types.d.ts.map +0 -1
- package/dist/cli/types.js +0 -7
- package/dist/cli/types.js.map +0 -1
- package/dist/cli/utils.d.ts +0 -29
- package/dist/cli/utils.d.ts.map +0 -1
- package/dist/cli/utils.js +0 -53
- package/dist/cli/utils.js.map +0 -1
- package/dist/cli.d.ts +0 -9
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -1805
- package/dist/config/generator.d.ts +0 -90
- package/dist/config/generator.d.ts.map +0 -1
- package/dist/config/generator.js +0 -320
- package/dist/config/generator.js.map +0 -1
- package/dist/config/loader.d.ts +0 -107
- package/dist/config/loader.d.ts.map +0 -1
- package/dist/config/loader.js +0 -251
- package/dist/config/loader.js.map +0 -1
- package/dist/config/schema.d.ts +0 -107
- package/dist/config/schema.d.ts.map +0 -1
- package/dist/config/schema.js +0 -169
- package/dist/config/schema.js.map +0 -1
- package/dist/enrich/audio-transcription.d.ts +0 -77
- package/dist/enrich/audio-transcription.d.ts.map +0 -1
- package/dist/enrich/audio-transcription.js +0 -370
- package/dist/enrich/audio-transcription.js.map +0 -1
- package/dist/enrich/checkpoint.d.ts +0 -137
- package/dist/enrich/checkpoint.d.ts.map +0 -1
- package/dist/enrich/checkpoint.js +0 -205
- package/dist/enrich/checkpoint.js.map +0 -1
- package/dist/enrich/idempotency.d.ts +0 -90
- package/dist/enrich/idempotency.d.ts.map +0 -1
- package/dist/enrich/idempotency.js +0 -188
- package/dist/enrich/idempotency.js.map +0 -1
- package/dist/enrich/image-analysis.d.ts +0 -62
- package/dist/enrich/image-analysis.d.ts.map +0 -1
- package/dist/enrich/image-analysis.js +0 -264
- package/dist/enrich/image-analysis.js.map +0 -1
- package/dist/enrich/index.d.ts +0 -60
- package/dist/enrich/index.d.ts.map +0 -1
- package/dist/enrich/index.js +0 -74
- package/dist/enrich/index.js.map +0 -1
- package/dist/enrich/link-enrichment.d.ts +0 -37
- package/dist/enrich/link-enrichment.d.ts.map +0 -1
- package/dist/enrich/link-enrichment.js +0 -202
- package/dist/enrich/link-enrichment.js.map +0 -1
- package/dist/enrich/pdf-video-handling.d.ts +0 -49
- package/dist/enrich/pdf-video-handling.d.ts.map +0 -1
- package/dist/enrich/pdf-video-handling.js +0 -325
- package/dist/enrich/pdf-video-handling.js.map +0 -1
- package/dist/enrich/progress-tracker.d.ts +0 -120
- package/dist/enrich/progress-tracker.d.ts.map +0 -1
- package/dist/enrich/progress-tracker.js +0 -220
- package/dist/enrich/progress-tracker.js.map +0 -1
- package/dist/enrich/providers/firecrawl.d.ts +0 -18
- package/dist/enrich/providers/firecrawl.d.ts.map +0 -1
- package/dist/enrich/providers/firecrawl.js +0 -48
- package/dist/enrich/providers/firecrawl.js.map +0 -1
- package/dist/enrich/providers/generic.d.ts +0 -16
- package/dist/enrich/providers/generic.d.ts.map +0 -1
- package/dist/enrich/providers/generic.js +0 -36
- package/dist/enrich/providers/generic.js.map +0 -1
- package/dist/enrich/providers/index.d.ts +0 -14
- package/dist/enrich/providers/index.d.ts.map +0 -1
- package/dist/enrich/providers/index.js +0 -13
- package/dist/enrich/providers/index.js.map +0 -1
- package/dist/enrich/providers/instagram.d.ts +0 -16
- package/dist/enrich/providers/instagram.d.ts.map +0 -1
- package/dist/enrich/providers/instagram.js +0 -43
- package/dist/enrich/providers/instagram.js.map +0 -1
- package/dist/enrich/providers/spotify.d.ts +0 -16
- package/dist/enrich/providers/spotify.d.ts.map +0 -1
- package/dist/enrich/providers/spotify.js +0 -45
- package/dist/enrich/providers/spotify.js.map +0 -1
- package/dist/enrich/providers/twitter.d.ts +0 -16
- package/dist/enrich/providers/twitter.d.ts.map +0 -1
- package/dist/enrich/providers/twitter.js +0 -43
- package/dist/enrich/providers/twitter.js.map +0 -1
- package/dist/enrich/providers/types.d.ts +0 -47
- package/dist/enrich/providers/types.d.ts.map +0 -1
- package/dist/enrich/providers/types.js +0 -15
- package/dist/enrich/providers/types.js.map +0 -1
- package/dist/enrich/providers/youtube.d.ts +0 -16
- package/dist/enrich/providers/youtube.d.ts.map +0 -1
- package/dist/enrich/providers/youtube.js +0 -43
- package/dist/enrich/providers/youtube.js.map +0 -1
- package/dist/enrich/rate-limiting.d.ts +0 -118
- package/dist/enrich/rate-limiting.d.ts.map +0 -1
- package/dist/enrich/rate-limiting.js +0 -258
- package/dist/enrich/rate-limiting.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/ingest/dedup-merge.d.ts +0 -82
- package/dist/ingest/dedup-merge.d.ts.map +0 -1
- package/dist/ingest/dedup-merge.js +0 -262
- package/dist/ingest/dedup-merge.js.map +0 -1
- package/dist/ingest/ingest-csv.d.ts +0 -62
- package/dist/ingest/ingest-csv.d.ts.map +0 -1
- package/dist/ingest/ingest-csv.js +0 -300
- package/dist/ingest/ingest-csv.js.map +0 -1
- package/dist/ingest/ingest-db.d.ts +0 -64
- package/dist/ingest/ingest-db.d.ts.map +0 -1
- package/dist/ingest/ingest-db.js +0 -172
- package/dist/ingest/ingest-db.js.map +0 -1
- package/dist/ingest/link-replies-and-tapbacks.d.ts +0 -53
- package/dist/ingest/link-replies-and-tapbacks.d.ts.map +0 -1
- package/dist/ingest/link-replies-and-tapbacks.js +0 -381
- package/dist/ingest/link-replies-and-tapbacks.js.map +0 -1
- package/dist/normalize/date-converters.d.ts +0 -45
- package/dist/normalize/date-converters.d.ts.map +0 -1
- package/dist/normalize/date-converters.js +0 -166
- package/dist/normalize/date-converters.js.map +0 -1
- package/dist/normalize/path-validator.d.ts +0 -65
- package/dist/normalize/path-validator.d.ts.map +0 -1
- package/dist/normalize/path-validator.js +0 -221
- package/dist/normalize/path-validator.js.map +0 -1
- package/dist/normalize/validate-normalized.d.ts +0 -45
- package/dist/normalize/validate-normalized.d.ts.map +0 -1
- package/dist/normalize/validate-normalized.js +0 -144
- package/dist/normalize/validate-normalized.js.map +0 -1
- package/dist/render/embeds-blockquotes.d.ts +0 -84
- package/dist/render/embeds-blockquotes.d.ts.map +0 -1
- package/dist/render/embeds-blockquotes.js +0 -204
- package/dist/render/embeds-blockquotes.js.map +0 -1
- package/dist/render/grouping.d.ts +0 -78
- package/dist/render/grouping.d.ts.map +0 -1
- package/dist/render/grouping.js +0 -134
- package/dist/render/grouping.js.map +0 -1
- package/dist/render/index.d.ts +0 -47
- package/dist/render/index.d.ts.map +0 -1
- package/dist/render/index.js +0 -245
- package/dist/render/index.js.map +0 -1
- package/dist/render/reply-rendering.d.ts +0 -88
- package/dist/render/reply-rendering.d.ts.map +0 -1
- package/dist/render/reply-rendering.js +0 -196
- package/dist/render/reply-rendering.js.map +0 -1
- package/dist/schema/message.d.ts +0 -125
- package/dist/schema/message.d.ts.map +0 -1
- package/dist/schema/message.js +0 -331
- package/dist/schema/message.js.map +0 -1
- package/dist/utils/delta-detection.d.ts +0 -107
- package/dist/utils/delta-detection.d.ts.map +0 -1
- package/dist/utils/delta-detection.js +0 -199
- package/dist/utils/delta-detection.js.map +0 -1
- package/dist/utils/enrichment-merge.d.ts +0 -135
- package/dist/utils/enrichment-merge.d.ts.map +0 -1
- package/dist/utils/enrichment-merge.js +0 -280
- package/dist/utils/enrichment-merge.js.map +0 -1
- package/dist/utils/human.d.ts +0 -15
- package/dist/utils/human.d.ts.map +0 -1
- package/dist/utils/human.js +0 -27
- package/dist/utils/human.js.map +0 -1
- package/dist/utils/incremental-state.d.ts +0 -133
- package/dist/utils/incremental-state.d.ts.map +0 -1
- package/dist/utils/incremental-state.js +0 -237
- package/dist/utils/incremental-state.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -40
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -176
- package/dist/utils/logger.js.map +0 -1
package/dist/config/loader.js
DELETED
|
@@ -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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"}
|
package/dist/config/schema.d.ts
DELETED
|
@@ -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"}
|
package/dist/config/schema.js
DELETED
|
@@ -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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,4BAA4B,CAAC;IACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC;IAC3C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CAChD,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,qBAAqB,GAAG,CAAC;KAC7B,MAAM,CAAC;IACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAClC,CAAC;KACD,QAAQ,EAAE,CAAA;AAEZ;;GAEG;AACH,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C,wBAAwB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACnD,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,iBAAiB,CAAC;IACpD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAC7D,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACxC,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3C,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACvD,CAAC,CAAA;AAmCF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAA6C,CAAC,CAAC,MAAM,CAAC;IAC9E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAClC,eAAe,EAAE,CAAC;SAChB,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAC;SAChE,GAAG,CAAC,CAAC,EAAE,0CAA0C,CAAC;SAClD,OAAO,CAAC,CAAC,gCAAgC,CAAC,CAAC;IAC7C,MAAM,EAAE,kBAAkB;IAC1B,SAAS,EAAE,qBAAqB;IAChC,UAAU,EAAE,sBAAsB,CAAC,OAAO,CAAC;QAC1C,oBAAoB,EAAE,IAAI;QAC1B,wBAAwB,EAAE,IAAI;QAC9B,oBAAoB,EAAE,IAAI;QAC1B,aAAa,EAAE,iBAAiB;QAChC,kBAAkB,EAAE,GAAG;QACvB,YAAY,EAAE,KAAK;KACnB,CAAC;IACF,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC;QAClC,gBAAgB,EAAE,IAAI;QACtB,qBAAqB,EAAE,IAAI;QAC3B,qBAAqB,EAAE,IAAI;QAC3B,eAAe,EAAE,EAAE;KACnB,CAAC;CACF,CAAC,CAAA;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe;IAC7C,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;AAClC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAe;IAKjD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAE7C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;IAC5C,CAAC;IAED,OAAO;QACN,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACxB,OAAO,EAAE,GAAG,CAAC,OAAO;SACpB,CAAC,CAAC;KACH,CAAA;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC9C,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,CAAC,gCAAgC,CAAC;IACnD,UAAU,EAAE;QACX,oBAAoB,EAAE,IAAI;QAC1B,wBAAwB,EAAE,IAAI;QAC9B,oBAAoB,EAAE,IAAI;QAC1B,aAAa,EAAE,iBAAiB;QAChC,kBAAkB,EAAE,GAAG;QACvB,YAAY,EAAE,KAAK;KACnB;IACD,MAAM,EAAE;QACP,gBAAgB,EAAE,IAAI;QACtB,qBAAqB,EAAE,IAAI;QAC3B,qBAAqB,EAAE,IAAI;QAC3B,eAAe,EAAE,EAAE;KACnB;CACD,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IACnC,wBAAwB;IACxB,uBAAuB;IACvB,wBAAwB;CACf,CAAA;AAOV;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IAClD,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,MAAM,CAAA;IACd,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,OAAO,MAAM,CAAA;IACd,CAAC;IAED,MAAM,IAAI,KAAK,CACd,mCAAmC,QAAQ,yCAAyC,CACpF,CAAA;AACF,CAAC"}
|
|
@@ -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"}
|