@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.
Files changed (110) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +6 -6
  3. package/dist/cli/clean-empty.d.ts.map +1 -1
  4. package/dist/cli/clean-empty.js +2 -3
  5. package/dist/cli/clean-empty.js.map +1 -1
  6. package/dist/cli/commands.d.ts.map +1 -1
  7. package/dist/cli/commands.js +1 -20
  8. package/dist/cli/commands.js.map +1 -1
  9. package/dist/cli/config-cmd.d.ts.map +1 -1
  10. package/dist/cli/config-cmd.js +4 -3
  11. package/dist/cli/config-cmd.js.map +1 -1
  12. package/dist/cli/dedup.d.ts.map +1 -1
  13. package/dist/cli/dedup.js +3 -11
  14. package/dist/cli/dedup.js.map +1 -1
  15. package/dist/cli/diff.d.ts.map +1 -1
  16. package/dist/cli/diff.js +3 -7
  17. package/dist/cli/diff.js.map +1 -1
  18. package/dist/cli/find.d.ts.map +1 -1
  19. package/dist/cli/find.js +2 -3
  20. package/dist/cli/find.js.map +1 -1
  21. package/dist/cli/flatten.d.ts.map +1 -1
  22. package/dist/cli/flatten.js +4 -11
  23. package/dist/cli/flatten.js.map +1 -1
  24. package/dist/cli/handle-cli-error.d.ts +7 -0
  25. package/dist/cli/handle-cli-error.d.ts.map +1 -0
  26. package/dist/cli/handle-cli-error.js +25 -0
  27. package/dist/cli/handle-cli-error.js.map +1 -0
  28. package/dist/cli/info.js.map +1 -1
  29. package/dist/cli/init.js +2 -2
  30. package/dist/cli/init.js.map +1 -1
  31. package/dist/cli/organize.d.ts.map +1 -1
  32. package/dist/cli/organize.js +4 -11
  33. package/dist/cli/organize.js.map +1 -1
  34. package/dist/cli/rename.d.ts +4 -2
  35. package/dist/cli/rename.d.ts.map +1 -1
  36. package/dist/cli/rename.js +166 -227
  37. package/dist/cli/rename.js.map +1 -1
  38. package/dist/cli/sanitize.d.ts.map +1 -1
  39. package/dist/cli/sanitize.js +4 -12
  40. package/dist/cli/sanitize.js.map +1 -1
  41. package/dist/cli/shared-config.d.ts +60 -0
  42. package/dist/cli/shared-config.d.ts.map +1 -0
  43. package/dist/cli/shared-config.js +64 -0
  44. package/dist/cli/shared-config.js.map +1 -0
  45. package/dist/cli/stats.d.ts.map +1 -1
  46. package/dist/cli/stats.js +2 -4
  47. package/dist/cli/stats.js.map +1 -1
  48. package/dist/cli/tree.d.ts.map +1 -1
  49. package/dist/cli/tree.js +2 -3
  50. package/dist/cli/tree.js.map +1 -1
  51. package/dist/cli/watch.d.ts +3 -1
  52. package/dist/cli/watch.d.ts.map +1 -1
  53. package/dist/cli/watch.js +19 -63
  54. package/dist/cli/watch.js.map +1 -1
  55. package/dist/parsers/pdf-parser.d.ts.map +1 -1
  56. package/dist/parsers/pdf-parser.js +39 -24
  57. package/dist/parsers/pdf-parser.js.map +1 -1
  58. package/dist/services/base-cloud-service.d.ts +32 -0
  59. package/dist/services/base-cloud-service.d.ts.map +1 -0
  60. package/dist/services/base-cloud-service.js +73 -0
  61. package/dist/services/base-cloud-service.js.map +1 -0
  62. package/dist/services/base-local-service.d.ts +18 -0
  63. package/dist/services/base-local-service.d.ts.map +1 -0
  64. package/dist/services/base-local-service.js +81 -0
  65. package/dist/services/base-local-service.js.map +1 -0
  66. package/dist/services/claude-service.d.ts +8 -6
  67. package/dist/services/claude-service.d.ts.map +1 -1
  68. package/dist/services/claude-service.js +40 -98
  69. package/dist/services/claude-service.js.map +1 -1
  70. package/dist/services/lmstudio-service.d.ts +35 -9
  71. package/dist/services/lmstudio-service.d.ts.map +1 -1
  72. package/dist/services/lmstudio-service.js +23 -101
  73. package/dist/services/lmstudio-service.js.map +1 -1
  74. package/dist/services/ollama-service.d.ts +23 -9
  75. package/dist/services/ollama-service.d.ts.map +1 -1
  76. package/dist/services/ollama-service.js +16 -87
  77. package/dist/services/ollama-service.js.map +1 -1
  78. package/dist/services/openai-service.d.ts +8 -6
  79. package/dist/services/openai-service.d.ts.map +1 -1
  80. package/dist/services/openai-service.js +36 -94
  81. package/dist/services/openai-service.js.map +1 -1
  82. package/dist/utils/ai-name-sanitizer.d.ts +14 -0
  83. package/dist/utils/ai-name-sanitizer.d.ts.map +1 -0
  84. package/dist/utils/ai-name-sanitizer.js +39 -0
  85. package/dist/utils/ai-name-sanitizer.js.map +1 -0
  86. package/dist/utils/assert-directory.d.ts +9 -0
  87. package/dist/utils/assert-directory.d.ts.map +1 -0
  88. package/dist/utils/assert-directory.js +15 -0
  89. package/dist/utils/assert-directory.js.map +1 -0
  90. package/dist/utils/batch-rename.d.ts.map +1 -1
  91. package/dist/utils/batch-rename.js +10 -1
  92. package/dist/utils/batch-rename.js.map +1 -1
  93. package/dist/utils/file-info.d.ts +8 -0
  94. package/dist/utils/file-info.d.ts.map +1 -0
  95. package/dist/utils/file-info.js +25 -0
  96. package/dist/utils/file-info.js.map +1 -0
  97. package/dist/utils/image-compressor.js +1 -1
  98. package/dist/utils/image-compressor.js.map +1 -1
  99. package/dist/utils/organize.js.map +1 -1
  100. package/dist/utils/pattern-rename.d.ts.map +1 -1
  101. package/dist/utils/pattern-rename.js +8 -1
  102. package/dist/utils/pattern-rename.js.map +1 -1
  103. package/dist/utils/record-session.d.ts +18 -0
  104. package/dist/utils/record-session.d.ts.map +1 -0
  105. package/dist/utils/record-session.js +24 -0
  106. package/dist/utils/record-session.js.map +1 -0
  107. package/dist/utils/ui.d.ts.map +1 -1
  108. package/dist/utils/ui.js +1 -7
  109. package/dist/utils/ui.js.map +1 -1
  110. package/package.json +24 -22
@@ -1,93 +1,22 @@
1
- import { buildFileNamePrompt, AI_SYSTEM_PROMPT } from '../utils/ai-prompts.js';
2
- import { AuthError, NetworkError, RateLimitError, ConfigError } from '../errors.js';
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
- this.baseUrl = this.validateLocalUrl(baseUrl);
9
- this.model = model;
5
+ super('Ollama', baseUrl, model);
10
6
  }
11
- validateLocalUrl(url) {
12
- let parsed;
13
- try {
14
- parsed = new URL(url);
15
- }
16
- catch {
17
- throw new ConfigError(`Invalid Ollama base URL: ${url}`);
18
- }
19
- const hostname = parsed.hostname.toLowerCase();
20
- const allowed = hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';
21
- if (!allowed) {
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
- if (!response.ok) {
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":"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"}
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 { AIProvider, FileInfo, AINameResult } from '../types/index.js';
2
- export declare class OpenAIService implements AIProvider {
3
- name: string;
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
- 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<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":"AAEA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKvE,qBAAa,aAAc,YAAW,UAAU;IAC9C,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,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;IA6ExB,OAAO,CAAC,gBAAgB;CAkBzB"}
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 { 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 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
- 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.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
- throw new NetworkError(`OpenAI API error (${error.status}): ${error.message}`, { details: { status: error.status } });
81
- }
82
- throw new NetworkError(`Failed to generate filename with OpenAI: ${error instanceof Error ? error.message : 'Unknown error'}`, { cause: error });
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
- sanitizeFileName(name, convention) {
86
- const nameWithoutExt = name.replace(/\.[^/.]+$/, '');
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":"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"}
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,CAEhE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAElE"}
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
- return stem.replace(new RegExp(pattern, 'g'), '');
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,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/B,CAAC"}
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.buffer, format: 'JPEG', quality: 1 }));
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":"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"}
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,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CACzE,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAExD,wEAAwE;QACxE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;QAC5B,IAAI,KAAK,GAAG,IAAI,CAAC,aAAa,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9D,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;gBACpB,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC3D,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC1D,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACvC,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAChF,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC3D,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAED,+DAA+D;QAC/D,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrG,CAAC;IAEO,MAAM,CAAC,eAAe,CAC5B,YAA0B,EAC1B,GAAU,EACV,KAAa,EACb,MAAc,EACd,OAAe;QAEf,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAAC,OAAe;QAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"organize.js","sourceRoot":"","sources":["../../src/utils/organize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,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,IAAyC;IAEzC,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
+ {"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,CAe/E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAOtE"}
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
- return { find: new RegExp(find, flags || undefined), replace };
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;IACjE,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"}
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