codebuff 1.0.333 → 1.0.335

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 (363) hide show
  1. package/index.js +334 -0
  2. package/package.json +23 -72
  3. package/dist/__tests__/display.test.d.ts +0 -1
  4. package/dist/__tests__/display.test.js +0 -174
  5. package/dist/__tests__/display.test.js.map +0 -1
  6. package/dist/background-process-manager.d.ts +0 -50
  7. package/dist/background-process-manager.js +0 -364
  8. package/dist/background-process-manager.js.map +0 -1
  9. package/dist/browser-runner.d.ts +0 -35
  10. package/dist/browser-runner.js +0 -689
  11. package/dist/browser-runner.js.map +0 -1
  12. package/dist/chat-storage.d.ts +0 -2
  13. package/dist/chat-storage.js +0 -98
  14. package/dist/chat-storage.js.map +0 -1
  15. package/dist/checkpoints/checkpoint-manager.d.ts +0 -94
  16. package/dist/checkpoints/checkpoint-manager.js +0 -291
  17. package/dist/checkpoints/checkpoint-manager.js.map +0 -1
  18. package/dist/checkpoints/file-manager.d.ts +0 -72
  19. package/dist/checkpoints/file-manager.js +0 -495
  20. package/dist/checkpoints/file-manager.js.map +0 -1
  21. package/dist/cli-definitions.d.ts +0 -9
  22. package/dist/cli-definitions.js +0 -60
  23. package/dist/cli-definitions.js.map +0 -1
  24. package/dist/cli-handlers/api-key.d.ts +0 -25
  25. package/dist/cli-handlers/api-key.js +0 -66
  26. package/dist/cli-handlers/api-key.js.map +0 -1
  27. package/dist/cli-handlers/checkpoint.d.ts +0 -19
  28. package/dist/cli-handlers/checkpoint.js +0 -221
  29. package/dist/cli-handlers/checkpoint.js.map +0 -1
  30. package/dist/cli-handlers/diff.d.ts +0 -2
  31. package/dist/cli-handlers/diff.js +0 -31
  32. package/dist/cli-handlers/diff.js.map +0 -1
  33. package/dist/cli-handlers/easter-egg.d.ts +0 -1
  34. package/dist/cli-handlers/easter-egg.js +0 -126
  35. package/dist/cli-handlers/easter-egg.js.map +0 -1
  36. package/dist/cli-handlers/inititalization-flow.d.ts +0 -1
  37. package/dist/cli-handlers/inititalization-flow.js +0 -25
  38. package/dist/cli-handlers/inititalization-flow.js.map +0 -1
  39. package/dist/cli.d.ts +0 -67
  40. package/dist/cli.js +0 -777
  41. package/dist/cli.js.map +0 -1
  42. package/dist/client.d.ts +0 -91
  43. package/dist/client.js +0 -1112
  44. package/dist/client.js.map +0 -1
  45. package/dist/code-map/languages.d.ts +0 -12
  46. package/dist/code-map/languages.d.ts.map +0 -1
  47. package/dist/code-map/languages.js +0 -130
  48. package/dist/code-map/languages.js.map +0 -1
  49. package/dist/code-map/parse.d.ts +0 -22
  50. package/dist/code-map/parse.d.ts.map +0 -1
  51. package/dist/code-map/parse.js +0 -180
  52. package/dist/code-map/parse.js.map +0 -1
  53. package/dist/code-map/tree-sitter-queries/readme.md +0 -23
  54. package/dist/code-map/tree-sitter-queries/tree-sitter-c-tags.scm +0 -16
  55. package/dist/code-map/tree-sitter-queries/tree-sitter-c_sharp-tags.scm +0 -23
  56. package/dist/code-map/tree-sitter-queries/tree-sitter-cpp-tags.scm +0 -29
  57. package/dist/code-map/tree-sitter-queries/tree-sitter-go-tags.scm +0 -26
  58. package/dist/code-map/tree-sitter-queries/tree-sitter-java-tags.scm +0 -19
  59. package/dist/code-map/tree-sitter-queries/tree-sitter-javascript-tags.scm +0 -16
  60. package/dist/code-map/tree-sitter-queries/tree-sitter-php-tags.scm +0 -23
  61. package/dist/code-map/tree-sitter-queries/tree-sitter-python-tags.scm +0 -12
  62. package/dist/code-map/tree-sitter-queries/tree-sitter-ruby-tags.scm +0 -58
  63. package/dist/code-map/tree-sitter-queries/tree-sitter-rust-tags.scm +0 -26
  64. package/dist/code-map/tree-sitter-queries/tree-sitter-typescript-tags.scm +0 -22
  65. package/dist/code-map/tsconfig.tsbuildinfo +0 -1
  66. package/dist/common/actions.d.ts +0 -1809
  67. package/dist/common/actions.d.ts.map +0 -1
  68. package/dist/common/actions.js +0 -140
  69. package/dist/common/actions.js.map +0 -1
  70. package/dist/common/analytics.d.ts +0 -6
  71. package/dist/common/analytics.d.ts.map +0 -1
  72. package/dist/common/analytics.js +0 -60
  73. package/dist/common/analytics.js.map +0 -1
  74. package/dist/common/api-keys/constants.d.ts +0 -9
  75. package/dist/common/api-keys/constants.d.ts.map +0 -1
  76. package/dist/common/api-keys/constants.js +0 -26
  77. package/dist/common/api-keys/constants.js.map +0 -1
  78. package/dist/common/api-keys/crypto.d.ts +0 -25
  79. package/dist/common/api-keys/crypto.d.ts.map +0 -1
  80. package/dist/common/api-keys/crypto.js +0 -186
  81. package/dist/common/api-keys/crypto.js.map +0 -1
  82. package/dist/common/browser-actions.d.ts +0 -4416
  83. package/dist/common/browser-actions.d.ts.map +0 -1
  84. package/dist/common/browser-actions.js +0 -343
  85. package/dist/common/browser-actions.js.map +0 -1
  86. package/dist/common/constants/analytics-events.d.ts +0 -29
  87. package/dist/common/constants/analytics-events.d.ts.map +0 -1
  88. package/dist/common/constants/analytics-events.js +0 -37
  89. package/dist/common/constants/analytics-events.js.map +0 -1
  90. package/dist/common/constants/grant-priorities.d.ts +0 -3
  91. package/dist/common/constants/grant-priorities.d.ts.map +0 -1
  92. package/dist/common/constants/grant-priorities.js +0 -11
  93. package/dist/common/constants/grant-priorities.js.map +0 -1
  94. package/dist/common/constants/tools.d.ts +0 -19
  95. package/dist/common/constants/tools.d.ts.map +0 -1
  96. package/dist/common/constants/tools.js +0 -45
  97. package/dist/common/constants/tools.js.map +0 -1
  98. package/dist/common/constants.d.ts +0 -149
  99. package/dist/common/constants.d.ts.map +0 -1
  100. package/dist/common/constants.js +0 -234
  101. package/dist/common/constants.js.map +0 -1
  102. package/dist/common/db/drizzle.config.d.ts +0 -3
  103. package/dist/common/db/drizzle.config.d.ts.map +0 -1
  104. package/dist/common/db/drizzle.config.js +0 -17
  105. package/dist/common/db/drizzle.config.js.map +0 -1
  106. package/dist/common/db/index.d.ts +0 -7
  107. package/dist/common/db/index.d.ts.map +0 -1
  108. package/dist/common/db/index.js +0 -35
  109. package/dist/common/db/index.js.map +0 -1
  110. package/dist/common/db/schema.d.ts +0 -2449
  111. package/dist/common/db/schema.d.ts.map +0 -1
  112. package/dist/common/db/schema.js +0 -310
  113. package/dist/common/db/schema.js.map +0 -1
  114. package/dist/common/db/transaction.d.ts +0 -13
  115. package/dist/common/db/transaction.d.ts.map +0 -1
  116. package/dist/common/db/transaction.js +0 -36
  117. package/dist/common/db/transaction.js.map +0 -1
  118. package/dist/common/json-config/__tests__/constants.test.d.ts +0 -2
  119. package/dist/common/json-config/__tests__/constants.test.d.ts.map +0 -1
  120. package/dist/common/json-config/__tests__/constants.test.js +0 -273
  121. package/dist/common/json-config/__tests__/constants.test.js.map +0 -1
  122. package/dist/common/json-config/__tests__/stringify-schema.test.d.ts +0 -2
  123. package/dist/common/json-config/__tests__/stringify-schema.test.d.ts.map +0 -1
  124. package/dist/common/json-config/__tests__/stringify-schema.test.js +0 -66
  125. package/dist/common/json-config/__tests__/stringify-schema.test.js.map +0 -1
  126. package/dist/common/json-config/constants.d.ts +0 -138
  127. package/dist/common/json-config/constants.d.ts.map +0 -1
  128. package/dist/common/json-config/constants.js +0 -78
  129. package/dist/common/json-config/constants.js.map +0 -1
  130. package/dist/common/json-config/default.d.ts +0 -3
  131. package/dist/common/json-config/default.d.ts.map +0 -1
  132. package/dist/common/json-config/default.js +0 -12
  133. package/dist/common/json-config/default.js.map +0 -1
  134. package/dist/common/json-config/stringify-schema.d.ts +0 -10
  135. package/dist/common/json-config/stringify-schema.d.ts.map +0 -1
  136. package/dist/common/json-config/stringify-schema.js +0 -131
  137. package/dist/common/json-config/stringify-schema.js.map +0 -1
  138. package/dist/common/project-file-tree.d.ts +0 -12
  139. package/dist/common/project-file-tree.d.ts.map +0 -1
  140. package/dist/common/project-file-tree.js +0 -212
  141. package/dist/common/project-file-tree.js.map +0 -1
  142. package/dist/common/types/agent-state.d.ts +0 -265
  143. package/dist/common/types/agent-state.d.ts.map +0 -1
  144. package/dist/common/types/agent-state.js +0 -48
  145. package/dist/common/types/agent-state.js.map +0 -1
  146. package/dist/common/types/grant.d.ts +0 -3
  147. package/dist/common/types/grant.d.ts.map +0 -1
  148. package/dist/common/types/grant.js +0 -11
  149. package/dist/common/types/grant.js.map +0 -1
  150. package/dist/common/types/message.d.ts +0 -320
  151. package/dist/common/types/message.d.ts.map +0 -1
  152. package/dist/common/types/message.js +0 -60
  153. package/dist/common/types/message.js.map +0 -1
  154. package/dist/common/types/organization.d.ts +0 -106
  155. package/dist/common/types/organization.d.ts.map +0 -1
  156. package/dist/common/types/organization.js +0 -3
  157. package/dist/common/types/organization.js.map +0 -1
  158. package/dist/common/types/referral.d.ts +0 -3
  159. package/dist/common/types/referral.d.ts.map +0 -1
  160. package/dist/common/types/referral.js +0 -5
  161. package/dist/common/types/referral.js.map +0 -1
  162. package/dist/common/types/tools.d.ts +0 -6
  163. package/dist/common/types/tools.d.ts.map +0 -1
  164. package/dist/common/types/tools.js +0 -3
  165. package/dist/common/types/tools.js.map +0 -1
  166. package/dist/common/types/usage.d.ts +0 -41
  167. package/dist/common/types/usage.d.ts.map +0 -1
  168. package/dist/common/types/usage.js +0 -16
  169. package/dist/common/types/usage.js.map +0 -1
  170. package/dist/common/util/__tests__/messages.test.d.ts +0 -2
  171. package/dist/common/util/__tests__/messages.test.d.ts.map +0 -1
  172. package/dist/common/util/__tests__/messages.test.js +0 -70
  173. package/dist/common/util/__tests__/messages.test.js.map +0 -1
  174. package/dist/common/util/__tests__/saxy.test.d.ts +0 -2
  175. package/dist/common/util/__tests__/saxy.test.d.ts.map +0 -1
  176. package/dist/common/util/__tests__/saxy.test.js +0 -906
  177. package/dist/common/util/__tests__/saxy.test.js.map +0 -1
  178. package/dist/common/util/__tests__/string.test.d.ts +0 -2
  179. package/dist/common/util/__tests__/string.test.d.ts.map +0 -1
  180. package/dist/common/util/__tests__/string.test.js +0 -82
  181. package/dist/common/util/__tests__/string.test.js.map +0 -1
  182. package/dist/common/util/array.d.ts +0 -7
  183. package/dist/common/util/array.d.ts.map +0 -1
  184. package/dist/common/util/array.js +0 -32
  185. package/dist/common/util/array.js.map +0 -1
  186. package/dist/common/util/changes.d.ts +0 -9
  187. package/dist/common/util/changes.d.ts.map +0 -1
  188. package/dist/common/util/changes.js +0 -87
  189. package/dist/common/util/changes.js.map +0 -1
  190. package/dist/common/util/credentials.d.ts +0 -26
  191. package/dist/common/util/credentials.d.ts.map +0 -1
  192. package/dist/common/util/credentials.js +0 -24
  193. package/dist/common/util/credentials.js.map +0 -1
  194. package/dist/common/util/currency.d.ts +0 -15
  195. package/dist/common/util/currency.d.ts.map +0 -1
  196. package/dist/common/util/currency.js +0 -23
  197. package/dist/common/util/currency.js.map +0 -1
  198. package/dist/common/util/dates.d.ts +0 -11
  199. package/dist/common/util/dates.d.ts.map +0 -1
  200. package/dist/common/util/dates.js +0 -22
  201. package/dist/common/util/dates.js.map +0 -1
  202. package/dist/common/util/file.d.ts +0 -171
  203. package/dist/common/util/file.d.ts.map +0 -1
  204. package/dist/common/util/file.js +0 -216
  205. package/dist/common/util/file.js.map +0 -1
  206. package/dist/common/util/git.d.ts +0 -7
  207. package/dist/common/util/git.d.ts.map +0 -1
  208. package/dist/common/util/git.js +0 -81
  209. package/dist/common/util/git.js.map +0 -1
  210. package/dist/common/util/logger.d.ts +0 -9
  211. package/dist/common/util/logger.d.ts.map +0 -1
  212. package/dist/common/util/logger.js +0 -52
  213. package/dist/common/util/logger.js.map +0 -1
  214. package/dist/common/util/lru-cache.d.ts +0 -31
  215. package/dist/common/util/lru-cache.d.ts.map +0 -1
  216. package/dist/common/util/lru-cache.js +0 -68
  217. package/dist/common/util/lru-cache.js.map +0 -1
  218. package/dist/common/util/messages.d.ts +0 -12
  219. package/dist/common/util/messages.d.ts.map +0 -1
  220. package/dist/common/util/messages.js +0 -81
  221. package/dist/common/util/messages.js.map +0 -1
  222. package/dist/common/util/min-heap.d.ts +0 -16
  223. package/dist/common/util/min-heap.d.ts.map +0 -1
  224. package/dist/common/util/min-heap.js +0 -73
  225. package/dist/common/util/min-heap.js.map +0 -1
  226. package/dist/common/util/object.d.ts +0 -19
  227. package/dist/common/util/object.d.ts.map +0 -1
  228. package/dist/common/util/object.js +0 -91
  229. package/dist/common/util/object.js.map +0 -1
  230. package/dist/common/util/patch.d.ts +0 -2
  231. package/dist/common/util/patch.d.ts.map +0 -1
  232. package/dist/common/util/patch.js +0 -215
  233. package/dist/common/util/patch.js.map +0 -1
  234. package/dist/common/util/promise.d.ts +0 -17
  235. package/dist/common/util/promise.d.ts.map +0 -1
  236. package/dist/common/util/promise.js +0 -51
  237. package/dist/common/util/promise.js.map +0 -1
  238. package/dist/common/util/random.d.ts +0 -2
  239. package/dist/common/util/random.d.ts.map +0 -1
  240. package/dist/common/util/random.js +0 -17
  241. package/dist/common/util/random.js.map +0 -1
  242. package/dist/common/util/referral.d.ts +0 -2
  243. package/dist/common/util/referral.d.ts.map +0 -1
  244. package/dist/common/util/referral.js +0 -6
  245. package/dist/common/util/referral.js.map +0 -1
  246. package/dist/common/util/saxy.d.ts +0 -179
  247. package/dist/common/util/saxy.d.ts.map +0 -1
  248. package/dist/common/util/saxy.js +0 -548
  249. package/dist/common/util/saxy.js.map +0 -1
  250. package/dist/common/util/string.d.ts +0 -80
  251. package/dist/common/util/string.d.ts.map +0 -1
  252. package/dist/common/util/string.js +0 -275
  253. package/dist/common/util/string.js.map +0 -1
  254. package/dist/common/util/stripe.d.ts +0 -4
  255. package/dist/common/util/stripe.d.ts.map +0 -1
  256. package/dist/common/util/stripe.js +0 -22
  257. package/dist/common/util/stripe.js.map +0 -1
  258. package/dist/common/util/sync-failure.d.ts +0 -2
  259. package/dist/common/util/sync-failure.d.ts.map +0 -1
  260. package/dist/common/util/sync-failure.js +0 -57
  261. package/dist/common/util/sync-failure.js.map +0 -1
  262. package/dist/common/websockets/websocket-client.d.ts +0 -43
  263. package/dist/common/websockets/websocket-client.d.ts.map +0 -1
  264. package/dist/common/websockets/websocket-client.js +0 -216
  265. package/dist/common/websockets/websocket-client.js.map +0 -1
  266. package/dist/common/websockets/websocket-schema.d.ts +0 -3679
  267. package/dist/common/websockets/websocket-schema.d.ts.map +0 -1
  268. package/dist/common/websockets/websocket-schema.js +0 -55
  269. package/dist/common/websockets/websocket-schema.js.map +0 -1
  270. package/dist/config.d.ts +0 -4
  271. package/dist/config.js +0 -12
  272. package/dist/config.js.map +0 -1
  273. package/dist/create-template-project.d.ts +0 -1
  274. package/dist/create-template-project.js +0 -131
  275. package/dist/create-template-project.js.map +0 -1
  276. package/dist/credentials.d.ts +0 -4
  277. package/dist/credentials.js +0 -44
  278. package/dist/credentials.js.map +0 -1
  279. package/dist/dev-process-manager.d.ts +0 -10
  280. package/dist/dev-process-manager.js +0 -56
  281. package/dist/dev-process-manager.js.map +0 -1
  282. package/dist/display.d.ts +0 -9
  283. package/dist/display.js +0 -137
  284. package/dist/display.js.map +0 -1
  285. package/dist/fingerprint.d.ts +0 -1
  286. package/dist/fingerprint.js +0 -48
  287. package/dist/fingerprint.js.map +0 -1
  288. package/dist/index.d.ts +0 -2
  289. package/dist/index.js +0 -125
  290. package/dist/index.js.map +0 -1
  291. package/dist/json-config/hooks.d.ts +0 -9
  292. package/dist/json-config/hooks.js +0 -60
  293. package/dist/json-config/hooks.js.map +0 -1
  294. package/dist/json-config/parser.d.ts +0 -7
  295. package/dist/json-config/parser.js +0 -54
  296. package/dist/json-config/parser.js.map +0 -1
  297. package/dist/menu.d.ts +0 -14
  298. package/dist/menu.js +0 -344
  299. package/dist/menu.js.map +0 -1
  300. package/dist/project-files.d.ts +0 -104
  301. package/dist/project-files.js +0 -621
  302. package/dist/project-files.js.map +0 -1
  303. package/dist/startup-process-handler.d.ts +0 -1
  304. package/dist/startup-process-handler.js +0 -25
  305. package/dist/startup-process-handler.js.map +0 -1
  306. package/dist/terminal/background.d.ts +0 -12
  307. package/dist/terminal/background.js +0 -148
  308. package/dist/terminal/background.js.map +0 -1
  309. package/dist/terminal/base.d.ts +0 -41
  310. package/dist/terminal/base.js +0 -553
  311. package/dist/terminal/base.js.map +0 -1
  312. package/dist/tool-handlers.d.ts +0 -31
  313. package/dist/tool-handlers.js +0 -275
  314. package/dist/tool-handlers.js.map +0 -1
  315. package/dist/types.d.ts +0 -15
  316. package/dist/types.js +0 -3
  317. package/dist/types.js.map +0 -1
  318. package/dist/update-codebuff.d.ts +0 -1
  319. package/dist/update-codebuff.js +0 -169
  320. package/dist/update-codebuff.js.map +0 -1
  321. package/dist/utils/__tests__/background-process-manager.test.d.ts +0 -1
  322. package/dist/utils/__tests__/background-process-manager.test.js +0 -327
  323. package/dist/utils/__tests__/background-process-manager.test.js.map +0 -1
  324. package/dist/utils/__tests__/response-example-4-files.txt +0 -621
  325. package/dist/utils/__tests__/tool-renderers.test.d.ts +0 -1
  326. package/dist/utils/__tests__/tool-renderers.test.js +0 -83
  327. package/dist/utils/__tests__/tool-renderers.test.js.map +0 -1
  328. package/dist/utils/__tests__/xml-stream-parser.test.d.ts +0 -1
  329. package/dist/utils/__tests__/xml-stream-parser.test.js +0 -255
  330. package/dist/utils/__tests__/xml-stream-parser.test.js.map +0 -1
  331. package/dist/utils/analytics.d.ts +0 -7
  332. package/dist/utils/analytics.js +0 -132
  333. package/dist/utils/analytics.js.map +0 -1
  334. package/dist/utils/detect-shell.d.ts +0 -1
  335. package/dist/utils/detect-shell.js +0 -65
  336. package/dist/utils/detect-shell.js.map +0 -1
  337. package/dist/utils/git.d.ts +0 -13
  338. package/dist/utils/git.js +0 -143
  339. package/dist/utils/git.js.map +0 -1
  340. package/dist/utils/logger.d.ts +0 -21
  341. package/dist/utils/logger.js +0 -109
  342. package/dist/utils/logger.js.map +0 -1
  343. package/dist/utils/spinner.d.ts +0 -12
  344. package/dist/utils/spinner.js +0 -85
  345. package/dist/utils/spinner.js.map +0 -1
  346. package/dist/utils/system-info.d.ts +0 -8
  347. package/dist/utils/system-info.js +0 -22
  348. package/dist/utils/system-info.js.map +0 -1
  349. package/dist/utils/tool-renderers.d.ts +0 -16
  350. package/dist/utils/tool-renderers.js +0 -216
  351. package/dist/utils/tool-renderers.js.map +0 -1
  352. package/dist/utils/xml-stream-parser.d.ts +0 -9
  353. package/dist/utils/xml-stream-parser.js +0 -143
  354. package/dist/utils/xml-stream-parser.js.map +0 -1
  355. package/dist/web-scraper.d.ts +0 -3
  356. package/dist/web-scraper.js +0 -59
  357. package/dist/web-scraper.js.map +0 -1
  358. package/dist/workers/checkpoint-worker.d.ts +0 -1
  359. package/dist/workers/checkpoint-worker.js +0 -51
  360. package/dist/workers/checkpoint-worker.js.map +0 -1
  361. package/dist/workers/project-context.d.ts +0 -1
  362. package/dist/workers/project-context.js +0 -27
  363. package/dist/workers/project-context.js.map +0 -1
package/dist/cli.js DELETED
@@ -1,777 +0,0 @@
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.CLI = void 0;
27
- const fs_1 = __importStar(require("fs"));
28
- const os = __importStar(require("os"));
29
- const os_1 = require("os");
30
- const path_1 = __importStar(require("path"));
31
- const readline = __importStar(require("readline"));
32
- const analytics_events_1 = require("./common/constants/analytics-events");
33
- const file_1 = require("./common/util/file");
34
- const string_1 = require("./common/util/string");
35
- const picocolors_1 = require("picocolors");
36
- const background_process_manager_1 = require("./background-process-manager");
37
- const checkpoint_manager_1 = require("./checkpoints/checkpoint-manager");
38
- const api_key_1 = require("./cli-handlers/api-key");
39
- const checkpoint_1 = require("./cli-handlers/checkpoint");
40
- const diff_1 = require("./cli-handlers/diff");
41
- const easter_egg_1 = require("./cli-handlers/easter-egg");
42
- const inititalization_flow_1 = require("./cli-handlers/inititalization-flow");
43
- const client_1 = require("./client");
44
- const config_1 = require("./config");
45
- const display_1 = require("./display");
46
- const menu_1 = require("./menu");
47
- const project_files_1 = require("./project-files");
48
- const base_1 = require("./terminal/base");
49
- const analytics_1 = require("./utils/analytics");
50
- const spinner_1 = require("./utils/spinner");
51
- const credentials_1 = require("./credentials");
52
- const parser_1 = require("./json-config/parser");
53
- const startup_process_handler_1 = require("./startup-process-handler");
54
- const logger_1 = require("./utils/logger");
55
- const PROMPT_HISTORY_PATH = path_1.default.join(credentials_1.CONFIG_DIR, 'prompt_history.json');
56
- class CLI {
57
- static instance = null;
58
- readyPromise;
59
- git;
60
- costMode;
61
- isReceivingResponse = false;
62
- stopResponse = null;
63
- lastSigintTime = 0;
64
- lastInputTime = 0;
65
- consecutiveFastInputs = 0;
66
- pastedContent = '';
67
- isPasting = false;
68
- shouldReconnectWhenIdle = false;
69
- rl;
70
- constructor(readyPromise, { git, costMode, model }) {
71
- this.git = git;
72
- this.costMode = costMode;
73
- this.setupSignalHandlers();
74
- this.initReadlineInterface();
75
- client_1.Client.createInstance({
76
- websocketUrl: config_1.websocketUrl,
77
- onWebSocketError: this.onWebSocketError.bind(this),
78
- onWebSocketReconnect: this.onWebSocketReconnect.bind(this),
79
- freshPrompt: this.freshPrompt.bind(this),
80
- reconnectWhenNextIdle: this.reconnectWhenNextIdle.bind(this),
81
- costMode: this.costMode,
82
- git: this.git,
83
- model,
84
- });
85
- this.readyPromise = Promise.all([
86
- readyPromise.then((results) => {
87
- const [fileContext, ,] = results;
88
- client_1.Client.getInstance().initAgentState(fileContext);
89
- return client_1.Client.getInstance().warmContextCache();
90
- }),
91
- client_1.Client.getInstance().connect(),
92
- ]);
93
- this.setPrompt();
94
- process.on('unhandledRejection', (reason, promise) => {
95
- console.error('\nUnhandled Rejection at:', promise, 'reason:', reason);
96
- logger_1.logger.error({
97
- errorMessage: reason instanceof Error ? reason.message : String(reason),
98
- errorStack: reason instanceof Error ? reason.stack : undefined,
99
- }, 'Unhandled Rejection');
100
- this.freshPrompt();
101
- });
102
- process.on('uncaughtException', (err, origin) => {
103
- console.error(`\nCaught exception: ${err}\n` + `Exception origin: ${origin}`);
104
- console.error(err.stack);
105
- logger_1.logger.error({
106
- errorMessage: err.message,
107
- errorStack: err.stack,
108
- origin,
109
- }, 'Uncaught Exception');
110
- this.freshPrompt();
111
- });
112
- }
113
- static initialize(readyPromise, options) {
114
- if (CLI.instance) {
115
- throw new Error('CLI is already initialized');
116
- }
117
- CLI.instance = new CLI(readyPromise, options);
118
- }
119
- static getInstance() {
120
- if (!CLI.instance) {
121
- throw new Error('CLI must be initialized before getting an instance');
122
- }
123
- return CLI.instance;
124
- }
125
- setupSignalHandlers() {
126
- process.on('exit', () => {
127
- spinner_1.Spinner.get().restoreCursor();
128
- // Kill the persistent PTY process first
129
- if (base_1.persistentProcess?.type === 'pty') {
130
- base_1.persistentProcess.pty.kill();
131
- }
132
- (0, background_process_manager_1.sendKillSignalToAllBackgroundProcesses)();
133
- const isHomeDir = (0, project_files_1.getProjectRoot)() === os.homedir();
134
- if (!isHomeDir) {
135
- console.log((0, picocolors_1.green)('Codebuff out!'));
136
- }
137
- if (process.env.NEXT_PUBLIC_CB_ENVIRONMENT === 'dev') {
138
- logger_1.logger.info('[dev] active handles on close', process._getActiveHandles());
139
- }
140
- });
141
- for (const signal of ['SIGTERM', 'SIGHUP']) {
142
- process.on(signal, async () => {
143
- process.removeAllListeners('unhandledRejection');
144
- process.removeAllListeners('uncaughtException');
145
- spinner_1.Spinner.get().restoreCursor();
146
- await (0, background_process_manager_1.killAllBackgroundProcesses)();
147
- client_1.Client.getInstance().close();
148
- await (0, analytics_1.flushAnalytics)();
149
- process.exit(0);
150
- });
151
- }
152
- process.on('SIGTSTP', async () => await this.handleExit());
153
- // Doesn't catch SIGKILL (e.g. `kill -9`)
154
- }
155
- _loadHistory() {
156
- try {
157
- if (fs_1.default.existsSync(PROMPT_HISTORY_PATH)) {
158
- const content = fs_1.default.readFileSync(PROMPT_HISTORY_PATH, 'utf8');
159
- const history = JSON.parse(content);
160
- // Filter out empty lines and reverse for readline
161
- return history.filter((line) => line.trim()).reverse();
162
- }
163
- }
164
- catch (error) {
165
- console.error('Error loading prompt history:', error);
166
- logger_1.logger.error({
167
- errorMessage: error instanceof Error ? error.message : String(error),
168
- errorStack: error instanceof Error ? error.stack : undefined,
169
- }, 'Error loading prompt history');
170
- // If file doesn't exist or is invalid JSON, create empty history file
171
- fs_1.default.writeFileSync(PROMPT_HISTORY_PATH, '[]');
172
- }
173
- return [];
174
- }
175
- _appendToHistory(line) {
176
- try {
177
- let history = [];
178
- if (fs_1.default.existsSync(PROMPT_HISTORY_PATH)) {
179
- const content = fs_1.default.readFileSync(PROMPT_HISTORY_PATH, 'utf8');
180
- history = JSON.parse(content);
181
- }
182
- const trimmedLine = line.trim();
183
- if (trimmedLine) {
184
- // Remove all previous occurrences of the line
185
- history = history.filter((h) => h !== trimmedLine);
186
- // Add the new line to the end
187
- history.push(trimmedLine);
188
- fs_1.default.writeFileSync(PROMPT_HISTORY_PATH, JSON.stringify(history, null, 2));
189
- }
190
- }
191
- catch (error) {
192
- console.error('Error appending to prompt history:', error);
193
- logger_1.logger.error({
194
- errorMessage: error instanceof Error ? error.message : String(error),
195
- errorStack: error instanceof Error ? error.stack : undefined,
196
- }, 'Error appending to prompt history');
197
- }
198
- }
199
- initReadlineInterface() {
200
- this.rl = readline.createInterface({
201
- input: process.stdin,
202
- output: process.stdout,
203
- historySize: 1000,
204
- terminal: true,
205
- completer: this.inputCompleter.bind(this),
206
- });
207
- // Load and populate history
208
- const history = this._loadHistory();
209
- this.rl.history.push(...history);
210
- this.rl.on('line', (line) => this.handleLine(line));
211
- this.rl.on('SIGINT', async () => await this.handleSigint());
212
- this.rl.on('close', async () => await this.handleExit());
213
- process.stdin.on('keypress', (str, key) => this.handleKeyPress(str, key));
214
- }
215
- inputCompleter(line) {
216
- const lastWord = line.split(' ').pop() || '';
217
- if (line.startsWith('/')) {
218
- const slashCommands = (0, menu_1.getSlashCommands)();
219
- const currentInput = line.substring(1); // Text after '/'
220
- const matches = slashCommands
221
- .map((cmd) => cmd.baseCommand) // Get base command strings
222
- .filter((cmdName) => cmdName && cmdName.startsWith(currentInput))
223
- .map((cmdName) => `/${cmdName}`); // Add back the slash for display
224
- if (matches.length > 0) {
225
- return [matches, line]; // Return all matches and the full line typed so far
226
- }
227
- return [[], line]; // No slash command matches
228
- }
229
- // Handle @ prefix for token and file completion
230
- if (lastWord.startsWith('@')) {
231
- const client = client_1.Client.getInstance();
232
- if (!client.fileContext?.fileTree)
233
- return [[], line];
234
- const searchTerm = lastWord.substring(1); // Remove @ prefix
235
- const searchTermLower = searchTerm.toLowerCase();
236
- // Get token names from fileTokenScores
237
- const tokenNames = Object.values(client.fileContext.fileTokenScores).flatMap((o) => Object.keys(o));
238
- // Get all file paths
239
- const paths = this.getAllFilePaths(client.fileContext.fileTree);
240
- // Combine tokens and paths for matching
241
- const allCandidates = [...tokenNames, ...paths];
242
- const matchingItems = allCandidates.filter((item) => item.toLowerCase().startsWith(searchTermLower) ||
243
- item.toLowerCase().includes('/' + searchTermLower));
244
- // Limit the number of results to keep completion manageable
245
- const MAX_COMPLETION_RESULTS = 20;
246
- const limitedMatches = matchingItems.slice(0, MAX_COMPLETION_RESULTS);
247
- if (limitedMatches.length > 1) {
248
- // Find common prefix among matches
249
- const suffixes = limitedMatches.map((item) => {
250
- const index = item.toLowerCase().indexOf(searchTermLower);
251
- return item.slice(index + searchTerm.length);
252
- });
253
- let commonPrefix = '';
254
- const firstSuffix = suffixes[0];
255
- for (let i = 0; i < firstSuffix.length; i++) {
256
- const char = firstSuffix[i];
257
- if (suffixes.every((suffix) => suffix[i] === char)) {
258
- commonPrefix += char;
259
- }
260
- else {
261
- break;
262
- }
263
- }
264
- if (commonPrefix) {
265
- // Return the completion with @ prefix preserved
266
- return [['@' + searchTerm + commonPrefix], lastWord];
267
- }
268
- // Multiple matches but no common prefix - show matches WITHOUT @ prefix but keep @ in input
269
- return [limitedMatches, lastWord];
270
- }
271
- // Single match or no matches - remove @ prefix from completion
272
- return [limitedMatches, lastWord];
273
- }
274
- // Original file path completion logic (unchanged)
275
- const input = lastWord.startsWith('~')
276
- ? (0, os_1.homedir)() + lastWord.slice(1)
277
- : lastWord;
278
- const directorySuffix = process.platform === 'win32' ? '\\' : '/';
279
- const dir = input.endsWith(directorySuffix)
280
- ? input.slice(0, input.length - 1)
281
- : (0, path_1.dirname)(input);
282
- const partial = input.endsWith(directorySuffix) ? '' : (0, path_1.basename)(input);
283
- let baseDir = (0, path_1.isAbsolute)(dir) ? dir : path_1.default.join((0, project_files_1.getWorkingDirectory)(), dir);
284
- try {
285
- const files = (0, fs_1.readdirSync)(baseDir);
286
- const fsMatches = files
287
- .filter((file) => file.startsWith(partial))
288
- .map((file) => file + ((0, file_1.isDir)(path_1.default.join(baseDir, file)) ? directorySuffix : ''));
289
- return [fsMatches, partial];
290
- }
291
- catch {
292
- return [[], line];
293
- }
294
- }
295
- getAllFilePaths(nodes, basePath = '') {
296
- return nodes.flatMap((node) => {
297
- if (node.type === 'file') {
298
- return [path_1.default.join(basePath, node.name)];
299
- }
300
- return this.getAllFilePaths(node.children || [], path_1.default.join(basePath, node.name));
301
- });
302
- }
303
- getModeIndicator() {
304
- const costModeIndicator = this.costMode !== 'normal' ? ` (${this.costMode})` : '';
305
- return costModeIndicator;
306
- }
307
- setPrompt() {
308
- const projectRoot = (0, project_files_1.getProjectRoot)();
309
- const cwd = (0, project_files_1.getWorkingDirectory)();
310
- const projectDirName = (0, path_1.parse)(projectRoot).base;
311
- const ps1Dir = projectDirName +
312
- (cwd === projectRoot
313
- ? ''
314
- : (os.platform() === 'win32' ? '\\' : '/') +
315
- path_1.default.relative(projectRoot, cwd));
316
- const modeIndicator = this.getModeIndicator();
317
- this.rl.setPrompt((0, picocolors_1.green)(`${ps1Dir}${modeIndicator} > `));
318
- }
319
- /**
320
- * Prompts the user with a clean prompt state
321
- */
322
- freshPrompt(userInput = '') {
323
- spinner_1.Spinner.get().stop();
324
- this.isReceivingResponse = false;
325
- if (this.shouldReconnectWhenIdle) {
326
- client_1.Client.getInstance().reconnect();
327
- this.shouldReconnectWhenIdle = false;
328
- }
329
- readline.cursorTo(process.stdout, 0);
330
- const rlAny = this.rl;
331
- // Check for pending auto-topup message before showing prompt
332
- if (client_1.Client.getInstance().pendingTopUpMessageAmount > 0) {
333
- console.log('\n\n' +
334
- (0, picocolors_1.green)(`Auto top-up successful! ${client_1.Client.getInstance().pendingTopUpMessageAmount.toLocaleString()} credits added.`) +
335
- '\n');
336
- client_1.Client.getInstance().pendingTopUpMessageAmount = 0;
337
- }
338
- // clear line first
339
- rlAny.line = '';
340
- this.pastedContent = '';
341
- this.setPrompt();
342
- // then prompt
343
- this.rl.prompt();
344
- (0, display_1.disableSquashNewlines)();
345
- if (!userInput) {
346
- return;
347
- }
348
- // then rewrite new prompt
349
- this.rl.write(' '.repeat(userInput.length)); // hacky way to move cursor
350
- rlAny.line = userInput;
351
- rlAny._refreshLine();
352
- }
353
- async printInitialPrompt({ initialInput, runInitFlow, }) {
354
- const client = client_1.Client.getInstance();
355
- if (client.user) {
356
- (0, menu_1.displayGreeting)(this.costMode, client.user.name);
357
- }
358
- else {
359
- console.log(`Welcome to Codebuff! Give us a sec to get your account set up...`);
360
- await client_1.Client.getInstance().login();
361
- return;
362
- }
363
- this.freshPrompt();
364
- if (runInitFlow) {
365
- process.stdout.write('init\n');
366
- await this.handleUserInput('init');
367
- }
368
- if (initialInput) {
369
- process.stdout.write(initialInput + '\n');
370
- await this.handleUserInput(initialInput);
371
- }
372
- }
373
- async printDiff() {
374
- (0, diff_1.handleDiff)(client_1.Client.getInstance().lastChanges);
375
- this.freshPrompt();
376
- }
377
- async handleLine(line) {
378
- this.detectPasting();
379
- if (this.isPasting) {
380
- this.pastedContent += line + '\n';
381
- }
382
- else if (!this.isReceivingResponse) {
383
- const input = (this.pastedContent + line).trim();
384
- this.pastedContent = '';
385
- await this.handleUserInput(input);
386
- this._appendToHistory(input);
387
- }
388
- }
389
- async handleUserInput(userInput) {
390
- (0, display_1.enableSquashNewlines)();
391
- this.rl.setPrompt('');
392
- if (!userInput) {
393
- this.freshPrompt();
394
- return;
395
- }
396
- userInput = userInput.trim();
397
- const processedResult = await this.processCommand(userInput);
398
- if (processedResult === null) {
399
- // Command was fully handled by processCommand
400
- return;
401
- }
402
- // processedResult is the string to be forwarded as a prompt
403
- await this.forwardUserInput(processedResult);
404
- }
405
- /**
406
- * Cleans command input by removing leading slash while preserving special command syntax
407
- * @param input The raw user input
408
- * @returns The cleaned command string
409
- */
410
- cleanCommandInput(input) {
411
- return input.startsWith('/') ? input.substring(1) : input;
412
- }
413
- /**
414
- * Checks if a command is a known slash command
415
- * @param command The command to check (without leading slash)
416
- */
417
- isKnownSlashCommand(command) {
418
- return (0, menu_1.getSlashCommands)().some((cmd) => cmd.baseCommand === command);
419
- }
420
- /**
421
- * Handles an unknown slash command by displaying an error message
422
- * @param command The unknown command that was entered
423
- */
424
- handleUnknownCommand(command) {
425
- console.log((0, picocolors_1.yellow)(`Unknown slash command: ${command}`) +
426
- `\nType / to see available commands`);
427
- this.freshPrompt();
428
- }
429
- async processCommand(userInput) {
430
- // Handle cost mode commands with optional message: /lite, /lite message, /normal, /normal message, etc.
431
- const costModeMatch = userInput.match(/^\/?(lite|normal|max|experimental|ask)(?:\s+(.*))?$/i);
432
- if (costModeMatch) {
433
- const mode = costModeMatch[1].toLowerCase();
434
- const message = costModeMatch[2]?.trim() || '';
435
- // Track the cost mode command usage
436
- (0, analytics_1.trackEvent)(analytics_events_1.AnalyticsEvent.SLASH_COMMAND_USED, {
437
- userId: client_1.Client.getInstance().user?.id || 'unknown',
438
- command: mode,
439
- });
440
- this.costMode = mode;
441
- client_1.Client.getInstance().setCostMode(mode);
442
- if (mode === 'lite') {
443
- console.log((0, picocolors_1.yellow)('✨ Switched to lite mode (faster, cheaper)'));
444
- }
445
- else if (mode === 'normal') {
446
- console.log((0, picocolors_1.green)('⚖️ Switched to normal mode (balanced)'));
447
- }
448
- else if (mode === 'max') {
449
- console.log((0, picocolors_1.blueBright)('⚡ Switched to max mode (slower, more thorough)'));
450
- }
451
- else if (mode === 'experimental') {
452
- console.log((0, picocolors_1.magenta)('🧪 Switched to experimental mode (cutting-edge)'));
453
- }
454
- else if (mode === 'ask') {
455
- console.log((0, picocolors_1.cyan)('💬 Switched to ask mode (questions & planning only, no code changes)'));
456
- console.log((0, picocolors_1.gray)('Tip: Use /export to save conversation summary to a file after fleshing out a plan'));
457
- }
458
- if (!message) {
459
- this.freshPrompt();
460
- return null; // Fully handled, no message to forward
461
- }
462
- // Return the message part to be processed as user input
463
- return message;
464
- }
465
- const cleanInput = this.cleanCommandInput(userInput);
466
- // Handle empty slash command
467
- if (userInput === '/') {
468
- return userInput; // Let it be processed as a prompt
469
- }
470
- // Track slash command usage if it starts with '/'
471
- if (userInput.startsWith('/') && !userInput.startsWith('/!')) {
472
- const commandBase = cleanInput.split(' ')[0];
473
- if (!this.isKnownSlashCommand(commandBase)) {
474
- (0, analytics_1.trackEvent)(analytics_events_1.AnalyticsEvent.INVALID_COMMAND, {
475
- userId: client_1.Client.getInstance().user?.id || 'unknown',
476
- command: cleanInput,
477
- });
478
- this.handleUnknownCommand(userInput);
479
- return null;
480
- }
481
- // Track successful slash command usage
482
- (0, analytics_1.trackEvent)(analytics_events_1.AnalyticsEvent.SLASH_COMMAND_USED, {
483
- userId: client_1.Client.getInstance().user?.id || 'unknown',
484
- command: commandBase,
485
- });
486
- }
487
- if (cleanInput === 'help' || cleanInput === 'h') {
488
- (0, menu_1.displayMenu)();
489
- this.freshPrompt();
490
- return null;
491
- }
492
- if (cleanInput === 'login' || cleanInput === 'signin') {
493
- await client_1.Client.getInstance().login();
494
- checkpoint_manager_1.checkpointManager.clearCheckpoints();
495
- return null;
496
- }
497
- if (cleanInput === 'logout' || cleanInput === 'signout') {
498
- await client_1.Client.getInstance().logout();
499
- this.freshPrompt();
500
- return null;
501
- }
502
- if (cleanInput.startsWith('ref-')) {
503
- // Referral codes can be entered with or without a leading slash.
504
- // Pass the cleaned input (without slash) to the handler.
505
- await client_1.Client.getInstance().handleReferralCode(cleanInput.trim());
506
- return null;
507
- }
508
- // Detect potential API key input first
509
- // API keys are not slash commands, so use userInput
510
- const detectionResult = (0, api_key_1.detectApiKey)(userInput);
511
- if (detectionResult.status !== 'not_found') {
512
- await (0, api_key_1.handleApiKeyInput)(client_1.Client.getInstance(), detectionResult, this.readyPromise, this.freshPrompt.bind(this));
513
- return null;
514
- }
515
- if (cleanInput === 'usage' || cleanInput === 'credits') {
516
- await client_1.Client.getInstance().getUsage();
517
- return null;
518
- }
519
- if (cleanInput === 'quit' || cleanInput === 'exit' || cleanInput === 'q') {
520
- await this.handleExit();
521
- return null;
522
- }
523
- if (cleanInput === 'reset') {
524
- await this.readyPromise;
525
- await client_1.Client.getInstance().resetContext();
526
- const projectRoot = (0, project_files_1.getProjectRoot)();
527
- (0, base_1.clearScreen)();
528
- // from index.ts
529
- const config = (0, parser_1.loadCodebuffConfig)();
530
- await (0, background_process_manager_1.killAllBackgroundProcesses)();
531
- const processStartPromise = (0, startup_process_handler_1.logAndHandleStartup)();
532
- const initFileContextPromise = (0, project_files_1.initProjectFileContextWithWorker)(projectRoot, true);
533
- this.readyPromise = Promise.all([
534
- initFileContextPromise,
535
- processStartPromise,
536
- ]);
537
- (0, menu_1.displayGreeting)(this.costMode, client_1.Client.getInstance().user?.name ?? null);
538
- this.freshPrompt();
539
- return null;
540
- }
541
- if (['diff', 'doff', 'dif', 'iff', 'd'].includes(cleanInput)) {
542
- (0, diff_1.handleDiff)(client_1.Client.getInstance().lastChanges);
543
- this.freshPrompt();
544
- return null;
545
- }
546
- if (cleanInput === 'uuddlrlrba' ||
547
- cleanInput === 'konami' ||
548
- cleanInput === 'codebuffy') {
549
- (0, easter_egg_1.showEasterEgg)(this.freshPrompt.bind(this));
550
- return null;
551
- }
552
- // Checkpoint commands
553
- if ((0, checkpoint_1.isCheckpointCommand)(cleanInput)) {
554
- (0, analytics_1.trackEvent)(analytics_events_1.AnalyticsEvent.CHECKPOINT_COMMAND_USED, {
555
- command: cleanInput, // Log the cleaned command
556
- });
557
- if ((0, checkpoint_1.isCheckpointCommand)(cleanInput, 'undo')) {
558
- await (0, checkpoint_1.saveCheckpoint)(userInput, client_1.Client.getInstance(), this.readyPromise);
559
- const toRestore = await (0, checkpoint_1.handleUndo)(client_1.Client.getInstance(), this.rl);
560
- this.freshPrompt(toRestore);
561
- return null;
562
- }
563
- if ((0, checkpoint_1.isCheckpointCommand)(cleanInput, 'redo')) {
564
- await (0, checkpoint_1.saveCheckpoint)(userInput, client_1.Client.getInstance(), this.readyPromise);
565
- const toRestore = await (0, checkpoint_1.handleRedo)(client_1.Client.getInstance(), this.rl);
566
- this.freshPrompt(toRestore);
567
- return null;
568
- }
569
- if ((0, checkpoint_1.isCheckpointCommand)(cleanInput, 'list')) {
570
- await (0, checkpoint_1.saveCheckpoint)(userInput, client_1.Client.getInstance(), this.readyPromise);
571
- await (0, checkpoint_1.listCheckpoints)();
572
- this.freshPrompt();
573
- return null;
574
- }
575
- const restoreMatch = (0, checkpoint_1.isCheckpointCommand)(cleanInput, 'restore');
576
- if (restoreMatch) {
577
- const id = parseInt(restoreMatch[1], 10);
578
- await (0, checkpoint_1.saveCheckpoint)(userInput, client_1.Client.getInstance(), this.readyPromise);
579
- const toRestore = await (0, checkpoint_1.handleRestoreCheckpoint)(id, client_1.Client.getInstance(), this.rl);
580
- this.freshPrompt(toRestore);
581
- return null;
582
- }
583
- if ((0, checkpoint_1.isCheckpointCommand)(cleanInput, 'clear')) {
584
- (0, checkpoint_1.handleClearCheckpoints)();
585
- this.freshPrompt();
586
- return null;
587
- }
588
- if ((0, checkpoint_1.isCheckpointCommand)(cleanInput, 'save')) {
589
- await (0, checkpoint_1.saveCheckpoint)(userInput, client_1.Client.getInstance(), this.readyPromise, true);
590
- (0, checkpoint_1.displayCheckpointMenu)();
591
- this.freshPrompt();
592
- return null;
593
- }
594
- // Default checkpoint action (if just "checkpoint" or "/checkpoint" is typed)
595
- (0, checkpoint_1.displayCheckpointMenu)();
596
- this.freshPrompt();
597
- return null;
598
- }
599
- if (cleanInput === 'init') {
600
- (0, inititalization_flow_1.handleInitializationFlowLocally)();
601
- // Also forward user input (original with / if present, or cleanInput) to the backend
602
- // The original forwardUserInput takes the raw userInput.
603
- return userInput; // Let it fall through to forwardUserInput
604
- }
605
- if (cleanInput === 'export') {
606
- console.log((0, picocolors_1.yellow)('Exporting conversation to a file...'));
607
- // Forward to backend like init command
608
- return userInput; // Let it fall through to forwardUserInput
609
- }
610
- if (cleanInput === 'compact') {
611
- console.log((0, picocolors_1.yellow)('Compacting conversation...'));
612
- // Forward to backend
613
- return userInput;
614
- }
615
- // If no command was matched, return the original userInput to be processed as a prompt
616
- return userInput;
617
- }
618
- async forwardUserInput(promptContent) {
619
- const cleanedInput = this.cleanCommandInput(promptContent);
620
- await (0, checkpoint_1.saveCheckpoint)(cleanedInput, client_1.Client.getInstance(), this.readyPromise);
621
- spinner_1.Spinner.get().start('Thinking...');
622
- this.isReceivingResponse = true;
623
- const { responsePromise, stopResponse } = await client_1.Client.getInstance().sendUserInput(cleanedInput);
624
- this.stopResponse = stopResponse;
625
- await responsePromise;
626
- this.stopResponse = null;
627
- this.isReceivingResponse = false;
628
- spinner_1.Spinner.get().stop();
629
- this.freshPrompt();
630
- }
631
- reconnectWhenNextIdle() {
632
- if (!this.isReceivingResponse) {
633
- client_1.Client.getInstance().reconnect();
634
- }
635
- else {
636
- this.shouldReconnectWhenIdle = true;
637
- }
638
- }
639
- onWebSocketError() {
640
- spinner_1.Spinner.get().stop();
641
- this.isReceivingResponse = false;
642
- if (this.stopResponse) {
643
- this.stopResponse();
644
- this.stopResponse = null;
645
- }
646
- console.error('\n' + (0, picocolors_1.yellow)('Could not connect. Retrying...'));
647
- logger_1.logger.error({
648
- errorMessage: 'Could not connect. Retrying...',
649
- }, 'WebSocket connection error');
650
- }
651
- onWebSocketReconnect() {
652
- console.log('\n' + (0, picocolors_1.green)('Reconnected!'));
653
- this.freshPrompt();
654
- }
655
- handleKeyPress(str, key) {
656
- if (key.name === 'escape') {
657
- this.handleEscKey();
658
- }
659
- if (str === '/') {
660
- const currentLine = this.pastedContent + this.rl.line;
661
- // Only track and show menu if '/' is the first character typed
662
- if (currentLine === '/') {
663
- (0, analytics_1.trackEvent)(analytics_events_1.AnalyticsEvent.SLASH_MENU_ACTIVATED, {
664
- userId: client_1.Client.getInstance().user?.id || 'unknown',
665
- });
666
- (0, menu_1.displaySlashCommandHelperMenu)();
667
- // Call freshPrompt and pre-fill the line with the slash
668
- // so the user can continue typing their command.
669
- this.freshPrompt('/');
670
- }
671
- }
672
- if (!this.isPasting &&
673
- str === ' ' &&
674
- '_refreshLine' in this.rl &&
675
- 'line' in this.rl &&
676
- 'cursor' in this.rl) {
677
- const rlAny = this.rl;
678
- const { cursor, line } = rlAny;
679
- const prevTwoChars = cursor > 1 ? line.slice(cursor - 2, cursor) : '';
680
- if (prevTwoChars === ' ') {
681
- rlAny.line = line.slice(0, cursor - 2) + '\n\n' + line.slice(cursor);
682
- rlAny._refreshLine();
683
- }
684
- }
685
- this.detectPasting();
686
- }
687
- async handleSigint() {
688
- if ((0, base_1.isCommandRunning)()) {
689
- (0, base_1.resetShell)((0, project_files_1.getProjectRoot)());
690
- }
691
- if (this.isReceivingResponse) {
692
- this.handleStopResponse();
693
- }
694
- else {
695
- const now = Date.now();
696
- if (now - this.lastSigintTime < 5000 && !this.rl.line) {
697
- await this.handleExit();
698
- }
699
- else {
700
- this.lastSigintTime = now;
701
- console.log('\nPress Ctrl-C again to exit');
702
- this.freshPrompt();
703
- }
704
- }
705
- }
706
- handleEscKey() {
707
- if (this.isReceivingResponse) {
708
- this.handleStopResponse();
709
- }
710
- }
711
- handleStopResponse() {
712
- console.log((0, picocolors_1.yellow)('\n[Response stopped by user]'));
713
- this.isReceivingResponse = false;
714
- if (this.stopResponse) {
715
- this.stopResponse();
716
- }
717
- spinner_1.Spinner.get().stop();
718
- }
719
- async handleExit() {
720
- spinner_1.Spinner.get().restoreCursor();
721
- process.removeAllListeners('unhandledRejection');
722
- process.removeAllListeners('uncaughtException');
723
- console.log('\n');
724
- // Kill the persistent PTY process first
725
- (0, base_1.killAndResetPersistentProcess)();
726
- await (0, background_process_manager_1.killAllBackgroundProcesses)();
727
- client_1.Client.getInstance().close(); // Close WebSocket
728
- const client = client_1.Client.getInstance();
729
- // Check for organization coverage first
730
- const coverage = await client.checkRepositoryCoverage();
731
- // Calculate session usage and total for display
732
- const totalCreditsUsedThisSession = Object.values(client.creditsByPromptId)
733
- .flat()
734
- .reduce((sum, credits) => sum + credits, 0);
735
- let exitUsageMessage = `${(0, string_1.pluralize)(totalCreditsUsedThisSession, 'credit')} used this session`;
736
- if (client.usageData.remainingBalance !== null) {
737
- exitUsageMessage += `, ${client.usageData.remainingBalance.toLocaleString()} credits left.`;
738
- }
739
- else {
740
- exitUsageMessage += '.';
741
- }
742
- console.log(exitUsageMessage);
743
- if (coverage.isCovered && coverage.organizationName) {
744
- // When covered by an organization, show organization information
745
- console.log((0, picocolors_1.green)(`Your usage in this repository was covered by the ${(0, picocolors_1.bold)(coverage.organizationName)} organization.`));
746
- }
747
- else {
748
- // Only show personal credit renewal when not covered by an organization
749
- if (client.usageData.next_quota_reset) {
750
- const daysUntilReset = Math.ceil((new Date(client.usageData.next_quota_reset).getTime() - Date.now()) /
751
- (1000 * 60 * 60 * 24));
752
- console.log(`Your free credits will reset in ${(0, string_1.pluralize)(daysUntilReset, 'day')}.`);
753
- }
754
- }
755
- await (0, analytics_1.flushAnalytics)();
756
- process.exit(0);
757
- }
758
- detectPasting() {
759
- const currentTime = Date.now();
760
- const timeDiff = currentTime - this.lastInputTime;
761
- if (timeDiff < 10) {
762
- this.consecutiveFastInputs++;
763
- if (this.consecutiveFastInputs >= 2) {
764
- this.isPasting = true;
765
- }
766
- }
767
- else {
768
- this.consecutiveFastInputs = 0;
769
- if (this.isPasting) {
770
- this.isPasting = false;
771
- }
772
- }
773
- this.lastInputTime = currentTime;
774
- }
775
- }
776
- exports.CLI = CLI;
777
- //# sourceMappingURL=cli.js.map