@amirdaraee/namewise 1.0.1 → 1.2.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.
- package/CHANGELOG.md +94 -0
- package/README.md +8 -8
- package/dist/cli/apply.d.ts.map +1 -1
- package/dist/cli/apply.js +33 -6
- package/dist/cli/apply.js.map +1 -1
- package/dist/cli/clean-empty.d.ts.map +1 -1
- package/dist/cli/clean-empty.js +2 -3
- package/dist/cli/clean-empty.js.map +1 -1
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +18 -37
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/config-cmd.d.ts.map +1 -1
- package/dist/cli/config-cmd.js +7 -4
- package/dist/cli/config-cmd.js.map +1 -1
- package/dist/cli/dedup.d.ts.map +1 -1
- package/dist/cli/dedup.js +3 -11
- package/dist/cli/dedup.js.map +1 -1
- package/dist/cli/diff.d.ts.map +1 -1
- package/dist/cli/diff.js +3 -7
- package/dist/cli/diff.js.map +1 -1
- package/dist/cli/find.d.ts.map +1 -1
- package/dist/cli/find.js +2 -3
- package/dist/cli/find.js.map +1 -1
- package/dist/cli/flatten.d.ts.map +1 -1
- package/dist/cli/flatten.js +4 -11
- package/dist/cli/flatten.js.map +1 -1
- package/dist/cli/handle-cli-error.d.ts +7 -0
- package/dist/cli/handle-cli-error.d.ts.map +1 -0
- package/dist/cli/handle-cli-error.js +27 -0
- package/dist/cli/handle-cli-error.js.map +1 -0
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +8 -6
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/organize.d.ts.map +1 -1
- package/dist/cli/organize.js +4 -11
- package/dist/cli/organize.js.map +1 -1
- package/dist/cli/rename.d.ts +4 -2
- package/dist/cli/rename.d.ts.map +1 -1
- package/dist/cli/rename.js +171 -227
- package/dist/cli/rename.js.map +1 -1
- package/dist/cli/sanitize.d.ts.map +1 -1
- package/dist/cli/sanitize.js +4 -12
- package/dist/cli/sanitize.js.map +1 -1
- package/dist/cli/shared-config.d.ts +60 -0
- package/dist/cli/shared-config.d.ts.map +1 -0
- package/dist/cli/shared-config.js +64 -0
- package/dist/cli/shared-config.js.map +1 -0
- package/dist/cli/stats.d.ts.map +1 -1
- package/dist/cli/stats.js +2 -4
- package/dist/cli/stats.js.map +1 -1
- package/dist/cli/tree.d.ts.map +1 -1
- package/dist/cli/tree.js +2 -3
- package/dist/cli/tree.js.map +1 -1
- package/dist/cli/watch.d.ts +3 -1
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +19 -63
- package/dist/cli/watch.js.map +1 -1
- package/dist/parsers/pdf-parser.d.ts.map +1 -1
- package/dist/parsers/pdf-parser.js +44 -27
- package/dist/parsers/pdf-parser.js.map +1 -1
- package/dist/services/base-cloud-service.d.ts +32 -0
- package/dist/services/base-cloud-service.d.ts.map +1 -0
- package/dist/services/base-cloud-service.js +73 -0
- package/dist/services/base-cloud-service.js.map +1 -0
- package/dist/services/base-local-service.d.ts +18 -0
- package/dist/services/base-local-service.d.ts.map +1 -0
- package/dist/services/base-local-service.js +81 -0
- package/dist/services/base-local-service.js.map +1 -0
- package/dist/services/claude-service.d.ts +8 -6
- package/dist/services/claude-service.d.ts.map +1 -1
- package/dist/services/claude-service.js +40 -98
- package/dist/services/claude-service.js.map +1 -1
- package/dist/services/file-renamer.d.ts +7 -0
- package/dist/services/file-renamer.d.ts.map +1 -1
- package/dist/services/file-renamer.js +63 -12
- package/dist/services/file-renamer.js.map +1 -1
- package/dist/services/lmstudio-service.d.ts +35 -9
- package/dist/services/lmstudio-service.d.ts.map +1 -1
- package/dist/services/lmstudio-service.js +23 -101
- package/dist/services/lmstudio-service.js.map +1 -1
- package/dist/services/ollama-service.d.ts +23 -9
- package/dist/services/ollama-service.d.ts.map +1 -1
- package/dist/services/ollama-service.js +16 -87
- package/dist/services/ollama-service.js.map +1 -1
- package/dist/services/openai-service.d.ts +8 -6
- package/dist/services/openai-service.d.ts.map +1 -1
- package/dist/services/openai-service.js +36 -94
- package/dist/services/openai-service.js.map +1 -1
- package/dist/utils/ai-name-sanitizer.d.ts +14 -0
- package/dist/utils/ai-name-sanitizer.d.ts.map +1 -0
- package/dist/utils/ai-name-sanitizer.js +55 -0
- package/dist/utils/ai-name-sanitizer.js.map +1 -0
- package/dist/utils/ai-prompts.d.ts.map +1 -1
- package/dist/utils/ai-prompts.js +2 -1
- package/dist/utils/ai-prompts.js.map +1 -1
- package/dist/utils/assert-directory.d.ts +9 -0
- package/dist/utils/assert-directory.d.ts.map +1 -0
- package/dist/utils/assert-directory.js +15 -0
- package/dist/utils/assert-directory.js.map +1 -0
- package/dist/utils/file-info.d.ts +8 -0
- package/dist/utils/file-info.d.ts.map +1 -0
- package/dist/utils/file-info.js +25 -0
- package/dist/utils/file-info.js.map +1 -0
- package/dist/utils/file-templates.d.ts.map +1 -1
- package/dist/utils/file-templates.js +31 -1
- package/dist/utils/file-templates.js.map +1 -1
- package/dist/utils/image-compressor.d.ts +1 -1
- package/dist/utils/image-compressor.d.ts.map +1 -1
- package/dist/utils/image-compressor.js +4 -2
- package/dist/utils/image-compressor.js.map +1 -1
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +4 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/record-session.d.ts +18 -0
- package/dist/utils/record-session.d.ts.map +1 -0
- package/dist/utils/record-session.js +24 -0
- package/dist/utils/record-session.js.map +1 -0
- package/dist/utils/ui.d.ts.map +1 -1
- package/dist/utils/ui.js +1 -7
- package/dist/utils/ui.js.map +1 -1
- package/package.json +17 -18
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Config } from '../types/index.js';
|
|
2
|
+
import { NamiwiseFileConfig } from '../utils/config-loader.js';
|
|
3
|
+
/**
|
|
4
|
+
* CLI options shared by the `rename` and `watch` subcommands, as parsed by
|
|
5
|
+
* Commander. Numeric flags arrive as strings (`--max-size 10` → `'10'`).
|
|
6
|
+
*/
|
|
7
|
+
export interface SharedRenameOptions {
|
|
8
|
+
provider?: string;
|
|
9
|
+
apiKey?: string;
|
|
10
|
+
case?: string;
|
|
11
|
+
template?: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
date?: string;
|
|
14
|
+
dryRun?: boolean;
|
|
15
|
+
maxSize?: string;
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
model?: string;
|
|
18
|
+
recursive?: boolean;
|
|
19
|
+
depth?: string;
|
|
20
|
+
concurrency?: string;
|
|
21
|
+
output?: string;
|
|
22
|
+
pattern?: string | string[];
|
|
23
|
+
/** Commander sets `ai: false` when --no-ai is passed. */
|
|
24
|
+
ai?: boolean;
|
|
25
|
+
log?: boolean;
|
|
26
|
+
language?: string;
|
|
27
|
+
context?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Options for the `rename` subcommand (adds the batch-rename flags). */
|
|
30
|
+
export interface RenameOptions extends SharedRenameOptions {
|
|
31
|
+
sequence?: boolean;
|
|
32
|
+
sequencePrefix?: string;
|
|
33
|
+
prefix?: string;
|
|
34
|
+
suffix?: string;
|
|
35
|
+
dateStamp?: 'created' | 'modified';
|
|
36
|
+
strip?: string;
|
|
37
|
+
truncate?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Options for the `watch` subcommand. */
|
|
40
|
+
export type WatchOptions = SharedRenameOptions;
|
|
41
|
+
/** Resolve the AI provider: CLI flag > config file > default (claude). */
|
|
42
|
+
export declare function resolveProvider(options: SharedRenameOptions, fileConfig: NamiwiseFileConfig): Config['aiProvider'];
|
|
43
|
+
/** Whether the provider needs an API key (cloud providers, unless --no-ai). */
|
|
44
|
+
export declare function providerRequiresApiKey(provider: Config['aiProvider'], aiDisabled: boolean): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Resolve the API key for a provider. Returns `initialKey` unchanged when it
|
|
47
|
+
* is set or when no key is required; otherwise falls back to the environment
|
|
48
|
+
* (CLAUDE_API_KEY/ANTHROPIC_API_KEY for claude, OPENAI_API_KEY for openai).
|
|
49
|
+
*
|
|
50
|
+
* Never prompts — `rename` layers its interactive prompt on top of this,
|
|
51
|
+
* `watch` deliberately does not.
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveApiKey(provider: Config['aiProvider'], initialKey: string | undefined, aiDisabled: boolean): string | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* Build the runtime Config from CLI options and the cascading file config
|
|
56
|
+
* (CLI flags override file config which overrides defaults). Shared by
|
|
57
|
+
* `rename` and `watch`, which previously each copy-pasted this literal.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildConfig(options: SharedRenameOptions, fileConfig: NamiwiseFileConfig, provider: Config['aiProvider'], apiKey: string | undefined): Config;
|
|
60
|
+
//# sourceMappingURL=shared-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-config.d.ts","sourceRoot":"","sources":["../../src/cli/shared-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA4B,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B,yDAAyD;IACzD,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAE/C,0EAA0E;AAC1E,wBAAgB,eAAe,CAC7B,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,kBAAkB,GAC7B,MAAM,CAAC,YAAY,CAAC,CAEtB;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,EAC9B,UAAU,EAAE,OAAO,GAClB,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,UAAU,EAAE,OAAO,GAClB,MAAM,GAAG,SAAS,CAWpB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,mBAAmB,EAC5B,UAAU,EAAE,kBAAkB,EAC9B,QAAQ,EAAE,MAAM,CAAC,YAAY,CAAC,EAC9B,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,MAAM,CA0BR"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { DocumentParserFactory } from '../parsers/factory.js';
|
|
2
|
+
/** Resolve the AI provider: CLI flag > config file > default (claude). */
|
|
3
|
+
export function resolveProvider(options, fileConfig) {
|
|
4
|
+
return (options.provider ?? fileConfig.provider ?? 'claude');
|
|
5
|
+
}
|
|
6
|
+
/** Whether the provider needs an API key (cloud providers, unless --no-ai). */
|
|
7
|
+
export function providerRequiresApiKey(provider, aiDisabled) {
|
|
8
|
+
return ['claude', 'openai'].includes(provider) && !aiDisabled;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolve the API key for a provider. Returns `initialKey` unchanged when it
|
|
12
|
+
* is set or when no key is required; otherwise falls back to the environment
|
|
13
|
+
* (CLAUDE_API_KEY/ANTHROPIC_API_KEY for claude, OPENAI_API_KEY for openai).
|
|
14
|
+
*
|
|
15
|
+
* Never prompts — `rename` layers its interactive prompt on top of this,
|
|
16
|
+
* `watch` deliberately does not.
|
|
17
|
+
*/
|
|
18
|
+
export function resolveApiKey(provider, initialKey, aiDisabled) {
|
|
19
|
+
if (!providerRequiresApiKey(provider, aiDisabled) || initialKey) {
|
|
20
|
+
return initialKey;
|
|
21
|
+
}
|
|
22
|
+
if (provider === 'claude') {
|
|
23
|
+
const envKey = process.env.CLAUDE_API_KEY ?? process.env.ANTHROPIC_API_KEY;
|
|
24
|
+
if (envKey)
|
|
25
|
+
return envKey;
|
|
26
|
+
}
|
|
27
|
+
else if (provider === 'openai' && process.env.OPENAI_API_KEY) {
|
|
28
|
+
return process.env.OPENAI_API_KEY;
|
|
29
|
+
}
|
|
30
|
+
return initialKey;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build the runtime Config from CLI options and the cascading file config
|
|
34
|
+
* (CLI flags override file config which overrides defaults). Shared by
|
|
35
|
+
* `rename` and `watch`, which previously each copy-pasted this literal.
|
|
36
|
+
*/
|
|
37
|
+
export function buildConfig(options, fileConfig, provider, apiKey) {
|
|
38
|
+
return {
|
|
39
|
+
aiProvider: provider,
|
|
40
|
+
apiKey,
|
|
41
|
+
maxFileSize: parseInt(options.maxSize ?? String(fileConfig.maxSize ?? '10')) * 1024 * 1024,
|
|
42
|
+
supportedExtensions: new DocumentParserFactory().getSupportedExtensions(),
|
|
43
|
+
dryRun: options.dryRun ?? fileConfig.dryRun ?? false,
|
|
44
|
+
namingConvention: (options.case ?? fileConfig.case ?? 'kebab-case'),
|
|
45
|
+
templateOptions: {
|
|
46
|
+
category: (options.template ?? fileConfig.template ?? 'general'),
|
|
47
|
+
personalName: options.name ?? fileConfig.name,
|
|
48
|
+
dateFormat: (options.date ?? fileConfig.date ?? 'none')
|
|
49
|
+
},
|
|
50
|
+
localLLMConfig: {
|
|
51
|
+
baseUrl: options.baseUrl ?? fileConfig.baseUrl,
|
|
52
|
+
model: options.model ?? fileConfig.model
|
|
53
|
+
},
|
|
54
|
+
recursive: options.recursive ?? fileConfig.recursive ?? false,
|
|
55
|
+
depth: options.depth !== undefined ? parseInt(options.depth) : fileConfig.depth,
|
|
56
|
+
concurrency: parseInt(options.concurrency ?? String(fileConfig.concurrency ?? '3')),
|
|
57
|
+
outputPath: options.output ?? fileConfig.output,
|
|
58
|
+
patterns: Array.isArray(options.pattern) ? options.pattern : (options.pattern ? [options.pattern] : []),
|
|
59
|
+
noAi: options.ai === false,
|
|
60
|
+
language: options.language ?? fileConfig.language,
|
|
61
|
+
context: options.context ?? fileConfig.context
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=shared-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared-config.js","sourceRoot":"","sources":["../../src/cli/shared-config.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/stats.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/cli/stats.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/cli/stats.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,OAAO,CAAC,IAAI,CAAC,CAgCf"}
|
package/dist/cli/stats.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { promises as fs } from 'fs';
|
|
2
1
|
import path from 'path';
|
|
3
2
|
import { computeStats } from '../utils/stats.js';
|
|
4
3
|
import { formatBytes } from '../utils/fs-collect.js';
|
|
4
|
+
import { assertDirectory } from '../utils/assert-directory.js';
|
|
5
5
|
import * as ui from '../utils/ui.js';
|
|
6
6
|
export async function statsCommand(directory, options = {}) {
|
|
7
|
-
|
|
8
|
-
if (!stat.isDirectory())
|
|
9
|
-
throw new Error(`${directory} is not a directory`);
|
|
7
|
+
await assertDirectory(directory);
|
|
10
8
|
const stats = await computeStats(directory, options.recursive ?? false);
|
|
11
9
|
if (stats.totalFiles === 0) {
|
|
12
10
|
ui.info('No files found.');
|
package/dist/cli/stats.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/cli/stats.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/cli/stats.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAiB,EACjB,UAAmC,EAAE;IAErC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAEjC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC;IAExE,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,EAAE,CAAC,IAAI,CAAC,gBAAgB,MAAM,EAAE,CAAC,CAAC;IAClC,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,UAAU,cAAc,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAEnF,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC;YAC9B,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,IAAI;YACzD,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,UAAU,GAAG,GAAG,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,UAAU,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/cli/tree.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/cli/tree.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../src/cli/tree.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
package/dist/cli/tree.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { promises as fs } from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { formatBytes } from '../utils/fs-collect.js';
|
|
4
|
+
import { assertDirectory } from '../utils/assert-directory.js';
|
|
4
5
|
import * as ui from '../utils/ui.js';
|
|
5
6
|
export async function treeCommand(directory, options = {}) {
|
|
6
|
-
|
|
7
|
-
if (!stat.isDirectory())
|
|
8
|
-
throw new Error(`${directory} is not a directory`);
|
|
7
|
+
await assertDirectory(directory);
|
|
9
8
|
const maxDepth = options.depth ?? Infinity;
|
|
10
9
|
ui.info(`\n${path.resolve(directory)}`);
|
|
11
10
|
await printTree(directory, '', 0, maxDepth);
|
package/dist/cli/tree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/cli/tree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,SAAiB,EACjB,UAA8B,EAAE;IAEhC,MAAM,
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../src/cli/tree.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/watch.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { WatchOptions } from './shared-config.js';
|
|
2
|
+
export type { WatchOptions } from './shared-config.js';
|
|
3
|
+
export declare function watchDirectory(directory: string, options: WatchOptions): Promise<void>;
|
|
2
4
|
//# sourceMappingURL=watch.d.ts.map
|
package/dist/cli/watch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AAWA,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAA+C,MAAM,oBAAoB,CAAC;AAE/F,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAoF5F"}
|
package/dist/cli/watch.js
CHANGED
|
@@ -1,57 +1,33 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
|
-
import { promises as fs } from 'fs';
|
|
3
2
|
import chokidar from 'chokidar';
|
|
4
3
|
import * as ui from '../utils/ui.js';
|
|
5
4
|
import { DocumentParserFactory } from '../parsers/factory.js';
|
|
6
5
|
import { AIServiceFactory } from '../services/ai-factory.js';
|
|
7
6
|
import { FileRenamer } from '../services/file-renamer.js';
|
|
8
7
|
import { loadConfig } from '../utils/config-loader.js';
|
|
9
|
-
import {
|
|
8
|
+
import { recordSession } from '../utils/record-session.js';
|
|
9
|
+
import { assertDirectory } from '../utils/assert-directory.js';
|
|
10
|
+
import { statToFileInfo } from '../utils/file-info.js';
|
|
11
|
+
import { resolveProvider, resolveApiKey, buildConfig } from './shared-config.js';
|
|
10
12
|
export async function watchDirectory(directory, options) {
|
|
11
13
|
// Validate directory
|
|
12
|
-
|
|
13
|
-
if (!stats.isDirectory()) {
|
|
14
|
-
throw new Error(`${directory} is not a directory`);
|
|
15
|
-
}
|
|
14
|
+
await assertDirectory(directory);
|
|
16
15
|
const absDir = path.resolve(directory);
|
|
17
16
|
// Load cascading config file
|
|
18
17
|
const fileConfig = await loadConfig(absDir);
|
|
19
18
|
// Resolve provider
|
|
20
|
-
const provider = (options
|
|
21
|
-
// Get API key for cloud providers
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
if (provider === 'claude' && (process.env.CLAUDE_API_KEY ?? process.env.ANTHROPIC_API_KEY)) {
|
|
26
|
-
apiKey = process.env.CLAUDE_API_KEY ?? process.env.ANTHROPIC_API_KEY;
|
|
27
|
-
}
|
|
28
|
-
else if (provider === 'openai' && process.env.OPENAI_API_KEY) {
|
|
29
|
-
apiKey = process.env.OPENAI_API_KEY;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
// Build config (mirrors renameFiles logic)
|
|
19
|
+
const provider = resolveProvider(options, fileConfig);
|
|
20
|
+
// Get API key for cloud providers. Unlike `rename`, watch never prompts for
|
|
21
|
+
// a missing key and does not read an apiKey from the config file.
|
|
22
|
+
const apiKey = resolveApiKey(provider, options.apiKey, options.ai === false);
|
|
23
|
+
// Build config (shared with renameFiles)
|
|
33
24
|
const config = {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
supportedExtensions: new DocumentParserFactory().getSupportedExtensions(),
|
|
25
|
+
...buildConfig(options, fileConfig, provider, apiKey),
|
|
26
|
+
// watch historically ignores the config-file dryRun default and the
|
|
27
|
+
// language/context settings — preserve that behaviour.
|
|
38
28
|
dryRun: options.dryRun ?? false,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
category: (options.template ?? fileConfig.template ?? 'general'),
|
|
42
|
-
personalName: options.name ?? fileConfig.name,
|
|
43
|
-
dateFormat: (options.date ?? fileConfig.date ?? 'none')
|
|
44
|
-
},
|
|
45
|
-
localLLMConfig: {
|
|
46
|
-
baseUrl: options.baseUrl ?? fileConfig.baseUrl,
|
|
47
|
-
model: options.model ?? fileConfig.model
|
|
48
|
-
},
|
|
49
|
-
recursive: options.recursive ?? fileConfig.recursive ?? false,
|
|
50
|
-
depth: options.depth !== undefined ? parseInt(options.depth) : fileConfig.depth,
|
|
51
|
-
concurrency: parseInt(options.concurrency ?? String(fileConfig.concurrency ?? '3')),
|
|
52
|
-
outputPath: options.output ?? fileConfig.output,
|
|
53
|
-
patterns: Array.isArray(options.pattern) ? options.pattern : (options.pattern ? [options.pattern] : []),
|
|
54
|
-
noAi: options.ai === false
|
|
29
|
+
language: undefined,
|
|
30
|
+
context: undefined
|
|
55
31
|
};
|
|
56
32
|
// Determine supported extensions from the parser factory
|
|
57
33
|
const parserFactory = new DocumentParserFactory(config);
|
|
@@ -77,35 +53,15 @@ export async function watchDirectory(directory, options) {
|
|
|
77
53
|
const fileName = path.basename(filePath);
|
|
78
54
|
ui.dim(`Detected: ${fileName}`);
|
|
79
55
|
try {
|
|
80
|
-
const
|
|
81
|
-
const extension = path.extname(fileName).toLowerCase();
|
|
82
|
-
const parentFolder = path.basename(path.dirname(filePath));
|
|
83
|
-
const fullPath = path.resolve(filePath);
|
|
84
|
-
const folderPath = path.dirname(fullPath).split(path.sep).filter(p => p);
|
|
85
|
-
const fileInfo = {
|
|
86
|
-
path: filePath,
|
|
87
|
-
name: fileName,
|
|
88
|
-
extension,
|
|
89
|
-
size: fileStat.size,
|
|
90
|
-
createdAt: fileStat.birthtime,
|
|
91
|
-
modifiedAt: fileStat.mtime,
|
|
92
|
-
accessedAt: fileStat.atime,
|
|
93
|
-
parentFolder,
|
|
94
|
-
folderPath: folderPath.slice(-3),
|
|
95
|
-
documentMetadata: undefined
|
|
96
|
-
};
|
|
56
|
+
const fileInfo = await statToFileInfo(filePath);
|
|
97
57
|
const { results } = await renamer.renameFiles([fileInfo]);
|
|
98
58
|
const result = results[0];
|
|
99
59
|
if (result?.success && result.newPath !== result.originalPath) {
|
|
100
60
|
const newName = path.basename(result.newPath);
|
|
101
61
|
ui.success(`${fileName} → ${newName}`);
|
|
102
|
-
await
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
directory: absDir,
|
|
106
|
-
dryRun: config.dryRun,
|
|
107
|
-
renames: [{ originalPath: result.originalPath, newPath: result.newPath }]
|
|
108
|
-
});
|
|
62
|
+
await recordSession(absDir, config.dryRun, [
|
|
63
|
+
{ originalPath: result.originalPath, newPath: result.newPath }
|
|
64
|
+
]);
|
|
109
65
|
}
|
|
110
66
|
else if (result?.success) {
|
|
111
67
|
ui.dim(`No rename needed for: ${fileName}`);
|
package/dist/cli/watch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/cli/watch.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAErC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAgB,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAI/F,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAqB;IAC3E,qBAAqB;IACrB,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAEjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEvC,6BAA6B;IAC7B,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAE5C,mBAAmB;IACnB,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAEtD,4EAA4E;IAC5E,kEAAkE;IAClE,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAE7E,yCAAyC;IACzC,MAAM,MAAM,GAAW;QACrB,GAAG,WAAW,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC;QACrD,oEAAoE;QACpE,uDAAuD;QACvD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,QAAQ,EAAE,SAAS;QACnB,OAAO,EAAE,SAAS;KACnB,CAAC;IAEF,yDAAyD;IACzD,MAAM,aAAa,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,mBAAmB,GAAG,aAAa,CAAC,sBAAsB,EAAE,CAAC;IAEnE,oDAAoD;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IACtH,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAElE,8BAA8B;IAC9B,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE;QACrC,aAAa,EAAE,IAAI;QACnB,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,CAAC,QAAgB,EAAE,EAAE;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACjD,2EAA2E;YAC3E,IAAI,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAC;YACvB,OAAO,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,YAAY,MAAM,iBAAiB,CAAC,CAAC;IAE7C,yBAAyB;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,EAAE,CAAC,GAAG,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YAEhD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE1D,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC;gBAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC9C,EAAE,CAAC,OAAO,CAAC,GAAG,QAAQ,QAAQ,OAAO,EAAE,CAAC,CAAC;gBACzC,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;oBACzC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;iBAC/D,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBAC3B,EAAE,CAAC,GAAG,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,EAAE,CAAC,KAAK,CAAC,oBAAoB,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;QACxG,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,EAAE,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAC9B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/pdf-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAC;AAIlF,qBAAa,SAAU,YAAW,cAAc;;IAK9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI7B,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"pdf-parser.d.ts","sourceRoot":"","sources":["../../src/parsers/pdf-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAC;AAIlF,qBAAa,SAAU,YAAW,cAAc;;IAK9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI7B,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAgFnD,OAAO,CAAC,SAAS;CAmBlB"}
|
|
@@ -11,28 +11,50 @@ export class PDFParser {
|
|
|
11
11
|
}
|
|
12
12
|
async parse(filePath) {
|
|
13
13
|
try {
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
14
|
+
const { getDocument } = await import('pdfjs-dist/legacy/build/pdf.mjs');
|
|
15
|
+
const raw = fs.readFileSync(filePath);
|
|
16
|
+
// pdfjs may transfer the buffer to its (fake) worker, so hand it a copy
|
|
17
|
+
// rather than the fs buffer.
|
|
18
|
+
const data = new Uint8Array(raw);
|
|
17
19
|
// Suppress pdfjs noise (both stderr and console.warn) for the entire PDF
|
|
18
|
-
// pipeline —
|
|
19
|
-
// pdf-
|
|
20
|
+
// pipeline — warnings can come from either the text-extraction path or
|
|
21
|
+
// pdf-to-png-converter (scanned path).
|
|
20
22
|
const origStderrWrite = process.stderr.write?.bind(process.stderr);
|
|
21
23
|
const origConsoleWarn = console.warn;
|
|
22
24
|
process.stderr.write = () => true;
|
|
23
25
|
console.warn = () => { };
|
|
24
|
-
let data;
|
|
25
26
|
let content = '';
|
|
27
|
+
let imageData;
|
|
28
|
+
let numPages = 0;
|
|
29
|
+
let info = {};
|
|
26
30
|
try {
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
const loadingTask = getDocument({ data, verbosity: 0 });
|
|
32
|
+
const doc = await loadingTask.promise;
|
|
33
|
+
try {
|
|
34
|
+
numPages = doc.numPages;
|
|
35
|
+
const meta = await doc.getMetadata().catch(() => undefined);
|
|
36
|
+
info = meta?.info ?? {};
|
|
37
|
+
const pageTexts = [];
|
|
38
|
+
for (let i = 1; i <= numPages; i++) {
|
|
39
|
+
const page = await doc.getPage(i);
|
|
40
|
+
const textContent = await page.getTextContent();
|
|
41
|
+
pageTexts.push(textContent.items
|
|
42
|
+
.map((item) => (typeof item.str === 'string' ? item.str : ''))
|
|
43
|
+
.join(' '));
|
|
44
|
+
}
|
|
45
|
+
content = pageTexts.join('\n\n').trim();
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
await loadingTask.destroy();
|
|
49
|
+
}
|
|
29
50
|
if (PDFToImageConverter.isScannedPDF(content)) {
|
|
30
51
|
try {
|
|
31
|
-
|
|
32
|
-
|
|
52
|
+
// Return the rendered page as imageData (the vision path), keeping
|
|
53
|
+
// whatever sparse text was extracted as extra context for the AI.
|
|
54
|
+
imageData = await PDFToImageConverter.convertFirstPageToBase64(raw);
|
|
33
55
|
}
|
|
34
56
|
catch {
|
|
35
|
-
// Conversion failed; continue with
|
|
57
|
+
// Conversion failed; continue with the sparse text content
|
|
36
58
|
}
|
|
37
59
|
}
|
|
38
60
|
}
|
|
@@ -42,24 +64,19 @@ export class PDFParser {
|
|
|
42
64
|
console.warn = origConsoleWarn;
|
|
43
65
|
}
|
|
44
66
|
const metadata = {};
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
metadata.modificationDate = this.parseDate(pdfData.meta.info.ModDate);
|
|
56
|
-
}
|
|
57
|
-
if (pdfData.numpages)
|
|
58
|
-
metadata.pages = pdfData.numpages;
|
|
59
|
-
}
|
|
67
|
+
metadata.title = info.Title;
|
|
68
|
+
metadata.author = info.Author;
|
|
69
|
+
metadata.creator = info.Creator;
|
|
70
|
+
metadata.subject = info.Subject;
|
|
71
|
+
if (info.CreationDate)
|
|
72
|
+
metadata.creationDate = this.parseDate(info.CreationDate);
|
|
73
|
+
if (info.ModDate)
|
|
74
|
+
metadata.modificationDate = this.parseDate(info.ModDate);
|
|
75
|
+
if (numPages)
|
|
76
|
+
metadata.pages = numPages;
|
|
60
77
|
if (content)
|
|
61
78
|
metadata.wordCount = content.split(/\s+/).filter((w) => w.length > 0).length;
|
|
62
|
-
return { content, metadata };
|
|
79
|
+
return { content, metadata, imageData };
|
|
63
80
|
}
|
|
64
81
|
catch (error) {
|
|
65
82
|
// Re-throw if already typed — prevents double-wrapping by future nested calls
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf-parser.js","sourceRoot":"","sources":["../../src/parsers/pdf-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,OAAO,SAAS;IACpB;QACE,2CAA2C;IAC7C,CAAC;IAED,QAAQ,CAAC,QAAgB;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAgB;QAC1B,IAAI,CAAC;YACH,MAAM,
|
|
1
|
+
{"version":3,"file":"pdf-parser.js","sourceRoot":"","sources":["../../src/parsers/pdf-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AIProvider, FileInfo, AINameResult } from '../types/index.js';
|
|
2
|
+
/** Shape shared by the Anthropic and OpenAI SDK error classes. */
|
|
3
|
+
export interface CloudApiError {
|
|
4
|
+
status?: number;
|
|
5
|
+
message: string;
|
|
6
|
+
}
|
|
7
|
+
export interface TokenUsage {
|
|
8
|
+
inputTokens?: number;
|
|
9
|
+
outputTokens?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Shared skeleton for cloud AI providers (Claude, OpenAI): image-data
|
|
13
|
+
* validation, prompt building, filename sanitization, and error mapping.
|
|
14
|
+
* Subclasses supply the SDK calls and response/token extraction.
|
|
15
|
+
*/
|
|
16
|
+
export declare abstract class BaseCloudService<TResponse> implements AIProvider {
|
|
17
|
+
readonly name: string;
|
|
18
|
+
protected model: string;
|
|
19
|
+
protected constructor(name: string, model: string);
|
|
20
|
+
generateFileName(content: string, originalName: string, namingConvention?: string, category?: string, fileInfo?: FileInfo, language?: string, context?: string, imageData?: string): Promise<AINameResult>;
|
|
21
|
+
/** Sends a text-only completion request to the provider SDK. */
|
|
22
|
+
protected abstract createTextCompletion(prompt: string): Promise<TResponse>;
|
|
23
|
+
/** Sends a vision completion request (prompt + image) to the provider SDK. */
|
|
24
|
+
protected abstract createImageCompletion(prompt: string, imageData: string): Promise<TResponse>;
|
|
25
|
+
/** Extracts the suggested filename text from the SDK response. */
|
|
26
|
+
protected abstract extractSuggestedName(response: TResponse): string;
|
|
27
|
+
/** Extracts token usage from the SDK response. */
|
|
28
|
+
protected abstract extractTokenUsage(response: TResponse): TokenUsage;
|
|
29
|
+
/** Returns the error if it is the provider SDK's APIError, otherwise undefined. */
|
|
30
|
+
protected abstract asApiError(error: unknown): CloudApiError | undefined;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=base-cloud-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-cloud-service.d.ts","sourceRoot":"","sources":["../../src/services/base-cloud-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMvE,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,8BAAsB,gBAAgB,CAAC,SAAS,CAAE,YAAW,UAAU;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;IAExB,SAAS,aAAa,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAK3C,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,gBAAgB,GAAE,MAAqB,EACvC,QAAQ,GAAE,MAAkB,EAC5B,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IA6DxB,gEAAgE;IAChE,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAE3E,8EAA8E;IAC9E,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAE/F,kEAAkE;IAClE,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM;IAEpE,kDAAkD;IAClD,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,GAAG,UAAU;IAErE,mFAAmF;IACnF,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS;CACzE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { AuthError, NetworkError, RateLimitError } from '../errors.js';
|
|
2
|
+
import { buildFileNamePrompt } from '../utils/ai-prompts.js';
|
|
3
|
+
import { sanitizeCloudFileName } from '../utils/ai-name-sanitizer.js';
|
|
4
|
+
/**
|
|
5
|
+
* Shared skeleton for cloud AI providers (Claude, OpenAI): image-data
|
|
6
|
+
* validation, prompt building, filename sanitization, and error mapping.
|
|
7
|
+
* Subclasses supply the SDK calls and response/token extraction.
|
|
8
|
+
*/
|
|
9
|
+
export class BaseCloudService {
|
|
10
|
+
name;
|
|
11
|
+
model;
|
|
12
|
+
constructor(name, model) {
|
|
13
|
+
this.name = name;
|
|
14
|
+
this.model = model;
|
|
15
|
+
}
|
|
16
|
+
async generateFileName(content, originalName, namingConvention = 'kebab-case', category = 'general', fileInfo, language, context, imageData) {
|
|
17
|
+
const convention = namingConvention;
|
|
18
|
+
const fileCategory = category;
|
|
19
|
+
try {
|
|
20
|
+
let response;
|
|
21
|
+
if (imageData) {
|
|
22
|
+
if (!imageData.startsWith('data:image/') || !imageData.includes(',')) {
|
|
23
|
+
throw new NetworkError('Invalid image data format');
|
|
24
|
+
}
|
|
25
|
+
const prompt = buildFileNamePrompt({
|
|
26
|
+
content: 'Analyze this image and generate an appropriate filename based on what you see.',
|
|
27
|
+
originalName,
|
|
28
|
+
namingConvention: convention,
|
|
29
|
+
category: fileCategory,
|
|
30
|
+
fileInfo,
|
|
31
|
+
language,
|
|
32
|
+
context
|
|
33
|
+
});
|
|
34
|
+
response = await this.createImageCompletion(prompt, imageData);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const prompt = buildFileNamePrompt({
|
|
38
|
+
content,
|
|
39
|
+
originalName,
|
|
40
|
+
namingConvention: convention,
|
|
41
|
+
category: fileCategory,
|
|
42
|
+
fileInfo,
|
|
43
|
+
language,
|
|
44
|
+
context
|
|
45
|
+
});
|
|
46
|
+
response = await this.createTextCompletion(prompt);
|
|
47
|
+
}
|
|
48
|
+
const suggestedName = this.extractSuggestedName(response);
|
|
49
|
+
const { inputTokens, outputTokens } = this.extractTokenUsage(response);
|
|
50
|
+
return {
|
|
51
|
+
name: sanitizeCloudFileName(suggestedName, convention),
|
|
52
|
+
inputTokens,
|
|
53
|
+
outputTokens
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof AuthError || error instanceof NetworkError || error instanceof RateLimitError)
|
|
58
|
+
throw error;
|
|
59
|
+
const apiError = this.asApiError(error);
|
|
60
|
+
if (apiError) {
|
|
61
|
+
if (apiError.status === 401 || apiError.status === 403) {
|
|
62
|
+
throw new AuthError(`${this.name} authentication failed: ${apiError.message}`, { details: { status: apiError.status } });
|
|
63
|
+
}
|
|
64
|
+
if (apiError.status === 429) {
|
|
65
|
+
throw new RateLimitError(`${this.name} rate limit exceeded: ${apiError.message}`, { details: { status: apiError.status } });
|
|
66
|
+
}
|
|
67
|
+
throw new NetworkError(`${this.name} API error (${apiError.status}): ${apiError.message}`, { details: { status: apiError.status } });
|
|
68
|
+
}
|
|
69
|
+
throw new NetworkError(`Failed to generate filename with ${this.name}: ${error instanceof Error ? error.message : 'Unknown error'}`, { cause: error });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=base-cloud-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-cloud-service.js","sourceRoot":"","sources":["../../src/services/base-cloud-service.ts"],"names":[],"mappings":"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"}
|