codebuff 1.0.175 → 1.0.177

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 (58) hide show
  1. package/dist/checkpoints/checkpoint-manager.d.ts +73 -0
  2. package/dist/checkpoints/checkpoint-manager.js +193 -0
  3. package/dist/checkpoints/checkpoint-manager.js.map +1 -0
  4. package/dist/{checkpoint-file-manager.d.ts → checkpoints/file-manager.d.ts} +10 -0
  5. package/dist/{checkpoint-file-manager.js → checkpoints/file-manager.js} +92 -35
  6. package/dist/checkpoints/file-manager.js.map +1 -0
  7. package/dist/cli.d.ts +0 -1
  8. package/dist/cli.js +35 -58
  9. package/dist/cli.js.map +1 -1
  10. package/dist/client.d.ts +6 -4
  11. package/dist/client.js +28 -16
  12. package/dist/client.js.map +1 -1
  13. package/dist/code-map/tsconfig.tsbuildinfo +1 -1
  14. package/dist/common/actions.d.ts +36 -36
  15. package/dist/common/advanced-analyzer.d.ts +19 -0
  16. package/dist/common/advanced-analyzer.js +140 -0
  17. package/dist/common/advanced-analyzer.js.map +1 -0
  18. package/dist/common/browser-actions.d.ts +48 -48
  19. package/dist/common/constants.d.ts +0 -1
  20. package/dist/common/constants.js +1 -44
  21. package/dist/common/constants.js.map +1 -1
  22. package/dist/common/message-image-handling.d.ts +41 -0
  23. package/dist/common/message-image-handling.js +57 -0
  24. package/dist/common/message-image-handling.js.map +1 -0
  25. package/dist/common/project-file-tree.d.ts +1 -0
  26. package/dist/common/project-file-tree.js +3 -1
  27. package/dist/common/project-file-tree.js.map +1 -1
  28. package/dist/common/types/agent-state.d.ts +22 -22
  29. package/dist/common/types/message.d.ts +18 -18
  30. package/dist/common/util/file.d.ts +4 -4
  31. package/dist/common/util/process-stream.d.ts +8 -0
  32. package/dist/common/util/process-stream.js +102 -0
  33. package/dist/common/util/process-stream.js.map +1 -0
  34. package/dist/common/websockets/websocket-schema.d.ts +72 -72
  35. package/dist/menu.js +1 -1
  36. package/dist/menu.js.map +1 -1
  37. package/dist/project-files.d.ts +2 -2
  38. package/dist/project-files.js +2 -2
  39. package/dist/project-files.js.map +1 -1
  40. package/dist/tool-handlers.d.ts +2 -1
  41. package/dist/tool-handlers.js +3 -3
  42. package/dist/tool-handlers.js.map +1 -1
  43. package/dist/utils/terminal.js +4 -40
  44. package/dist/utils/terminal.js.map +1 -1
  45. package/dist/utils/tool-renderers.js +14 -2
  46. package/dist/utils/tool-renderers.js.map +1 -1
  47. package/dist/workers/checkpoint-worker.js +47 -0
  48. package/dist/workers/checkpoint-worker.js.map +1 -0
  49. package/dist/workers/project-context.d.ts +1 -0
  50. package/dist/{worker-script-project-context.js → workers/project-context.js} +5 -5
  51. package/dist/workers/project-context.js.map +1 -0
  52. package/package.json +1 -1
  53. package/dist/checkpoint-file-manager.js.map +0 -1
  54. package/dist/checkpoints.d.ts +0 -63
  55. package/dist/checkpoints.js +0 -159
  56. package/dist/checkpoints.js.map +0 -1
  57. package/dist/worker-script-project-context.js.map +0 -1
  58. /package/dist/{worker-script-project-context.d.ts → workers/checkpoint-worker.d.ts} +0 -0
@@ -0,0 +1,73 @@
1
+ import { AgentState } from '../common/types/agent-state';
2
+ /**
3
+ * Interface representing a checkpoint of agent state
4
+ */
5
+ export interface Checkpoint {
6
+ agentStateString: string;
7
+ /** Promise resolving to the git commit hash for this checkpoint */
8
+ fileStateIdPromise: Promise<string>;
9
+ /** Number of messages in the agent's history at checkpoint time */
10
+ historyLength: number;
11
+ id: number;
12
+ timestamp: number;
13
+ /** User input that triggered this checkpoint */
14
+ userInput: string;
15
+ }
16
+ /**
17
+ * Manages checkpoints of agent state and file state using git operations in a worker thread.
18
+ * Each checkpoint contains both the agent's conversation state and a git commit
19
+ * representing the state of all tracked files at that point.
20
+ */
21
+ export declare class CheckpointManager {
22
+ checkpoints: Array<Checkpoint>;
23
+ private bareRepoPath;
24
+ enabled: boolean;
25
+ /** Worker thread for git operations */
26
+ private worker;
27
+ /**
28
+ * Initialize or return the existing worker thread
29
+ * @returns The worker thread instance
30
+ */
31
+ private initWorker;
32
+ /**
33
+ * Execute an operation in the worker thread with timeout handling
34
+ * @param message - The message describing the operation to perform
35
+ * @returns A promise that resolves with the operation result
36
+ * @throws Error if the operation fails or times out
37
+ */
38
+ private runWorkerOperation;
39
+ /**
40
+ * Get the path to the bare git repository used for storing file states
41
+ * @returns The bare repo path
42
+ */
43
+ private getBareRepoPath;
44
+ /**
45
+ * Add a new checkpoint of the current agent and file state
46
+ * @param agentState - The current agent state to checkpoint
47
+ * @param userInput - The user input that triggered this checkpoint
48
+ * @returns The created checkpoint, or null if checkpointing is disabled
49
+ */
50
+ addCheckpoint(agentState: AgentState, userInput: string): Promise<Checkpoint | null>;
51
+ /**
52
+ * Get the most recent checkpoint
53
+ * @returns The most recent checkpoint or null if none exist
54
+ */
55
+ getLatestCheckpoint(): Checkpoint | null;
56
+ /**
57
+ * Restore the file state from a specific checkpoint
58
+ * @param id - The ID of the checkpoint to restore
59
+ * @returns True if restoration succeeded, false if checkpoint not found
60
+ */
61
+ restoreCheckointFileState(id: number): Promise<boolean>;
62
+ /**
63
+ * Clear all checkpoints
64
+ */
65
+ clearCheckpoints(): void;
66
+ /**
67
+ * Get a formatted string representation of all checkpoints
68
+ * @param detailed Whether to include detailed information about each checkpoint
69
+ * @returns A formatted string representation of all checkpoints
70
+ */
71
+ getCheckpointsAsString(detailed?: boolean): string;
72
+ }
73
+ export declare const checkpointManager: CheckpointManager;
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkpointManager = exports.CheckpointManager = void 0;
4
+ const path_1 = require("path");
5
+ const picocolors_1 = require("picocolors");
6
+ const worker_threads_1 = require("worker_threads");
7
+ const project_file_tree_1 = require("../common/project-file-tree");
8
+ const file_manager_1 = require("./file-manager");
9
+ const project_files_1 = require("src/project-files");
10
+ /**
11
+ * Manages checkpoints of agent state and file state using git operations in a worker thread.
12
+ * Each checkpoint contains both the agent's conversation state and a git commit
13
+ * representing the state of all tracked files at that point.
14
+ */
15
+ class CheckpointManager {
16
+ checkpoints = [];
17
+ bareRepoPath = null;
18
+ enabled = true;
19
+ /** Worker thread for git operations */
20
+ worker = null;
21
+ /**
22
+ * Initialize or return the existing worker thread
23
+ * @returns The worker thread instance
24
+ */
25
+ initWorker() {
26
+ if (!this.worker) {
27
+ // NOTE: Uses the built worker-script-project-context.js within dist.
28
+ // So you need to run `bun run build` before running locally.
29
+ const workerPath = __filename.endsWith('.ts')
30
+ ? (0, path_1.join)(__dirname, '../../dist', 'workers/checkpoint-worker.js')
31
+ : (0, path_1.join)(__dirname, '../workers/checkpoint-worker.js');
32
+ this.worker = new worker_threads_1.Worker(workerPath);
33
+ }
34
+ return this.worker;
35
+ }
36
+ /**
37
+ * Execute an operation in the worker thread with timeout handling
38
+ * @param message - The message describing the operation to perform
39
+ * @returns A promise that resolves with the operation result
40
+ * @throws Error if the operation fails or times out
41
+ */
42
+ async runWorkerOperation(message) {
43
+ const worker = this.initWorker();
44
+ return new Promise((resolve, reject) => {
45
+ const timeoutMs = 30000; // 30 seconds timeout
46
+ const handler = (response) => {
47
+ if (response.success) {
48
+ resolve(response.result);
49
+ }
50
+ else {
51
+ reject(new Error(response.error));
52
+ }
53
+ worker.off('message', handler);
54
+ };
55
+ worker.on('message', handler);
56
+ worker.postMessage(message);
57
+ // Add timeout
58
+ setTimeout(() => {
59
+ worker.off('message', handler);
60
+ reject(new Error('Worker operation timed out'));
61
+ }, timeoutMs);
62
+ });
63
+ }
64
+ /**
65
+ * Get the path to the bare git repository used for storing file states
66
+ * @returns The bare repo path
67
+ */
68
+ getBareRepoPath() {
69
+ if (!this.bareRepoPath) {
70
+ this.bareRepoPath = (0, file_manager_1.getBareRepoPath)((0, project_files_1.getProjectRoot)());
71
+ }
72
+ return this.bareRepoPath;
73
+ }
74
+ /**
75
+ * Add a new checkpoint of the current agent and file state
76
+ * @param agentState - The current agent state to checkpoint
77
+ * @param userInput - The user input that triggered this checkpoint
78
+ * @returns The created checkpoint, or null if checkpointing is disabled
79
+ */
80
+ async addCheckpoint(agentState, userInput) {
81
+ if (!this.enabled) {
82
+ return null;
83
+ }
84
+ const id = this.checkpoints.length + 1;
85
+ const projectDir = (0, project_files_1.getProjectRoot)();
86
+ const bareRepoPath = this.getBareRepoPath();
87
+ const relativeFilepaths = (0, project_file_tree_1.getAllFilePaths)(agentState.fileContext.fileTree);
88
+ if (relativeFilepaths.length >= project_file_tree_1.DEFAULT_MAX_FILES) {
89
+ this.enabled = false;
90
+ return null;
91
+ }
92
+ const needToStage = await (0, file_manager_1.hasUnsavedChanges)({
93
+ projectDir,
94
+ bareRepoPath,
95
+ relativeFilepaths,
96
+ });
97
+ if (!needToStage && this.checkpoints.length > 0) {
98
+ return null;
99
+ }
100
+ const fileStateIdPromise = needToStage
101
+ ? this.runWorkerOperation({
102
+ type: 'store',
103
+ projectDir,
104
+ bareRepoPath,
105
+ message: `Checkpoint ${id}`,
106
+ relativeFilepaths,
107
+ })
108
+ : (0, file_manager_1.getLatestCommit)({ bareRepoPath });
109
+ const checkpoint = {
110
+ agentStateString: JSON.stringify(agentState),
111
+ fileStateIdPromise,
112
+ historyLength: agentState.messageHistory.length,
113
+ id,
114
+ timestamp: Date.now(),
115
+ userInput,
116
+ };
117
+ this.checkpoints.push(checkpoint);
118
+ return checkpoint;
119
+ }
120
+ /**
121
+ * Get the most recent checkpoint
122
+ * @returns The most recent checkpoint or null if none exist
123
+ */
124
+ getLatestCheckpoint() {
125
+ if (!this.enabled) {
126
+ return null;
127
+ }
128
+ return this.checkpoints.length === 0
129
+ ? null
130
+ : this.checkpoints[this.checkpoints.length - 1];
131
+ }
132
+ /**
133
+ * Restore the file state from a specific checkpoint
134
+ * @param id - The ID of the checkpoint to restore
135
+ * @returns True if restoration succeeded, false if checkpoint not found
136
+ */
137
+ async restoreCheckointFileState(id) {
138
+ const checkpoint = this.checkpoints[id - 1];
139
+ if (!checkpoint) {
140
+ return false;
141
+ }
142
+ const relativeFilepaths = (0, project_file_tree_1.getAllFilePaths)(JSON.parse(checkpoint.agentStateString).fileContext
143
+ .fileTree);
144
+ await this.runWorkerOperation({
145
+ type: 'restore',
146
+ projectDir: (0, project_files_1.getProjectRoot)(),
147
+ bareRepoPath: this.getBareRepoPath(),
148
+ commit: await checkpoint.fileStateIdPromise,
149
+ relativeFilepaths,
150
+ });
151
+ return true;
152
+ }
153
+ /**
154
+ * Clear all checkpoints
155
+ */
156
+ clearCheckpoints() {
157
+ this.checkpoints = [];
158
+ }
159
+ /**
160
+ * Get a formatted string representation of all checkpoints
161
+ * @param detailed Whether to include detailed information about each checkpoint
162
+ * @returns A formatted string representation of all checkpoints
163
+ */
164
+ getCheckpointsAsString(detailed = false) {
165
+ if (!this.enabled) {
166
+ return (0, picocolors_1.red)('Checkpoints not enabled: project too large.');
167
+ }
168
+ if (this.checkpoints.length === 0) {
169
+ return (0, picocolors_1.yellow)('No checkpoints available.');
170
+ }
171
+ const lines = [(0, picocolors_1.bold)((0, picocolors_1.underline)('Agent State Checkpoints:')), ''];
172
+ this.checkpoints.forEach((checkpoint) => {
173
+ const date = new Date(checkpoint.timestamp);
174
+ const formattedDate = date.toLocaleString();
175
+ const userInputOneLine = checkpoint.userInput.replaceAll('\n', ' ');
176
+ const userInput = userInputOneLine.length > 50
177
+ ? userInputOneLine.substring(0, 47) + '...'
178
+ : userInputOneLine;
179
+ lines.push(`${(0, picocolors_1.cyan)((0, picocolors_1.bold)(`#${checkpoint.id}`))} ${(0, picocolors_1.gray)(`[${formattedDate}]`)}:`);
180
+ lines.push(` ${(0, picocolors_1.blue)('Input')}: ${userInput}`);
181
+ if (detailed) {
182
+ const messageCount = checkpoint.historyLength;
183
+ lines.push(` ${(0, picocolors_1.blue)('Messages')}: ${messageCount}`);
184
+ }
185
+ lines.push(''); // Empty line between checkpoints
186
+ });
187
+ return lines.join('\n');
188
+ }
189
+ }
190
+ exports.CheckpointManager = CheckpointManager;
191
+ // Export a singleton instance for use throughout the application
192
+ exports.checkpointManager = new CheckpointManager();
193
+ //# sourceMappingURL=checkpoint-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint-manager.js","sourceRoot":"","sources":["../../src/checkpoints/checkpoint-manager.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,13 @@
1
+ import fs from 'fs';
1
2
  export declare function getBareRepoPath(dir: string): string;
3
+ export declare function hasUnsavedChanges({ projectDir, bareRepoPath, relativeFilepaths, }: {
4
+ projectDir: string;
5
+ bareRepoPath: string;
6
+ relativeFilepaths: Array<string>;
7
+ }): Promise<boolean>;
8
+ export declare function getLatestCommit({ bareRepoPath, }: {
9
+ bareRepoPath: string;
10
+ }): Promise<string>;
2
11
  export declare function initializeCheckpointFileManager({ projectDir, relativeFilepaths, }: {
3
12
  projectDir: string;
4
13
  relativeFilepaths: Array<string>;
@@ -29,3 +38,4 @@ export declare function restoreFileState({ projectDir, bareRepoPath, commit, rel
29
38
  commit: string;
30
39
  relativeFilepaths: Array<string>;
31
40
  }): Promise<void>;
41
+ export { fs };
@@ -3,29 +3,88 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fs = void 0;
6
7
  exports.getBareRepoPath = getBareRepoPath;
8
+ exports.hasUnsavedChanges = hasUnsavedChanges;
9
+ exports.getLatestCommit = getLatestCommit;
7
10
  exports.initializeCheckpointFileManager = initializeCheckpointFileManager;
8
11
  exports.storeFileState = storeFileState;
9
12
  exports.restoreFileState = restoreFileState;
10
13
  const crypto_1 = require("crypto");
11
14
  const fs_1 = __importDefault(require("fs"));
15
+ exports.fs = fs_1.default;
12
16
  const isomorphic_git_1 = require("isomorphic-git");
13
17
  const path_1 = require("path");
14
18
  const child_process_1 = require("child_process");
15
- const project_files_1 = require("./project-files");
19
+ const project_files_1 = require("../project-files");
20
+ let cachedGitAvailable = null;
16
21
  function gitCommandIsAvailable() {
17
- try {
18
- (0, child_process_1.execFileSync)('which', ['git']);
19
- return true;
20
- }
21
- catch (error) {
22
- return false;
22
+ if (cachedGitAvailable === null) {
23
+ try {
24
+ (0, child_process_1.execFileSync)('git', ['--version']);
25
+ cachedGitAvailable = true;
26
+ }
27
+ catch (error) {
28
+ cachedGitAvailable = false;
29
+ }
23
30
  }
31
+ return cachedGitAvailable;
24
32
  }
25
33
  function getBareRepoPath(dir) {
26
34
  const bareRepoName = (0, crypto_1.createHash)('sha256').update(dir).digest('hex');
27
35
  return (0, path_1.join)((0, project_files_1.getProjectDataDir)(), bareRepoName);
28
36
  }
37
+ async function hasUnsavedChanges({ projectDir, bareRepoPath, relativeFilepaths, }) {
38
+ if (gitCommandIsAvailable()) {
39
+ try {
40
+ const output = (0, child_process_1.execFileSync)('git', [
41
+ '--git-dir',
42
+ bareRepoPath,
43
+ '--work-tree',
44
+ projectDir,
45
+ 'status',
46
+ '--porcelain',
47
+ ]).toString();
48
+ return output.trim().length > 0;
49
+ }
50
+ catch (error) {
51
+ // error running git
52
+ }
53
+ }
54
+ for (const [, , workdirStatus, stageStatus] of await (0, isomorphic_git_1.statusMatrix)({
55
+ fs: fs_1.default,
56
+ dir: projectDir,
57
+ gitdir: bareRepoPath,
58
+ filepaths: relativeFilepaths,
59
+ })) {
60
+ if (workdirStatus !== stageStatus) {
61
+ return true;
62
+ }
63
+ }
64
+ return false;
65
+ }
66
+ async function getLatestCommit({ bareRepoPath, }) {
67
+ if (gitCommandIsAvailable()) {
68
+ try {
69
+ return (0, child_process_1.execFileSync)('git', [
70
+ '--git-dir',
71
+ bareRepoPath,
72
+ 'rev-parse',
73
+ 'HEAD',
74
+ ])
75
+ .toString()
76
+ .trim();
77
+ }
78
+ catch (error) {
79
+ // unable to get head
80
+ }
81
+ }
82
+ return await (0, isomorphic_git_1.resolveRef)({
83
+ fs: fs_1.default,
84
+ dir: bareRepoPath,
85
+ ref: 'HEAD',
86
+ });
87
+ }
29
88
  async function initializeCheckpointFileManager({ projectDir, relativeFilepaths, }) {
30
89
  const bareRepoPath = getBareRepoPath(projectDir);
31
90
  // Create the bare repo directory if it doesn't exist
@@ -46,7 +105,26 @@ async function initializeCheckpointFileManager({ projectDir, relativeFilepaths,
46
105
  relativeFilepaths,
47
106
  });
48
107
  }
49
- async function stageFilesIndividually({ projectDir, bareRepoPath, relativeFilepaths, }) {
108
+ async function stageFiles({ projectDir, bareRepoPath, relativeFilepaths, }) {
109
+ if (gitCommandIsAvailable()) {
110
+ try {
111
+ (0, child_process_1.execFileSync)('git', [
112
+ '--git-dir',
113
+ bareRepoPath,
114
+ '--work-tree',
115
+ projectDir,
116
+ '-C',
117
+ projectDir,
118
+ 'add',
119
+ '.',
120
+ ]);
121
+ return;
122
+ }
123
+ catch (error) {
124
+ // Failed to add .
125
+ }
126
+ }
127
+ // Stage files with isomorphic-git
50
128
  // Get status of all files in the project directory
51
129
  const currStatusMatrix = await (0, isomorphic_git_1.statusMatrix)({
52
130
  fs: fs_1.default,
@@ -85,32 +163,11 @@ async function stageFilesIndividually({ projectDir, bareRepoPath, relativeFilepa
85
163
  * @returns A promise that resolves to the id hash that can be used to restore this file state
86
164
  */
87
165
  async function storeFileState({ projectDir, bareRepoPath, message, relativeFilepaths: relativeFilepaths, }) {
88
- let added = false;
89
- if (gitCommandIsAvailable()) {
90
- try {
91
- (0, child_process_1.execFileSync)('git', [
92
- '--git-dir',
93
- bareRepoPath,
94
- '--work-tree',
95
- projectDir,
96
- '-C',
97
- projectDir,
98
- 'add',
99
- '.',
100
- ]);
101
- added = true;
102
- }
103
- catch (error) {
104
- // Failed to add .
105
- }
106
- }
107
- if (!added) {
108
- await stageFilesIndividually({
109
- projectDir,
110
- bareRepoPath,
111
- relativeFilepaths,
112
- });
113
- }
166
+ await stageFiles({
167
+ projectDir,
168
+ bareRepoPath,
169
+ relativeFilepaths,
170
+ });
114
171
  const commitHash = await (0, isomorphic_git_1.commit)({
115
172
  fs: fs_1.default,
116
173
  dir: projectDir,
@@ -174,4 +231,4 @@ async function restoreFileState({ projectDir, bareRepoPath, commit, relativeFile
174
231
  })));
175
232
  }
176
233
  }
177
- //# sourceMappingURL=checkpoint-file-manager.js.map
234
+ //# 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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"}
package/dist/cli.d.ts CHANGED
@@ -18,7 +18,6 @@ export declare class CLI {
18
18
  private initReadlineInterface;
19
19
  private completer;
20
20
  private setPrompt;
21
- private promptWithCheckpointNumber;
22
21
  printInitialPrompt(initialInput?: string): Promise<void>;
23
22
  printDiff(): Promise<void>;
24
23
  private handleLine;