codecane 1.0.155 → 1.0.170

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 (106) hide show
  1. package/dist/browser-runner.d.ts +3 -1
  2. package/dist/browser-runner.js +211 -136
  3. package/dist/browser-runner.js.map +1 -1
  4. package/dist/chat-storage.d.ts +1 -1
  5. package/dist/chat-storage.js +35 -31
  6. package/dist/chat-storage.js.map +1 -1
  7. package/dist/checkpoints.d.ts +62 -0
  8. package/dist/checkpoints.js +134 -0
  9. package/dist/checkpoints.js.map +1 -0
  10. package/dist/cli.d.ts +20 -13
  11. package/dist/cli.js +461 -353
  12. package/dist/cli.js.map +1 -1
  13. package/dist/client.d.ts +178 -25
  14. package/dist/client.js +236 -198
  15. package/dist/client.js.map +1 -1
  16. package/dist/code-map/tsconfig.tsbuildinfo +1 -1
  17. package/dist/common/actions.d.ts +2115 -444
  18. package/dist/common/actions.js +31 -78
  19. package/dist/common/actions.js.map +1 -1
  20. package/dist/common/browser-actions.d.ts +253 -173
  21. package/dist/common/browser-actions.js +25 -12
  22. package/dist/common/browser-actions.js.map +1 -1
  23. package/dist/common/constants/tools.d.ts +3 -0
  24. package/dist/common/constants/tools.js +24 -0
  25. package/dist/common/constants/tools.js.map +1 -0
  26. package/dist/common/constants.d.ts +14 -8
  27. package/dist/common/constants.js +7 -6
  28. package/dist/common/constants.js.map +1 -1
  29. package/dist/common/message-image-handling.d.ts +41 -0
  30. package/dist/common/message-image-handling.js +57 -0
  31. package/dist/common/message-image-handling.js.map +1 -0
  32. package/dist/common/project-file-tree.js +7 -7
  33. package/dist/common/project-file-tree.js.map +1 -1
  34. package/dist/common/types/agent-state.d.ts +466 -0
  35. package/dist/common/types/agent-state.js +30 -0
  36. package/dist/common/types/agent-state.js.map +1 -0
  37. package/dist/common/types/message.d.ts +311 -0
  38. package/dist/common/types/message.js +54 -0
  39. package/dist/common/types/message.js.map +1 -0
  40. package/dist/common/types/tools.d.ts +5 -0
  41. package/dist/common/types/tools.js +3 -0
  42. package/dist/common/types/tools.js.map +1 -0
  43. package/dist/common/types/usage.d.ts +2 -2
  44. package/dist/common/util/__tests__/messages.test.js +70 -0
  45. package/dist/common/util/__tests__/messages.test.js.map +1 -0
  46. package/dist/common/util/changes.js +3 -3
  47. package/dist/common/util/changes.js.map +1 -1
  48. package/dist/common/util/credentials.d.ts +4 -4
  49. package/dist/common/util/file.d.ts +9 -2
  50. package/dist/common/util/file.js +31 -27
  51. package/dist/common/util/file.js.map +1 -1
  52. package/dist/common/util/git.js +1 -1
  53. package/dist/common/util/git.js.map +1 -1
  54. package/dist/common/util/lru-cache.d.ts +9 -0
  55. package/dist/common/util/lru-cache.js +42 -0
  56. package/dist/common/util/lru-cache.js.map +1 -0
  57. package/dist/common/util/messages.d.ts +6 -0
  58. package/dist/common/util/messages.js +22 -0
  59. package/dist/common/util/messages.js.map +1 -0
  60. package/dist/common/util/min-heap.d.ts +15 -0
  61. package/dist/common/util/min-heap.js +73 -0
  62. package/dist/common/util/min-heap.js.map +1 -0
  63. package/dist/common/util/process-stream.d.ts +8 -0
  64. package/dist/common/util/process-stream.js +102 -0
  65. package/dist/common/util/process-stream.js.map +1 -0
  66. package/dist/common/util/promise.d.ts +8 -0
  67. package/dist/common/util/promise.js +25 -2
  68. package/dist/common/util/promise.js.map +1 -1
  69. package/dist/common/util/string.d.ts +31 -0
  70. package/dist/common/util/string.js +71 -1
  71. package/dist/common/util/string.js.map +1 -1
  72. package/dist/common/websockets/websocket-schema.d.ts +4065 -1019
  73. package/dist/config.d.ts +1 -0
  74. package/dist/config.js +3 -2
  75. package/dist/config.js.map +1 -1
  76. package/dist/credentials.d.ts +1 -0
  77. package/dist/credentials.js +7 -3
  78. package/dist/credentials.js.map +1 -1
  79. package/dist/index.js +3 -3
  80. package/dist/index.js.map +1 -1
  81. package/dist/menu.js +16 -12
  82. package/dist/menu.js.map +1 -1
  83. package/dist/project-files.d.ts +43 -3
  84. package/dist/project-files.js +97 -18
  85. package/dist/project-files.js.map +1 -1
  86. package/dist/tool-handlers.d.ts +22 -7
  87. package/dist/tool-handlers.js +111 -44
  88. package/dist/tool-handlers.js.map +1 -1
  89. package/dist/utils/process-xml-chunks.d.ts +31 -0
  90. package/dist/utils/process-xml-chunks.js +235 -0
  91. package/dist/utils/process-xml-chunks.js.map +1 -0
  92. package/dist/utils/spinner.d.ts +11 -0
  93. package/dist/utils/spinner.js +87 -0
  94. package/dist/utils/spinner.js.map +1 -0
  95. package/dist/utils/terminal.d.ts +3 -3
  96. package/dist/utils/terminal.js +23 -24
  97. package/dist/utils/terminal.js.map +1 -1
  98. package/dist/web-scraper.d.ts +1 -1
  99. package/dist/web-scraper.js +11 -7
  100. package/dist/web-scraper.js.map +1 -1
  101. package/dist/worker-script-project-context.js +1 -1
  102. package/dist/worker-script-project-context.js.map +1 -1
  103. package/package.json +3 -4
  104. package/dist/__tests__/browser-runner.test.js +0 -15
  105. package/dist/__tests__/browser-runner.test.js.map +0 -1
  106. /package/dist/{__tests__/browser-runner.test.d.ts → common/util/__tests__/messages.test.d.ts} +0 -0
@@ -0,0 +1,311 @@
1
+ import { z } from 'zod';
2
+ declare const MessageContentObjectSchema: z.ZodUnion<[z.ZodObject<{
3
+ type: z.ZodLiteral<"text">;
4
+ text: z.ZodString;
5
+ cache_control: z.ZodOptional<z.ZodObject<{
6
+ type: z.ZodLiteral<"ephemeral">;
7
+ }, "strip", z.ZodTypeAny, {
8
+ type: "ephemeral";
9
+ }, {
10
+ type: "ephemeral";
11
+ }>>;
12
+ }, "strip", z.ZodTypeAny, {
13
+ type: "text";
14
+ text: string;
15
+ cache_control?: {
16
+ type: "ephemeral";
17
+ } | undefined;
18
+ }, {
19
+ type: "text";
20
+ text: string;
21
+ cache_control?: {
22
+ type: "ephemeral";
23
+ } | undefined;
24
+ }>, z.ZodObject<{
25
+ type: z.ZodLiteral<"tool_use">;
26
+ id: z.ZodString;
27
+ name: z.ZodString;
28
+ input: z.ZodRecord<z.ZodString, z.ZodAny>;
29
+ cache_control: z.ZodOptional<z.ZodObject<{
30
+ type: z.ZodLiteral<"ephemeral">;
31
+ }, "strip", z.ZodTypeAny, {
32
+ type: "ephemeral";
33
+ }, {
34
+ type: "ephemeral";
35
+ }>>;
36
+ }, "strip", z.ZodTypeAny, {
37
+ type: "tool_use";
38
+ name: string;
39
+ id: string;
40
+ input: Record<string, any>;
41
+ cache_control?: {
42
+ type: "ephemeral";
43
+ } | undefined;
44
+ }, {
45
+ type: "tool_use";
46
+ name: string;
47
+ id: string;
48
+ input: Record<string, any>;
49
+ cache_control?: {
50
+ type: "ephemeral";
51
+ } | undefined;
52
+ }>, z.ZodObject<{
53
+ type: z.ZodLiteral<"tool_result">;
54
+ tool_use_id: z.ZodString;
55
+ content: z.ZodString;
56
+ cache_control: z.ZodOptional<z.ZodObject<{
57
+ type: z.ZodLiteral<"ephemeral">;
58
+ }, "strip", z.ZodTypeAny, {
59
+ type: "ephemeral";
60
+ }, {
61
+ type: "ephemeral";
62
+ }>>;
63
+ }, "strip", z.ZodTypeAny, {
64
+ content: string;
65
+ type: "tool_result";
66
+ tool_use_id: string;
67
+ cache_control?: {
68
+ type: "ephemeral";
69
+ } | undefined;
70
+ }, {
71
+ content: string;
72
+ type: "tool_result";
73
+ tool_use_id: string;
74
+ cache_control?: {
75
+ type: "ephemeral";
76
+ } | undefined;
77
+ }>, z.ZodObject<{
78
+ type: z.ZodLiteral<"image">;
79
+ source: z.ZodObject<{
80
+ type: z.ZodLiteral<"base64">;
81
+ media_type: z.ZodLiteral<"image/jpeg">;
82
+ data: z.ZodString;
83
+ }, "strip", z.ZodTypeAny, {
84
+ type: "base64";
85
+ media_type: "image/jpeg";
86
+ data: string;
87
+ }, {
88
+ type: "base64";
89
+ media_type: "image/jpeg";
90
+ data: string;
91
+ }>;
92
+ cache_control: z.ZodOptional<z.ZodObject<{
93
+ type: z.ZodLiteral<"ephemeral">;
94
+ }, "strip", z.ZodTypeAny, {
95
+ type: "ephemeral";
96
+ }, {
97
+ type: "ephemeral";
98
+ }>>;
99
+ }, "strip", z.ZodTypeAny, {
100
+ type: "image";
101
+ source: {
102
+ type: "base64";
103
+ media_type: "image/jpeg";
104
+ data: string;
105
+ };
106
+ cache_control?: {
107
+ type: "ephemeral";
108
+ } | undefined;
109
+ }, {
110
+ type: "image";
111
+ source: {
112
+ type: "base64";
113
+ media_type: "image/jpeg";
114
+ data: string;
115
+ };
116
+ cache_control?: {
117
+ type: "ephemeral";
118
+ } | undefined;
119
+ }>]>;
120
+ export declare const MessageSchema: z.ZodObject<{
121
+ role: z.ZodUnion<[z.ZodLiteral<"user">, z.ZodLiteral<"assistant">]>;
122
+ content: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodUnion<[z.ZodObject<{
123
+ type: z.ZodLiteral<"text">;
124
+ text: z.ZodString;
125
+ cache_control: z.ZodOptional<z.ZodObject<{
126
+ type: z.ZodLiteral<"ephemeral">;
127
+ }, "strip", z.ZodTypeAny, {
128
+ type: "ephemeral";
129
+ }, {
130
+ type: "ephemeral";
131
+ }>>;
132
+ }, "strip", z.ZodTypeAny, {
133
+ type: "text";
134
+ text: string;
135
+ cache_control?: {
136
+ type: "ephemeral";
137
+ } | undefined;
138
+ }, {
139
+ type: "text";
140
+ text: string;
141
+ cache_control?: {
142
+ type: "ephemeral";
143
+ } | undefined;
144
+ }>, z.ZodObject<{
145
+ type: z.ZodLiteral<"tool_use">;
146
+ id: z.ZodString;
147
+ name: z.ZodString;
148
+ input: z.ZodRecord<z.ZodString, z.ZodAny>;
149
+ cache_control: z.ZodOptional<z.ZodObject<{
150
+ type: z.ZodLiteral<"ephemeral">;
151
+ }, "strip", z.ZodTypeAny, {
152
+ type: "ephemeral";
153
+ }, {
154
+ type: "ephemeral";
155
+ }>>;
156
+ }, "strip", z.ZodTypeAny, {
157
+ type: "tool_use";
158
+ name: string;
159
+ id: string;
160
+ input: Record<string, any>;
161
+ cache_control?: {
162
+ type: "ephemeral";
163
+ } | undefined;
164
+ }, {
165
+ type: "tool_use";
166
+ name: string;
167
+ id: string;
168
+ input: Record<string, any>;
169
+ cache_control?: {
170
+ type: "ephemeral";
171
+ } | undefined;
172
+ }>, z.ZodObject<{
173
+ type: z.ZodLiteral<"tool_result">;
174
+ tool_use_id: z.ZodString;
175
+ content: z.ZodString;
176
+ cache_control: z.ZodOptional<z.ZodObject<{
177
+ type: z.ZodLiteral<"ephemeral">;
178
+ }, "strip", z.ZodTypeAny, {
179
+ type: "ephemeral";
180
+ }, {
181
+ type: "ephemeral";
182
+ }>>;
183
+ }, "strip", z.ZodTypeAny, {
184
+ content: string;
185
+ type: "tool_result";
186
+ tool_use_id: string;
187
+ cache_control?: {
188
+ type: "ephemeral";
189
+ } | undefined;
190
+ }, {
191
+ content: string;
192
+ type: "tool_result";
193
+ tool_use_id: string;
194
+ cache_control?: {
195
+ type: "ephemeral";
196
+ } | undefined;
197
+ }>, z.ZodObject<{
198
+ type: z.ZodLiteral<"image">;
199
+ source: z.ZodObject<{
200
+ type: z.ZodLiteral<"base64">;
201
+ media_type: z.ZodLiteral<"image/jpeg">;
202
+ data: z.ZodString;
203
+ }, "strip", z.ZodTypeAny, {
204
+ type: "base64";
205
+ media_type: "image/jpeg";
206
+ data: string;
207
+ }, {
208
+ type: "base64";
209
+ media_type: "image/jpeg";
210
+ data: string;
211
+ }>;
212
+ cache_control: z.ZodOptional<z.ZodObject<{
213
+ type: z.ZodLiteral<"ephemeral">;
214
+ }, "strip", z.ZodTypeAny, {
215
+ type: "ephemeral";
216
+ }, {
217
+ type: "ephemeral";
218
+ }>>;
219
+ }, "strip", z.ZodTypeAny, {
220
+ type: "image";
221
+ source: {
222
+ type: "base64";
223
+ media_type: "image/jpeg";
224
+ data: string;
225
+ };
226
+ cache_control?: {
227
+ type: "ephemeral";
228
+ } | undefined;
229
+ }, {
230
+ type: "image";
231
+ source: {
232
+ type: "base64";
233
+ media_type: "image/jpeg";
234
+ data: string;
235
+ };
236
+ cache_control?: {
237
+ type: "ephemeral";
238
+ } | undefined;
239
+ }>]>, "many">]>;
240
+ }, "strip", z.ZodTypeAny, {
241
+ content: string | ({
242
+ type: "text";
243
+ text: string;
244
+ cache_control?: {
245
+ type: "ephemeral";
246
+ } | undefined;
247
+ } | {
248
+ type: "tool_use";
249
+ name: string;
250
+ id: string;
251
+ input: Record<string, any>;
252
+ cache_control?: {
253
+ type: "ephemeral";
254
+ } | undefined;
255
+ } | {
256
+ content: string;
257
+ type: "tool_result";
258
+ tool_use_id: string;
259
+ cache_control?: {
260
+ type: "ephemeral";
261
+ } | undefined;
262
+ } | {
263
+ type: "image";
264
+ source: {
265
+ type: "base64";
266
+ media_type: "image/jpeg";
267
+ data: string;
268
+ };
269
+ cache_control?: {
270
+ type: "ephemeral";
271
+ } | undefined;
272
+ })[];
273
+ role: "user" | "assistant";
274
+ }, {
275
+ content: string | ({
276
+ type: "text";
277
+ text: string;
278
+ cache_control?: {
279
+ type: "ephemeral";
280
+ } | undefined;
281
+ } | {
282
+ type: "tool_use";
283
+ name: string;
284
+ id: string;
285
+ input: Record<string, any>;
286
+ cache_control?: {
287
+ type: "ephemeral";
288
+ } | undefined;
289
+ } | {
290
+ content: string;
291
+ type: "tool_result";
292
+ tool_use_id: string;
293
+ cache_control?: {
294
+ type: "ephemeral";
295
+ } | undefined;
296
+ } | {
297
+ type: "image";
298
+ source: {
299
+ type: "base64";
300
+ media_type: "image/jpeg";
301
+ data: string;
302
+ };
303
+ cache_control?: {
304
+ type: "ephemeral";
305
+ } | undefined;
306
+ })[];
307
+ role: "user" | "assistant";
308
+ }>;
309
+ export type Message = z.infer<typeof MessageSchema>;
310
+ export type MessageContentObject = z.infer<typeof MessageContentObjectSchema>;
311
+ export {};
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const MessageContentObjectSchema = zod_1.z.union([
6
+ zod_1.z.object({
7
+ type: zod_1.z.literal('text'),
8
+ text: zod_1.z.string(),
9
+ cache_control: zod_1.z
10
+ .object({
11
+ type: zod_1.z.literal('ephemeral'),
12
+ })
13
+ .optional(),
14
+ }),
15
+ zod_1.z.object({
16
+ type: zod_1.z.literal('tool_use'),
17
+ id: zod_1.z.string(),
18
+ name: zod_1.z.string(),
19
+ input: zod_1.z.record(zod_1.z.string(), zod_1.z.any()),
20
+ cache_control: zod_1.z
21
+ .object({
22
+ type: zod_1.z.literal('ephemeral'),
23
+ })
24
+ .optional(),
25
+ }),
26
+ zod_1.z.object({
27
+ type: zod_1.z.literal('tool_result'),
28
+ tool_use_id: zod_1.z.string(),
29
+ content: zod_1.z.string(),
30
+ cache_control: zod_1.z
31
+ .object({
32
+ type: zod_1.z.literal('ephemeral'),
33
+ })
34
+ .optional(),
35
+ }),
36
+ zod_1.z.object({
37
+ type: zod_1.z.literal('image'),
38
+ source: zod_1.z.object({
39
+ type: zod_1.z.literal('base64'),
40
+ media_type: zod_1.z.literal('image/jpeg'),
41
+ data: zod_1.z.string(),
42
+ }),
43
+ cache_control: zod_1.z
44
+ .object({
45
+ type: zod_1.z.literal('ephemeral'),
46
+ })
47
+ .optional(),
48
+ }),
49
+ ]);
50
+ exports.MessageSchema = zod_1.z.object({
51
+ role: zod_1.z.union([zod_1.z.literal('user'), zod_1.z.literal('assistant')]),
52
+ content: zod_1.z.union([zod_1.z.string(), zod_1.z.array(MessageContentObjectSchema)]),
53
+ });
54
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/types/message.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;AAEvB,MAAM,0BAA0B,GAAG,OAAC,CAAC,KAAK,CAAC;IACzC,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QACvB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;QAChB,aAAa,EAAE,OAAC;aACb,MAAM,CAAC;YACN,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,WAAW,CAAC;SAC7B,CAAC;aACD,QAAQ,EAAE;KACd,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QAC3B,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;QACd,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,GAAG,EAAE,CAAC;QACpC,aAAa,EAAE,OAAC;aACb,MAAM,CAAC;YACN,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,WAAW,CAAC;SAC7B,CAAC;aACD,QAAQ,EAAE;KACd,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,aAAa,CAAC;QAC9B,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;QACvB,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE;QACnB,aAAa,EAAE,OAAC;aACb,MAAM,CAAC;YACN,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,WAAW,CAAC;SAC7B,CAAC;aACD,QAAQ,EAAE;KACd,CAAC;IACF,OAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACxB,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC;YACf,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;YACzB,UAAU,EAAE,OAAC,CAAC,OAAO,CAAC,YAAY,CAAC;YACnC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;SACjB,CAAC;QACF,aAAa,EAAE,OAAC;aACb,MAAM,CAAC;YACN,IAAI,EAAE,OAAC,CAAC,OAAO,CAAC,WAAW,CAAC;SAC7B,CAAC;aACD,QAAQ,EAAE;KACd,CAAC;CACH,CAAC,CAAA;AAEW,QAAA,aAAa,GAAG,OAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1D,OAAO,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;CACpE,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export type RawToolCall = {
2
+ name: string;
3
+ id: string;
4
+ parameters: Record<string, any>;
5
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/types/tools.ts"],"names":[],"mappings":""}
@@ -8,17 +8,17 @@ export declare const usageDataSchema: z.ZodObject<{
8
8
  overageRate: z.ZodNullable<z.ZodNumber>;
9
9
  }, "strip", z.ZodTypeAny, {
10
10
  creditsUsed: number;
11
+ overageRate: number | null;
11
12
  totalQuota: number;
12
13
  remainingCredits: number;
13
14
  subscriptionActive: boolean;
14
15
  nextQuotaReset: Date;
15
- overageRate: number | null;
16
16
  }, {
17
17
  creditsUsed: number;
18
+ overageRate: number | null;
18
19
  totalQuota: number;
19
20
  remainingCredits: number;
20
21
  subscriptionActive: boolean;
21
22
  nextQuotaReset: Date;
22
- overageRate: number | null;
23
23
  }>;
24
24
  export type UsageData = z.infer<typeof usageDataSchema>;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const bun_test_1 = require("bun:test");
4
+ const messages_1 = require("../messages");
5
+ (0, bun_test_1.describe)('limitScreenshots', () => {
6
+ const createImageContent = (id) => ({
7
+ type: 'image',
8
+ source: {
9
+ type: 'base64',
10
+ media_type: 'image/jpeg',
11
+ data: `base64data${id}`,
12
+ },
13
+ });
14
+ const createTextContent = (text) => ({
15
+ type: 'text',
16
+ text,
17
+ });
18
+ (0, bun_test_1.it)('should return messages unchanged when no screenshots present', () => {
19
+ const messages = [
20
+ { role: 'user', content: 'hello' },
21
+ { role: 'assistant', content: [createTextContent('world')] },
22
+ ];
23
+ (0, bun_test_1.expect)((0, messages_1.limitScreenshots)(messages, 2)).toEqual(messages);
24
+ });
25
+ (0, bun_test_1.it)('should return messages unchanged when screenshots under limit', () => {
26
+ const messages = [
27
+ { role: 'user', content: [createImageContent(1)] },
28
+ { role: 'assistant', content: [createImageContent(2)] },
29
+ ];
30
+ (0, bun_test_1.expect)((0, messages_1.limitScreenshots)(messages, 2)).toEqual(messages);
31
+ });
32
+ (0, bun_test_1.it)('should keep only most recent screenshots when over limit', () => {
33
+ const messages = [
34
+ {
35
+ role: 'user',
36
+ content: [createImageContent(1), createTextContent('hello')],
37
+ },
38
+ {
39
+ role: 'assistant',
40
+ content: [createImageContent(2), createImageContent(3)],
41
+ },
42
+ ];
43
+ const result = (0, messages_1.limitScreenshots)(messages, 2);
44
+ const images = result.flatMap(msg => Array.isArray(msg.content)
45
+ ? msg.content.filter(item => item.type === 'image')
46
+ : []);
47
+ (0, bun_test_1.expect)(images).toHaveLength(2);
48
+ (0, bun_test_1.expect)(images[0]).toEqual(createImageContent(2));
49
+ (0, bun_test_1.expect)(images[1]).toEqual(createImageContent(3));
50
+ });
51
+ (0, bun_test_1.it)('should preserve non-image content when filtering', () => {
52
+ const messages = [
53
+ {
54
+ role: 'user',
55
+ content: [createImageContent(1), createTextContent('hello')],
56
+ },
57
+ {
58
+ role: 'assistant',
59
+ content: [createImageContent(2), createTextContent('world')],
60
+ },
61
+ ];
62
+ const result = (0, messages_1.limitScreenshots)(messages, 1);
63
+ (0, bun_test_1.expect)(result[0].content).toEqual([createTextContent('hello')]);
64
+ (0, bun_test_1.expect)(result[1].content).toEqual([
65
+ createImageContent(2),
66
+ createTextContent('world'),
67
+ ]);
68
+ });
69
+ });
70
+ //# sourceMappingURL=messages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.test.js","sourceRoot":"","sources":["../../../src/util/__tests__/messages.test.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ function applyChanges(projectRoot, changes) {
12
12
  const created = [];
13
13
  const modified = [];
14
14
  for (const change of changes) {
15
- const { filePath, content, type } = change;
15
+ const { path: filePath, content, type } = change;
16
16
  const fullPath = path_1.default.join(projectRoot, filePath);
17
17
  try {
18
18
  const fileExists = fs_1.default.existsSync(fullPath);
@@ -37,13 +37,13 @@ function applyChanges(projectRoot, changes) {
37
37
  }
38
38
  }
39
39
  catch (error) {
40
- console.error(`Failed to apply patch to ${filePath}:`, error, content);
40
+ console.error(`Failed to apply patch to ${path_1.default}:`, error, content);
41
41
  }
42
42
  }
43
43
  return { created, modified };
44
44
  }
45
45
  async function applyAndRevertChanges(projectRoot, changes, onApply) {
46
- const filesChanged = changes.map((change) => change.filePath);
46
+ const filesChanged = changes.map((change) => change.path);
47
47
  const files = Object.fromEntries(filesChanged.map((filePath) => {
48
48
  const fullPath = path_1.default.join(projectRoot, filePath);
49
49
  const oldContent = fs_1.default.existsSync(fullPath)
@@ -1 +1 @@
1
- {"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/util/changes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"changes.js","sourceRoot":"","sources":["../../src/util/changes.ts"],"names":[],"mappings":"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"}
@@ -7,18 +7,18 @@ export declare const userSchema: z.ZodObject<{
7
7
  fingerprintId: z.ZodString;
8
8
  fingerprintHash: z.ZodString;
9
9
  }, "strip", z.ZodTypeAny, {
10
- name: string | null;
11
10
  email: string;
11
+ name: string | null;
12
12
  id: string;
13
- authToken: string;
14
13
  fingerprintId: string;
14
+ authToken: string;
15
15
  fingerprintHash: string;
16
16
  }, {
17
- name: string | null;
18
17
  email: string;
18
+ name: string | null;
19
19
  id: string;
20
- authToken: string;
21
20
  fingerprintId: string;
21
+ authToken: string;
22
22
  fingerprintHash: string;
23
23
  }>;
24
24
  export type User = z.infer<typeof userSchema>;
@@ -82,6 +82,7 @@ export declare const ProjectFileContextSchema: z.ZodObject<{
82
82
  path: string;
83
83
  content: string;
84
84
  }>, "many">, "many">;
85
+ prevFileVersions: z.ZodRecord<z.ZodString, z.ZodNullable<z.ZodString>>;
85
86
  }, "strip", z.ZodTypeAny, {
86
87
  currentWorkingDirectory: string;
87
88
  fileTree: FileTreeNode[];
@@ -107,6 +108,7 @@ export declare const ProjectFileContextSchema: z.ZodObject<{
107
108
  path: string;
108
109
  content: string;
109
110
  }[][];
111
+ prevFileVersions: Record<string, string | null>;
110
112
  userKnowledgeFiles?: Record<string, string> | undefined;
111
113
  }, {
112
114
  currentWorkingDirectory: string;
@@ -133,19 +135,24 @@ export declare const ProjectFileContextSchema: z.ZodObject<{
133
135
  path: string;
134
136
  content: string;
135
137
  }[][];
138
+ prevFileVersions: Record<string, string | null>;
136
139
  userKnowledgeFiles?: Record<string, string> | undefined;
137
140
  }>;
138
141
  export type ProjectFileContext = z.infer<typeof ProjectFileContextSchema>;
139
142
  export declare const createFileBlock: (filePath: string, content: string) => string;
140
- export declare const createFileBlockWithoutPath: (content: string) => string;
141
143
  export declare const fileRegex: RegExp;
142
144
  export declare const fileWithNoPathRegex: RegExp;
143
145
  export declare const parseFileBlocks: (fileBlocks: string) => Record<string, string>;
144
- export declare const parseFileBlocksWithoutPath: (fileBlocks: string) => string[];
145
146
  export declare const createMarkdownFileBlock: (filePath: string, content: string) => string;
146
147
  export declare const createSearchReplaceBlock: (search: string, replace: string) => string;
147
148
  export declare function printFileTree(nodes: FileTreeNode[], depth?: number): string;
148
149
  export declare function printFileTreeWithTokens(nodes: FileTreeNode[], fileTokenScores: Record<string, Record<string, number>>, path?: string[]): string;
150
+ /**
151
+ * Ensures the given file contents ends with a newline character.
152
+ * @param contents - The file contents
153
+ * @returns the file contents with a newline character.
154
+ */
155
+ export declare const ensureEndsWithNewline: (contents: string | null) => string | null;
149
156
  export declare const ensureDirectoryExists: (baseDir: string) => void;
150
157
  /**
151
158
  * Removes markdown code block syntax if present, including any language tag