@amirdaraee/namewise 1.0.0 → 1.1.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 +46 -0
- package/README.md +6 -6
- 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 +1 -20
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/config-cmd.d.ts.map +1 -1
- package/dist/cli/config-cmd.js +4 -3
- 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 +25 -0
- package/dist/cli/handle-cli-error.js.map +1 -0
- package/dist/cli/info.js.map +1 -1
- package/dist/cli/init.js +2 -2
- 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 +166 -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 +39 -24
- 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/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 +39 -0
- package/dist/utils/ai-name-sanitizer.js.map +1 -0
- 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/batch-rename.d.ts.map +1 -1
- package/dist/utils/batch-rename.js +10 -1
- package/dist/utils/batch-rename.js.map +1 -1
- 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/image-compressor.js +1 -1
- package/dist/utils/image-compressor.js.map +1 -1
- package/dist/utils/organize.js.map +1 -1
- package/dist/utils/pattern-rename.d.ts.map +1 -1
- package/dist/utils/pattern-rename.js +8 -1
- package/dist/utils/pattern-rename.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 +24 -22
|
@@ -1,93 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
export class OllamaService {
|
|
4
|
-
name = 'Ollama';
|
|
5
|
-
baseUrl;
|
|
6
|
-
model;
|
|
1
|
+
import { AI_SYSTEM_PROMPT } from '../utils/ai-prompts.js';
|
|
2
|
+
import { BaseLocalService } from './base-local-service.js';
|
|
3
|
+
export class OllamaService extends BaseLocalService {
|
|
7
4
|
constructor(baseUrl = 'http://localhost:11434', model = 'llama3.1') {
|
|
8
|
-
|
|
9
|
-
this.model = model;
|
|
5
|
+
super('Ollama', baseUrl, model);
|
|
10
6
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
throw new ConfigError(`Ollama base URL must point to localhost (got: ${hostname})`);
|
|
23
|
-
}
|
|
24
|
-
return url;
|
|
25
|
-
}
|
|
26
|
-
async generateFileName(content, originalName, namingConvention = 'kebab-case', category = 'general', fileInfo, language, context, imageData) {
|
|
27
|
-
try {
|
|
28
|
-
if (imageData && (!imageData.startsWith('data:image/') || !imageData.includes(','))) {
|
|
29
|
-
throw new NetworkError('Invalid image data format');
|
|
30
|
-
}
|
|
31
|
-
const prompt = buildFileNamePrompt({
|
|
32
|
-
content: imageData
|
|
33
|
-
? 'Analyze this image and generate an appropriate filename based on what you see.'
|
|
34
|
-
: content,
|
|
35
|
-
originalName,
|
|
36
|
-
namingConvention: namingConvention,
|
|
37
|
-
category: category,
|
|
38
|
-
fileInfo,
|
|
39
|
-
language,
|
|
40
|
-
context
|
|
41
|
-
});
|
|
42
|
-
const userMessage = imageData
|
|
43
|
-
? { role: 'user', content: prompt, images: [imageData.split(',')[1]] }
|
|
44
|
-
: { role: 'user', content: prompt };
|
|
45
|
-
const response = await this.makeRequest('/api/chat', {
|
|
46
|
-
model: this.model,
|
|
47
|
-
messages: [
|
|
48
|
-
{ role: 'system', content: AI_SYSTEM_PROMPT },
|
|
49
|
-
userMessage
|
|
50
|
-
],
|
|
51
|
-
stream: false
|
|
52
|
-
});
|
|
53
|
-
if (response.message?.content) {
|
|
54
|
-
return { name: this.sanitizeFilename(response.message.content), inputTokens: undefined, outputTokens: undefined };
|
|
55
|
-
}
|
|
56
|
-
throw new NetworkError('No response content from Ollama');
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
if (error instanceof AuthError || error instanceof NetworkError || error instanceof RateLimitError || error instanceof ConfigError)
|
|
60
|
-
throw error;
|
|
61
|
-
throw new NetworkError(`Ollama service failed: ${error instanceof Error ? error.message : 'Unknown error'}`, { cause: error });
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
sanitizeFilename(filename) {
|
|
65
|
-
return filename
|
|
66
|
-
.trim()
|
|
67
|
-
.replace(/^["']|["']$/g, '')
|
|
68
|
-
.replace(/\.(txt|pdf|docx?|xlsx?|md|rtf)$/i, '')
|
|
69
|
-
.replace(/[<>:"/\\|?*]/g, '-')
|
|
70
|
-
.replace(/\s+/g, '-')
|
|
71
|
-
.toLowerCase();
|
|
72
|
-
}
|
|
73
|
-
async makeRequest(endpoint, payload) {
|
|
74
|
-
const url = `${this.baseUrl}${endpoint}`;
|
|
75
|
-
const response = await fetch(url, {
|
|
76
|
-
method: 'POST',
|
|
77
|
-
headers: { 'Content-Type': 'application/json' },
|
|
78
|
-
body: JSON.stringify(payload)
|
|
7
|
+
async requestCompletion(prompt, imageData) {
|
|
8
|
+
const userMessage = imageData
|
|
9
|
+
? { role: 'user', content: prompt, images: [imageData.split(',')[1]] }
|
|
10
|
+
: { role: 'user', content: prompt };
|
|
11
|
+
const response = await this.makeRequest('/api/chat', {
|
|
12
|
+
model: this.model,
|
|
13
|
+
messages: [
|
|
14
|
+
{ role: 'system', content: AI_SYSTEM_PROMPT },
|
|
15
|
+
userMessage
|
|
16
|
+
],
|
|
17
|
+
stream: false
|
|
79
18
|
});
|
|
80
|
-
|
|
81
|
-
const errorText = await response.text();
|
|
82
|
-
if (response.status === 401 || response.status === 403) {
|
|
83
|
-
throw new AuthError(`Ollama authentication failed`, { details: { status: response.status, body: errorText } });
|
|
84
|
-
}
|
|
85
|
-
if (response.status === 429) {
|
|
86
|
-
throw new RateLimitError(`Ollama rate limit exceeded`, { details: { status: response.status } });
|
|
87
|
-
}
|
|
88
|
-
throw new NetworkError(`Ollama API request failed: ${response.status} ${response.statusText}`, { details: { status: response.status, body: errorText } });
|
|
89
|
-
}
|
|
90
|
-
return response.json();
|
|
19
|
+
return response.message?.content;
|
|
91
20
|
}
|
|
92
21
|
async isAvailable() {
|
|
93
22
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama-service.js","sourceRoot":"","sources":["../../src/services/ollama-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ollama-service.js","sourceRoot":"","sources":["../../src/services/ollama-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAyB3D,MAAM,OAAO,aAAc,SAAQ,gBAAmD;IACpF,YAAY,OAAO,GAAG,wBAAwB,EAAE,KAAK,GAAG,UAAU;QAChE,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAES,KAAK,CAAC,iBAAiB,CAAC,MAAc,EAAE,SAAkB;QAClE,MAAM,WAAW,GAAsB,SAAS;YAC9C,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACtE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAEtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;YACnD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE;gBAC7C,WAAW;aACZ;YACD,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;YACzD,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC,QAAQ,CAAC,EAAE;gBAAE,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAsB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACxE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
import { BaseCloudService, CloudApiError, TokenUsage } from './base-cloud-service.js';
|
|
3
|
+
export declare class OpenAIService extends BaseCloudService<OpenAI.Chat.Completions.ChatCompletion> {
|
|
4
4
|
private client;
|
|
5
|
-
private model;
|
|
6
5
|
constructor(apiKey: string, model?: string);
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
protected createTextCompletion(prompt: string): Promise<OpenAI.Chat.Completions.ChatCompletion>;
|
|
7
|
+
protected createImageCompletion(prompt: string, imageData: string): Promise<OpenAI.Chat.Completions.ChatCompletion>;
|
|
8
|
+
protected extractSuggestedName(response: OpenAI.Chat.Completions.ChatCompletion): string;
|
|
9
|
+
protected extractTokenUsage(response: OpenAI.Chat.Completions.ChatCompletion): TokenUsage;
|
|
10
|
+
protected asApiError(error: unknown): CloudApiError | undefined;
|
|
9
11
|
}
|
|
10
12
|
//# sourceMappingURL=openai-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-service.d.ts","sourceRoot":"","sources":["../../src/services/openai-service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai-service.d.ts","sourceRoot":"","sources":["../../src/services/openai-service.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEtF,qBAAa,aAAc,SAAQ,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;IACzF,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAK1C,SAAS,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;IAS/F,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;IAiBnH,SAAS,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,MAAM;IAIxF,SAAS,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,GAAG,UAAU;IAOzF,SAAS,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS;CAGhE"}
|
|
@@ -1,104 +1,46 @@
|
|
|
1
1
|
import OpenAI from 'openai';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import { buildFileNamePrompt } from '../utils/ai-prompts.js';
|
|
5
|
-
export class OpenAIService {
|
|
6
|
-
name = 'OpenAI';
|
|
2
|
+
import { BaseCloudService } from './base-cloud-service.js';
|
|
3
|
+
export class OpenAIService extends BaseCloudService {
|
|
7
4
|
client;
|
|
8
|
-
model;
|
|
9
5
|
constructor(apiKey, model) {
|
|
6
|
+
super('OpenAI', model ?? 'gpt-5.5');
|
|
10
7
|
this.client = new OpenAI({ apiKey });
|
|
11
|
-
this.model = model ?? 'gpt-4o';
|
|
12
8
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
response = await this.client.chat.completions.create({
|
|
32
|
-
model: this.model,
|
|
33
|
-
messages: [
|
|
34
|
-
{
|
|
35
|
-
role: 'user',
|
|
36
|
-
content: [
|
|
37
|
-
{ type: 'text', text: prompt },
|
|
38
|
-
{ type: 'image_url', image_url: { url: imageData } }
|
|
39
|
-
]
|
|
40
|
-
}
|
|
41
|
-
],
|
|
42
|
-
max_tokens: 100,
|
|
43
|
-
temperature: 0.3
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
const prompt = buildFileNamePrompt({
|
|
48
|
-
content,
|
|
49
|
-
originalName,
|
|
50
|
-
namingConvention: convention,
|
|
51
|
-
category: fileCategory,
|
|
52
|
-
fileInfo,
|
|
53
|
-
language,
|
|
54
|
-
context
|
|
55
|
-
});
|
|
56
|
-
response = await this.client.chat.completions.create({
|
|
57
|
-
model: this.model,
|
|
58
|
-
messages: [{ role: 'user', content: prompt }],
|
|
59
|
-
max_tokens: 100,
|
|
60
|
-
temperature: 0.3
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
const suggestedName = response.choices[0]?.message?.content?.trim() || 'untitled-document';
|
|
64
|
-
return {
|
|
65
|
-
name: this.sanitizeFileName(suggestedName, convention),
|
|
66
|
-
inputTokens: response.usage?.prompt_tokens,
|
|
67
|
-
outputTokens: response.usage?.completion_tokens
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
catch (error) {
|
|
71
|
-
if (error instanceof AuthError || error instanceof NetworkError || error instanceof RateLimitError)
|
|
72
|
-
throw error;
|
|
73
|
-
if (error instanceof OpenAI.APIError) {
|
|
74
|
-
if (error.status === 401 || error.status === 403) {
|
|
75
|
-
throw new AuthError(`OpenAI authentication failed: ${error.message}`, { details: { status: error.status } });
|
|
76
|
-
}
|
|
77
|
-
if (error.status === 429) {
|
|
78
|
-
throw new RateLimitError(`OpenAI rate limit exceeded: ${error.message}`, { details: { status: error.status } });
|
|
9
|
+
createTextCompletion(prompt) {
|
|
10
|
+
return this.client.chat.completions.create({
|
|
11
|
+
model: this.model,
|
|
12
|
+
messages: [{ role: 'user', content: prompt }],
|
|
13
|
+
max_tokens: 100,
|
|
14
|
+
temperature: 0.3
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
createImageCompletion(prompt, imageData) {
|
|
18
|
+
return this.client.chat.completions.create({
|
|
19
|
+
model: this.model,
|
|
20
|
+
messages: [
|
|
21
|
+
{
|
|
22
|
+
role: 'user',
|
|
23
|
+
content: [
|
|
24
|
+
{ type: 'text', text: prompt },
|
|
25
|
+
{ type: 'image_url', image_url: { url: imageData } }
|
|
26
|
+
]
|
|
79
27
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}
|
|
28
|
+
],
|
|
29
|
+
max_tokens: 100,
|
|
30
|
+
temperature: 0.3
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
extractSuggestedName(response) {
|
|
34
|
+
return response.choices[0]?.message?.content?.trim() || 'untitled-document';
|
|
35
|
+
}
|
|
36
|
+
extractTokenUsage(response) {
|
|
37
|
+
return {
|
|
38
|
+
inputTokens: response.usage?.prompt_tokens,
|
|
39
|
+
outputTokens: response.usage?.completion_tokens
|
|
40
|
+
};
|
|
84
41
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const safeForWindows = stripWindowsIllegalChars(nameWithoutExt);
|
|
88
|
-
let cleaned = applyNamingConvention(safeForWindows, convention);
|
|
89
|
-
if (!cleaned) {
|
|
90
|
-
cleaned = applyNamingConvention('untitled document', convention);
|
|
91
|
-
}
|
|
92
|
-
else if (cleaned.length > 100) {
|
|
93
|
-
cleaned = cleaned.substring(0, 100);
|
|
94
|
-
if (convention === 'kebab-case') {
|
|
95
|
-
cleaned = cleaned.replace(/-[^-]*$/, '');
|
|
96
|
-
}
|
|
97
|
-
else if (convention === 'snake_case') {
|
|
98
|
-
cleaned = cleaned.replace(/_[^_]*$/, '');
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return cleaned;
|
|
42
|
+
asApiError(error) {
|
|
43
|
+
return error instanceof OpenAI.APIError ? error : undefined;
|
|
102
44
|
}
|
|
103
45
|
}
|
|
104
46
|
//# sourceMappingURL=openai-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-service.js","sourceRoot":"","sources":["../../src/services/openai-service.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"openai-service.js","sourceRoot":"","sources":["../../src/services/openai-service.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAA6B,MAAM,yBAAyB,CAAC;AAEtF,MAAM,OAAO,aAAc,SAAQ,gBAAwD;IACjF,MAAM,CAAS;IAEvB,YAAY,MAAc,EAAE,KAAc;QACxC,KAAK,CAAC,QAAQ,EAAE,KAAK,IAAI,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAES,oBAAoB,CAAC,MAAc;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACzC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7C,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,GAAG;SACjB,CAAC,CAAC;IACL,CAAC;IAES,qBAAqB,CAAC,MAAc,EAAE,SAAiB;QAC/D,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACzC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;wBAC9B,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;qBACrD;iBACF;aACF;YACD,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,GAAG;SACjB,CAAC,CAAC;IACL,CAAC;IAES,oBAAoB,CAAC,QAAgD;QAC7E,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,mBAAmB,CAAC;IAC9E,CAAC;IAES,iBAAiB,CAAC,QAAgD;QAC1E,OAAO;YACL,WAAW,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa;YAC1C,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,iBAAiB;SAChD,CAAC;IACJ,CAAC;IAES,UAAU,CAAC,KAAc;QACjC,OAAO,KAAK,YAAY,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { NamingConvention } from './naming-conventions.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sanitizes AI-suggested filenames from cloud providers (Claude, OpenAI):
|
|
4
|
+
* strips the extension and Windows-illegal characters, applies the naming
|
|
5
|
+
* convention, and truncates overly long names at a word boundary.
|
|
6
|
+
*/
|
|
7
|
+
export declare function sanitizeCloudFileName(name: string, convention: NamingConvention): string;
|
|
8
|
+
/**
|
|
9
|
+
* Sanitizes AI-suggested filenames from local providers (Ollama, LMStudio):
|
|
10
|
+
* strips surrounding quotes and known extensions, replaces invalid characters
|
|
11
|
+
* and whitespace with hyphens, and lowercases the result.
|
|
12
|
+
*/
|
|
13
|
+
export declare function sanitizeLocalFileName(filename: string): string;
|
|
14
|
+
//# sourceMappingURL=ai-name-sanitizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-name-sanitizer.d.ts","sourceRoot":"","sources":["../../src/utils/ai-name-sanitizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmD,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE5G;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAiBxF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQ9D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { applyNamingConvention, stripWindowsIllegalChars } from './naming-conventions.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sanitizes AI-suggested filenames from cloud providers (Claude, OpenAI):
|
|
4
|
+
* strips the extension and Windows-illegal characters, applies the naming
|
|
5
|
+
* convention, and truncates overly long names at a word boundary.
|
|
6
|
+
*/
|
|
7
|
+
export function sanitizeCloudFileName(name, convention) {
|
|
8
|
+
const nameWithoutExt = name.replace(/\.[^/.]+$/, '');
|
|
9
|
+
const safeForWindows = stripWindowsIllegalChars(nameWithoutExt);
|
|
10
|
+
let cleaned = applyNamingConvention(safeForWindows, convention);
|
|
11
|
+
if (!cleaned) {
|
|
12
|
+
cleaned = applyNamingConvention('untitled document', convention);
|
|
13
|
+
}
|
|
14
|
+
else if (cleaned.length > 100) {
|
|
15
|
+
cleaned = cleaned.substring(0, 100);
|
|
16
|
+
if (convention === 'kebab-case') {
|
|
17
|
+
cleaned = cleaned.replace(/-[^-]*$/, '');
|
|
18
|
+
}
|
|
19
|
+
else if (convention === 'snake_case') {
|
|
20
|
+
cleaned = cleaned.replace(/_[^_]*$/, '');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return cleaned;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Sanitizes AI-suggested filenames from local providers (Ollama, LMStudio):
|
|
27
|
+
* strips surrounding quotes and known extensions, replaces invalid characters
|
|
28
|
+
* and whitespace with hyphens, and lowercases the result.
|
|
29
|
+
*/
|
|
30
|
+
export function sanitizeLocalFileName(filename) {
|
|
31
|
+
return filename
|
|
32
|
+
.trim()
|
|
33
|
+
.replace(/^["']|["']$/g, '') // Remove quotes
|
|
34
|
+
.replace(/\.(txt|pdf|docx?|xlsx?|md|rtf)$/i, '') // Remove extensions
|
|
35
|
+
.replace(/[<>:"/\\|?*]/g, '-') // Replace invalid characters
|
|
36
|
+
.replace(/\s+/g, '-') // Replace spaces with hyphens
|
|
37
|
+
.toLowerCase();
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=ai-name-sanitizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-name-sanitizer.js","sourceRoot":"","sources":["../../src/utils/ai-name-sanitizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAoB,MAAM,yBAAyB,CAAC;AAE5G;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,UAA4B;IAC9E,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,wBAAwB,CAAC,cAAc,CAAC,CAAC;IAChE,IAAI,OAAO,GAAG,qBAAqB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IAEhE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,qBAAqB,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;IACnE,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAChC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YAChC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YACvC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,OAAO,QAAQ;SACZ,IAAI,EAAE;SACN,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,gBAAgB;SAC5C,OAAO,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC,oBAAoB;SACpE,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,6BAA6B;SAC3D,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,8BAA8B;SACnD,WAAW,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate that a path exists and is a directory.
|
|
3
|
+
*
|
|
4
|
+
* Throws the stat error (e.g. ENOENT) when the path does not exist, or
|
|
5
|
+
* `"<path> is not a directory"` when it exists but is not a directory —
|
|
6
|
+
* the exact error text shared by every subcommand.
|
|
7
|
+
*/
|
|
8
|
+
export declare function assertDirectory(dirPath: string): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=assert-directory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assert-directory.d.ts","sourceRoot":"","sources":["../../src/utils/assert-directory.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKpE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
/**
|
|
3
|
+
* Validate that a path exists and is a directory.
|
|
4
|
+
*
|
|
5
|
+
* Throws the stat error (e.g. ENOENT) when the path does not exist, or
|
|
6
|
+
* `"<path> is not a directory"` when it exists but is not a directory —
|
|
7
|
+
* the exact error text shared by every subcommand.
|
|
8
|
+
*/
|
|
9
|
+
export async function assertDirectory(dirPath) {
|
|
10
|
+
const stat = await fs.stat(dirPath);
|
|
11
|
+
if (!stat.isDirectory()) {
|
|
12
|
+
throw new Error(`${dirPath} is not a directory`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=assert-directory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assert-directory.js","sourceRoot":"","sources":["../../src/utils/assert-directory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AAEpC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,qBAAqB,CAAC,CAAC;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-rename.d.ts","sourceRoot":"","sources":["../../src/utils/batch-rename.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAIR;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAWnF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"batch-rename.d.ts","sourceRoot":"","sources":["../../src/utils/batch-rename.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAIR;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAWnF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAUhE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAElE"}
|
|
@@ -28,7 +28,16 @@ export function applyDateStamp(stem, date, format) {
|
|
|
28
28
|
return `${stamp}-${stem}`;
|
|
29
29
|
}
|
|
30
30
|
export function applyStrip(stem, pattern) {
|
|
31
|
-
|
|
31
|
+
let find;
|
|
32
|
+
try {
|
|
33
|
+
// User-supplied regex is the point of --strip; it only runs against the
|
|
34
|
+
// user's own filenames in their own process.
|
|
35
|
+
find = new RegExp(pattern, 'g');
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new Error(`Invalid regular expression for --strip: "${pattern}"`);
|
|
39
|
+
}
|
|
40
|
+
return stem.replace(find, '');
|
|
32
41
|
}
|
|
33
42
|
export function applyTruncate(stem, maxLen) {
|
|
34
43
|
return stem.slice(0, maxLen);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-rename.js","sourceRoot":"","sources":["../../src/utils/batch-rename.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAC3B,KAAa,EACb,KAAa,EACb,MAAe;IAEf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACtD,OAAO,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACtD,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAU,EAAE,MAAkB;IACzE,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,KAAa,CAAC;IAClB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YAAE,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC;YAAC,MAAM;QACnC,KAAK,UAAU;YAAE,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,MAAM;QAC/C;YAAS,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,0BAA0B;IACtE,CAAC;IACD,OAAO,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe;IACtD,
|
|
1
|
+
{"version":3,"file":"batch-rename.js","sourceRoot":"","sources":["../../src/utils/batch-rename.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAC3B,KAAa,EACb,KAAa,EACb,MAAe;IAEf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACtD,OAAO,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc;IACtD,OAAO,GAAG,IAAI,GAAG,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAU,EAAE,MAAkB;IACzE,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,IAAI,KAAa,CAAC;IAClB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YAAE,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC;YAAC,MAAM;QACnC,KAAK,UAAU;YAAE,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAC,MAAM;QAC/C;YAAS,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,0BAA0B;IACtE,CAAC;IACD,OAAO,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe;IACtD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,wEAAwE;QACxE,6CAA6C;QAC7C,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,4CAA4C,OAAO,GAAG,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { FileInfo } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Stat a file and build the FileInfo record consumed by the rename pipeline.
|
|
4
|
+
* Shared by the `rename` scanner and the `watch` add-handler, which previously
|
|
5
|
+
* each built this literal by hand.
|
|
6
|
+
*/
|
|
7
|
+
export declare function statToFileInfo(filePath: string): Promise<FileInfo>;
|
|
8
|
+
//# sourceMappingURL=file-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-info.d.ts","sourceRoot":"","sources":["../../src/utils/file-info.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiBxE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Stat a file and build the FileInfo record consumed by the rename pipeline.
|
|
5
|
+
* Shared by the `rename` scanner and the `watch` add-handler, which previously
|
|
6
|
+
* each built this literal by hand.
|
|
7
|
+
*/
|
|
8
|
+
export async function statToFileInfo(filePath) {
|
|
9
|
+
const stats = await fs.stat(filePath);
|
|
10
|
+
const fullPath = path.resolve(filePath);
|
|
11
|
+
const folderPath = path.dirname(fullPath).split(path.sep).filter(p => p);
|
|
12
|
+
return {
|
|
13
|
+
path: filePath,
|
|
14
|
+
name: path.basename(filePath),
|
|
15
|
+
extension: path.extname(filePath).toLowerCase(),
|
|
16
|
+
size: stats.size,
|
|
17
|
+
createdAt: stats.birthtime,
|
|
18
|
+
modifiedAt: stats.mtime,
|
|
19
|
+
accessedAt: stats.atime,
|
|
20
|
+
parentFolder: path.basename(path.dirname(filePath)),
|
|
21
|
+
folderPath: folderPath.slice(-3),
|
|
22
|
+
documentMetadata: undefined
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=file-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-info.js","sourceRoot":"","sources":["../../src/utils/file-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEzE,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;QAC/C,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,KAAK;QACvB,UAAU,EAAE,KAAK,CAAC,KAAK;QACvB,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnD,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,gBAAgB,EAAE,SAAS;KAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -29,7 +29,7 @@ export class ImageCompressor {
|
|
|
29
29
|
// Decode HEIC/HEIF to JPEG first (canvas cannot load HEIC natively)
|
|
30
30
|
if (mimeType === 'image/heic' || mimeType === 'image/heif') {
|
|
31
31
|
const heicConvert = (await import('heic-convert')).default;
|
|
32
|
-
workingBuffer = Buffer.from(await heicConvert({ buffer: workingBuffer
|
|
32
|
+
workingBuffer = Buffer.from(await heicConvert({ buffer: workingBuffer, format: 'JPEG', quality: 1 }));
|
|
33
33
|
}
|
|
34
34
|
const img = await canvasModule.loadImage(workingBuffer);
|
|
35
35
|
// Resize so the longest side is at most 1024px, preserving aspect ratio
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-compressor.js","sourceRoot":"","sources":["../../src/utils/image-compressor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAI3C,MAAM,OAAO,eAAe;IAClB,MAAM,CAAU,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;IACjD,MAAM,CAAU,aAAa,GAAG,IAAI,CAAC;IAE7C;;;;OAIG;IACK,MAAM,CAAC,KAAK,CAAC,gBAAgB;QACnC,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,WAAW,CACnB,kFAAkF,EAClF;gBACE,IAAI,EAAE,oHAAoH;gBAC1H,KAAK;aACN,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,QAAgB;QACpD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACnD,IAAI,aAAa,GAAG,MAAM,CAAC;QAE3B,oEAAoE;QACpE,IAAI,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC3D,MAAM,WAAW,GAAG,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3D,aAAa,GAAG,MAAM,CAAC,IAAI,CACzB,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"image-compressor.js","sourceRoot":"","sources":["../../src/utils/image-compressor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organize.js","sourceRoot":"","sources":["../../src/utils/organize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"organize.js","sourceRoot":"","sources":["../../src/utils/organize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAc,MAAM,IAAI,CAAC;AAChD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAU/C,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,SAAiB,EACjB,EAAc,EACd,SAAkB;IAElB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE7D,oEAAoE;QACpE,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO;YAAE,SAAS;QAEjD,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,SAAS,CAChB,QAAgB,EAChB,EAAc,EACd,IAAW;IAEX,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1D,OAAO,GAAG,IAAI,OAAO,CAAC;QACxB,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,KAAK,GAAI,IAAY,CAAC,IAAI,IAAI,CAAC,CAAC;YACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;gBAAE,OAAO,OAAO,CAAC;YACxC,IAAI,KAAK,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;gBAAE,OAAO,QAAQ,CAAC;YAC9C,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern-rename.d.ts","sourceRoot":"","sources":["../../src/utils/pattern-rename.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"pattern-rename.d.ts","sourceRoot":"","sources":["../../src/utils/pattern-rename.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAqB/E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAOtE"}
|
|
@@ -2,7 +2,14 @@ export function parsePattern(pattern) {
|
|
|
2
2
|
const sedMatch = pattern.match(/^s\/((?:[^/\\]|\\.)*)\/((?:[^/\\]|\\.)*)\/([gimu]*)$/);
|
|
3
3
|
if (sedMatch) {
|
|
4
4
|
const [, find, replace, flags] = sedMatch;
|
|
5
|
-
|
|
5
|
+
try {
|
|
6
|
+
// User-supplied regex is the point of the s/find/replace/ syntax; it only
|
|
7
|
+
// runs against the user's own filenames in their own process.
|
|
8
|
+
return { find: new RegExp(find, flags || undefined), replace };
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
throw new Error(`Invalid regular expression in pattern: "${find}"`);
|
|
12
|
+
}
|
|
6
13
|
}
|
|
7
14
|
const colonIdx = pattern.indexOf(':');
|
|
8
15
|
if (colonIdx > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern-rename.js","sourceRoot":"","sources":["../../src/utils/pattern-rename.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACvF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"pattern-rename.js","sourceRoot":"","sources":["../../src/utils/pattern-rename.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACvF,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAC;QAC1C,IAAI,CAAC;YACH,0EAA0E;YAC1E,8DAA8D;YAC9D,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,GAAG,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC5C,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;IACpF,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,6CAA6C,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAkB;IAC5D,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Record a rename session in ~/.namewise/history.json.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the `appendHistory` entry literal (id/timestamp/directory/dryRun/renames)
|
|
5
|
+
* that was previously hand-built at every call site. The directory is resolved
|
|
6
|
+
* to an absolute path (idempotent for already-absolute paths).
|
|
7
|
+
*
|
|
8
|
+
* Lives in its own module (rather than history.ts) so that tests which mock
|
|
9
|
+
* history.js and assert on `appendHistory` keep working unchanged.
|
|
10
|
+
*/
|
|
11
|
+
export declare function recordSession(directory: string, dryRun: boolean, renames: Array<{
|
|
12
|
+
originalPath: string;
|
|
13
|
+
newPath: string;
|
|
14
|
+
}>, tokenUsage?: {
|
|
15
|
+
inputTokens?: number;
|
|
16
|
+
outputTokens?: number;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=record-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-session.d.ts","sourceRoot":"","sources":["../../src/utils/record-session.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EACzD,UAAU,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { appendHistory } from './history.js';
|
|
3
|
+
/**
|
|
4
|
+
* Record a rename session in ~/.namewise/history.json.
|
|
5
|
+
*
|
|
6
|
+
* Wraps the `appendHistory` entry literal (id/timestamp/directory/dryRun/renames)
|
|
7
|
+
* that was previously hand-built at every call site. The directory is resolved
|
|
8
|
+
* to an absolute path (idempotent for already-absolute paths).
|
|
9
|
+
*
|
|
10
|
+
* Lives in its own module (rather than history.ts) so that tests which mock
|
|
11
|
+
* history.js and assert on `appendHistory` keep working unchanged.
|
|
12
|
+
*/
|
|
13
|
+
export async function recordSession(directory, dryRun, renames, tokenUsage) {
|
|
14
|
+
const timestamp = new Date().toISOString();
|
|
15
|
+
await appendHistory({
|
|
16
|
+
id: timestamp,
|
|
17
|
+
timestamp,
|
|
18
|
+
directory: path.resolve(directory),
|
|
19
|
+
dryRun,
|
|
20
|
+
renames,
|
|
21
|
+
tokenUsage
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=record-session.js.map
|