filex-cli 0.1.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 (42) hide show
  1. package/README.md +72 -0
  2. package/dist/bin/filex.d.ts +3 -0
  3. package/dist/bin/filex.d.ts.map +1 -0
  4. package/dist/bin/filex.js +5 -0
  5. package/dist/bin/filex.js.map +1 -0
  6. package/dist/src/actions/convertImages.d.ts +16 -0
  7. package/dist/src/actions/convertImages.d.ts.map +1 -0
  8. package/dist/src/actions/convertImages.js +101 -0
  9. package/dist/src/actions/convertImages.js.map +1 -0
  10. package/dist/src/actions/mergePdfs.d.ts +12 -0
  11. package/dist/src/actions/mergePdfs.d.ts.map +1 -0
  12. package/dist/src/actions/mergePdfs.js +132 -0
  13. package/dist/src/actions/mergePdfs.js.map +1 -0
  14. package/dist/src/actions/resizeImages.d.ts +11 -0
  15. package/dist/src/actions/resizeImages.d.ts.map +1 -0
  16. package/dist/src/actions/resizeImages.js +71 -0
  17. package/dist/src/actions/resizeImages.js.map +1 -0
  18. package/dist/src/ai/explain.d.ts +15 -0
  19. package/dist/src/ai/explain.d.ts.map +1 -0
  20. package/dist/src/ai/explain.js +75 -0
  21. package/dist/src/ai/explain.js.map +1 -0
  22. package/dist/src/ai/parseIntent.d.ts +18 -0
  23. package/dist/src/ai/parseIntent.d.ts.map +1 -0
  24. package/dist/src/ai/parseIntent.js +145 -0
  25. package/dist/src/ai/parseIntent.js.map +1 -0
  26. package/dist/src/cli.d.ts +2 -0
  27. package/dist/src/cli.d.ts.map +1 -0
  28. package/dist/src/cli.js +149 -0
  29. package/dist/src/cli.js.map +1 -0
  30. package/dist/src/confirm.d.ts +17 -0
  31. package/dist/src/confirm.d.ts.map +1 -0
  32. package/dist/src/confirm.js +69 -0
  33. package/dist/src/confirm.js.map +1 -0
  34. package/dist/src/scan.d.ts +27 -0
  35. package/dist/src/scan.d.ts.map +1 -0
  36. package/dist/src/scan.js +79 -0
  37. package/dist/src/scan.js.map +1 -0
  38. package/dist/src/schema.d.ts +224 -0
  39. package/dist/src/schema.d.ts.map +1 -0
  40. package/dist/src/schema.js +52 -0
  41. package/dist/src/schema.js.map +1 -0
  42. package/package.json +46 -0
@@ -0,0 +1,224 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Action schema for FileX commands.
4
+ * AI output must conform to this schema.
5
+ * One action per run. Unknown fields are rejected.
6
+ */
7
+ export declare const ConvertImagesOptionsSchema: z.ZodOptional<z.ZodObject<{
8
+ from: z.ZodOptional<z.ZodEnum<["png", "jpg", "jpeg", "webp", "gif", "tiff", "avif"]>>;
9
+ to: z.ZodOptional<z.ZodEnum<["webp", "png", "jpg"]>>;
10
+ format: z.ZodOptional<z.ZodLiteral<"webp">>;
11
+ maxWidth: z.ZodOptional<z.ZodNumber>;
12
+ quality: z.ZodOptional<z.ZodNumber>;
13
+ }, "strict", z.ZodTypeAny, {
14
+ from?: "png" | "jpg" | "jpeg" | "webp" | "gif" | "tiff" | "avif" | undefined;
15
+ to?: "png" | "jpg" | "webp" | undefined;
16
+ quality?: number | undefined;
17
+ maxWidth?: number | undefined;
18
+ format?: "webp" | undefined;
19
+ }, {
20
+ from?: "png" | "jpg" | "jpeg" | "webp" | "gif" | "tiff" | "avif" | undefined;
21
+ to?: "png" | "jpg" | "webp" | undefined;
22
+ quality?: number | undefined;
23
+ maxWidth?: number | undefined;
24
+ format?: "webp" | undefined;
25
+ }>>;
26
+ export declare const ResizeImagesOptionsSchema: z.ZodObject<{
27
+ maxWidth: z.ZodNumber;
28
+ }, "strict", z.ZodTypeAny, {
29
+ maxWidth: number;
30
+ }, {
31
+ maxWidth: number;
32
+ }>;
33
+ export declare const MergePdfsOptionsSchema: z.ZodOptional<z.ZodObject<{
34
+ outputFile: z.ZodOptional<z.ZodString>;
35
+ order: z.ZodOptional<z.ZodEnum<["name", "name-desc", "date", "date-desc", "random"]>>;
36
+ }, "strict", z.ZodTypeAny, {
37
+ outputFile?: string | undefined;
38
+ order?: "name" | "name-desc" | "date" | "date-desc" | "random" | undefined;
39
+ }, {
40
+ outputFile?: string | undefined;
41
+ order?: "name" | "name-desc" | "date" | "date-desc" | "random" | undefined;
42
+ }>>;
43
+ export declare const ConvertImagesActionSchema: z.ZodObject<{
44
+ action: z.ZodLiteral<"convert_images">;
45
+ options: z.ZodOptional<z.ZodObject<{
46
+ from: z.ZodOptional<z.ZodEnum<["png", "jpg", "jpeg", "webp", "gif", "tiff", "avif"]>>;
47
+ to: z.ZodOptional<z.ZodEnum<["webp", "png", "jpg"]>>;
48
+ format: z.ZodOptional<z.ZodLiteral<"webp">>;
49
+ maxWidth: z.ZodOptional<z.ZodNumber>;
50
+ quality: z.ZodOptional<z.ZodNumber>;
51
+ }, "strict", z.ZodTypeAny, {
52
+ from?: "png" | "jpg" | "jpeg" | "webp" | "gif" | "tiff" | "avif" | undefined;
53
+ to?: "png" | "jpg" | "webp" | undefined;
54
+ quality?: number | undefined;
55
+ maxWidth?: number | undefined;
56
+ format?: "webp" | undefined;
57
+ }, {
58
+ from?: "png" | "jpg" | "jpeg" | "webp" | "gif" | "tiff" | "avif" | undefined;
59
+ to?: "png" | "jpg" | "webp" | undefined;
60
+ quality?: number | undefined;
61
+ maxWidth?: number | undefined;
62
+ format?: "webp" | undefined;
63
+ }>>;
64
+ }, "strict", z.ZodTypeAny, {
65
+ action: "convert_images";
66
+ options?: {
67
+ from?: "png" | "jpg" | "jpeg" | "webp" | "gif" | "tiff" | "avif" | undefined;
68
+ to?: "png" | "jpg" | "webp" | undefined;
69
+ quality?: number | undefined;
70
+ maxWidth?: number | undefined;
71
+ format?: "webp" | undefined;
72
+ } | undefined;
73
+ }, {
74
+ action: "convert_images";
75
+ options?: {
76
+ from?: "png" | "jpg" | "jpeg" | "webp" | "gif" | "tiff" | "avif" | undefined;
77
+ to?: "png" | "jpg" | "webp" | undefined;
78
+ quality?: number | undefined;
79
+ maxWidth?: number | undefined;
80
+ format?: "webp" | undefined;
81
+ } | undefined;
82
+ }>;
83
+ export declare const ResizeImagesActionSchema: z.ZodObject<{
84
+ action: z.ZodLiteral<"resize_images">;
85
+ options: z.ZodObject<{
86
+ maxWidth: z.ZodNumber;
87
+ }, "strict", z.ZodTypeAny, {
88
+ maxWidth: number;
89
+ }, {
90
+ maxWidth: number;
91
+ }>;
92
+ }, "strict", z.ZodTypeAny, {
93
+ options: {
94
+ maxWidth: number;
95
+ };
96
+ action: "resize_images";
97
+ }, {
98
+ options: {
99
+ maxWidth: number;
100
+ };
101
+ action: "resize_images";
102
+ }>;
103
+ export declare const MergePdfsActionSchema: z.ZodObject<{
104
+ action: z.ZodLiteral<"merge_pdfs">;
105
+ options: z.ZodOptional<z.ZodObject<{
106
+ outputFile: z.ZodOptional<z.ZodString>;
107
+ order: z.ZodOptional<z.ZodEnum<["name", "name-desc", "date", "date-desc", "random"]>>;
108
+ }, "strict", z.ZodTypeAny, {
109
+ outputFile?: string | undefined;
110
+ order?: "name" | "name-desc" | "date" | "date-desc" | "random" | undefined;
111
+ }, {
112
+ outputFile?: string | undefined;
113
+ order?: "name" | "name-desc" | "date" | "date-desc" | "random" | undefined;
114
+ }>>;
115
+ }, "strict", z.ZodTypeAny, {
116
+ action: "merge_pdfs";
117
+ options?: {
118
+ outputFile?: string | undefined;
119
+ order?: "name" | "name-desc" | "date" | "date-desc" | "random" | undefined;
120
+ } | undefined;
121
+ }, {
122
+ action: "merge_pdfs";
123
+ options?: {
124
+ outputFile?: string | undefined;
125
+ order?: "name" | "name-desc" | "date" | "date-desc" | "random" | undefined;
126
+ } | undefined;
127
+ }>;
128
+ export declare const ActionSchema: z.ZodDiscriminatedUnion<"action", [z.ZodObject<{
129
+ action: z.ZodLiteral<"convert_images">;
130
+ options: z.ZodOptional<z.ZodObject<{
131
+ from: z.ZodOptional<z.ZodEnum<["png", "jpg", "jpeg", "webp", "gif", "tiff", "avif"]>>;
132
+ to: z.ZodOptional<z.ZodEnum<["webp", "png", "jpg"]>>;
133
+ format: z.ZodOptional<z.ZodLiteral<"webp">>;
134
+ maxWidth: z.ZodOptional<z.ZodNumber>;
135
+ quality: z.ZodOptional<z.ZodNumber>;
136
+ }, "strict", z.ZodTypeAny, {
137
+ from?: "png" | "jpg" | "jpeg" | "webp" | "gif" | "tiff" | "avif" | undefined;
138
+ to?: "png" | "jpg" | "webp" | undefined;
139
+ quality?: number | undefined;
140
+ maxWidth?: number | undefined;
141
+ format?: "webp" | undefined;
142
+ }, {
143
+ from?: "png" | "jpg" | "jpeg" | "webp" | "gif" | "tiff" | "avif" | undefined;
144
+ to?: "png" | "jpg" | "webp" | undefined;
145
+ quality?: number | undefined;
146
+ maxWidth?: number | undefined;
147
+ format?: "webp" | undefined;
148
+ }>>;
149
+ }, "strict", z.ZodTypeAny, {
150
+ action: "convert_images";
151
+ options?: {
152
+ from?: "png" | "jpg" | "jpeg" | "webp" | "gif" | "tiff" | "avif" | undefined;
153
+ to?: "png" | "jpg" | "webp" | undefined;
154
+ quality?: number | undefined;
155
+ maxWidth?: number | undefined;
156
+ format?: "webp" | undefined;
157
+ } | undefined;
158
+ }, {
159
+ action: "convert_images";
160
+ options?: {
161
+ from?: "png" | "jpg" | "jpeg" | "webp" | "gif" | "tiff" | "avif" | undefined;
162
+ to?: "png" | "jpg" | "webp" | undefined;
163
+ quality?: number | undefined;
164
+ maxWidth?: number | undefined;
165
+ format?: "webp" | undefined;
166
+ } | undefined;
167
+ }>, z.ZodObject<{
168
+ action: z.ZodLiteral<"resize_images">;
169
+ options: z.ZodObject<{
170
+ maxWidth: z.ZodNumber;
171
+ }, "strict", z.ZodTypeAny, {
172
+ maxWidth: number;
173
+ }, {
174
+ maxWidth: number;
175
+ }>;
176
+ }, "strict", z.ZodTypeAny, {
177
+ options: {
178
+ maxWidth: number;
179
+ };
180
+ action: "resize_images";
181
+ }, {
182
+ options: {
183
+ maxWidth: number;
184
+ };
185
+ action: "resize_images";
186
+ }>, z.ZodObject<{
187
+ action: z.ZodLiteral<"merge_pdfs">;
188
+ options: z.ZodOptional<z.ZodObject<{
189
+ outputFile: z.ZodOptional<z.ZodString>;
190
+ order: z.ZodOptional<z.ZodEnum<["name", "name-desc", "date", "date-desc", "random"]>>;
191
+ }, "strict", z.ZodTypeAny, {
192
+ outputFile?: string | undefined;
193
+ order?: "name" | "name-desc" | "date" | "date-desc" | "random" | undefined;
194
+ }, {
195
+ outputFile?: string | undefined;
196
+ order?: "name" | "name-desc" | "date" | "date-desc" | "random" | undefined;
197
+ }>>;
198
+ }, "strict", z.ZodTypeAny, {
199
+ action: "merge_pdfs";
200
+ options?: {
201
+ outputFile?: string | undefined;
202
+ order?: "name" | "name-desc" | "date" | "date-desc" | "random" | undefined;
203
+ } | undefined;
204
+ }, {
205
+ action: "merge_pdfs";
206
+ options?: {
207
+ outputFile?: string | undefined;
208
+ order?: "name" | "name-desc" | "date" | "date-desc" | "random" | undefined;
209
+ } | undefined;
210
+ }>]>;
211
+ export type Action = z.infer<typeof ActionSchema>;
212
+ export type ConvertImagesAction = z.infer<typeof ConvertImagesActionSchema>;
213
+ export type ResizeImagesAction = z.infer<typeof ResizeImagesActionSchema>;
214
+ export type MergePdfsAction = z.infer<typeof MergePdfsActionSchema>;
215
+ /**
216
+ * Parse and validate an action from AI output or manual input.
217
+ * Returns the validated action or throws on invalid input.
218
+ */
219
+ export declare function parseAction(input: unknown): Action;
220
+ /**
221
+ * Safely parse an action, returning null on failure instead of throwing.
222
+ */
223
+ export declare function safeParseAction(input: unknown): Action | null;
224
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AAEH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;GAMjB,CAAC;AAEvB,eAAO,MAAM,yBAAyB;;;;;;EAE3B,CAAC;AAEZ,eAAO,MAAM,sBAAsB;;;;;;;;;GAGb,CAAC;AAEvB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG3B,CAAC;AAEZ,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;EAG1B,CAAC;AAEZ,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;EAGvB,CAAC;AAEZ,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAIvB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAClD,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAC5E,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAC1E,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAG7D"}
@@ -0,0 +1,52 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Action schema for FileX commands.
4
+ * AI output must conform to this schema.
5
+ * One action per run. Unknown fields are rejected.
6
+ */
7
+ export const ConvertImagesOptionsSchema = z.object({
8
+ from: z.enum(['png', 'jpg', 'jpeg', 'webp', 'gif', 'tiff', 'avif']).optional(),
9
+ to: z.enum(['webp', 'png', 'jpg']).optional(),
10
+ format: z.literal('webp').optional(), // legacy, maps to 'to'
11
+ maxWidth: z.number().positive().optional(),
12
+ quality: z.number().min(1).max(100).optional(),
13
+ }).strict().optional();
14
+ export const ResizeImagesOptionsSchema = z.object({
15
+ maxWidth: z.number().positive(),
16
+ }).strict();
17
+ export const MergePdfsOptionsSchema = z.object({
18
+ outputFile: z.string().optional(),
19
+ order: z.enum(['name', 'name-desc', 'date', 'date-desc', 'random']).optional(),
20
+ }).strict().optional();
21
+ export const ConvertImagesActionSchema = z.object({
22
+ action: z.literal('convert_images'),
23
+ options: ConvertImagesOptionsSchema,
24
+ }).strict();
25
+ export const ResizeImagesActionSchema = z.object({
26
+ action: z.literal('resize_images'),
27
+ options: ResizeImagesOptionsSchema,
28
+ }).strict();
29
+ export const MergePdfsActionSchema = z.object({
30
+ action: z.literal('merge_pdfs'),
31
+ options: MergePdfsOptionsSchema,
32
+ }).strict();
33
+ export const ActionSchema = z.discriminatedUnion('action', [
34
+ ConvertImagesActionSchema,
35
+ ResizeImagesActionSchema,
36
+ MergePdfsActionSchema,
37
+ ]);
38
+ /**
39
+ * Parse and validate an action from AI output or manual input.
40
+ * Returns the validated action or throws on invalid input.
41
+ */
42
+ export function parseAction(input) {
43
+ return ActionSchema.parse(input);
44
+ }
45
+ /**
46
+ * Safely parse an action, returning null on failure instead of throwing.
47
+ */
48
+ export function safeParseAction(input) {
49
+ const result = ActionSchema.safeParse(input);
50
+ return result.success ? result.data : null;
51
+ }
52
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9E,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7C,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,uBAAuB;IAC7D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACjD,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;AAEvB,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;CACjF,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;AAEvB,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACnC,OAAO,EAAE,0BAA0B;CACtC,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IAClC,OAAO,EAAE,yBAAyB;CACrC,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IAC/B,OAAO,EAAE,sBAAsB;CAClC,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE;IACvD,yBAAyB;IACzB,wBAAwB;IACxB,qBAAqB;CACxB,CAAC,CAAC;AAOH;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc;IACtC,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "filex-cli",
3
+ "version": "0.1.0",
4
+ "description": "A Terminal CLI agent to modify and talk with your files",
5
+ "type": "module",
6
+ "main": "dist/cli.js",
7
+ "bin": {
8
+ "filex": "./dist/bin/filex.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsx bin/filex.ts",
17
+ "start": "node dist/bin/filex.js"
18
+ },
19
+ "keywords": [
20
+ "cli",
21
+ "file",
22
+ "convert",
23
+ "resize",
24
+ "pdf",
25
+ "merge"
26
+ ],
27
+ "author": "",
28
+ "license": "MIT",
29
+ "engines": {
30
+ "node": ">=18.0.0"
31
+ },
32
+ "dependencies": {
33
+ "chalk": "^5.3.0",
34
+ "commander": "^12.1.0",
35
+ "dotenv": "^17.2.3",
36
+ "ora": "^8.0.1",
37
+ "pdf-lib": "^1.17.1",
38
+ "sharp": "^0.33.5",
39
+ "zod": "^3.23.8"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^22.10.5",
43
+ "tsx": "^4.19.2",
44
+ "typescript": "^5.7.3"
45
+ }
46
+ }