codebuff 1.0.256 → 1.0.258

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 (124) hide show
  1. package/dist/background-process-manager.d.ts +50 -0
  2. package/dist/background-process-manager.js +359 -0
  3. package/dist/background-process-manager.js.map +1 -0
  4. package/dist/browser-runner.d.ts +35 -0
  5. package/dist/browser-runner.js +680 -0
  6. package/dist/browser-runner.js.map +1 -0
  7. package/dist/chat-storage.d.ts +2 -0
  8. package/dist/chat-storage.js +93 -0
  9. package/dist/chat-storage.js.map +1 -0
  10. package/dist/checkpoints/checkpoint-manager.d.ts +94 -0
  11. package/dist/checkpoints/checkpoint-manager.js +280 -0
  12. package/dist/checkpoints/checkpoint-manager.js.map +1 -0
  13. package/dist/checkpoints/file-manager.d.ts +72 -0
  14. package/dist/checkpoints/file-manager.js +294 -0
  15. package/dist/checkpoints/file-manager.js.map +1 -0
  16. package/dist/cli-handlers/api-key.d.ts +25 -0
  17. package/dist/cli-handlers/api-key.js +66 -0
  18. package/dist/cli-handlers/api-key.js.map +1 -0
  19. package/dist/cli-handlers/checkpoint.d.ts +18 -0
  20. package/dist/cli-handlers/checkpoint.js +195 -0
  21. package/dist/cli-handlers/checkpoint.js.map +1 -0
  22. package/dist/cli-handlers/diff.d.ts +2 -0
  23. package/dist/cli-handlers/diff.js +31 -0
  24. package/dist/cli-handlers/diff.js.map +1 -0
  25. package/dist/cli-handlers/easter-egg.d.ts +1 -0
  26. package/dist/cli-handlers/easter-egg.js +126 -0
  27. package/dist/cli-handlers/easter-egg.js.map +1 -0
  28. package/dist/cli-handlers/inititalization-flow.d.ts +1 -0
  29. package/dist/cli-handlers/inititalization-flow.js +24 -0
  30. package/dist/cli-handlers/inititalization-flow.js.map +1 -0
  31. package/dist/cli.d.ts +44 -0
  32. package/dist/cli.js +485 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/client.d.ts +151 -0
  35. package/dist/client.js +833 -0
  36. package/dist/client.js.map +1 -0
  37. package/dist/common/constants/analytics-events.d.ts +2 -1
  38. package/dist/common/constants/analytics-events.js +2 -1
  39. package/dist/common/constants/analytics-events.js.map +1 -1
  40. package/dist/config.d.ts +4 -0
  41. package/dist/config.js +12 -0
  42. package/dist/config.js.map +1 -0
  43. package/dist/create-template-project.d.ts +1 -0
  44. package/dist/create-template-project.js +107 -0
  45. package/dist/create-template-project.js.map +1 -0
  46. package/dist/credentials.d.ts +4 -0
  47. package/dist/credentials.js +38 -0
  48. package/dist/credentials.js.map +1 -0
  49. package/dist/dev-process-manager.d.ts +10 -0
  50. package/dist/dev-process-manager.js +54 -0
  51. package/dist/dev-process-manager.js.map +1 -0
  52. package/dist/display.d.ts +9 -0
  53. package/dist/display.js +68 -0
  54. package/dist/display.js.map +1 -0
  55. package/dist/fingerprint.d.ts +1 -0
  56. package/dist/fingerprint.js +48 -0
  57. package/dist/fingerprint.js.map +1 -0
  58. package/dist/index.d.ts +2 -0
  59. package/dist/index.js +119 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/menu.d.ts +3 -0
  62. package/dist/menu.js +126 -0
  63. package/dist/menu.js.map +1 -0
  64. package/dist/project-files.d.ts +114 -0
  65. package/dist/project-files.js +513 -0
  66. package/dist/project-files.js.map +1 -0
  67. package/dist/startup-process-handler.d.ts +2 -0
  68. package/dist/startup-process-handler.js +21 -0
  69. package/dist/startup-process-handler.js.map +1 -0
  70. package/dist/tool-handlers.d.ts +28 -0
  71. package/dist/tool-handlers.js +240 -0
  72. package/dist/tool-handlers.js.map +1 -0
  73. package/dist/types.d.ts +15 -0
  74. package/dist/types.js +3 -0
  75. package/dist/types.js.map +1 -0
  76. package/dist/update-codebuff.d.ts +1 -0
  77. package/dist/update-codebuff.js +160 -0
  78. package/dist/update-codebuff.js.map +1 -0
  79. package/dist/utils/__tests__/background-process-manager.test.d.ts +1 -0
  80. package/dist/utils/__tests__/background-process-manager.test.js +289 -0
  81. package/dist/utils/__tests__/background-process-manager.test.js.map +1 -0
  82. package/dist/utils/__tests__/tool-renderers.test.d.ts +1 -0
  83. package/dist/utils/__tests__/tool-renderers.test.js +51 -0
  84. package/dist/utils/__tests__/tool-renderers.test.js.map +1 -0
  85. package/dist/utils/__tests__/xml-stream-parser.test.d.ts +1 -0
  86. package/dist/utils/__tests__/xml-stream-parser.test.js +229 -0
  87. package/dist/utils/__tests__/xml-stream-parser.test.js.map +1 -0
  88. package/dist/utils/analytics.d.ts +6 -0
  89. package/dist/utils/analytics.js +75 -0
  90. package/dist/utils/analytics.js.map +1 -0
  91. package/dist/utils/detect-shell.d.ts +1 -0
  92. package/dist/utils/detect-shell.js +60 -0
  93. package/dist/utils/detect-shell.js.map +1 -0
  94. package/dist/utils/git.d.ts +1 -0
  95. package/dist/utils/git.js +23 -0
  96. package/dist/utils/git.js.map +1 -0
  97. package/dist/utils/logger.d.ts +21 -0
  98. package/dist/utils/logger.js +105 -0
  99. package/dist/utils/logger.js.map +1 -0
  100. package/dist/utils/spinner.d.ts +11 -0
  101. package/dist/utils/spinner.js +87 -0
  102. package/dist/utils/spinner.js.map +1 -0
  103. package/dist/utils/system-info.d.ts +8 -0
  104. package/dist/utils/system-info.js +22 -0
  105. package/dist/utils/system-info.js.map +1 -0
  106. package/dist/utils/terminal.d.ts +43 -0
  107. package/dist/utils/terminal.js +493 -0
  108. package/dist/utils/terminal.js.map +1 -0
  109. package/dist/utils/tool-renderers.d.ts +16 -0
  110. package/dist/utils/tool-renderers.js +148 -0
  111. package/dist/utils/tool-renderers.js.map +1 -0
  112. package/dist/utils/xml-stream-parser.d.ts +9 -0
  113. package/dist/utils/xml-stream-parser.js +128 -0
  114. package/dist/utils/xml-stream-parser.js.map +1 -0
  115. package/dist/web-scraper.d.ts +3 -0
  116. package/dist/web-scraper.js +57 -0
  117. package/dist/web-scraper.js.map +1 -0
  118. package/dist/workers/checkpoint-worker.d.ts +1 -0
  119. package/dist/workers/checkpoint-worker.js +48 -0
  120. package/dist/workers/checkpoint-worker.js.map +1 -0
  121. package/dist/workers/project-context.d.ts +1 -0
  122. package/dist/workers/project-context.js +17 -0
  123. package/dist/workers/project-context.js.map +1 -0
  124. package/package.json +1 -1
@@ -0,0 +1,294 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fs = void 0;
7
+ exports.getBareRepoPath = getBareRepoPath;
8
+ exports.hasUnsavedChanges = hasUnsavedChanges;
9
+ exports.getLatestCommit = getLatestCommit;
10
+ exports.initializeCheckpointFileManager = initializeCheckpointFileManager;
11
+ exports.storeFileState = storeFileState;
12
+ exports.restoreFileState = restoreFileState;
13
+ const child_process_1 = require("child_process");
14
+ const crypto_1 = require("crypto");
15
+ const fs_1 = __importDefault(require("fs"));
16
+ exports.fs = fs_1.default;
17
+ const os_1 = __importDefault(require("os"));
18
+ const path_1 = require("path");
19
+ const isomorphic_git_1 = require("isomorphic-git");
20
+ const project_files_1 = require("../project-files");
21
+ const git_1 = require("../utils/git");
22
+ /**
23
+ * Generates a unique path for storing the bare git repository based on the project directory.
24
+ * Uses SHA-256 hashing to create a unique identifier.
25
+ * @param dir - The project directory path to hash
26
+ * @returns The full path where the bare repo should be stored
27
+ */
28
+ function getBareRepoPath(dir) {
29
+ const bareRepoName = (0, crypto_1.createHash)('sha256').update(dir).digest('hex');
30
+ return (0, path_1.join)((0, project_files_1.getProjectDataDir)(), bareRepoName);
31
+ }
32
+ /**
33
+ * Checks if there are any uncommitted changes in the working directory.
34
+ * First attempts to use native git commands, falling back to isomorphic-git if unavailable.
35
+ * @param projectDir - The working tree directory path
36
+ * @param bareRepoPath - The bare git repository path
37
+ * @param relativeFilepaths - Array of file paths relative to projectDir to check
38
+ * @returns Promise resolving to true if there are uncommitted changes, false otherwise
39
+ */
40
+ async function hasUnsavedChanges({ projectDir, bareRepoPath, relativeFilepaths, }) {
41
+ if ((0, git_1.gitCommandIsAvailable)()) {
42
+ try {
43
+ const output = (0, child_process_1.execFileSync)('git', [
44
+ '--git-dir',
45
+ bareRepoPath,
46
+ '--work-tree',
47
+ projectDir,
48
+ 'status',
49
+ '--porcelain',
50
+ ], { stdio: ['ignore', 'pipe', 'ignore'] }).toString();
51
+ return output.trim().length > 0;
52
+ }
53
+ catch (error) {
54
+ // error running git
55
+ }
56
+ }
57
+ for (const [, , workdirStatus, stageStatus] of await (0, isomorphic_git_1.statusMatrix)({
58
+ fs: fs_1.default,
59
+ dir: projectDir,
60
+ gitdir: bareRepoPath,
61
+ filepaths: relativeFilepaths,
62
+ })) {
63
+ if (workdirStatus !== stageStatus) {
64
+ return true;
65
+ }
66
+ }
67
+ return false;
68
+ }
69
+ /**
70
+ * Gets the hash of the latest commit in the repository.
71
+ * First attempts to use native git commands, falling back to isomorphic-git if unavailable.
72
+ * @param bareRepoPath - The bare git repository path
73
+ * @returns Promise resolving to the commit hash
74
+ */
75
+ async function getLatestCommit({ bareRepoPath, }) {
76
+ if ((0, git_1.gitCommandIsAvailable)()) {
77
+ try {
78
+ return (0, child_process_1.execFileSync)('git', ['--git-dir', bareRepoPath, 'rev-parse', 'HEAD'], { stdio: ['ignore', 'pipe', 'ignore'] })
79
+ .toString()
80
+ .trim();
81
+ }
82
+ catch (error) {
83
+ // unable to get head
84
+ }
85
+ }
86
+ return await (0, isomorphic_git_1.resolveRef)({
87
+ fs: fs_1.default,
88
+ gitdir: bareRepoPath,
89
+ ref: 'HEAD',
90
+ });
91
+ }
92
+ /**
93
+ * Initializes a bare git repository for tracking file changes.
94
+ * Creates the repository if it doesn't exist, otherwise uses the existing one.
95
+ * Makes an initial commit of the current file state.
96
+ * @param projectDir - The working tree directory path
97
+ * @param relativeFilepaths - Array of file paths relative to projectDir to track
98
+ */
99
+ async function initializeCheckpointFileManager({ projectDir, relativeFilepaths, }) {
100
+ if (projectDir === os_1.default.homedir()) {
101
+ return;
102
+ }
103
+ const bareRepoPath = getBareRepoPath(projectDir);
104
+ // Create the bare repo directory if it doesn't exist
105
+ fs_1.default.mkdirSync(bareRepoPath, { recursive: true });
106
+ try {
107
+ // Check if it's already a valid Git repo
108
+ await (0, isomorphic_git_1.resolveRef)({ fs: fs_1.default, gitdir: bareRepoPath, ref: 'HEAD' });
109
+ }
110
+ catch (error) {
111
+ // Bare repo doesn't exist yet
112
+ await (0, isomorphic_git_1.init)({
113
+ fs: fs_1.default,
114
+ dir: projectDir,
115
+ gitdir: bareRepoPath,
116
+ bare: true,
117
+ defaultBranch: 'master',
118
+ });
119
+ }
120
+ // Commit the files in the bare repo
121
+ await storeFileState({
122
+ projectDir,
123
+ bareRepoPath,
124
+ message: 'Initial Commit',
125
+ relativeFilepaths,
126
+ });
127
+ }
128
+ /**
129
+ * Stages all changes in the working directory.
130
+ * First attempts to use native git commands, falling back to isomorphic-git if unavailable.
131
+ * @param projectDir - The working tree directory path
132
+ * @param bareRepoPath - The bare git repository path
133
+ * @param relativeFilepaths - Array of file paths relative to projectDir to stage
134
+ */
135
+ async function gitAddAll({ projectDir, bareRepoPath, relativeFilepaths, }) {
136
+ if ((0, git_1.gitCommandIsAvailable)()) {
137
+ try {
138
+ (0, child_process_1.execFileSync)('git', [
139
+ '--git-dir',
140
+ bareRepoPath,
141
+ '--work-tree',
142
+ projectDir,
143
+ '-C',
144
+ projectDir,
145
+ 'add',
146
+ '.',
147
+ ], { stdio: 'ignore' });
148
+ return;
149
+ }
150
+ catch (error) {
151
+ // Failed to `git add .`
152
+ }
153
+ }
154
+ // Stage files with isomorphic-git
155
+ // Get status of all files in the project directory
156
+ const currStatusMatrix = (await (0, isomorphic_git_1.statusMatrix)({
157
+ fs: fs_1.default,
158
+ dir: projectDir,
159
+ gitdir: bareRepoPath,
160
+ filepaths: relativeFilepaths,
161
+ })) ?? [];
162
+ for (const [filepath, , workdirStatus, stageStatus] of currStatusMatrix) {
163
+ if (workdirStatus === stageStatus) {
164
+ continue;
165
+ }
166
+ if (workdirStatus === 2) {
167
+ // Existing file different from HEAD
168
+ try {
169
+ await (0, isomorphic_git_1.add)({ fs: fs_1.default, dir: projectDir, gitdir: bareRepoPath, filepath });
170
+ }
171
+ catch (error) {
172
+ // error adding files
173
+ }
174
+ }
175
+ else if (workdirStatus === 0) {
176
+ // Deleted file
177
+ try {
178
+ await (0, isomorphic_git_1.remove)({ fs: fs_1.default, dir: projectDir, gitdir: bareRepoPath, filepath });
179
+ }
180
+ catch (error) {
181
+ // error removing file
182
+ }
183
+ }
184
+ }
185
+ }
186
+ async function gitCommit({ projectDir, bareRepoPath, message, }) {
187
+ if ((0, git_1.gitCommandIsAvailable)()) {
188
+ try {
189
+ (0, child_process_1.execFileSync)('git', [
190
+ '--git-dir',
191
+ bareRepoPath,
192
+ '--work-tree',
193
+ projectDir,
194
+ 'commit',
195
+ '-m',
196
+ message,
197
+ ], { stdio: 'ignore' });
198
+ return await getLatestCommit({ bareRepoPath });
199
+ }
200
+ catch (error) {
201
+ // Failed to commit, continue to isomorphic-git implementation
202
+ }
203
+ }
204
+ const commitHash = await (0, isomorphic_git_1.commit)({
205
+ fs: fs_1.default,
206
+ dir: projectDir,
207
+ gitdir: bareRepoPath,
208
+ author: { name: 'Codebuff' },
209
+ message,
210
+ ref: '/refs/heads/master',
211
+ });
212
+ if ((0, git_1.gitCommandIsAvailable)()) {
213
+ try {
214
+ (0, child_process_1.execFileSync)('git', [
215
+ '--git-dir',
216
+ bareRepoPath,
217
+ '--work-tree',
218
+ projectDir,
219
+ 'checkout',
220
+ 'master',
221
+ ], { stdio: 'ignore' });
222
+ return commitHash;
223
+ }
224
+ catch (error) {
225
+ // Unable to checkout with git
226
+ }
227
+ }
228
+ await (0, isomorphic_git_1.checkout)({ fs: fs_1.default, dir: projectDir, gitdir: bareRepoPath, ref: 'master' });
229
+ return commitHash;
230
+ }
231
+ /**
232
+ * Creates a new commit with the current state of all tracked files.
233
+ * Stages all changes and creates a commit with the specified message.
234
+ * @param projectDir - The working tree directory path
235
+ * @param bareRepoPath - The bare git repository path
236
+ * @param message - The commit message
237
+ * @param relativeFilepaths - Array of file paths relative to projectDir to commit
238
+ * @returns Promise resolving to the new commit's hash
239
+ */
240
+ async function storeFileState({ projectDir, bareRepoPath, message, relativeFilepaths: relativeFilepaths, }) {
241
+ await gitAddAll({
242
+ projectDir,
243
+ bareRepoPath,
244
+ relativeFilepaths,
245
+ });
246
+ return await gitCommit({ projectDir, bareRepoPath, message });
247
+ }
248
+ /**
249
+ * Restores the working directory and index to match the specified commit.
250
+ * Equivalent to `git reset --hard`
251
+ * First attempts to use native git commands, falling back to isomorphic-git if unavailable.
252
+ * @param projectDir - The working tree directory path
253
+ * @param bareRepoPath - The bare git repository path
254
+ * @param commit - The commit hash to restore to
255
+ * @param relativeFilepaths - Array of file paths relative to projectDir to restore
256
+ */
257
+ async function restoreFileState({ projectDir, bareRepoPath, commit, relativeFilepaths, }) {
258
+ let resetDone = false;
259
+ if ((0, git_1.gitCommandIsAvailable)()) {
260
+ try {
261
+ (0, child_process_1.execFileSync)('git', [
262
+ '--git-dir',
263
+ bareRepoPath,
264
+ '--work-tree',
265
+ projectDir,
266
+ 'reset',
267
+ '--hard',
268
+ commit,
269
+ ]);
270
+ return;
271
+ }
272
+ catch (error) {
273
+ // Failed to use git, continue to isomorphic-git implementation
274
+ }
275
+ }
276
+ // Update the working directory to reflect the specified commit
277
+ await (0, isomorphic_git_1.checkout)({
278
+ fs: fs_1.default,
279
+ dir: projectDir,
280
+ gitdir: bareRepoPath,
281
+ ref: commit,
282
+ filepaths: relativeFilepaths,
283
+ force: true,
284
+ });
285
+ // Reset the index to match the specified commit
286
+ await Promise.all(relativeFilepaths.map((filepath) => (0, isomorphic_git_1.resetIndex)({
287
+ fs: fs_1.default,
288
+ dir: projectDir,
289
+ gitdir: bareRepoPath,
290
+ filepath,
291
+ ref: commit,
292
+ })));
293
+ }
294
+ //# sourceMappingURL=file-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-manager.js","sourceRoot":"","sources":["../../src/checkpoints/file-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Client } from '../client';
2
+ import { ApiKeyType } from '../common/api-keys/constants';
3
+ export type ApiKeyDetectionResult = {
4
+ status: 'found';
5
+ type: ApiKeyType;
6
+ key: string;
7
+ } | {
8
+ status: 'prefix_only';
9
+ type: ApiKeyType;
10
+ prefix: string;
11
+ length: number;
12
+ } | {
13
+ status: 'not_found';
14
+ };
15
+ /**
16
+ * Detects if the user input contains a known API key pattern.
17
+ * Returns information about the detected key or prefix.
18
+ */
19
+ export declare function detectApiKey(userInput: string): ApiKeyDetectionResult;
20
+ /**
21
+ * Handles the result of API key detection.
22
+ */
23
+ export declare function handleApiKeyInput(client: Client, detectionResult: Exclude<ApiKeyDetectionResult, {
24
+ status: 'not_found';
25
+ }>, readyPromise: Promise<any>, returnControlToUser: () => void): Promise<void>;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectApiKey = detectApiKey;
4
+ exports.handleApiKeyInput = handleApiKeyInput;
5
+ const picocolors_1 = require("picocolors");
6
+ const constants_1 = require("../common/api-keys/constants");
7
+ /**
8
+ * Detects if the user input contains a known API key pattern.
9
+ * Returns information about the detected key or prefix.
10
+ */
11
+ function detectApiKey(userInput) {
12
+ // Build regex patterns for each key type
13
+ const keyPatterns = constants_1.API_KEY_TYPES.map((keyType) => {
14
+ const prefix = constants_1.KEY_PREFIXES[keyType];
15
+ const length = constants_1.KEY_LENGTHS[keyType];
16
+ const escapedPrefix = prefix.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
17
+ return {
18
+ type: keyType,
19
+ prefix: prefix,
20
+ length: length,
21
+ // Regex to find the key potentially surrounded by whitespace or at start/end
22
+ regex: new RegExp(`(?:^|\\s)(${escapedPrefix}[^\\s]{${length - prefix.length}})(?:\\s|$)`),
23
+ };
24
+ });
25
+ // Test input against each pattern for a full match
26
+ for (const patternInfo of keyPatterns) {
27
+ const match = userInput.match(patternInfo.regex);
28
+ if (match && match[1]) {
29
+ // Found a full, valid key pattern
30
+ return { status: 'found', type: patternInfo.type, key: match[1] };
31
+ }
32
+ }
33
+ // If no full key matched, check if the input *starts* with any known prefix
34
+ for (const patternInfo of keyPatterns) {
35
+ if (userInput.includes(patternInfo.prefix)) {
36
+ // Found a prefix, but it didn't match the full pattern (wrong length/format)
37
+ return {
38
+ status: 'prefix_only',
39
+ type: patternInfo.type,
40
+ prefix: patternInfo.prefix,
41
+ length: patternInfo.length,
42
+ };
43
+ }
44
+ }
45
+ // No valid key or known prefix detected
46
+ return { status: 'not_found' };
47
+ }
48
+ /**
49
+ * Handles the result of API key detection.
50
+ */
51
+ async function handleApiKeyInput(client, detectionResult, readyPromise, returnControlToUser) {
52
+ switch (detectionResult.status) {
53
+ case 'found':
54
+ await readyPromise;
55
+ // Call the client method to add the valid key
56
+ await client.handleAddApiKey(detectionResult.type, detectionResult.key);
57
+ // Note: client.handleAddApiKey calls returnControlToUser internally
58
+ break;
59
+ case 'prefix_only':
60
+ // Print the warning for incorrect format/length
61
+ console.log((0, picocolors_1.yellow)(`Input looks like a ${detectionResult.type} API key but has the wrong length or format. Expected ${detectionResult.length} characters starting with "${detectionResult.prefix}".`));
62
+ returnControlToUser(); // Give the user a fresh prompt after the warning
63
+ break;
64
+ }
65
+ }
66
+ //# sourceMappingURL=api-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.js","sourceRoot":"","sources":["../../src/cli-handlers/api-key.ts"],"names":[],"mappings":";;AAaA,oCAyCC;AAKD,8CA0BC;AArFD,2CAAmC;AAEnC,yDAAgG;AAOhG;;;GAGG;AACH,SAAgB,YAAY,CAAC,SAAiB;IAC5C,yCAAyC;IACzC,MAAM,WAAW,GAAG,yBAAa,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,wBAAY,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,MAAM,GAAG,uBAAW,CAAC,OAAO,CAAC,CAAA;QACnC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAA;QACtE,OAAO;YACL,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,MAAM;YACd,6EAA6E;YAC7E,KAAK,EAAE,IAAI,MAAM,CACf,aAAa,aAAa,UAAU,MAAM,GAAG,MAAM,CAAC,MAAM,aAAa,CACxE;SACF,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,mDAAmD;IACnD,KAAK,MAAM,WAAW,IAAI,WAAW,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAChD,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,kCAAkC;YAClC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QACnE,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,KAAK,MAAM,WAAW,IAAI,WAAW,EAAE,CAAC;QACtC,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,6EAA6E;YAC7E,OAAO;gBACL,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,MAAM,EAAE,WAAW,CAAC,MAAM;aAC3B,CAAA;QACH,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;AAChC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,eAAwE,EACxE,YAA0B,EAC1B,mBAA+B;IAE/B,QAAQ,eAAe,CAAC,MAAM,EAAE,CAAC;QAC/B,KAAK,OAAO;YACV,MAAM,YAAY,CAAA;YAClB,8CAA8C;YAC9C,MAAM,MAAM,CAAC,eAAe,CAC1B,eAAe,CAAC,IAAI,EACpB,eAAe,CAAC,GAAG,CACpB,CAAA;YACD,oEAAoE;YACpE,MAAK;QACP,KAAK,aAAa;YAChB,gDAAgD;YAChD,OAAO,CAAC,GAAG,CACT,IAAA,mBAAM,EACJ,sBAAsB,eAAe,CAAC,IAAI,yDAAyD,eAAe,CAAC,MAAM,8BAA8B,eAAe,CAAC,MAAM,IAAI,CAClL,CACF,CAAA;YACD,mBAAmB,EAAE,CAAA,CAAC,iDAAiD;YACvE,MAAK;IACT,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Interface as ReadlineInterface } from 'readline';
2
+ import type { Client } from '../client';
3
+ export declare const checkpointCommands: {
4
+ readonly save: readonly [readonly ["checkpoint"], "Save current state as a new checkpoint"];
5
+ readonly list: readonly [readonly ["checkpoint list", "checkpoints"], "List all saved checkpoints"];
6
+ readonly clear: readonly [readonly ["checkpoint clear"], "Clear all checkpoints"];
7
+ readonly undo: readonly [readonly ["undo", "u"], "Undo to previous checkpoint"];
8
+ readonly redo: readonly [readonly ["redo", "r"], "Redo previously undone checkpoint"];
9
+ readonly restore: readonly [readonly [RegExp], "Restore to checkpoint number <n>"];
10
+ };
11
+ export declare function displayCheckpointMenu(): void;
12
+ export declare function isCheckpointCommand(userInput: string, type?: keyof typeof checkpointCommands | null): boolean | RegExpMatchArray;
13
+ export declare function listCheckpoints(): Promise<void>;
14
+ export declare function handleUndo(client: Client, rl: ReadlineInterface): Promise<string>;
15
+ export declare function handleRedo(client: Client, rl: ReadlineInterface): Promise<string>;
16
+ export declare function handleRestoreCheckpoint(id: number, client: Client, rl: ReadlineInterface): Promise<string>;
17
+ export declare function handleClearCheckpoints(): void;
18
+ export declare function saveCheckpoint(userInput: string, client: Client, readyPromise: Promise<any>, saveWithNoChanges?: boolean): Promise<void>;
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkpointCommands = void 0;
4
+ exports.displayCheckpointMenu = displayCheckpointMenu;
5
+ exports.isCheckpointCommand = isCheckpointCommand;
6
+ exports.listCheckpoints = listCheckpoints;
7
+ exports.handleUndo = handleUndo;
8
+ exports.handleRedo = handleRedo;
9
+ exports.handleRestoreCheckpoint = handleRestoreCheckpoint;
10
+ exports.handleClearCheckpoints = handleClearCheckpoints;
11
+ exports.saveCheckpoint = saveCheckpoint;
12
+ const picocolors_1 = require("picocolors");
13
+ const checkpoint_manager_1 = require("../checkpoints/checkpoint-manager");
14
+ const spinner_1 = require("../utils/spinner");
15
+ exports.checkpointCommands = {
16
+ save: [['checkpoint'], 'Save current state as a new checkpoint'],
17
+ list: [['checkpoint list', 'checkpoints'], 'List all saved checkpoints'],
18
+ clear: [['checkpoint clear'], 'Clear all checkpoints'],
19
+ undo: [['undo', 'u'], 'Undo to previous checkpoint'],
20
+ redo: [['redo', 'r'], 'Redo previously undone checkpoint'],
21
+ restore: [[/^checkpoint\s+(\d+)$/], 'Restore to checkpoint number <n>'],
22
+ };
23
+ const allCheckpointCommands = Object.entries(exports.checkpointCommands)
24
+ .map((entry) => entry[1][0])
25
+ .flat();
26
+ function displayCheckpointMenu() {
27
+ console.log('\n' + (0, picocolors_1.bold)((0, picocolors_1.underline)('Checkpoint Commands:')));
28
+ Object.entries(exports.checkpointCommands).forEach(([, [aliases, description]]) => {
29
+ const formattedAliases = aliases
30
+ .map((a) => (typeof a === 'string' ? (0, picocolors_1.cyan)(a) : (0, picocolors_1.cyan)('checkpoint <n>')))
31
+ .join(', ');
32
+ console.log(`${formattedAliases} - ${description}`);
33
+ });
34
+ console.log();
35
+ }
36
+ function isCheckpointCommand(userInput, type = null) {
37
+ if (type === null) {
38
+ if (userInput.startsWith('checkpoint')) {
39
+ return true;
40
+ }
41
+ for (const pattern of allCheckpointCommands) {
42
+ if (pattern instanceof RegExp) {
43
+ const m = userInput.match(pattern);
44
+ if (m) {
45
+ return m;
46
+ }
47
+ }
48
+ if (userInput === pattern) {
49
+ return true;
50
+ }
51
+ }
52
+ return false;
53
+ }
54
+ for (const pattern of exports.checkpointCommands[type][0]) {
55
+ if (pattern instanceof RegExp) {
56
+ const m = userInput.match(pattern);
57
+ if (m) {
58
+ return m;
59
+ }
60
+ }
61
+ if (userInput === pattern) {
62
+ return true;
63
+ }
64
+ }
65
+ return false;
66
+ }
67
+ async function listCheckpoints() {
68
+ console.log(checkpoint_manager_1.checkpointManager.getCheckpointsAsString());
69
+ }
70
+ async function handleUndo(client, rl) {
71
+ let failed = false;
72
+ try {
73
+ await checkpoint_manager_1.checkpointManager.restoreUndoCheckpoint();
74
+ }
75
+ catch (error) {
76
+ failed = true;
77
+ if (error instanceof checkpoint_manager_1.CheckpointsDisabledError) {
78
+ console.log((0, picocolors_1.red)(`Checkpoints not enabled: ${error.message}`));
79
+ }
80
+ else {
81
+ console.log((0, picocolors_1.red)(`Unable to undo: ${error.message}`));
82
+ }
83
+ }
84
+ let userInput = '';
85
+ if (!failed) {
86
+ const currentCheckpoint = checkpoint_manager_1.checkpointManager.checkpoints[checkpoint_manager_1.checkpointManager.currentCheckpointId - 1];
87
+ // Restore the agentState
88
+ client.agentState = JSON.parse(currentCheckpoint.agentStateString);
89
+ client.lastToolResults = JSON.parse(currentCheckpoint.lastToolResultsString);
90
+ console.log((0, picocolors_1.green)(`Checkpoint #${checkpoint_manager_1.checkpointManager.currentCheckpointId} restored.`));
91
+ userInput =
92
+ checkpoint_manager_1.checkpointManager.checkpoints[checkpoint_manager_1.checkpointManager.currentCheckpointId - 1]
93
+ ?.userInput ?? '';
94
+ }
95
+ return isCheckpointCommand(userInput) ? '' : userInput;
96
+ }
97
+ async function handleRedo(client, rl) {
98
+ let failed = false;
99
+ try {
100
+ await checkpoint_manager_1.checkpointManager.restoreRedoCheckpoint();
101
+ }
102
+ catch (error) {
103
+ failed = true;
104
+ if (error instanceof checkpoint_manager_1.CheckpointsDisabledError) {
105
+ console.log((0, picocolors_1.red)(`Checkpoints not enabled: ${error.message}`));
106
+ }
107
+ else {
108
+ console.log((0, picocolors_1.red)(`Unable to redo: ${error.message}`));
109
+ }
110
+ }
111
+ let userInput = '';
112
+ if (!failed) {
113
+ const currentCheckpoint = checkpoint_manager_1.checkpointManager.checkpoints[checkpoint_manager_1.checkpointManager.currentCheckpointId - 1];
114
+ // Restore the agentState
115
+ client.agentState = JSON.parse(currentCheckpoint.agentStateString);
116
+ client.lastToolResults = JSON.parse(currentCheckpoint.lastToolResultsString);
117
+ console.log((0, picocolors_1.green)(`Checkpoint #${checkpoint_manager_1.checkpointManager.currentCheckpointId} restored.`));
118
+ userInput =
119
+ checkpoint_manager_1.checkpointManager.checkpoints[checkpoint_manager_1.checkpointManager.currentCheckpointId - 1]
120
+ ?.userInput ?? '';
121
+ }
122
+ return isCheckpointCommand(userInput) ? '' : userInput;
123
+ }
124
+ async function handleRestoreCheckpoint(id, client, rl) {
125
+ spinner_1.Spinner.get().start();
126
+ if (checkpoint_manager_1.checkpointManager.disabledReason !== null) {
127
+ console.log((0, picocolors_1.red)(`Checkpoints not enabled: ${checkpoint_manager_1.checkpointManager.disabledReason}`));
128
+ return '';
129
+ }
130
+ const checkpoint = checkpoint_manager_1.checkpointManager.checkpoints[id - 1];
131
+ if (!checkpoint) {
132
+ console.log((0, picocolors_1.red)(`Checkpoint #${id} not found.`));
133
+ return '';
134
+ }
135
+ try {
136
+ // Wait for save before trying to restore checkpoint
137
+ const latestCheckpoint = checkpoint_manager_1.checkpointManager.getLatestCheckpoint();
138
+ await latestCheckpoint?.fileStateIdPromise;
139
+ }
140
+ catch (error) {
141
+ // Should never happen
142
+ }
143
+ // Restore the agentState
144
+ client.agentState = JSON.parse(checkpoint.agentStateString);
145
+ client.lastToolResults = JSON.parse(checkpoint.lastToolResultsString);
146
+ let failed = false;
147
+ try {
148
+ // Restore file state
149
+ await checkpoint_manager_1.checkpointManager.restoreCheckointFileState({
150
+ id: checkpoint.id,
151
+ resetUndoIds: true,
152
+ });
153
+ }
154
+ catch (error) {
155
+ failed = true;
156
+ spinner_1.Spinner.get().stop();
157
+ console.log((0, picocolors_1.red)(`Unable to restore checkpoint: ${error.message}`));
158
+ }
159
+ if (!failed) {
160
+ spinner_1.Spinner.get().stop();
161
+ console.log((0, picocolors_1.green)(`Restored to checkpoint #${id}.`));
162
+ }
163
+ // Insert the original user input that created this checkpoint
164
+ return isCheckpointCommand(checkpoint.userInput) ? '' : checkpoint.userInput;
165
+ }
166
+ function handleClearCheckpoints() {
167
+ checkpoint_manager_1.checkpointManager.clearCheckpoints();
168
+ console.log('Cleared all checkpoints.');
169
+ }
170
+ async function saveCheckpoint(userInput, client, readyPromise, saveWithNoChanges = false) {
171
+ if (checkpoint_manager_1.checkpointManager.disabledReason !== null) {
172
+ return;
173
+ }
174
+ spinner_1.Spinner.get().start();
175
+ await readyPromise;
176
+ spinner_1.Spinner.get().stop();
177
+ try {
178
+ // Make sure the previous checkpoint is done
179
+ await checkpoint_manager_1.checkpointManager.getLatestCheckpoint().fileStateIdPromise;
180
+ }
181
+ catch (error) {
182
+ // No latest checkpoint available, no need to wait
183
+ }
184
+ // Save the current agent state
185
+ try {
186
+ const { checkpoint, created } = await checkpoint_manager_1.checkpointManager.addCheckpoint(client.agentState, client.lastToolResults, userInput, saveWithNoChanges);
187
+ if (created) {
188
+ console.log(`[checkpoint #${checkpoint.id} saved]`);
189
+ }
190
+ }
191
+ catch (error) {
192
+ // Unable to add checkpoint, do not display anything to user
193
+ }
194
+ }
195
+ //# sourceMappingURL=checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/cli-handlers/checkpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { FileChange } from '../common/actions';
2
+ export declare function handleDiff(lastChanges: FileChange[]): void;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleDiff = handleDiff;
4
+ const picocolors_1 = require("picocolors");
5
+ function handleDiff(lastChanges) {
6
+ if (lastChanges.length === 0) {
7
+ console.log((0, picocolors_1.yellow)('No changes found in the last assistant response.'));
8
+ return;
9
+ }
10
+ lastChanges.forEach((change) => {
11
+ console.log((0, picocolors_1.bold)(`___${change.path}___`));
12
+ const lines = change.content
13
+ .split('\n')
14
+ .map((line) => (change.type === 'file' ? '+' + line : line));
15
+ lines.forEach((line) => {
16
+ if (line.startsWith('+')) {
17
+ console.log((0, picocolors_1.green)(line));
18
+ }
19
+ else if (line.startsWith('-')) {
20
+ console.log((0, picocolors_1.red)(line));
21
+ }
22
+ else if (line.startsWith('@@')) {
23
+ console.log((0, picocolors_1.cyan)(line));
24
+ }
25
+ else {
26
+ console.log(line);
27
+ }
28
+ });
29
+ });
30
+ }
31
+ //# sourceMappingURL=diff.js.map