codebuff 1.0.274 → 1.0.275

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/cli-handlers/initialization-flow.d.ts +1 -0
  2. package/dist/cli-handlers/initialization-flow.js +24 -0
  3. package/dist/cli-handlers/initialization-flow.js.map +1 -0
  4. package/dist/cli-modules/command-processor.d.ts +12 -0
  5. package/dist/cli-modules/command-processor.js +129 -0
  6. package/dist/cli-modules/command-processor.js.map +1 -0
  7. package/dist/cli-modules/input-handler.d.ts +20 -0
  8. package/dist/cli-modules/input-handler.js +98 -0
  9. package/dist/cli-modules/input-handler.js.map +1 -0
  10. package/dist/cli-modules/readline-handler.d.ts +17 -0
  11. package/dist/cli-modules/readline-handler.js +134 -0
  12. package/dist/cli-modules/readline-handler.js.map +1 -0
  13. package/dist/cli-modules/signal-handler.d.ts +13 -0
  14. package/dist/cli-modules/signal-handler.js +69 -0
  15. package/dist/cli-modules/signal-handler.js.map +1 -0
  16. package/dist/cli-modules/types.d.ts +51 -0
  17. package/dist/cli-modules/types.js +3 -0
  18. package/dist/cli-modules/types.js.map +1 -0
  19. package/dist/cli-modules/websocket-handler.d.ts +16 -0
  20. package/dist/cli-modules/websocket-handler.js +53 -0
  21. package/dist/cli-modules/websocket-handler.js.map +1 -0
  22. package/dist/code-map/__mocks__/tree-sitter-typescript.d.ts +12 -0
  23. package/dist/code-map/__mocks__/tree-sitter-typescript.d.ts.map +1 -0
  24. package/dist/code-map/__mocks__/tree-sitter-typescript.js +14 -0
  25. package/dist/code-map/__mocks__/tree-sitter-typescript.js.map +1 -0
  26. package/dist/code-map/__mocks__/wasm-mock.d.ts +2 -0
  27. package/dist/code-map/__mocks__/wasm-mock.d.ts.map +1 -0
  28. package/dist/code-map/__mocks__/wasm-mock.js +3 -0
  29. package/dist/code-map/__mocks__/wasm-mock.js.map +1 -0
  30. package/dist/code-map/__tests__/parse.test.d.ts +2 -0
  31. package/dist/code-map/__tests__/parse.test.d.ts.map +1 -0
  32. package/dist/code-map/__tests__/parse.test.js +231 -0
  33. package/dist/code-map/__tests__/parse.test.js.map +1 -0
  34. package/dist/code-map/__tests__/test-langs/consumer.d.ts +2 -0
  35. package/dist/code-map/__tests__/test-langs/consumer.d.ts.map +1 -0
  36. package/dist/code-map/__tests__/test-langs/consumer.js +6 -0
  37. package/dist/code-map/__tests__/test-langs/consumer.js.map +1 -0
  38. package/dist/code-map/__tests__/test-langs/empty.d.ts +1 -0
  39. package/dist/code-map/__tests__/test-langs/empty.d.ts.map +1 -0
  40. package/dist/code-map/__tests__/test-langs/empty.js +2 -0
  41. package/dist/code-map/__tests__/test-langs/empty.js.map +1 -0
  42. package/dist/code-map/__tests__/test-langs/test.d.ts +12 -0
  43. package/dist/code-map/__tests__/test-langs/test.d.ts.map +1 -0
  44. package/dist/code-map/__tests__/test-langs/test.js +23 -0
  45. package/dist/code-map/__tests__/test-langs/test.js.map +1 -0
  46. package/dist/code-map/__tests__/test-langs/unused.d.ts +2 -0
  47. package/dist/code-map/__tests__/test-langs/unused.d.ts.map +1 -0
  48. package/dist/code-map/__tests__/test-langs/unused.js +7 -0
  49. package/dist/code-map/__tests__/test-langs/unused.js.map +1 -0
  50. package/dist/code-map/__tests__/test-langs/utils1.d.ts +2 -0
  51. package/dist/code-map/__tests__/test-langs/utils1.d.ts.map +1 -0
  52. package/dist/code-map/__tests__/test-langs/utils1.js +7 -0
  53. package/dist/code-map/__tests__/test-langs/utils1.js.map +1 -0
  54. package/dist/code-map/__tests__/test-langs/utils2.d.ts +2 -0
  55. package/dist/code-map/__tests__/test-langs/utils2.d.ts.map +1 -0
  56. package/dist/code-map/__tests__/test-langs/utils2.js +8 -0
  57. package/dist/code-map/__tests__/test-langs/utils2.js.map +1 -0
  58. package/dist/code-map/__tests__/tree-sitter-minimal.test.d.ts +2 -0
  59. package/dist/code-map/__tests__/tree-sitter-minimal.test.d.ts.map +1 -0
  60. package/dist/code-map/__tests__/tree-sitter-minimal.test.js +79 -0
  61. package/dist/code-map/__tests__/tree-sitter-minimal.test.js.map +1 -0
  62. package/dist/code-map/jest.config.d.ts +4 -0
  63. package/dist/code-map/jest.config.d.ts.map +1 -0
  64. package/dist/code-map/jest.config.js +18 -0
  65. package/dist/code-map/jest.config.js.map +1 -0
  66. package/dist/code-map/parse.test.d.ts +2 -0
  67. package/dist/code-map/parse.test.d.ts.map +1 -0
  68. package/dist/code-map/parse.test.js +218 -0
  69. package/dist/code-map/parse.test.js.map +1 -0
  70. package/dist/code-map/scripts/tree-sitter-test.cjs +27 -0
  71. package/dist/code-map/scripts/tree-sitter-test.cjs.map +1 -0
  72. package/dist/code-map/scripts/tree-sitter-test.d.cts +2 -0
  73. package/dist/code-map/scripts/tree-sitter-test.d.cts.map +1 -0
  74. package/dist/code-map/scripts/tree-sitter-test.d.ts +2 -0
  75. package/dist/code-map/scripts/tree-sitter-test.d.ts.map +1 -0
  76. package/dist/code-map/scripts/tree-sitter-test.js +54 -0
  77. package/dist/code-map/scripts/tree-sitter-test.js.map +1 -0
  78. package/dist/code-map/test-parser.d.ts +2 -0
  79. package/dist/code-map/test-parser.d.ts.map +1 -0
  80. package/dist/code-map/test-parser.js +42 -0
  81. package/dist/code-map/test-parser.js.map +1 -0
  82. package/dist/code-map/tsconfig.tsbuildinfo +1 -1
  83. package/dist/common/actions.d.ts +28 -28
  84. package/dist/common/bigquery/client.d.ts +15 -0
  85. package/dist/common/bigquery/client.js +265 -0
  86. package/dist/common/bigquery/client.js.map +1 -0
  87. package/dist/common/bigquery/schema.d.ts +55 -0
  88. package/dist/common/bigquery/schema.js +24 -0
  89. package/dist/common/bigquery/schema.js.map +1 -0
  90. package/dist/common/constants/tools.d.ts +1 -0
  91. package/dist/common/constants/tools.js +1 -0
  92. package/dist/common/constants/tools.js.map +1 -1
  93. package/dist/common/util/file-metadata.d.ts +9 -0
  94. package/dist/common/util/file-metadata.js +24 -0
  95. package/dist/common/util/file-metadata.js.map +1 -0
  96. package/dist/common/util/promise.js +1 -1
  97. package/dist/common/util/promise.js.map +1 -1
  98. package/dist/common/websockets/websocket-schema.d.ts +48 -48
  99. package/dist/index.js +2 -8
  100. package/dist/tool-handlers.js +3 -0
  101. package/dist/tool-handlers.js.map +1 -1
  102. package/dist/utils/tool-renderers.js +3 -0
  103. package/dist/utils/tool-renderers.js.map +1 -1
  104. package/package.json +1 -1
  105. package/dist/common/__tests__/project-file-tree.test.d.ts +0 -1
  106. package/dist/common/__tests__/project-file-tree.test.js +0 -251
  107. package/dist/common/__tests__/project-file-tree.test.js.map +0 -1
  108. package/dist/common/json-config/__tests__/__snapshots__/stringify-schema.test.js.snap +0 -119
  109. package/dist/common/util/process-stream.d.ts +0 -7
  110. package/dist/common/util/process-stream.js +0 -162
  111. package/dist/common/util/process-stream.js.map +0 -1
  112. package/dist/utils/__tests__/__snapshots__/background-process-manager.test.js.snap +0 -137
  113. package/dist/utils/__tests__/file-paths.test.d.ts +0 -1
  114. package/dist/utils/__tests__/file-paths.test.js +0 -37
  115. package/dist/utils/__tests__/file-paths.test.js.map +0 -1
  116. package/dist/utils/__tests__/path.test.d.ts +0 -1
  117. package/dist/utils/__tests__/path.test.js +0 -37
  118. package/dist/utils/__tests__/path.test.js.map +0 -1
  119. package/dist/utils/file-paths.d.ts +0 -9
  120. package/dist/utils/file-paths.js +0 -24
  121. package/dist/utils/file-paths.js.map +0 -1
  122. package/dist/utils/path.d.ts +0 -9
  123. package/dist/utils/path.js +0 -27
  124. package/dist/utils/path.js.map +0 -1
@@ -0,0 +1 @@
1
+ export declare function handleInitializationFlowLocally(): void;
@@ -0,0 +1,24 @@
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.handleInitializationFlowLocally = handleInitializationFlowLocally;
7
+ const fs_1 = require("fs");
8
+ const path_1 = __importDefault(require("path"));
9
+ const constants_1 = require("../common/json-config/constants");
10
+ const project_files_1 = require("../project-files");
11
+ function handleInitializationFlowLocally() {
12
+ const projectRoot = (0, project_files_1.getProjectRoot)();
13
+ // Knowledge file will be created in the backend
14
+ const configPath = path_1.default.join(projectRoot, constants_1.codebuffConfigFile);
15
+ if (!(0, fs_1.existsSync)(configPath)) {
16
+ // Create the config file
17
+ const configContent = {
18
+ description: 'Template configuration for this project. See https://www.codebuff.com/config for all options.',
19
+ startupProcesses: [],
20
+ };
21
+ (0, fs_1.writeFileSync)(configPath, JSON.stringify(configContent, null, 2));
22
+ }
23
+ }
24
+ //# sourceMappingURL=initialization-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialization-flow.js","sourceRoot":"","sources":["../../src/cli-handlers/initialization-flow.ts"],"names":[],"mappings":";;;;;AAOA,0EAeC;AAtBD,2BAA8C;AAC9C,gDAAuB;AAEvB,4DAAiE;AAEjE,oDAAiD;AAEjD,SAAgB,+BAA+B;IAC7C,MAAM,WAAW,GAAG,IAAA,8BAAc,GAAE,CAAA;IAEpC,gDAAgD;IAEhD,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,8BAAkB,CAAC,CAAA;IAC7D,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,yBAAyB;QACzB,MAAM,aAAa,GAAG;YACpB,WAAW,EACT,+FAA+F;YACjG,gBAAgB,EAAE,EAAE;SACrB,CAAA;QACD,IAAA,kBAAa,EAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACnE,CAAC;AACH,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { CommandProcessorOptions, Handler } from './types';
2
+ export declare class CommandProcessor implements Handler {
3
+ private client;
4
+ private rl;
5
+ private freshPrompt;
6
+ private readyPromise;
7
+ private costMode;
8
+ private git;
9
+ constructor(options: CommandProcessorOptions);
10
+ processCommand(userInput: string): Promise<boolean>;
11
+ cleanup(): Promise<void>;
12
+ }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommandProcessor = void 0;
4
+ const analytics_events_1 = require("../common/constants/analytics-events");
5
+ const analytics_1 = require("../utils/analytics");
6
+ const menu_1 = require("../menu");
7
+ const diff_1 = require("../cli-handlers/diff");
8
+ const easter_egg_1 = require("../cli-handlers/easter-egg");
9
+ const inititalization_flow_1 = require("../cli-handlers/inititalization-flow");
10
+ const api_key_1 = require("../cli-handlers/api-key");
11
+ const checkpoint_1 = require("../cli-handlers/checkpoint");
12
+ class CommandProcessor {
13
+ client;
14
+ rl;
15
+ freshPrompt;
16
+ readyPromise;
17
+ costMode;
18
+ git;
19
+ constructor(options) {
20
+ this.client = options.client;
21
+ this.rl = options.rl;
22
+ this.freshPrompt = options.freshPrompt;
23
+ this.readyPromise = options.readyPromise;
24
+ this.costMode = options.costMode;
25
+ this.git = options.git;
26
+ }
27
+ async processCommand(userInput) {
28
+ if (userInput === 'help' || userInput === 'h' || userInput === '/help') {
29
+ (0, menu_1.displayMenu)();
30
+ this.freshPrompt();
31
+ return true;
32
+ }
33
+ if (userInput === 'login' || userInput === 'signin') {
34
+ await this.client.login();
35
+ return true;
36
+ }
37
+ if (userInput === 'logout' || userInput === 'signout') {
38
+ await this.client.logout();
39
+ this.freshPrompt();
40
+ return true;
41
+ }
42
+ if (userInput.startsWith('ref-')) {
43
+ await this.client.handleReferralCode(userInput.trim());
44
+ return true;
45
+ }
46
+ // Detect potential API key input first
47
+ const detectionResult = (0, api_key_1.detectApiKey)(userInput);
48
+ if (detectionResult.status !== 'not_found') {
49
+ // If something resembling an API key was detected (valid or just prefix), handle it
50
+ await (0, api_key_1.handleApiKeyInput)(this.client, detectionResult, this.readyPromise, this.freshPrompt);
51
+ return true;
52
+ }
53
+ if (userInput === 'usage' || userInput === 'credits') {
54
+ await this.client.getUsage();
55
+ return true;
56
+ }
57
+ if (userInput === 'quit' || userInput === 'exit' || userInput === 'q') {
58
+ process.emit('SIGTSTP');
59
+ return true;
60
+ }
61
+ if (['diff', 'doff', 'dif', 'iff', 'd'].includes(userInput)) {
62
+ (0, diff_1.handleDiff)(this.client.lastChanges);
63
+ this.freshPrompt();
64
+ return true;
65
+ }
66
+ if (userInput === 'uuddlrlrba' ||
67
+ userInput === 'konami' ||
68
+ userInput === 'codebuffy') {
69
+ (0, easter_egg_1.showEasterEgg)(this.freshPrompt);
70
+ return true;
71
+ }
72
+ // Checkpoint commands
73
+ if ((0, checkpoint_1.isCheckpointCommand)(userInput)) {
74
+ (0, analytics_1.trackEvent)(analytics_events_1.AnalyticsEvent.CHECKPOINT_COMMAND_USED, {
75
+ command: userInput,
76
+ });
77
+ if ((0, checkpoint_1.isCheckpointCommand)(userInput, 'undo')) {
78
+ await (0, checkpoint_1.saveCheckpoint)(userInput, this.client, this.readyPromise);
79
+ const toRestore = await (0, checkpoint_1.handleUndo)(this.client, this.rl);
80
+ this.freshPrompt(toRestore);
81
+ return true;
82
+ }
83
+ if ((0, checkpoint_1.isCheckpointCommand)(userInput, 'redo')) {
84
+ await (0, checkpoint_1.saveCheckpoint)(userInput, this.client, this.readyPromise);
85
+ const toRestore = await (0, checkpoint_1.handleRedo)(this.client, this.rl);
86
+ this.freshPrompt(toRestore);
87
+ return true;
88
+ }
89
+ if ((0, checkpoint_1.isCheckpointCommand)(userInput, 'list')) {
90
+ await (0, checkpoint_1.saveCheckpoint)(userInput, this.client, this.readyPromise);
91
+ await (0, checkpoint_1.listCheckpoints)();
92
+ this.freshPrompt();
93
+ return true;
94
+ }
95
+ const restoreMatch = (0, checkpoint_1.isCheckpointCommand)(userInput, 'restore');
96
+ if (restoreMatch) {
97
+ const id = parseInt(restoreMatch[1], 10);
98
+ await (0, checkpoint_1.saveCheckpoint)(userInput, this.client, this.readyPromise);
99
+ const toRestore = await (0, checkpoint_1.handleRestoreCheckpoint)(id, this.client, this.rl);
100
+ this.freshPrompt(toRestore);
101
+ return true;
102
+ }
103
+ if ((0, checkpoint_1.isCheckpointCommand)(userInput, 'clear')) {
104
+ (0, checkpoint_1.handleClearCheckpoints)();
105
+ this.freshPrompt();
106
+ return true;
107
+ }
108
+ if ((0, checkpoint_1.isCheckpointCommand)(userInput, 'save')) {
109
+ await (0, checkpoint_1.saveCheckpoint)(userInput, this.client, this.readyPromise, true);
110
+ (0, checkpoint_1.displayCheckpointMenu)();
111
+ this.freshPrompt();
112
+ return true;
113
+ }
114
+ (0, checkpoint_1.displayCheckpointMenu)();
115
+ this.freshPrompt();
116
+ return true;
117
+ }
118
+ if (userInput === 'init') {
119
+ (0, inititalization_flow_1.handleInitializationFlowLocally)();
120
+ return false;
121
+ }
122
+ return false;
123
+ }
124
+ async cleanup() {
125
+ // Nothing to clean up for now
126
+ }
127
+ }
128
+ exports.CommandProcessor = CommandProcessor;
129
+ //# sourceMappingURL=command-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-processor.js","sourceRoot":"","sources":["../../src/cli-modules/command-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { InputHandlerOptions, Handler } from './types';
2
+ export declare class InputHandler implements Handler {
3
+ private client;
4
+ private rl;
5
+ private freshPrompt;
6
+ private lastInputTime;
7
+ private consecutiveFastInputs;
8
+ private isPasting;
9
+ private pastedContent;
10
+ private isReceivingResponse;
11
+ constructor(options: InputHandlerOptions);
12
+ handleLine(line: string): void;
13
+ private handleUserInput;
14
+ private forwardUserInput;
15
+ handleKeyPress(str: string, key: any): void;
16
+ private handleEscKey;
17
+ private detectPasting;
18
+ setIsReceivingResponse(value: boolean): void;
19
+ cleanup(): Promise<void>;
20
+ }
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InputHandler = void 0;
4
+ const display_1 = require("../display");
5
+ class InputHandler {
6
+ client;
7
+ rl;
8
+ freshPrompt;
9
+ lastInputTime = 0;
10
+ consecutiveFastInputs = 0;
11
+ isPasting = false;
12
+ pastedContent = '';
13
+ isReceivingResponse;
14
+ constructor(options) {
15
+ this.client = options.client;
16
+ this.rl = options.rl;
17
+ this.freshPrompt = options.freshPrompt;
18
+ this.isReceivingResponse = options.isReceivingResponse;
19
+ }
20
+ handleLine(line) {
21
+ this.detectPasting();
22
+ if (this.isPasting) {
23
+ this.pastedContent += line + '\n';
24
+ }
25
+ else if (!this.isReceivingResponse) {
26
+ const input = (this.pastedContent + line).trim();
27
+ this.pastedContent = '';
28
+ this.handleUserInput(input);
29
+ }
30
+ }
31
+ async handleUserInput(userInput) {
32
+ (0, display_1.enableSquashNewlines)();
33
+ this.rl.setPrompt('');
34
+ if (!userInput) {
35
+ this.freshPrompt();
36
+ return;
37
+ }
38
+ userInput = userInput.trim();
39
+ await this.forwardUserInput(userInput);
40
+ }
41
+ async forwardUserInput(userInput) {
42
+ // This will be implemented as part of the command processor
43
+ // For now, just forward to the client
44
+ await this.client.sendUserInput(userInput);
45
+ this.freshPrompt();
46
+ }
47
+ handleKeyPress(str, key) {
48
+ if (key.name === 'escape') {
49
+ this.handleEscKey();
50
+ }
51
+ if (!this.isPasting &&
52
+ str === ' ' &&
53
+ '_refreshLine' in this.rl &&
54
+ 'line' in this.rl &&
55
+ 'cursor' in this.rl) {
56
+ const rlAny = this.rl;
57
+ const { cursor, line } = rlAny;
58
+ const prevTwoChars = cursor > 1 ? line.slice(cursor - 2, cursor) : '';
59
+ if (prevTwoChars === ' ') {
60
+ rlAny.line = line.slice(0, cursor - 2) + '\n\n' + line.slice(cursor);
61
+ rlAny._refreshLine();
62
+ }
63
+ }
64
+ this.detectPasting();
65
+ }
66
+ handleEscKey() {
67
+ if (this.isReceivingResponse) {
68
+ // This will be handled by the WebSocket handler
69
+ // For now, just stop the response
70
+ this.isReceivingResponse = false;
71
+ }
72
+ }
73
+ detectPasting() {
74
+ const currentTime = Date.now();
75
+ const timeDiff = currentTime - this.lastInputTime;
76
+ if (timeDiff < 10) {
77
+ this.consecutiveFastInputs++;
78
+ if (this.consecutiveFastInputs >= 2) {
79
+ this.isPasting = true;
80
+ }
81
+ }
82
+ else {
83
+ this.consecutiveFastInputs = 0;
84
+ if (this.isPasting) {
85
+ this.isPasting = false;
86
+ }
87
+ }
88
+ this.lastInputTime = currentTime;
89
+ }
90
+ setIsReceivingResponse(value) {
91
+ this.isReceivingResponse = value;
92
+ }
93
+ async cleanup() {
94
+ // Nothing to clean up for now
95
+ }
96
+ }
97
+ exports.InputHandler = InputHandler;
98
+ //# sourceMappingURL=input-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-handler.js","sourceRoot":"","sources":["../../src/cli-modules/input-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import * as readline from 'readline';
2
+ import { ReadlineHandlerOptions, Handler } from './types';
3
+ export declare class ReadlineHandler implements Handler {
4
+ private rl;
5
+ private client;
6
+ private historyPath;
7
+ private freshPromptCallback;
8
+ constructor(options: ReadlineHandlerOptions);
9
+ private initInterface;
10
+ private loadHistory;
11
+ appendToHistory(line: string): void;
12
+ private filePathCompleter;
13
+ setPrompt(): void;
14
+ freshPrompt(userInput?: string): void;
15
+ getReadlineInterface(): readline.Interface;
16
+ cleanup(): Promise<void>;
17
+ }
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.ReadlineHandler = void 0;
27
+ const readline = __importStar(require("readline"));
28
+ const fs = __importStar(require("fs"));
29
+ const os = __importStar(require("os"));
30
+ const path_1 = __importStar(require("path"));
31
+ const os_1 = require("os");
32
+ const picocolors_1 = require("picocolors");
33
+ const lodash_1 = require("lodash");
34
+ const project_files_1 = require("../project-files");
35
+ class ReadlineHandler {
36
+ rl;
37
+ client;
38
+ historyPath;
39
+ freshPromptCallback;
40
+ constructor(options) {
41
+ this.client = options.client;
42
+ this.historyPath = options.historyPath;
43
+ this.freshPromptCallback = options.freshPrompt;
44
+ this.rl = this.initInterface();
45
+ this.loadHistory();
46
+ }
47
+ initInterface() {
48
+ const rl = readline.createInterface({
49
+ input: process.stdin,
50
+ output: process.stdout,
51
+ historySize: 1000,
52
+ terminal: true,
53
+ completer: this.filePathCompleter.bind(this),
54
+ });
55
+ return rl;
56
+ }
57
+ loadHistory() {
58
+ try {
59
+ if (fs.existsSync(this.historyPath)) {
60
+ const content = fs.readFileSync(this.historyPath, 'utf8');
61
+ const history = JSON.parse(content);
62
+ // Filter out empty lines and duplicates
63
+ const cleanHistory = (0, lodash_1.uniq)(history.filter((line) => line.trim())).reverse();
64
+ this.rl.history.push(...cleanHistory);
65
+ }
66
+ }
67
+ catch (error) {
68
+ console.error('Error loading prompt history:', error);
69
+ // If file doesn't exist or is invalid JSON, create empty history file
70
+ fs.writeFileSync(this.historyPath, '[]');
71
+ }
72
+ }
73
+ appendToHistory(line) {
74
+ try {
75
+ let history = [];
76
+ if (fs.existsSync(this.historyPath)) {
77
+ const content = fs.readFileSync(this.historyPath, 'utf8');
78
+ history = JSON.parse(content);
79
+ }
80
+ // Only add non-empty, non-duplicate lines
81
+ if (line.trim() && !history.includes(line)) {
82
+ history.push(line);
83
+ fs.writeFileSync(this.historyPath, JSON.stringify(history, null, 2));
84
+ }
85
+ }
86
+ catch (error) {
87
+ console.error('Error appending to prompt history:', error);
88
+ }
89
+ }
90
+ filePathCompleter(line) {
91
+ const lastWord = line.split(' ').pop() || '';
92
+ const input = lastWord.startsWith('~')
93
+ ? (0, os_1.homedir)() + lastWord.slice(1)
94
+ : lastWord;
95
+ const directorySuffix = process.platform === 'win32' ? '\\' : '/';
96
+ const dir = input.endsWith(directorySuffix)
97
+ ? input.slice(0, input.length - 1)
98
+ : (0, path_1.dirname)(input);
99
+ const partial = input.endsWith(directorySuffix) ? '' : path_1.default.basename(input);
100
+ let baseDir = path_1.default.isAbsolute(dir) ? dir : path_1.default.join((0, project_files_1.getWorkingDirectory)(), dir);
101
+ try {
102
+ const files = fs.readdirSync(baseDir);
103
+ const matches = files
104
+ .filter((file) => file.startsWith(partial))
105
+ .map((file) => file + ((0, project_files_1.isDir)(path_1.default.join(baseDir, file)) ? directorySuffix : ''));
106
+ return [matches, partial];
107
+ }
108
+ catch {
109
+ return [[], line];
110
+ }
111
+ }
112
+ setPrompt() {
113
+ const projectRoot = (0, project_files_1.getProjectRoot)();
114
+ const cwd = (0, project_files_1.getWorkingDirectory)();
115
+ const projectDirName = (0, path_1.parse)(projectRoot).base;
116
+ const ps1Dir = projectDirName +
117
+ (cwd === projectRoot
118
+ ? ''
119
+ : (os.platform() === 'win32' ? '\\' : '/') +
120
+ path_1.default.relative(projectRoot, cwd));
121
+ this.rl.setPrompt((0, picocolors_1.green)(`${ps1Dir} > `));
122
+ }
123
+ freshPrompt(userInput = '') {
124
+ this.freshPromptCallback(userInput);
125
+ }
126
+ getReadlineInterface() {
127
+ return this.rl;
128
+ }
129
+ async cleanup() {
130
+ this.rl.close();
131
+ }
132
+ }
133
+ exports.ReadlineHandler = ReadlineHandler;
134
+ //# sourceMappingURL=readline-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readline-handler.js","sourceRoot":"","sources":["../../src/cli-modules/readline-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { SignalHandlerOptions, Handler } from './types';
2
+ export declare class SignalHandler implements Handler {
3
+ private client;
4
+ private rl;
5
+ private freshPrompt;
6
+ private onExit;
7
+ private lastSigintTime;
8
+ constructor(options: SignalHandlerOptions);
9
+ private setupHandlers;
10
+ handleSigint(): Promise<void>;
11
+ handleExit(): Promise<void>;
12
+ cleanup(): Promise<void>;
13
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SignalHandler = void 0;
4
+ const picocolors_1 = require("picocolors");
5
+ const analytics_1 = require("../utils/analytics");
6
+ const spinner_1 = require("../utils/spinner");
7
+ const terminal_1 = require("../utils/terminal");
8
+ const background_process_manager_1 = require("../background-process-manager");
9
+ class SignalHandler {
10
+ client;
11
+ rl;
12
+ freshPrompt;
13
+ onExit;
14
+ lastSigintTime = 0;
15
+ constructor(options) {
16
+ this.client = options.client;
17
+ this.rl = options.rl;
18
+ this.freshPrompt = options.freshPrompt;
19
+ this.onExit = options.onExit;
20
+ this.setupHandlers();
21
+ }
22
+ setupHandlers() {
23
+ process.on('exit', () => {
24
+ spinner_1.Spinner.get().restoreCursor();
25
+ // Kill the persistent PTY process first
26
+ (0, terminal_1.killAndResetPersistentProcess)();
27
+ (0, background_process_manager_1.sendKillSignalToAllBackgroundProcesses)();
28
+ console.log((0, picocolors_1.green)('Codebuff out!'));
29
+ });
30
+ for (const signal of ['SIGTERM', 'SIGHUP']) {
31
+ process.on(signal, async () => {
32
+ process.removeAllListeners('unhandledRejection');
33
+ process.removeAllListeners('uncaughtException');
34
+ spinner_1.Spinner.get().restoreCursor();
35
+ await (0, background_process_manager_1.killAllBackgroundProcesses)();
36
+ await (0, analytics_1.flushAnalytics)();
37
+ process.exit(0);
38
+ });
39
+ }
40
+ process.on('SIGTSTP', async () => await this.handleExit());
41
+ }
42
+ async handleSigint() {
43
+ if ('line' in this.rl) {
44
+ ;
45
+ this.rl.line = '';
46
+ }
47
+ const now = Date.now();
48
+ if (now - this.lastSigintTime < 5000) {
49
+ await this.handleExit();
50
+ }
51
+ else {
52
+ this.lastSigintTime = now;
53
+ console.log('\nPress Ctrl-C again to exit');
54
+ this.freshPrompt();
55
+ }
56
+ }
57
+ async handleExit() {
58
+ await this.onExit();
59
+ }
60
+ async cleanup() {
61
+ // Remove all signal handlers
62
+ process.removeAllListeners('exit');
63
+ process.removeAllListeners('SIGTERM');
64
+ process.removeAllListeners('SIGHUP');
65
+ process.removeAllListeners('SIGTSTP');
66
+ }
67
+ }
68
+ exports.SignalHandler = SignalHandler;
69
+ //# sourceMappingURL=signal-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-handler.js","sourceRoot":"","sources":["../../src/cli-modules/signal-handler.ts"],"names":[],"mappings":";;;AAAA,2CAAkC;AAClC,kDAAmD;AACnD,8CAA0C;AAC1C,gDAAiE;AACjE,8EAAkH;AAGlH,MAAa,aAAa;IAChB,MAAM,CAAgC;IACtC,EAAE,CAA4B;IAC9B,WAAW,CAAqC;IAChD,MAAM,CAAgC;IACtC,cAAc,GAAW,CAAC,CAAA;IAElC,YAAY,OAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC5B,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAA;QACpB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC5B,IAAI,CAAC,aAAa,EAAE,CAAA;IACtB,CAAC;IAEO,aAAa;QACnB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACtB,iBAAO,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAA;YAC7B,wCAAwC;YACxC,IAAA,wCAA6B,GAAE,CAAA;YAC/B,IAAA,mEAAsC,GAAE,CAAA;YACxC,OAAO,CAAC,GAAG,CAAC,IAAA,kBAAK,EAAC,eAAe,CAAC,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;QAEF,KAAK,MAAM,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;gBAC5B,OAAO,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,CAAA;gBAChD,OAAO,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAA;gBAC/C,iBAAO,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAA;gBAC7B,MAAM,IAAA,uDAA0B,GAAE,CAAA;gBAClC,MAAM,IAAA,0BAAc,GAAE,CAAA;gBACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IAC5D,CAAC;IAEM,KAAK,CAAC,YAAY;QACvB,IAAI,MAAM,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACtB,CAAC;YAAC,IAAI,CAAC,EAAU,CAAC,IAAI,GAAG,EAAE,CAAA;QAC7B,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,GAAG,GAAG,CAAA;YACzB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;YAC3C,IAAI,CAAC,WAAW,EAAE,CAAA;QACpB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,UAAU;QACrB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;IACrB,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,6BAA6B;QAC7B,OAAO,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAClC,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;QACrC,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QACpC,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC;CACF;AAhED,sCAgEC"}
@@ -0,0 +1,51 @@
1
+ import { Interface as ReadlineInterface } from 'readline';
2
+ import { Client } from '../client';
3
+ import { CostMode } from '../common/constants';
4
+ import { GitCommand } from '../types';
5
+ /**
6
+ * Base options interface that contains properties shared across multiple handlers
7
+ */
8
+ export interface BaseHandlerOptions {
9
+ client: Client;
10
+ rl: ReadlineInterface;
11
+ freshPrompt: (userInput?: string) => void;
12
+ }
13
+ /**
14
+ * Options for ReadlineHandler initialization
15
+ */
16
+ export interface ReadlineHandlerOptions extends BaseHandlerOptions {
17
+ historyPath: string;
18
+ }
19
+ /**
20
+ * Options for InputHandler initialization
21
+ */
22
+ export interface InputHandlerOptions extends BaseHandlerOptions {
23
+ isReceivingResponse: boolean;
24
+ }
25
+ /**
26
+ * Options for CommandProcessor initialization
27
+ */
28
+ export interface CommandProcessorOptions extends BaseHandlerOptions {
29
+ readyPromise: Promise<any>;
30
+ costMode: CostMode;
31
+ git: GitCommand;
32
+ }
33
+ /**
34
+ * Options for SignalHandler initialization
35
+ */
36
+ export interface SignalHandlerOptions extends BaseHandlerOptions {
37
+ onExit: () => Promise<void>;
38
+ }
39
+ /**
40
+ * Options for WebSocketHandler initialization
41
+ */
42
+ export interface WebSocketHandlerOptions extends BaseHandlerOptions {
43
+ isReceivingResponse: boolean;
44
+ shouldReconnectWhenIdle: boolean;
45
+ }
46
+ /**
47
+ * Common interface for all handlers
48
+ */
49
+ export interface Handler {
50
+ cleanup?: () => Promise<void>;
51
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli-modules/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { WebSocketHandlerOptions, Handler } from './types';
2
+ export declare class WebSocketHandler implements Handler {
3
+ private client;
4
+ private freshPrompt;
5
+ private isReceivingResponse;
6
+ private shouldReconnectWhenIdle;
7
+ private stopResponse;
8
+ constructor(options: WebSocketHandlerOptions);
9
+ onError(): void;
10
+ onReconnect(): void;
11
+ reconnectWhenNextIdle(): void;
12
+ setStopResponse(stopResponse: (() => void) | null): void;
13
+ setIsReceivingResponse(value: boolean): void;
14
+ setShouldReconnectWhenIdle(value: boolean): void;
15
+ cleanup(): Promise<void>;
16
+ }