@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.
Files changed (122) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/README.md +8 -8
  3. package/dist/cli/apply.d.ts.map +1 -1
  4. package/dist/cli/apply.js +33 -6
  5. package/dist/cli/apply.js.map +1 -1
  6. package/dist/cli/clean-empty.d.ts.map +1 -1
  7. package/dist/cli/clean-empty.js +2 -3
  8. package/dist/cli/clean-empty.js.map +1 -1
  9. package/dist/cli/commands.d.ts.map +1 -1
  10. package/dist/cli/commands.js +18 -37
  11. package/dist/cli/commands.js.map +1 -1
  12. package/dist/cli/config-cmd.d.ts.map +1 -1
  13. package/dist/cli/config-cmd.js +7 -4
  14. package/dist/cli/config-cmd.js.map +1 -1
  15. package/dist/cli/dedup.d.ts.map +1 -1
  16. package/dist/cli/dedup.js +3 -11
  17. package/dist/cli/dedup.js.map +1 -1
  18. package/dist/cli/diff.d.ts.map +1 -1
  19. package/dist/cli/diff.js +3 -7
  20. package/dist/cli/diff.js.map +1 -1
  21. package/dist/cli/find.d.ts.map +1 -1
  22. package/dist/cli/find.js +2 -3
  23. package/dist/cli/find.js.map +1 -1
  24. package/dist/cli/flatten.d.ts.map +1 -1
  25. package/dist/cli/flatten.js +4 -11
  26. package/dist/cli/flatten.js.map +1 -1
  27. package/dist/cli/handle-cli-error.d.ts +7 -0
  28. package/dist/cli/handle-cli-error.d.ts.map +1 -0
  29. package/dist/cli/handle-cli-error.js +27 -0
  30. package/dist/cli/handle-cli-error.js.map +1 -0
  31. package/dist/cli/init.d.ts.map +1 -1
  32. package/dist/cli/init.js +8 -6
  33. package/dist/cli/init.js.map +1 -1
  34. package/dist/cli/organize.d.ts.map +1 -1
  35. package/dist/cli/organize.js +4 -11
  36. package/dist/cli/organize.js.map +1 -1
  37. package/dist/cli/rename.d.ts +4 -2
  38. package/dist/cli/rename.d.ts.map +1 -1
  39. package/dist/cli/rename.js +171 -227
  40. package/dist/cli/rename.js.map +1 -1
  41. package/dist/cli/sanitize.d.ts.map +1 -1
  42. package/dist/cli/sanitize.js +4 -12
  43. package/dist/cli/sanitize.js.map +1 -1
  44. package/dist/cli/shared-config.d.ts +60 -0
  45. package/dist/cli/shared-config.d.ts.map +1 -0
  46. package/dist/cli/shared-config.js +64 -0
  47. package/dist/cli/shared-config.js.map +1 -0
  48. package/dist/cli/stats.d.ts.map +1 -1
  49. package/dist/cli/stats.js +2 -4
  50. package/dist/cli/stats.js.map +1 -1
  51. package/dist/cli/tree.d.ts.map +1 -1
  52. package/dist/cli/tree.js +2 -3
  53. package/dist/cli/tree.js.map +1 -1
  54. package/dist/cli/watch.d.ts +3 -1
  55. package/dist/cli/watch.d.ts.map +1 -1
  56. package/dist/cli/watch.js +19 -63
  57. package/dist/cli/watch.js.map +1 -1
  58. package/dist/parsers/pdf-parser.d.ts.map +1 -1
  59. package/dist/parsers/pdf-parser.js +44 -27
  60. package/dist/parsers/pdf-parser.js.map +1 -1
  61. package/dist/services/base-cloud-service.d.ts +32 -0
  62. package/dist/services/base-cloud-service.d.ts.map +1 -0
  63. package/dist/services/base-cloud-service.js +73 -0
  64. package/dist/services/base-cloud-service.js.map +1 -0
  65. package/dist/services/base-local-service.d.ts +18 -0
  66. package/dist/services/base-local-service.d.ts.map +1 -0
  67. package/dist/services/base-local-service.js +81 -0
  68. package/dist/services/base-local-service.js.map +1 -0
  69. package/dist/services/claude-service.d.ts +8 -6
  70. package/dist/services/claude-service.d.ts.map +1 -1
  71. package/dist/services/claude-service.js +40 -98
  72. package/dist/services/claude-service.js.map +1 -1
  73. package/dist/services/file-renamer.d.ts +7 -0
  74. package/dist/services/file-renamer.d.ts.map +1 -1
  75. package/dist/services/file-renamer.js +63 -12
  76. package/dist/services/file-renamer.js.map +1 -1
  77. package/dist/services/lmstudio-service.d.ts +35 -9
  78. package/dist/services/lmstudio-service.d.ts.map +1 -1
  79. package/dist/services/lmstudio-service.js +23 -101
  80. package/dist/services/lmstudio-service.js.map +1 -1
  81. package/dist/services/ollama-service.d.ts +23 -9
  82. package/dist/services/ollama-service.d.ts.map +1 -1
  83. package/dist/services/ollama-service.js +16 -87
  84. package/dist/services/ollama-service.js.map +1 -1
  85. package/dist/services/openai-service.d.ts +8 -6
  86. package/dist/services/openai-service.d.ts.map +1 -1
  87. package/dist/services/openai-service.js +36 -94
  88. package/dist/services/openai-service.js.map +1 -1
  89. package/dist/utils/ai-name-sanitizer.d.ts +14 -0
  90. package/dist/utils/ai-name-sanitizer.d.ts.map +1 -0
  91. package/dist/utils/ai-name-sanitizer.js +55 -0
  92. package/dist/utils/ai-name-sanitizer.js.map +1 -0
  93. package/dist/utils/ai-prompts.d.ts.map +1 -1
  94. package/dist/utils/ai-prompts.js +2 -1
  95. package/dist/utils/ai-prompts.js.map +1 -1
  96. package/dist/utils/assert-directory.d.ts +9 -0
  97. package/dist/utils/assert-directory.d.ts.map +1 -0
  98. package/dist/utils/assert-directory.js +15 -0
  99. package/dist/utils/assert-directory.js.map +1 -0
  100. package/dist/utils/file-info.d.ts +8 -0
  101. package/dist/utils/file-info.d.ts.map +1 -0
  102. package/dist/utils/file-info.js +25 -0
  103. package/dist/utils/file-info.js.map +1 -0
  104. package/dist/utils/file-templates.d.ts.map +1 -1
  105. package/dist/utils/file-templates.js +31 -1
  106. package/dist/utils/file-templates.js.map +1 -1
  107. package/dist/utils/image-compressor.d.ts +1 -1
  108. package/dist/utils/image-compressor.d.ts.map +1 -1
  109. package/dist/utils/image-compressor.js +4 -2
  110. package/dist/utils/image-compressor.js.map +1 -1
  111. package/dist/utils/logger.d.ts +2 -0
  112. package/dist/utils/logger.d.ts.map +1 -1
  113. package/dist/utils/logger.js +4 -0
  114. package/dist/utils/logger.js.map +1 -1
  115. package/dist/utils/record-session.d.ts +18 -0
  116. package/dist/utils/record-session.d.ts.map +1 -0
  117. package/dist/utils/record-session.js +24 -0
  118. package/dist/utils/record-session.js.map +1 -0
  119. package/dist/utils/ui.d.ts.map +1 -1
  120. package/dist/utils/ui.js +1 -7
  121. package/dist/utils/ui.js.map +1 -1
  122. package/package.json +17 -18
@@ -0,0 +1,18 @@
1
+ import { AIProvider, FileInfo, AINameResult } from '../types/index.js';
2
+ /**
3
+ * Shared skeleton for local AI providers (Ollama, LMStudio): localhost URL
4
+ * validation, HTTP request/status mapping, and the generateFileName flow.
5
+ * Subclasses supply the chat request payload and response extraction.
6
+ */
7
+ export declare abstract class BaseLocalService<TRequest, TResponse> implements AIProvider {
8
+ readonly name: string;
9
+ protected baseUrl: string;
10
+ protected model: string;
11
+ protected constructor(name: string, baseUrl: string, model: string);
12
+ private validateLocalUrl;
13
+ generateFileName(content: string, originalName: string, namingConvention?: string, category?: string, fileInfo?: FileInfo, language?: string, context?: string, imageData?: string): Promise<AINameResult>;
14
+ /** Sends the chat request and returns the raw response content, if any. */
15
+ protected abstract requestCompletion(prompt: string, imageData?: string): Promise<string | undefined>;
16
+ protected makeRequest(endpoint: string, payload: TRequest): Promise<TResponse>;
17
+ }
18
+ //# sourceMappingURL=base-local-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-local-service.d.ts","sourceRoot":"","sources":["../../src/services/base-local-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOvE;;;;GAIG;AACH,8BAAsB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAE,YAAW,UAAU;IAC/E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;IAExB,SAAS,aAAa,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAMlE,OAAO,CAAC,gBAAgB;IAelB,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,gBAAgB,SAAe,EAC/B,QAAQ,SAAY,EACpB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IA8BxB,2EAA2E;IAC3E,SAAS,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;cAErF,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC;CAqBrF"}
@@ -0,0 +1,81 @@
1
+ import { buildFileNamePrompt } from '../utils/ai-prompts.js';
2
+ import { AuthError, NetworkError, RateLimitError, ConfigError } from '../errors.js';
3
+ import { sanitizeLocalFileName } from '../utils/ai-name-sanitizer.js';
4
+ /**
5
+ * Shared skeleton for local AI providers (Ollama, LMStudio): localhost URL
6
+ * validation, HTTP request/status mapping, and the generateFileName flow.
7
+ * Subclasses supply the chat request payload and response extraction.
8
+ */
9
+ export class BaseLocalService {
10
+ name;
11
+ baseUrl;
12
+ model;
13
+ constructor(name, baseUrl, model) {
14
+ this.name = name;
15
+ this.baseUrl = this.validateLocalUrl(baseUrl);
16
+ this.model = model;
17
+ }
18
+ validateLocalUrl(url) {
19
+ let parsed;
20
+ try {
21
+ parsed = new URL(url);
22
+ }
23
+ catch {
24
+ throw new ConfigError(`Invalid ${this.name} base URL: ${url}`);
25
+ }
26
+ const hostname = parsed.hostname.toLowerCase();
27
+ const allowed = hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';
28
+ if (!allowed) {
29
+ throw new ConfigError(`${this.name} base URL must point to localhost (got: ${hostname})`);
30
+ }
31
+ return url;
32
+ }
33
+ async generateFileName(content, originalName, namingConvention = 'kebab-case', category = 'general', fileInfo, language, context, imageData) {
34
+ try {
35
+ if (imageData && (!imageData.startsWith('data:image/') || !imageData.includes(','))) {
36
+ throw new NetworkError('Invalid image data format');
37
+ }
38
+ const prompt = buildFileNamePrompt({
39
+ content: imageData
40
+ ? 'Analyze this image and generate an appropriate filename based on what you see.'
41
+ : content,
42
+ originalName,
43
+ namingConvention: namingConvention,
44
+ category: category,
45
+ fileInfo,
46
+ language,
47
+ context
48
+ });
49
+ const responseContent = await this.requestCompletion(prompt, imageData);
50
+ if (responseContent) {
51
+ return { name: sanitizeLocalFileName(responseContent), inputTokens: undefined, outputTokens: undefined };
52
+ }
53
+ throw new NetworkError(`No response content from ${this.name}`);
54
+ }
55
+ catch (error) {
56
+ if (error instanceof AuthError || error instanceof NetworkError || error instanceof RateLimitError || error instanceof ConfigError)
57
+ throw error;
58
+ throw new NetworkError(`${this.name} service failed: ${error instanceof Error ? error.message : 'Unknown error'}`, { cause: error });
59
+ }
60
+ }
61
+ async makeRequest(endpoint, payload) {
62
+ const url = `${this.baseUrl}${endpoint}`;
63
+ const response = await fetch(url, {
64
+ method: 'POST',
65
+ headers: { 'Content-Type': 'application/json' },
66
+ body: JSON.stringify(payload)
67
+ });
68
+ if (!response.ok) {
69
+ const errorText = await response.text();
70
+ if (response.status === 401 || response.status === 403) {
71
+ throw new AuthError(`${this.name} authentication failed`, { details: { status: response.status, body: errorText } });
72
+ }
73
+ if (response.status === 429) {
74
+ throw new RateLimitError(`${this.name} rate limit exceeded`, { details: { status: response.status } });
75
+ }
76
+ throw new NetworkError(`${this.name} API request failed: ${response.status} ${response.statusText}`, { details: { status: response.status, body: errorText } });
77
+ }
78
+ return response.json();
79
+ }
80
+ }
81
+ //# sourceMappingURL=base-local-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-local-service.js","sourceRoot":"","sources":["../../src/services/base-local-service.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,12 @@
1
- import { AIProvider, FileInfo, AINameResult } from '../types/index.js';
2
- export declare class ClaudeService implements AIProvider {
3
- name: string;
1
+ import Anthropic from '@anthropic-ai/sdk';
2
+ import { BaseCloudService, CloudApiError, TokenUsage } from './base-cloud-service.js';
3
+ export declare class ClaudeService extends BaseCloudService<Anthropic.Message> {
4
4
  private client;
5
- private model;
6
5
  constructor(apiKey: string, model?: string);
7
- generateFileName(content: string, originalName: string, namingConvention?: string, category?: string, fileInfo?: FileInfo, language?: string, context?: string, imageData?: string): Promise<AINameResult>;
8
- private sanitizeFileName;
6
+ protected createTextCompletion(prompt: string): Promise<Anthropic.Message>;
7
+ protected createImageCompletion(prompt: string, imageData: string): Promise<Anthropic.Message>;
8
+ protected extractSuggestedName(response: Anthropic.Message): string;
9
+ protected extractTokenUsage(response: Anthropic.Message): TokenUsage;
10
+ protected asApiError(error: unknown): CloudApiError | undefined;
9
11
  }
10
12
  //# sourceMappingURL=claude-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-service.d.ts","sourceRoot":"","sources":["../../src/services/claude-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKvE,qBAAa,aAAc,YAAW,UAAU;IAC9C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAKpC,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;IAoFxB,OAAO,CAAC,gBAAgB;CAkBzB"}
1
+ {"version":3,"file":"claude-service.d.ts","sourceRoot":"","sources":["../../src/services/claude-service.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEtF,qBAAa,aAAc,SAAQ,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC;IACpE,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAK1C,SAAS,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;IAQ1E,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;IAuB9F,SAAS,CAAC,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,GAAG,MAAM;IAMnE,SAAS,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,GAAG,UAAU;IAOpE,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS;CAGhE"}
@@ -1,111 +1,53 @@
1
1
  import Anthropic from '@anthropic-ai/sdk';
2
- import { AuthError, NetworkError, RateLimitError } from '../errors.js';
3
- import { applyNamingConvention, stripWindowsIllegalChars } from '../utils/naming-conventions.js';
4
- import { buildFileNamePrompt } from '../utils/ai-prompts.js';
5
- export class ClaudeService {
6
- name = 'Claude';
2
+ import { BaseCloudService } from './base-cloud-service.js';
3
+ export class ClaudeService extends BaseCloudService {
7
4
  client;
8
- model;
9
5
  constructor(apiKey, model) {
6
+ super('Claude', model ?? 'claude-opus-4-8');
10
7
  this.client = new Anthropic({ apiKey });
11
- this.model = model ?? 'claude-sonnet-4-5-20250929';
12
8
  }
13
- async generateFileName(content, originalName, namingConvention = 'kebab-case', category = 'general', fileInfo, language, context, imageData) {
14
- const convention = namingConvention;
15
- const fileCategory = category;
16
- try {
17
- let response;
18
- if (imageData) {
19
- if (!imageData.startsWith('data:image/') || !imageData.includes(',')) {
20
- throw new NetworkError('Invalid image data format');
21
- }
22
- const prompt = buildFileNamePrompt({
23
- content: 'Analyze this image and generate an appropriate filename based on what you see.',
24
- originalName,
25
- namingConvention: convention,
26
- category: fileCategory,
27
- fileInfo,
28
- language,
29
- context
30
- });
31
- response = await this.client.messages.create({
32
- model: this.model,
33
- max_tokens: 100,
34
- messages: [
9
+ createTextCompletion(prompt) {
10
+ return this.client.messages.create({
11
+ model: this.model,
12
+ max_tokens: 100,
13
+ messages: [{ role: 'user', content: prompt }]
14
+ });
15
+ }
16
+ createImageCompletion(prompt, imageData) {
17
+ return this.client.messages.create({
18
+ model: this.model,
19
+ max_tokens: 100,
20
+ messages: [
21
+ {
22
+ role: 'user',
23
+ content: [
24
+ { type: 'text', text: prompt },
35
25
  {
36
- role: 'user',
37
- content: [
38
- { type: 'text', text: prompt },
39
- {
40
- type: 'image',
41
- source: {
42
- type: 'base64',
43
- media_type: imageData.startsWith('data:image/png') ? 'image/png' : 'image/jpeg',
44
- data: imageData.split(',')[1]
45
- }
46
- }
47
- ]
26
+ type: 'image',
27
+ source: {
28
+ type: 'base64',
29
+ media_type: imageData.startsWith('data:image/png') ? 'image/png' : 'image/jpeg',
30
+ data: imageData.split(',')[1]
31
+ }
48
32
  }
49
33
  ]
50
- });
51
- }
52
- else {
53
- const prompt = buildFileNamePrompt({
54
- content,
55
- originalName,
56
- namingConvention: convention,
57
- category: fileCategory,
58
- fileInfo,
59
- language,
60
- context
61
- });
62
- response = await this.client.messages.create({
63
- model: this.model,
64
- max_tokens: 100,
65
- messages: [{ role: 'user', content: prompt }]
66
- });
67
- }
68
- const suggestedName = response.content[0].type === 'text'
69
- ? response.content[0].text.trim()
70
- : 'untitled-document';
71
- return {
72
- name: this.sanitizeFileName(suggestedName, convention),
73
- inputTokens: response.usage?.input_tokens,
74
- outputTokens: response.usage?.output_tokens
75
- };
76
- }
77
- catch (error) {
78
- if (error instanceof AuthError || error instanceof NetworkError || error instanceof RateLimitError)
79
- throw error;
80
- if (error instanceof Anthropic.APIError) {
81
- if (error.status === 401 || error.status === 403) {
82
- throw new AuthError(`Claude authentication failed: ${error.message}`, { details: { status: error.status } });
83
- }
84
- if (error.status === 429) {
85
- throw new RateLimitError(`Claude rate limit exceeded: ${error.message}`, { details: { status: error.status } });
86
34
  }
87
- throw new NetworkError(`Claude API error (${error.status}): ${error.message}`, { details: { status: error.status } });
88
- }
89
- throw new NetworkError(`Failed to generate filename with Claude: ${error instanceof Error ? error.message : 'Unknown error'}`, { cause: error });
90
- }
35
+ ]
36
+ });
37
+ }
38
+ extractSuggestedName(response) {
39
+ return response.content[0].type === 'text'
40
+ ? response.content[0].text.trim()
41
+ : 'untitled-document';
42
+ }
43
+ extractTokenUsage(response) {
44
+ return {
45
+ inputTokens: response.usage?.input_tokens,
46
+ outputTokens: response.usage?.output_tokens
47
+ };
91
48
  }
92
- sanitizeFileName(name, convention) {
93
- const nameWithoutExt = name.replace(/\.[^/.]+$/, '');
94
- const safeForWindows = stripWindowsIllegalChars(nameWithoutExt);
95
- let cleaned = applyNamingConvention(safeForWindows, convention);
96
- if (!cleaned) {
97
- cleaned = applyNamingConvention('untitled document', convention);
98
- }
99
- else if (cleaned.length > 100) {
100
- cleaned = cleaned.substring(0, 100);
101
- if (convention === 'kebab-case') {
102
- cleaned = cleaned.replace(/-[^-]*$/, '');
103
- }
104
- else if (convention === 'snake_case') {
105
- cleaned = cleaned.replace(/_[^_]*$/, '');
106
- }
107
- }
108
- return cleaned;
49
+ asApiError(error) {
50
+ return error instanceof Anthropic.APIError ? error : undefined;
109
51
  }
110
52
  }
111
53
  //# sourceMappingURL=claude-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-service.js","sourceRoot":"","sources":["../../src/services/claude-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-service.js","sourceRoot":"","sources":["../../src/services/claude-service.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAA6B,MAAM,yBAAyB,CAAC;AAEtF,MAAM,OAAO,aAAc,SAAQ,gBAAmC;IAC5D,MAAM,CAAY;IAE1B,YAAY,MAAc,EAAE,KAAc;QACxC,KAAK,CAAC,QAAQ,EAAE,KAAK,IAAI,iBAAiB,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAES,oBAAoB,CAAC,MAAc;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC9C,CAAC,CAAC;IACL,CAAC;IAES,qBAAqB,CAAC,MAAc,EAAE,SAAiB;QAC/D,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;wBAC9B;4BACE,IAAI,EAAE,OAAO;4BACb,MAAM,EAAE;gCACN,IAAI,EAAE,QAAQ;gCACd,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;gCAC/E,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;6BAC9B;yBACF;qBACF;iBACF;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAES,oBAAoB,CAAC,QAA2B;QACxD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM;YACxC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;YACjC,CAAC,CAAC,mBAAmB,CAAC;IAC1B,CAAC;IAES,iBAAiB,CAAC,QAA2B;QACrD,OAAO;YACL,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,YAAY;YACzC,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa;SAC5C,CAAC;IACJ,CAAC;IAES,UAAU,CAAC,KAAc;QACjC,OAAO,KAAK,YAAY,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,CAAC;CACF"}
@@ -6,10 +6,17 @@ export declare class FileRenamer {
6
6
  private aiService;
7
7
  private config;
8
8
  private retryOptions;
9
+ private claimedTargets;
9
10
  constructor(parserFactory: DocumentParserFactory, aiService: AIProvider | undefined, config: Config, retryOptions?: RetryOptions);
10
11
  renameFiles(files: FileInfo[], onProgress?: (completed: number, total: number, currentFile: string) => void): Promise<RenameSessionResult>;
11
12
  private renameFile;
12
13
  private buildNameFromMetadata;
14
+ /**
15
+ * Build the i-th conflict candidate for a basename. When the name ends with
16
+ * the (convention-formatted) personal name, the counter goes before it so
17
+ * the personal name stays last: bill-2-john, not bill-john-2.
18
+ */
19
+ private conflictCandidate;
13
20
  private resolveConflict;
14
21
  }
15
22
  //# sourceMappingURL=file-renamer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-renamer.d.ts","sourceRoot":"","sources":["../../src/services/file-renamer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAgB,UAAU,EAAgB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAO5D,qBAAa,WAAW;IAEpB,OAAO,CAAC,aAAa;IAErB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;gBAJZ,aAAa,EAAE,qBAAqB,EAEpC,SAAS,EAAE,UAAU,GAAG,SAAS,EACjC,MAAM,EAAE,MAAM,EACd,YAAY,GAAE,YAAiB;IAGnC,WAAW,CACf,KAAK,EAAE,QAAQ,EAAE,EACjB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,GAC3E,OAAO,CAAC,mBAAmB,CAAC;YAiDjB,UAAU;YA0EV,qBAAqB;YAiCrB,eAAe;CAuB9B"}
1
+ {"version":3,"file":"file-renamer.d.ts","sourceRoot":"","sources":["../../src/services/file-renamer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAgB,UAAU,EAAgB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAClH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAI9D,OAAO,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAwB5D,qBAAa,WAAW;IAOpB,OAAO,CAAC,aAAa;IAErB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IAPtB,OAAO,CAAC,cAAc,CAAqB;gBAGjC,aAAa,EAAE,qBAAqB,EAEpC,SAAS,EAAE,UAAU,GAAG,SAAS,EACjC,MAAM,EAAE,MAAM,EACd,YAAY,GAAE,YAAiB;IAGnC,WAAW,CACf,KAAK,EAAE,QAAQ,EAAE,EACjB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,GAC3E,OAAO,CAAC,mBAAmB,CAAC;YAkDjB,UAAU;YAuFV,qBAAqB;IAiCnC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;YAgBX,eAAe;CAsB9B"}
@@ -1,17 +1,36 @@
1
1
  import { promises as fs } from 'fs';
2
2
  import path from 'path';
3
3
  import { categorizeFile, applyTemplate } from '../utils/file-templates.js';
4
+ import { applyNamingConvention } from '../utils/naming-conventions.js';
4
5
  import { FileSizeError, UnsupportedTypeError, ParseError, VisionError, NetworkError } from '../errors.js';
5
6
  import { withRetry } from '../utils/retry.js';
6
7
  import { logger } from '../utils/logger.js';
7
8
  const IMAGE_EXTENSIONS = new Set([
8
9
  '.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.heic', '.webp'
9
10
  ]);
11
+ // Images are downscaled by ImageCompressor and scanned PDFs by pdf-to-image
12
+ // before reaching the AI, so oversized files of these types can still be
13
+ // analyzed without touching the original. Everything else respects maxFileSize.
14
+ const REDUCIBLE_EXTENSIONS = new Set([...IMAGE_EXTENSIONS, '.pdf']);
15
+ // Sanity ceiling for reducible types — above this we refuse to load the file.
16
+ const ABSOLUTE_MAX_FILE_SIZE = 100 * 1024 * 1024;
17
+ /** Lowercase and strip separators so 'IMG_1234' and 'img-1234' compare equal. */
18
+ function normalizeName(name) {
19
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, '');
20
+ }
21
+ /** Camera/scanner/export stems (IMG_0042, scan-2024…) carry no meaning to echo back. */
22
+ function isGenericStem(stem) {
23
+ return /^(img|image|dsc|dscn|dscf|pxl|scan|scanned|screenshot|photo|pict|untitled|document|doc|file)[-_ ()\d]*$/i.test(stem);
24
+ }
10
25
  export class FileRenamer {
11
26
  parserFactory;
12
27
  aiService;
13
28
  config;
14
29
  retryOptions;
30
+ // Targets already promised to other files in this batch. fs.access alone
31
+ // can't see them: dry-run never touches the disk, and concurrent live
32
+ // renames race the check — either way two files could claim one target.
33
+ claimedTargets = new Set();
15
34
  constructor(parserFactory,
16
35
  // undefined when noAi is set — the AI paths below are never reached then
17
36
  aiService, config, retryOptions = {}) {
@@ -21,6 +40,7 @@ export class FileRenamer {
21
40
  this.retryOptions = retryOptions;
22
41
  }
23
42
  async renameFiles(files, onProgress) {
43
+ this.claimedTargets.clear();
24
44
  const results = new Array(files.length);
25
45
  let totalInputTokens = undefined;
26
46
  let totalOutputTokens = undefined;
@@ -75,7 +95,12 @@ export class FileRenamer {
75
95
  }
76
96
  async renameFile(file) {
77
97
  if (file.size > this.config.maxFileSize) {
78
- throw new FileSizeError(`File size (${Math.round(file.size / 1024 / 1024)}MB) exceeds maximum allowed size (${Math.round(this.config.maxFileSize / 1024 / 1024)}MB)`);
98
+ const reducible = REDUCIBLE_EXTENSIONS.has(file.extension.toLowerCase());
99
+ if (!reducible || file.size > ABSOLUTE_MAX_FILE_SIZE) {
100
+ throw new FileSizeError(`File size (${Math.round(file.size / 1024 / 1024)}MB) exceeds maximum allowed size (${Math.round(this.config.maxFileSize / 1024 / 1024)}MB)`);
101
+ }
102
+ // Reducible type (image/PDF): proceed — the parser sends a compressed
103
+ // representation to the AI and the original file is never modified.
79
104
  }
80
105
  const parser = this.parserFactory.getParser(file.path);
81
106
  if (!parser) {
@@ -111,6 +136,13 @@ export class FileRenamer {
111
136
  if (!aiResult.name || aiResult.name.trim().length === 0) {
112
137
  throw new NetworkError('Failed to generate a filename');
113
138
  }
139
+ // The prompt tells the AI to keep already-good names, but echoing back a
140
+ // meaningless camera/scanner stem (IMG_0042) means it read nothing useful —
141
+ // fail loudly instead of blessing the junk name.
142
+ const originalStem = path.basename(file.name, file.extension);
143
+ if (isGenericStem(originalStem) && normalizeName(aiResult.name) === normalizeName(originalStem)) {
144
+ throw new ParseError(`AI could not derive a meaningful name (it returned the original filename "${file.name}")`);
145
+ }
114
146
  const coreFileName = aiResult.name;
115
147
  const templatedName = applyTemplate(coreFileName, fileCategory, this.config.templateOptions, this.config.namingConvention, file);
116
148
  const newFileName = `${templatedName}${file.extension}`;
@@ -165,21 +197,40 @@ export class FileRenamer {
165
197
  }
166
198
  return path.basename(file.name, file.extension).replace(/[-_]/g, ' ');
167
199
  }
200
+ /**
201
+ * Build the i-th conflict candidate for a basename. When the name ends with
202
+ * the (convention-formatted) personal name, the counter goes before it so
203
+ * the personal name stays last: bill-2-john, not bill-john-2.
204
+ */
205
+ conflictCandidate(base, i) {
206
+ const personalName = this.config.templateOptions.personalName;
207
+ if (personalName) {
208
+ const formatted = applyNamingConvention(personalName, this.config.namingConvention);
209
+ // Case-insensitive: camelCase/PascalCase re-capitalize the name inside
210
+ // the full filename (reportJohn vs john) — keep the base's own casing.
211
+ if (base.length > formatted.length && base.toLowerCase().endsWith(formatted.toLowerCase())) {
212
+ const stem = base.slice(0, base.length - formatted.length);
213
+ const tail = base.slice(base.length - formatted.length);
214
+ const sep = /[-_]$/.test(stem) ? stem.slice(-1) : '';
215
+ return `${stem}${i}${sep}${tail}`;
216
+ }
217
+ }
218
+ return `${base}-${i}`;
219
+ }
168
220
  async resolveConflict(newPath) {
169
221
  const ext = path.extname(newPath);
170
- const base = path.join(path.dirname(newPath), path.basename(newPath, ext));
171
- try {
172
- await fs.access(newPath);
173
- }
174
- catch (error) {
175
- if (error.code === 'ENOENT')
176
- return newPath;
177
- throw error;
178
- }
179
- for (let i = 2; i <= 99; i++) {
180
- const candidate = `${base}-${i}${ext}`;
222
+ const dir = path.dirname(newPath);
223
+ const base = path.basename(newPath, ext);
224
+ for (let i = 1; i <= 99; i++) {
225
+ const candidate = i === 1 ? newPath : path.join(dir, `${this.conflictCandidate(base, i)}${ext}`);
226
+ if (this.claimedTargets.has(candidate))
227
+ continue;
228
+ // Claim before awaiting: concurrent resolveConflict calls run between
229
+ // awaits, so a synchronous claim is what makes the reservation atomic.
230
+ this.claimedTargets.add(candidate);
181
231
  try {
182
232
  await fs.access(candidate);
233
+ // exists on disk — leave the (harmless) claim and try the next suffix
183
234
  }
184
235
  catch (error) {
185
236
  if (error.code === 'ENOENT')
@@ -1 +1 @@
1
- {"version":3,"file":"file-renamer.js","sourceRoot":"","sources":["../../src/services/file-renamer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-renamer.js","sourceRoot":"","sources":["../../src/services/file-renamer.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,40 @@
1
- import { AIProvider, FileInfo, AINameResult } from '../types/index.js';
2
- export declare class LMStudioService implements AIProvider {
3
- name: string;
4
- private baseUrl;
5
- private model;
1
+ import { BaseLocalService } from './base-local-service.js';
2
+ interface OpenAICompatibleResponse {
3
+ choices: Array<{
4
+ message: {
5
+ content: string;
6
+ role: string;
7
+ };
8
+ finish_reason: string;
9
+ }>;
10
+ usage?: {
11
+ prompt_tokens: number;
12
+ completion_tokens: number;
13
+ total_tokens: number;
14
+ };
15
+ }
16
+ interface OpenAIMessage {
17
+ role: 'system' | 'user' | 'assistant';
18
+ content: string | Array<{
19
+ type: string;
20
+ text?: string;
21
+ image_url?: {
22
+ url: string;
23
+ };
24
+ }>;
25
+ }
26
+ interface LMStudioChatRequest {
27
+ model: string;
28
+ messages: OpenAIMessage[];
29
+ temperature: number;
30
+ max_tokens: number;
31
+ stream: boolean;
32
+ }
33
+ export declare class LMStudioService extends BaseLocalService<LMStudioChatRequest, OpenAICompatibleResponse> {
6
34
  constructor(baseUrl?: string, model?: string);
7
- private validateLocalUrl;
8
- generateFileName(content: string, originalName: string, namingConvention?: string, category?: string, fileInfo?: FileInfo, language?: string, context?: string, imageData?: string): Promise<AINameResult>;
9
- private sanitizeFilename;
10
- private makeRequest;
35
+ protected requestCompletion(prompt: string, imageData?: string): Promise<string | undefined>;
11
36
  isAvailable(): Promise<boolean>;
12
37
  listModels(): Promise<string[]>;
13
38
  }
39
+ export {};
14
40
  //# sourceMappingURL=lmstudio-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lmstudio-service.d.ts","sourceRoot":"","sources":["../../src/services/lmstudio-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAiCvE,qBAAa,eAAgB,YAAW,UAAU;IAChD,IAAI,SAAc;IAClB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAGpB,OAAO,SAA0B,EACjC,KAAK,SAAgB;IAMvB,OAAO,CAAC,gBAAgB;IAelB,gBAAgB,CACpB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,gBAAgB,SAAe,EAC/B,QAAQ,SAAY,EACpB,QAAQ,CAAC,EAAE,QAAQ,EACnB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,CAAC;IAqDxB,OAAO,CAAC,gBAAgB;YAUV,WAAW;IA2BnB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAU/B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAWtC"}
1
+ {"version":3,"file":"lmstudio-service.d.ts","sourceRoot":"","sources":["../../src/services/lmstudio-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,UAAU,wBAAwB;IAChC,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,EAAE;YACP,OAAO,EAAE,MAAM,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;QACF,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;CACvF;AAED,UAAU,mBAAmB;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AASD,qBAAa,eAAgB,SAAQ,gBAAgB,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;gBAEhG,OAAO,SAA0B,EACjC,KAAK,SAAgB;cAKP,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IA0B5F,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAU/B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAWtC"}