codebuff 1.0.334 → 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 (379) 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/__tests__/rage-detectors.test.d.ts +0 -1
  7. package/dist/__tests__/rage-detectors.test.js +0 -127
  8. package/dist/__tests__/rage-detectors.test.js.map +0 -1
  9. package/dist/background-process-manager.d.ts +0 -50
  10. package/dist/background-process-manager.js +0 -364
  11. package/dist/background-process-manager.js.map +0 -1
  12. package/dist/browser-runner.d.ts +0 -35
  13. package/dist/browser-runner.js +0 -689
  14. package/dist/browser-runner.js.map +0 -1
  15. package/dist/chat-storage.d.ts +0 -2
  16. package/dist/chat-storage.js +0 -98
  17. package/dist/chat-storage.js.map +0 -1
  18. package/dist/checkpoints/checkpoint-manager.d.ts +0 -94
  19. package/dist/checkpoints/checkpoint-manager.js +0 -291
  20. package/dist/checkpoints/checkpoint-manager.js.map +0 -1
  21. package/dist/checkpoints/file-manager.d.ts +0 -72
  22. package/dist/checkpoints/file-manager.js +0 -498
  23. package/dist/checkpoints/file-manager.js.map +0 -1
  24. package/dist/cli-definitions.d.ts +0 -9
  25. package/dist/cli-definitions.js +0 -60
  26. package/dist/cli-definitions.js.map +0 -1
  27. package/dist/cli-handlers/api-key.d.ts +0 -25
  28. package/dist/cli-handlers/api-key.js +0 -66
  29. package/dist/cli-handlers/api-key.js.map +0 -1
  30. package/dist/cli-handlers/checkpoint.d.ts +0 -19
  31. package/dist/cli-handlers/checkpoint.js +0 -221
  32. package/dist/cli-handlers/checkpoint.js.map +0 -1
  33. package/dist/cli-handlers/diff.d.ts +0 -2
  34. package/dist/cli-handlers/diff.js +0 -31
  35. package/dist/cli-handlers/diff.js.map +0 -1
  36. package/dist/cli-handlers/easter-egg.d.ts +0 -1
  37. package/dist/cli-handlers/easter-egg.js +0 -126
  38. package/dist/cli-handlers/easter-egg.js.map +0 -1
  39. package/dist/cli-handlers/inititalization-flow.d.ts +0 -1
  40. package/dist/cli-handlers/inititalization-flow.js +0 -25
  41. package/dist/cli-handlers/inititalization-flow.js.map +0 -1
  42. package/dist/cli.d.ts +0 -67
  43. package/dist/cli.js +0 -812
  44. package/dist/cli.js.map +0 -1
  45. package/dist/client.d.ts +0 -91
  46. package/dist/client.js +0 -1112
  47. package/dist/client.js.map +0 -1
  48. package/dist/code-map/languages.d.ts +0 -12
  49. package/dist/code-map/languages.d.ts.map +0 -1
  50. package/dist/code-map/languages.js +0 -130
  51. package/dist/code-map/languages.js.map +0 -1
  52. package/dist/code-map/parse.d.ts +0 -22
  53. package/dist/code-map/parse.d.ts.map +0 -1
  54. package/dist/code-map/parse.js +0 -180
  55. package/dist/code-map/parse.js.map +0 -1
  56. package/dist/code-map/tree-sitter-queries/readme.md +0 -23
  57. package/dist/code-map/tree-sitter-queries/tree-sitter-c-tags.scm +0 -16
  58. package/dist/code-map/tree-sitter-queries/tree-sitter-c_sharp-tags.scm +0 -23
  59. package/dist/code-map/tree-sitter-queries/tree-sitter-cpp-tags.scm +0 -29
  60. package/dist/code-map/tree-sitter-queries/tree-sitter-go-tags.scm +0 -26
  61. package/dist/code-map/tree-sitter-queries/tree-sitter-java-tags.scm +0 -19
  62. package/dist/code-map/tree-sitter-queries/tree-sitter-javascript-tags.scm +0 -16
  63. package/dist/code-map/tree-sitter-queries/tree-sitter-php-tags.scm +0 -23
  64. package/dist/code-map/tree-sitter-queries/tree-sitter-python-tags.scm +0 -12
  65. package/dist/code-map/tree-sitter-queries/tree-sitter-ruby-tags.scm +0 -58
  66. package/dist/code-map/tree-sitter-queries/tree-sitter-rust-tags.scm +0 -26
  67. package/dist/code-map/tree-sitter-queries/tree-sitter-typescript-tags.scm +0 -22
  68. package/dist/code-map/tsconfig.tsbuildinfo +0 -1
  69. package/dist/common/actions.d.ts +0 -1809
  70. package/dist/common/actions.d.ts.map +0 -1
  71. package/dist/common/actions.js +0 -140
  72. package/dist/common/actions.js.map +0 -1
  73. package/dist/common/analytics.d.ts +0 -6
  74. package/dist/common/analytics.d.ts.map +0 -1
  75. package/dist/common/analytics.js +0 -60
  76. package/dist/common/analytics.js.map +0 -1
  77. package/dist/common/api-keys/constants.d.ts +0 -9
  78. package/dist/common/api-keys/constants.d.ts.map +0 -1
  79. package/dist/common/api-keys/constants.js +0 -26
  80. package/dist/common/api-keys/constants.js.map +0 -1
  81. package/dist/common/api-keys/crypto.d.ts +0 -25
  82. package/dist/common/api-keys/crypto.d.ts.map +0 -1
  83. package/dist/common/api-keys/crypto.js +0 -186
  84. package/dist/common/api-keys/crypto.js.map +0 -1
  85. package/dist/common/browser-actions.d.ts +0 -4416
  86. package/dist/common/browser-actions.d.ts.map +0 -1
  87. package/dist/common/browser-actions.js +0 -343
  88. package/dist/common/browser-actions.js.map +0 -1
  89. package/dist/common/constants/analytics-events.d.ts +0 -31
  90. package/dist/common/constants/analytics-events.d.ts.map +0 -1
  91. package/dist/common/constants/analytics-events.js +0 -39
  92. package/dist/common/constants/analytics-events.js.map +0 -1
  93. package/dist/common/constants/grant-priorities.d.ts +0 -3
  94. package/dist/common/constants/grant-priorities.d.ts.map +0 -1
  95. package/dist/common/constants/grant-priorities.js +0 -11
  96. package/dist/common/constants/grant-priorities.js.map +0 -1
  97. package/dist/common/constants/tools.d.ts +0 -19
  98. package/dist/common/constants/tools.d.ts.map +0 -1
  99. package/dist/common/constants/tools.js +0 -45
  100. package/dist/common/constants/tools.js.map +0 -1
  101. package/dist/common/constants.d.ts +0 -149
  102. package/dist/common/constants.d.ts.map +0 -1
  103. package/dist/common/constants.js +0 -234
  104. package/dist/common/constants.js.map +0 -1
  105. package/dist/common/db/drizzle.config.d.ts +0 -3
  106. package/dist/common/db/drizzle.config.d.ts.map +0 -1
  107. package/dist/common/db/drizzle.config.js +0 -17
  108. package/dist/common/db/drizzle.config.js.map +0 -1
  109. package/dist/common/db/index.d.ts +0 -7
  110. package/dist/common/db/index.d.ts.map +0 -1
  111. package/dist/common/db/index.js +0 -35
  112. package/dist/common/db/index.js.map +0 -1
  113. package/dist/common/db/schema.d.ts +0 -2449
  114. package/dist/common/db/schema.d.ts.map +0 -1
  115. package/dist/common/db/schema.js +0 -310
  116. package/dist/common/db/schema.js.map +0 -1
  117. package/dist/common/db/transaction.d.ts +0 -13
  118. package/dist/common/db/transaction.d.ts.map +0 -1
  119. package/dist/common/db/transaction.js +0 -36
  120. package/dist/common/db/transaction.js.map +0 -1
  121. package/dist/common/json-config/__tests__/__snapshots__/stringify-schema.test.js.snap +0 -144
  122. package/dist/common/json-config/__tests__/constants.test.d.ts +0 -2
  123. package/dist/common/json-config/__tests__/constants.test.d.ts.map +0 -1
  124. package/dist/common/json-config/__tests__/constants.test.js +0 -273
  125. package/dist/common/json-config/__tests__/constants.test.js.map +0 -1
  126. package/dist/common/json-config/__tests__/stringify-schema.test.d.ts +0 -2
  127. package/dist/common/json-config/__tests__/stringify-schema.test.d.ts.map +0 -1
  128. package/dist/common/json-config/__tests__/stringify-schema.test.js +0 -66
  129. package/dist/common/json-config/__tests__/stringify-schema.test.js.map +0 -1
  130. package/dist/common/json-config/constants.d.ts +0 -138
  131. package/dist/common/json-config/constants.d.ts.map +0 -1
  132. package/dist/common/json-config/constants.js +0 -78
  133. package/dist/common/json-config/constants.js.map +0 -1
  134. package/dist/common/json-config/default.d.ts +0 -3
  135. package/dist/common/json-config/default.d.ts.map +0 -1
  136. package/dist/common/json-config/default.js +0 -12
  137. package/dist/common/json-config/default.js.map +0 -1
  138. package/dist/common/json-config/stringify-schema.d.ts +0 -10
  139. package/dist/common/json-config/stringify-schema.d.ts.map +0 -1
  140. package/dist/common/json-config/stringify-schema.js +0 -131
  141. package/dist/common/json-config/stringify-schema.js.map +0 -1
  142. package/dist/common/project-file-tree.d.ts +0 -12
  143. package/dist/common/project-file-tree.d.ts.map +0 -1
  144. package/dist/common/project-file-tree.js +0 -212
  145. package/dist/common/project-file-tree.js.map +0 -1
  146. package/dist/common/types/agent-state.d.ts +0 -265
  147. package/dist/common/types/agent-state.d.ts.map +0 -1
  148. package/dist/common/types/agent-state.js +0 -48
  149. package/dist/common/types/agent-state.js.map +0 -1
  150. package/dist/common/types/grant.d.ts +0 -3
  151. package/dist/common/types/grant.d.ts.map +0 -1
  152. package/dist/common/types/grant.js +0 -11
  153. package/dist/common/types/grant.js.map +0 -1
  154. package/dist/common/types/message.d.ts +0 -320
  155. package/dist/common/types/message.d.ts.map +0 -1
  156. package/dist/common/types/message.js +0 -60
  157. package/dist/common/types/message.js.map +0 -1
  158. package/dist/common/types/organization.d.ts +0 -106
  159. package/dist/common/types/organization.d.ts.map +0 -1
  160. package/dist/common/types/organization.js +0 -3
  161. package/dist/common/types/organization.js.map +0 -1
  162. package/dist/common/types/referral.d.ts +0 -3
  163. package/dist/common/types/referral.d.ts.map +0 -1
  164. package/dist/common/types/referral.js +0 -5
  165. package/dist/common/types/referral.js.map +0 -1
  166. package/dist/common/types/tools.d.ts +0 -6
  167. package/dist/common/types/tools.d.ts.map +0 -1
  168. package/dist/common/types/tools.js +0 -3
  169. package/dist/common/types/tools.js.map +0 -1
  170. package/dist/common/types/usage.d.ts +0 -41
  171. package/dist/common/types/usage.d.ts.map +0 -1
  172. package/dist/common/types/usage.js +0 -16
  173. package/dist/common/types/usage.js.map +0 -1
  174. package/dist/common/util/__tests__/messages.test.d.ts +0 -2
  175. package/dist/common/util/__tests__/messages.test.d.ts.map +0 -1
  176. package/dist/common/util/__tests__/messages.test.js +0 -70
  177. package/dist/common/util/__tests__/messages.test.js.map +0 -1
  178. package/dist/common/util/__tests__/saxy.test.d.ts +0 -2
  179. package/dist/common/util/__tests__/saxy.test.d.ts.map +0 -1
  180. package/dist/common/util/__tests__/saxy.test.js +0 -906
  181. package/dist/common/util/__tests__/saxy.test.js.map +0 -1
  182. package/dist/common/util/__tests__/string.test.d.ts +0 -2
  183. package/dist/common/util/__tests__/string.test.d.ts.map +0 -1
  184. package/dist/common/util/__tests__/string.test.js +0 -82
  185. package/dist/common/util/__tests__/string.test.js.map +0 -1
  186. package/dist/common/util/array.d.ts +0 -7
  187. package/dist/common/util/array.d.ts.map +0 -1
  188. package/dist/common/util/array.js +0 -32
  189. package/dist/common/util/array.js.map +0 -1
  190. package/dist/common/util/changes.d.ts +0 -9
  191. package/dist/common/util/changes.d.ts.map +0 -1
  192. package/dist/common/util/changes.js +0 -87
  193. package/dist/common/util/changes.js.map +0 -1
  194. package/dist/common/util/credentials.d.ts +0 -26
  195. package/dist/common/util/credentials.d.ts.map +0 -1
  196. package/dist/common/util/credentials.js +0 -24
  197. package/dist/common/util/credentials.js.map +0 -1
  198. package/dist/common/util/currency.d.ts +0 -15
  199. package/dist/common/util/currency.d.ts.map +0 -1
  200. package/dist/common/util/currency.js +0 -23
  201. package/dist/common/util/currency.js.map +0 -1
  202. package/dist/common/util/dates.d.ts +0 -11
  203. package/dist/common/util/dates.d.ts.map +0 -1
  204. package/dist/common/util/dates.js +0 -22
  205. package/dist/common/util/dates.js.map +0 -1
  206. package/dist/common/util/file.d.ts +0 -171
  207. package/dist/common/util/file.d.ts.map +0 -1
  208. package/dist/common/util/file.js +0 -216
  209. package/dist/common/util/file.js.map +0 -1
  210. package/dist/common/util/git.d.ts +0 -7
  211. package/dist/common/util/git.d.ts.map +0 -1
  212. package/dist/common/util/git.js +0 -81
  213. package/dist/common/util/git.js.map +0 -1
  214. package/dist/common/util/logger.d.ts +0 -9
  215. package/dist/common/util/logger.d.ts.map +0 -1
  216. package/dist/common/util/logger.js +0 -52
  217. package/dist/common/util/logger.js.map +0 -1
  218. package/dist/common/util/lru-cache.d.ts +0 -31
  219. package/dist/common/util/lru-cache.d.ts.map +0 -1
  220. package/dist/common/util/lru-cache.js +0 -68
  221. package/dist/common/util/lru-cache.js.map +0 -1
  222. package/dist/common/util/messages.d.ts +0 -12
  223. package/dist/common/util/messages.d.ts.map +0 -1
  224. package/dist/common/util/messages.js +0 -81
  225. package/dist/common/util/messages.js.map +0 -1
  226. package/dist/common/util/min-heap.d.ts +0 -16
  227. package/dist/common/util/min-heap.d.ts.map +0 -1
  228. package/dist/common/util/min-heap.js +0 -73
  229. package/dist/common/util/min-heap.js.map +0 -1
  230. package/dist/common/util/object.d.ts +0 -19
  231. package/dist/common/util/object.d.ts.map +0 -1
  232. package/dist/common/util/object.js +0 -91
  233. package/dist/common/util/object.js.map +0 -1
  234. package/dist/common/util/patch.d.ts +0 -2
  235. package/dist/common/util/patch.d.ts.map +0 -1
  236. package/dist/common/util/patch.js +0 -215
  237. package/dist/common/util/patch.js.map +0 -1
  238. package/dist/common/util/promise.d.ts +0 -17
  239. package/dist/common/util/promise.d.ts.map +0 -1
  240. package/dist/common/util/promise.js +0 -51
  241. package/dist/common/util/promise.js.map +0 -1
  242. package/dist/common/util/random.d.ts +0 -2
  243. package/dist/common/util/random.d.ts.map +0 -1
  244. package/dist/common/util/random.js +0 -17
  245. package/dist/common/util/random.js.map +0 -1
  246. package/dist/common/util/referral.d.ts +0 -2
  247. package/dist/common/util/referral.d.ts.map +0 -1
  248. package/dist/common/util/referral.js +0 -6
  249. package/dist/common/util/referral.js.map +0 -1
  250. package/dist/common/util/saxy.d.ts +0 -179
  251. package/dist/common/util/saxy.d.ts.map +0 -1
  252. package/dist/common/util/saxy.js +0 -548
  253. package/dist/common/util/saxy.js.map +0 -1
  254. package/dist/common/util/string.d.ts +0 -80
  255. package/dist/common/util/string.d.ts.map +0 -1
  256. package/dist/common/util/string.js +0 -275
  257. package/dist/common/util/string.js.map +0 -1
  258. package/dist/common/util/stripe.d.ts +0 -4
  259. package/dist/common/util/stripe.d.ts.map +0 -1
  260. package/dist/common/util/stripe.js +0 -22
  261. package/dist/common/util/stripe.js.map +0 -1
  262. package/dist/common/util/sync-failure.d.ts +0 -2
  263. package/dist/common/util/sync-failure.d.ts.map +0 -1
  264. package/dist/common/util/sync-failure.js +0 -57
  265. package/dist/common/util/sync-failure.js.map +0 -1
  266. package/dist/common/websockets/websocket-client.d.ts +0 -43
  267. package/dist/common/websockets/websocket-client.d.ts.map +0 -1
  268. package/dist/common/websockets/websocket-client.js +0 -216
  269. package/dist/common/websockets/websocket-client.js.map +0 -1
  270. package/dist/common/websockets/websocket-schema.d.ts +0 -3679
  271. package/dist/common/websockets/websocket-schema.d.ts.map +0 -1
  272. package/dist/common/websockets/websocket-schema.js +0 -55
  273. package/dist/common/websockets/websocket-schema.js.map +0 -1
  274. package/dist/config.d.ts +0 -4
  275. package/dist/config.js +0 -12
  276. package/dist/config.js.map +0 -1
  277. package/dist/create-template-project.d.ts +0 -1
  278. package/dist/create-template-project.js +0 -131
  279. package/dist/create-template-project.js.map +0 -1
  280. package/dist/credentials.d.ts +0 -4
  281. package/dist/credentials.js +0 -44
  282. package/dist/credentials.js.map +0 -1
  283. package/dist/dev-process-manager.d.ts +0 -10
  284. package/dist/dev-process-manager.js +0 -56
  285. package/dist/dev-process-manager.js.map +0 -1
  286. package/dist/display.d.ts +0 -9
  287. package/dist/display.js +0 -137
  288. package/dist/display.js.map +0 -1
  289. package/dist/fingerprint.d.ts +0 -1
  290. package/dist/fingerprint.js +0 -48
  291. package/dist/fingerprint.js.map +0 -1
  292. package/dist/index.d.ts +0 -2
  293. package/dist/index.js +0 -128
  294. package/dist/index.js.map +0 -1
  295. package/dist/json-config/hooks.d.ts +0 -9
  296. package/dist/json-config/hooks.js +0 -60
  297. package/dist/json-config/hooks.js.map +0 -1
  298. package/dist/json-config/parser.d.ts +0 -7
  299. package/dist/json-config/parser.js +0 -54
  300. package/dist/json-config/parser.js.map +0 -1
  301. package/dist/menu.d.ts +0 -14
  302. package/dist/menu.js +0 -344
  303. package/dist/menu.js.map +0 -1
  304. package/dist/project-files.d.ts +0 -104
  305. package/dist/project-files.js +0 -621
  306. package/dist/project-files.js.map +0 -1
  307. package/dist/rage-detectors.d.ts +0 -15
  308. package/dist/rage-detectors.js +0 -55
  309. package/dist/rage-detectors.js.map +0 -1
  310. package/dist/startup-process-handler.d.ts +0 -1
  311. package/dist/startup-process-handler.js +0 -25
  312. package/dist/startup-process-handler.js.map +0 -1
  313. package/dist/terminal/background.d.ts +0 -12
  314. package/dist/terminal/background.js +0 -148
  315. package/dist/terminal/background.js.map +0 -1
  316. package/dist/terminal/base.d.ts +0 -41
  317. package/dist/terminal/base.js +0 -553
  318. package/dist/terminal/base.js.map +0 -1
  319. package/dist/tool-handlers.d.ts +0 -31
  320. package/dist/tool-handlers.js +0 -275
  321. package/dist/tool-handlers.js.map +0 -1
  322. package/dist/types.d.ts +0 -15
  323. package/dist/types.js +0 -3
  324. package/dist/types.js.map +0 -1
  325. package/dist/update-codebuff.d.ts +0 -1
  326. package/dist/update-codebuff.js +0 -169
  327. package/dist/update-codebuff.js.map +0 -1
  328. package/dist/utils/__tests__/background-process-manager.test.d.ts +0 -1
  329. package/dist/utils/__tests__/background-process-manager.test.js +0 -326
  330. package/dist/utils/__tests__/background-process-manager.test.js.map +0 -1
  331. package/dist/utils/__tests__/rage-detector.test.d.ts +0 -1
  332. package/dist/utils/__tests__/rage-detector.test.js +0 -450
  333. package/dist/utils/__tests__/rage-detector.test.js.map +0 -1
  334. package/dist/utils/__tests__/response-example-4-files.txt +0 -621
  335. package/dist/utils/__tests__/tool-renderers.test.d.ts +0 -1
  336. package/dist/utils/__tests__/tool-renderers.test.js +0 -83
  337. package/dist/utils/__tests__/tool-renderers.test.js.map +0 -1
  338. package/dist/utils/__tests__/xml-stream-parser.test.d.ts +0 -1
  339. package/dist/utils/__tests__/xml-stream-parser.test.js +0 -255
  340. package/dist/utils/__tests__/xml-stream-parser.test.js.map +0 -1
  341. package/dist/utils/analytics.d.ts +0 -7
  342. package/dist/utils/analytics.js +0 -132
  343. package/dist/utils/analytics.js.map +0 -1
  344. package/dist/utils/detect-shell.d.ts +0 -1
  345. package/dist/utils/detect-shell.js +0 -65
  346. package/dist/utils/detect-shell.js.map +0 -1
  347. package/dist/utils/git.d.ts +0 -13
  348. package/dist/utils/git.js +0 -143
  349. package/dist/utils/git.js.map +0 -1
  350. package/dist/utils/logger.d.ts +0 -21
  351. package/dist/utils/logger.js +0 -109
  352. package/dist/utils/logger.js.map +0 -1
  353. package/dist/utils/rage-detector.d.ts +0 -32
  354. package/dist/utils/rage-detector.js +0 -143
  355. package/dist/utils/rage-detector.js.map +0 -1
  356. package/dist/utils/spinner.d.ts +0 -13
  357. package/dist/utils/spinner.js +0 -94
  358. package/dist/utils/spinner.js.map +0 -1
  359. package/dist/utils/system-info.d.ts +0 -8
  360. package/dist/utils/system-info.js +0 -22
  361. package/dist/utils/system-info.js.map +0 -1
  362. package/dist/utils/tool-renderers.d.ts +0 -16
  363. package/dist/utils/tool-renderers.js +0 -216
  364. package/dist/utils/tool-renderers.js.map +0 -1
  365. package/dist/utils/with-hang-detection.d.ts +0 -1
  366. package/dist/utils/with-hang-detection.js +0 -18
  367. package/dist/utils/with-hang-detection.js.map +0 -1
  368. package/dist/utils/xml-stream-parser.d.ts +0 -9
  369. package/dist/utils/xml-stream-parser.js +0 -143
  370. package/dist/utils/xml-stream-parser.js.map +0 -1
  371. package/dist/web-scraper.d.ts +0 -3
  372. package/dist/web-scraper.js +0 -59
  373. package/dist/web-scraper.js.map +0 -1
  374. package/dist/workers/checkpoint-worker.d.ts +0 -1
  375. package/dist/workers/checkpoint-worker.js +0 -51
  376. package/dist/workers/checkpoint-worker.js.map +0 -1
  377. package/dist/workers/project-context.d.ts +0 -1
  378. package/dist/workers/project-context.js +0 -27
  379. package/dist/workers/project-context.js.map +0 -1
package/dist/client.js DELETED
@@ -1,1112 +0,0 @@
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.Client = void 0;
7
- const child_process_1 = require("child_process");
8
- const actions_1 = require("./common/actions");
9
- const fs_1 = require("fs");
10
- const os_1 = __importDefault(require("os"));
11
- const constants_1 = require("./common/api-keys/constants");
12
- const constants_2 = require("./common/constants");
13
- const analytics_events_1 = require("./common/constants/analytics-events");
14
- const constants_3 = require("./common/json-config/constants");
15
- const agent_state_1 = require("./common/types/agent-state");
16
- const array_1 = require("./common/util/array");
17
- const string_1 = require("./common/util/string");
18
- const websocket_client_1 = require("./common/websockets/websocket-client");
19
- const path_1 = __importDefault(require("path"));
20
- const picocolors_1 = require("picocolors");
21
- const ts_pattern_1 = require("ts-pattern");
22
- const zod_1 = require("zod");
23
- const package_json_1 = __importDefault(require("../package.json"));
24
- const background_process_manager_1 = require("./background-process-manager");
25
- const browser_runner_1 = require("./browser-runner");
26
- const chat_storage_1 = require("./chat-storage");
27
- const checkpoint_manager_1 = require("./checkpoints/checkpoint-manager");
28
- const cli_1 = require("./cli");
29
- const checkpoint_1 = require("./cli-handlers/checkpoint");
30
- const config_1 = require("./config");
31
- const credentials_1 = require("./credentials");
32
- const fingerprint_1 = require("./fingerprint");
33
- const hooks_1 = require("./json-config/hooks");
34
- const parser_1 = require("./json-config/parser");
35
- const menu_1 = require("./menu");
36
- const project_files_1 = require("./project-files");
37
- const tool_handlers_1 = require("./tool-handlers");
38
- const analytics_1 = require("./utils/analytics");
39
- const git_1 = require("./utils/git");
40
- const logger_1 = require("./utils/logger");
41
- const spinner_1 = require("./utils/spinner");
42
- const tool_renderers_1 = require("./utils/tool-renderers");
43
- const xml_stream_parser_1 = require("./utils/xml-stream-parser");
44
- const web_scraper_1 = require("./web-scraper");
45
- const LOW_BALANCE_THRESHOLD = 100;
46
- const WARNING_CONFIG = {
47
- [constants_2.UserState.LOGGED_OUT]: {
48
- message: () => `Type "login" to unlock full access and get free credits!`,
49
- threshold: 100,
50
- },
51
- [constants_2.UserState.DEPLETED]: {
52
- message: () => [
53
- (0, picocolors_1.red)(`\n❌ You have used all your credits.`),
54
- `Visit ${(0, picocolors_1.bold)((0, picocolors_1.blue)(config_1.websiteUrl + '/usage'))} to add more credits and continue coding.`,
55
- ].join('\n'),
56
- threshold: 100,
57
- },
58
- [constants_2.UserState.CRITICAL]: {
59
- message: (credits) => [
60
- (0, picocolors_1.yellow)(`\n🪫 Only ${(0, picocolors_1.bold)((0, string_1.pluralize)(credits, 'credit'))} remaining!`),
61
- (0, picocolors_1.yellow)(`Visit ${(0, picocolors_1.bold)(config_1.websiteUrl + '/usage')} to add more credits.`),
62
- ].join('\n'),
63
- threshold: 85,
64
- },
65
- [constants_2.UserState.ATTENTION_NEEDED]: {
66
- message: (credits) => [
67
- (0, picocolors_1.yellow)(`\n⚠️ ${(0, picocolors_1.bold)((0, string_1.pluralize)(credits, 'credit'))} remaining. Consider topping up soon.`),
68
- ].join('\n'),
69
- threshold: 75,
70
- },
71
- [constants_2.UserState.GOOD_STANDING]: {
72
- message: () => '',
73
- threshold: 0,
74
- },
75
- };
76
- class Client {
77
- static instance;
78
- webSocket;
79
- freshPrompt;
80
- reconnectWhenNextIdle;
81
- fingerprintId;
82
- costMode;
83
- hadFileChanges = false;
84
- git;
85
- responseComplete = false;
86
- responseBuffer = '';
87
- oneTimeFlags = Object.fromEntries(constants_2.ONE_TIME_LABELS.map((tag) => [tag, false]));
88
- usageData = {
89
- usage: 0,
90
- remainingBalance: null,
91
- balanceBreakdown: undefined,
92
- next_quota_reset: null,
93
- };
94
- pendingTopUpMessageAmount = 0;
95
- fileContext;
96
- lastChanges = [];
97
- filesChangedForHook = [];
98
- agentState;
99
- originalFileVersions = {};
100
- creditsByPromptId = {};
101
- user;
102
- lastWarnedPct = 0;
103
- storedApiKeyTypes = [];
104
- lastToolResults = [];
105
- model;
106
- constructor({ websocketUrl, onWebSocketError, onWebSocketReconnect, freshPrompt, reconnectWhenNextIdle, costMode, git, model, }) {
107
- this.costMode = costMode;
108
- this.model = model;
109
- this.git = git;
110
- this.webSocket = new websocket_client_1.APIRealtimeClient(websocketUrl, onWebSocketError, onWebSocketReconnect);
111
- logger_1.loggerContext.costMode = this.costMode;
112
- logger_1.loggerContext.model = this.model;
113
- this.user = this.getUser();
114
- this.initFingerprintId();
115
- const repoInfoPromise = this.setRepoContext();
116
- this.freshPrompt = freshPrompt;
117
- this.reconnectWhenNextIdle = reconnectWhenNextIdle;
118
- repoInfoPromise.then(() => logger_1.logger.info({
119
- eventId: analytics_events_1.AnalyticsEvent.APP_LAUNCHED,
120
- platform: os_1.default.platform(),
121
- costMode: this.costMode,
122
- model: this.model,
123
- }, 'App launched'));
124
- }
125
- static createInstance(options) {
126
- if (Client.instance) {
127
- throw new Error('Client instance already created. Use getInstance() to retrieve it.');
128
- }
129
- Client.instance = new Client(options);
130
- return Client.instance;
131
- }
132
- static getInstance() {
133
- if (!Client.instance) {
134
- throw new Error('Client instance has not been created yet. Call createInstance() first.');
135
- }
136
- return Client.instance;
137
- }
138
- async exit() {
139
- if (browser_runner_1.activeBrowserRunner) {
140
- browser_runner_1.activeBrowserRunner.shutdown();
141
- }
142
- process.exit(0);
143
- }
144
- initAgentState(projectFileContext) {
145
- this.agentState = (0, agent_state_1.getInitialAgentState)(projectFileContext);
146
- this.fileContext = projectFileContext;
147
- }
148
- async resetContext() {
149
- if (!this.fileContext)
150
- return;
151
- this.initAgentState(this.fileContext);
152
- this.lastToolResults = [];
153
- this.lastChanges = [];
154
- this.creditsByPromptId = {};
155
- checkpoint_manager_1.checkpointManager.clearCheckpoints(true);
156
- (0, chat_storage_1.setMessages)([]);
157
- (0, project_files_1.startNewChat)();
158
- await this.warmContextCache();
159
- }
160
- initFingerprintId() {
161
- if (!this.fingerprintId) {
162
- this.fingerprintId = this.user?.fingerprintId ?? (0, fingerprint_1.calculateFingerprint)();
163
- }
164
- return this.fingerprintId;
165
- }
166
- async setRepoContext() {
167
- const repoMetrics = await (0, git_1.getRepoMetrics)();
168
- logger_1.loggerContext.repoUrl = repoMetrics.repoUrl;
169
- logger_1.loggerContext.repoName = repoMetrics.repoName;
170
- logger_1.loggerContext.repoAgeDays = repoMetrics.ageDays;
171
- logger_1.loggerContext.repoTrackedFiles = repoMetrics.trackedFiles;
172
- logger_1.loggerContext.repoCommits = repoMetrics.commits;
173
- logger_1.loggerContext.repoCommitsLast30Days = repoMetrics.commitsLast30Days;
174
- logger_1.loggerContext.repoAuthorsLast30Days = repoMetrics.authorsLast30Days;
175
- if (this.user) {
176
- (0, analytics_1.identifyUser)(this.user?.id, {
177
- repoName: logger_1.loggerContext.repoName,
178
- repoAgeDays: logger_1.loggerContext.repoAgeDays,
179
- repoTrackedFiles: logger_1.loggerContext.repoTrackedFiles,
180
- repoCommits: logger_1.loggerContext.repoCommits,
181
- repoCommitsLast30Days: logger_1.loggerContext.repoCommitsLast30Days,
182
- repoAuthorsLast30Days: logger_1.loggerContext.repoAuthorsLast30Days,
183
- });
184
- }
185
- }
186
- getUser() {
187
- if (!(0, fs_1.existsSync)(credentials_1.CREDENTIALS_PATH)) {
188
- return;
189
- }
190
- const credentialsFile = (0, fs_1.readFileSync)(credentials_1.CREDENTIALS_PATH, 'utf8');
191
- const user = (0, credentials_1.userFromJson)(credentialsFile);
192
- if (user) {
193
- (0, analytics_1.identifyUser)(user.id, {
194
- email: user.email,
195
- name: user.name,
196
- fingerprintId: this.fingerprintId,
197
- platform: os_1.default.platform(),
198
- version: package_json_1.default.version,
199
- hasGit: (0, git_1.gitCommandIsAvailable)(),
200
- costMode: this.costMode,
201
- model: this.model,
202
- });
203
- logger_1.loggerContext.userId = user.id;
204
- logger_1.loggerContext.userEmail = user.email;
205
- logger_1.loggerContext.fingerprintId = user.fingerprintId;
206
- }
207
- return user;
208
- }
209
- async connect() {
210
- await this.webSocket.connect();
211
- this.setupSubscriptions();
212
- await this.fetchStoredApiKeyTypes();
213
- }
214
- async fetchStoredApiKeyTypes() {
215
- if (!this.user || !this.user.authToken) {
216
- return;
217
- }
218
- this.storedApiKeyTypes = [];
219
- }
220
- async handleAddApiKey(keyType, apiKey) {
221
- if (!this.user || !this.user.authToken) {
222
- console.log((0, picocolors_1.yellow)("Please log in first using 'login'."));
223
- this.freshPrompt();
224
- return;
225
- }
226
- const readableKeyType = constants_1.READABLE_NAME[keyType];
227
- spinner_1.Spinner.get().start('Storing API Key...');
228
- try {
229
- const response = await fetch(`${process.env.NEXT_PUBLIC_APP_URL}/api/api-keys`, {
230
- method: 'POST',
231
- headers: {
232
- 'Content-Type': 'application/json',
233
- Cookie: `next-auth.session-token=${this.user.authToken}`,
234
- },
235
- body: JSON.stringify({
236
- keyType,
237
- apiKey,
238
- authToken: this.user.authToken,
239
- }),
240
- });
241
- spinner_1.Spinner.get().stop();
242
- const respJson = await response.json();
243
- if (response.ok) {
244
- console.log((0, picocolors_1.green)(`Successfully added ${readableKeyType} API key.`));
245
- if (!this.storedApiKeyTypes.includes(keyType)) {
246
- this.storedApiKeyTypes.push(keyType);
247
- }
248
- }
249
- else {
250
- throw new Error(respJson.message);
251
- }
252
- }
253
- catch (e) {
254
- spinner_1.Spinner.get().stop();
255
- const error = e;
256
- logger_1.logger.error({
257
- errorMessage: error.message,
258
- errorStack: error.stack,
259
- keyType,
260
- }, 'Error adding API key');
261
- console.error((0, picocolors_1.red)('Error adding API key: ' + error.message));
262
- }
263
- finally {
264
- this.freshPrompt();
265
- }
266
- }
267
- async handleReferralCode(referralCode) {
268
- if (this.user) {
269
- try {
270
- const redeemReferralResp = await fetch(`${process.env.NEXT_PUBLIC_APP_URL}/api/referrals`, {
271
- method: 'POST',
272
- headers: {
273
- 'Content-Type': 'application/json',
274
- Cookie: `next-auth.session-token=${this.user.authToken};`,
275
- },
276
- body: JSON.stringify({
277
- referralCode,
278
- authToken: this.user.authToken,
279
- }),
280
- });
281
- const respJson = await redeemReferralResp.json();
282
- if (redeemReferralResp.ok) {
283
- console.log([
284
- (0, picocolors_1.green)(`Noice, you've earned an extra ${respJson.credits_redeemed} credits!`),
285
- `(pssst: you can also refer new users and earn ${constants_2.CREDITS_REFERRAL_BONUS} credits for each referral at: ${process.env.NEXT_PUBLIC_APP_URL}/referrals)`,
286
- ].join('\n'));
287
- this.getUsage();
288
- }
289
- else {
290
- throw new Error(respJson.error);
291
- }
292
- }
293
- catch (e) {
294
- const error = e;
295
- logger_1.logger.error({
296
- errorMessage: error.message,
297
- errorStack: error.stack,
298
- referralCode,
299
- }, 'Error redeeming referral code');
300
- console.error((0, picocolors_1.red)('Error: ' + error.message));
301
- this.freshPrompt();
302
- }
303
- }
304
- else {
305
- await this.login(referralCode);
306
- }
307
- }
308
- async logout() {
309
- if (this.user) {
310
- try {
311
- const response = await fetch(`${config_1.websiteUrl}/api/auth/cli/logout`, {
312
- method: 'POST',
313
- headers: { 'Content-Type': 'application/json' },
314
- body: JSON.stringify({
315
- authToken: this.user.authToken,
316
- userId: this.user.id,
317
- fingerprintId: this.user.fingerprintId,
318
- fingerprintHash: this.user.fingerprintHash,
319
- }),
320
- });
321
- if (!response.ok) {
322
- const error = await response.text();
323
- console.error((0, picocolors_1.red)('Failed to log out: ' + error));
324
- logger_1.logger.error({
325
- errorMessage: 'Failed to log out: ' + error,
326
- }, 'Failed to log out');
327
- }
328
- try {
329
- (0, fs_1.unlinkSync)(credentials_1.CREDENTIALS_PATH);
330
- console.log(`You (${this.user.name}) have been logged out.`);
331
- this.user = undefined;
332
- this.pendingTopUpMessageAmount = 0;
333
- this.usageData = {
334
- usage: 0,
335
- remainingBalance: null,
336
- balanceBreakdown: undefined,
337
- next_quota_reset: null,
338
- };
339
- this.oneTimeFlags = Object.fromEntries(constants_2.ONE_TIME_LABELS.map((tag) => [tag, false]));
340
- }
341
- catch (error) {
342
- logger_1.logger.error({
343
- errorMessage: error instanceof Error ? error.message : String(error),
344
- errorStack: error instanceof Error ? error.stack : undefined,
345
- }, 'Error removing credentials file');
346
- console.error('Error removing credentials file:', error);
347
- }
348
- }
349
- catch (error) {
350
- logger_1.logger.error({
351
- errorMessage: error instanceof Error ? error.message : String(error),
352
- errorStack: error instanceof Error ? error.stack : undefined,
353
- msg: 'Error during logout',
354
- }, 'Error during logout');
355
- console.error('Error during logout:', error);
356
- }
357
- }
358
- }
359
- async login(referralCode) {
360
- if (this.user) {
361
- console.log(`You are currently logged in as ${this.user.name}. Please enter "logout" first if you want to login as a different user.`);
362
- this.freshPrompt();
363
- return;
364
- }
365
- try {
366
- const response = await fetch(`${config_1.websiteUrl}/api/auth/cli/code`, {
367
- method: 'POST',
368
- headers: { 'Content-Type': 'application/json' },
369
- body: JSON.stringify({
370
- fingerprintId: await this.fingerprintId,
371
- referralCode,
372
- }),
373
- });
374
- if (!response.ok) {
375
- const error = await response.text();
376
- console.error((0, picocolors_1.red)('Login code request failed: ' + error));
377
- logger_1.logger.error({
378
- errorMessage: 'Login code request failed: ' + error,
379
- }, 'Login code request failed');
380
- this.freshPrompt();
381
- return;
382
- }
383
- const { loginUrl, fingerprintHash, expiresAt } = await response.json();
384
- const responseToUser = [
385
- '\n',
386
- `Press ${(0, picocolors_1.blue)('ENTER')} to open your browser and finish logging in...`,
387
- ];
388
- console.log(responseToUser.join('\n'));
389
- let shouldRequestLogin = true;
390
- cli_1.CLI.getInstance().rl.once('line', () => {
391
- if (shouldRequestLogin) {
392
- (0, child_process_1.spawn)(process.platform === 'win32' ? 'start' : 'open', [loginUrl]);
393
- console.log("Opened a browser window to log you in! If it doesn't open automatically, you can click this link:");
394
- console.log();
395
- console.log((0, picocolors_1.blue)((0, picocolors_1.bold)((0, picocolors_1.underline)(loginUrl))));
396
- }
397
- });
398
- const initialTime = Date.now();
399
- const pollInterval = setInterval(async () => {
400
- if (Date.now() - initialTime > 5 * 60 * 1000 && shouldRequestLogin) {
401
- shouldRequestLogin = false;
402
- console.log('Unable to login. Please try again by typing "login" in the terminal.');
403
- this.freshPrompt();
404
- clearInterval(pollInterval);
405
- return;
406
- }
407
- if (!shouldRequestLogin) {
408
- clearInterval(pollInterval);
409
- return;
410
- }
411
- try {
412
- const fingerprintId = await this.fingerprintId;
413
- const statusResponse = await fetch(`${config_1.websiteUrl}/api/auth/cli/status?fingerprintId=${fingerprintId}&fingerprintHash=${fingerprintHash}&expiresAt=${expiresAt}`);
414
- if (!statusResponse.ok) {
415
- if (statusResponse.status !== 401) {
416
- // Ignore 401s during polling
417
- const text = await statusResponse.text();
418
- console.error('Error checking login status:', text);
419
- logger_1.logger.error({
420
- errorMessage: text,
421
- errorStatus: statusResponse.status,
422
- errorStatusText: statusResponse.statusText,
423
- msg: 'Error checking login status',
424
- }, 'Error checking login status');
425
- }
426
- return;
427
- }
428
- const { user, message } = await statusResponse.json();
429
- if (user) {
430
- shouldRequestLogin = false;
431
- this.user = user;
432
- (0, analytics_1.identifyUser)(user.id, {
433
- email: user.email,
434
- name: user.name,
435
- fingerprintId: fingerprintId,
436
- platform: os_1.default.platform(),
437
- version: package_json_1.default.version,
438
- hasGit: (0, git_1.gitCommandIsAvailable)(),
439
- });
440
- logger_1.loggerContext.userId = user.id;
441
- logger_1.loggerContext.userEmail = user.email;
442
- logger_1.loggerContext.fingerprintId = fingerprintId;
443
- logger_1.logger.info({
444
- eventId: analytics_events_1.AnalyticsEvent.LOGIN,
445
- }, 'login');
446
- const credentialsPathDir = path_1.default.dirname(credentials_1.CREDENTIALS_PATH);
447
- (0, fs_1.mkdirSync)(credentialsPathDir, { recursive: true });
448
- (0, fs_1.writeFileSync)(credentials_1.CREDENTIALS_PATH, JSON.stringify({ default: user }));
449
- const referralLink = `${process.env.NEXT_PUBLIC_APP_URL}/referrals`;
450
- const responseToUser = [
451
- 'Authentication successful! 🎉',
452
- (0, picocolors_1.bold)(`Hey there, ${user.name}.`),
453
- `Refer new users and earn ${constants_2.CREDITS_REFERRAL_BONUS} credits per month: ${(0, picocolors_1.blueBright)(referralLink)}`,
454
- ];
455
- console.log('\n' + responseToUser.join('\n'));
456
- this.lastWarnedPct = 0;
457
- this.oneTimeFlags = Object.fromEntries(constants_2.ONE_TIME_LABELS.map((tag) => [tag, false]));
458
- (0, menu_1.displayGreeting)(this.costMode, null);
459
- clearInterval(pollInterval);
460
- this.freshPrompt();
461
- }
462
- }
463
- catch (error) {
464
- console.error('Error checking login status:', error);
465
- logger_1.logger.error({
466
- errorMessage: error instanceof Error ? error.message : String(error),
467
- errorStack: error instanceof Error ? error.stack : undefined,
468
- msg: 'Error checking login status',
469
- }, 'Error checking login status');
470
- }
471
- }, 5000);
472
- }
473
- catch (error) {
474
- console.error('Error during login:', error);
475
- logger_1.logger.error({
476
- errorMessage: error instanceof Error ? error.message : String(error),
477
- errorStack: error instanceof Error ? error.stack : undefined,
478
- msg: 'Error during login',
479
- }, 'Error during login');
480
- this.freshPrompt();
481
- }
482
- }
483
- setUsage(usageData) {
484
- this.usageData = usageData;
485
- }
486
- reconnect() {
487
- this.webSocket.forceReconnect();
488
- }
489
- setCostMode(costMode) {
490
- this.costMode = costMode;
491
- logger_1.loggerContext.costMode = this.costMode;
492
- }
493
- close() {
494
- this.webSocket.close();
495
- }
496
- setupSubscriptions() {
497
- this.webSocket.subscribe('action-error', (action) => {
498
- if (action.error === 'Insufficient credits') {
499
- console.error(['', (0, picocolors_1.red)(`Error: ${action.message}`)].join('\n'));
500
- logger_1.logger.info({
501
- errorMessage: action.message,
502
- }, 'Action error insufficient credits');
503
- console.error(`Visit ${(0, picocolors_1.blue)((0, picocolors_1.bold)(process.env.NEXT_PUBLIC_APP_URL + '/usage'))} to add credits.`);
504
- }
505
- else if (action.error === 'Auto top-up disabled') {
506
- console.error(['', (0, picocolors_1.red)(`Error: ${action.message}`)].join('\n'));
507
- logger_1.logger.info({
508
- errorMessage: action.message,
509
- }, 'Auto top-up disabled error');
510
- console.error((0, picocolors_1.yellow)(`Visit ${(0, picocolors_1.blue)((0, picocolors_1.bold)(process.env.NEXT_PUBLIC_APP_URL + '/usage'))} to update your payment settings.`));
511
- }
512
- else {
513
- console.error(['', (0, picocolors_1.red)(`Error: ${action.message}`)].join('\n'));
514
- logger_1.logger.error({
515
- errorMessage: action.message,
516
- }, 'Unknown action error');
517
- }
518
- this.freshPrompt();
519
- return;
520
- });
521
- this.webSocket.subscribe('read-files', (a) => {
522
- const { filePaths, requestId } = a;
523
- const files = (0, project_files_1.getFiles)(filePaths);
524
- this.webSocket.sendAction({
525
- type: 'read-files-response',
526
- files,
527
- requestId,
528
- });
529
- });
530
- this.webSocket.subscribe('npm-version-status', (action) => {
531
- const { isUpToDate } = action;
532
- if (!isUpToDate) {
533
- console.warn((0, picocolors_1.yellow)(`\nThere's a new version of Codebuff! Please update to ensure proper functionality.\nUpdate now by running: npm install -g codebuff`));
534
- }
535
- });
536
- this.webSocket.subscribe('message-cost-response', (action) => {
537
- const parsedAction = actions_1.MessageCostResponseSchema.safeParse(action);
538
- if (!parsedAction.success)
539
- return;
540
- const response = parsedAction.data;
541
- // Store credits used for this prompt
542
- if (!this.creditsByPromptId[response.promptId]) {
543
- this.creditsByPromptId[response.promptId] = [];
544
- }
545
- this.creditsByPromptId[response.promptId].push(response.credits);
546
- });
547
- this.webSocket.subscribe('usage-response', (action) => {
548
- const parsedAction = actions_1.UsageReponseSchema.safeParse(action);
549
- if (!parsedAction.success) {
550
- console.error((0, picocolors_1.red)('Received invalid usage data from server:'), parsedAction.error.errors);
551
- logger_1.logger.error({
552
- errorMessage: 'Received invalid usage data from server',
553
- errors: parsedAction.error.errors,
554
- }, 'Invalid usage data from server');
555
- return;
556
- }
557
- this.setUsage(parsedAction.data);
558
- // Store auto-topup amount if present, to be displayed when returning control to user
559
- if (parsedAction.data.autoTopupAdded) {
560
- this.pendingTopUpMessageAmount += parsedAction.data.autoTopupAdded;
561
- }
562
- // Only show warning if the response is complete
563
- if (this.responseComplete) {
564
- this.showUsageWarning();
565
- }
566
- });
567
- // Used to handle server restarts gracefully
568
- this.webSocket.subscribe('request-reconnect', () => {
569
- this.reconnectWhenNextIdle();
570
- });
571
- }
572
- showUsageWarning() {
573
- // Determine user state based on login status and credit balance
574
- const state = (0, ts_pattern_1.match)({
575
- isLoggedIn: !!this.user,
576
- credits: this.usageData.remainingBalance,
577
- })
578
- .with({ isLoggedIn: false }, () => constants_2.UserState.LOGGED_OUT)
579
- .with({ credits: ts_pattern_1.P.number.gte(100) }, () => constants_2.UserState.GOOD_STANDING)
580
- .with({ credits: ts_pattern_1.P.number.gte(20) }, () => constants_2.UserState.ATTENTION_NEEDED)
581
- .with({ credits: ts_pattern_1.P.number.gte(1) }, () => constants_2.UserState.CRITICAL)
582
- .otherwise(() => constants_2.UserState.DEPLETED);
583
- const config = WARNING_CONFIG[state];
584
- // Reset warning percentage if in good standing
585
- if (state === constants_2.UserState.GOOD_STANDING) {
586
- this.lastWarnedPct = 0;
587
- return;
588
- }
589
- // Show warning if we haven't warned at this threshold yet
590
- if (this.lastWarnedPct < config.threshold &&
591
- this.usageData.remainingBalance) {
592
- const message = config.message(this.usageData.remainingBalance);
593
- console.warn(message);
594
- this.lastWarnedPct = config.threshold;
595
- this.freshPrompt();
596
- }
597
- }
598
- async generateCommitMessage(stagedChanges) {
599
- return new Promise(async (resolve, reject) => {
600
- const unsubscribe = this.webSocket.subscribe('commit-message-response', (action) => {
601
- unsubscribe();
602
- resolve(action.commitMessage);
603
- });
604
- this.webSocket.sendAction({
605
- type: 'generate-commit-message',
606
- fingerprintId: await this.fingerprintId,
607
- authToken: this.user?.authToken,
608
- stagedChanges,
609
- });
610
- });
611
- }
612
- async sendUserInput(prompt) {
613
- if (!this.agentState) {
614
- throw new Error('Agent state not initialized');
615
- }
616
- (0, chat_storage_1.setMessages)([
617
- ...this.agentState.messageHistory,
618
- {
619
- role: 'user',
620
- content: prompt,
621
- },
622
- ]);
623
- this.agentState.agentStepsRemaining = (0, parser_1.loadCodebuffConfig)().maxAgentSteps;
624
- this.lastChanges = [];
625
- this.filesChangedForHook = [];
626
- const userInputId = `mc-input-` + Math.random().toString(36).substring(2, 15);
627
- logger_1.loggerContext.clientRequestId = userInputId;
628
- const startTime = Date.now(); // Capture start time
629
- // Check if we're in manager mode using CLI's isManagerMode flag
630
- const cli = cli_1.CLI.getInstance();
631
- const f = this.subscribeToResponse.bind(this);
632
- const { responsePromise, stopResponse } = f((chunk) => {
633
- spinner_1.Spinner.get().stop();
634
- process.stdout.write(chunk);
635
- }, userInputId, () => {
636
- spinner_1.Spinner.get().stop();
637
- process.stdout.write('\n' + (0, picocolors_1.green)((0, picocolors_1.underline)('Codebuff') + ': '));
638
- }, prompt, startTime);
639
- const urls = (0, web_scraper_1.parseUrlsFromContent)(prompt);
640
- const scrapedBlocks = await (0, web_scraper_1.getScrapedContentBlocks)(urls);
641
- const scrapedContent = scrapedBlocks.length > 0 ? scrapedBlocks.join('\n\n') + '\n\n' : '';
642
- // Append process updates to existing tool results
643
- const toolResults = (0, array_1.buildArray)(...(this.lastToolResults || []), ...(0, background_process_manager_1.getBackgroundProcessUpdates)(), scrapedContent && {
644
- toolName: 'web-scraper',
645
- toolCallId: (0, string_1.generateCompactId)(),
646
- result: scrapedContent,
647
- });
648
- spinner_1.Spinner.get().start('Thinking...');
649
- const action = {
650
- promptId: userInputId,
651
- prompt,
652
- agentState: this.agentState,
653
- toolResults,
654
- fingerprintId: await this.fingerprintId,
655
- authToken: this.user?.authToken,
656
- costMode: this.costMode,
657
- model: this.model,
658
- cwd: (0, project_files_1.getWorkingDirectory)(),
659
- repoUrl: logger_1.loggerContext.repoUrl,
660
- repoName: logger_1.loggerContext.repoName,
661
- };
662
- this.webSocket.sendAction({
663
- type: 'prompt',
664
- ...action,
665
- });
666
- return {
667
- responsePromise,
668
- stopResponse,
669
- };
670
- }
671
- subscribeToResponse(onChunk, userInputId, onStreamStart, prompt, startTime) {
672
- const rawChunkBuffer = [];
673
- this.responseBuffer = '';
674
- let streamStarted = false;
675
- let responseStopped = false;
676
- let resolveResponse;
677
- let rejectResponse;
678
- let unsubscribeChunks;
679
- let unsubscribeComplete;
680
- const responsePromise = new Promise((resolve, reject) => {
681
- resolveResponse = resolve;
682
- rejectResponse = reject;
683
- });
684
- const stopResponse = () => {
685
- responseStopped = true;
686
- unsubscribeChunks();
687
- unsubscribeComplete();
688
- const additionalMessages = [
689
- { role: 'user', content: prompt },
690
- {
691
- role: 'user',
692
- content: `<system><assistant_message>${rawChunkBuffer.join('')}</assistant_message>[RESPONSE_CANCELED_BY_USER]</system>`,
693
- },
694
- ];
695
- // Update the agent state with just the assistant's response
696
- const { messageHistory } = this.agentState;
697
- const newMessages = [...messageHistory, ...additionalMessages];
698
- this.agentState = {
699
- ...this.agentState,
700
- messageHistory: newMessages,
701
- };
702
- (0, chat_storage_1.setMessages)(newMessages);
703
- resolveResponse({
704
- type: 'prompt-response',
705
- promptId: userInputId,
706
- agentState: this.agentState,
707
- toolCalls: [],
708
- toolResults: [],
709
- wasStoppedByUser: true,
710
- });
711
- };
712
- const xmlStreamParser = (0, xml_stream_parser_1.createXMLStreamParser)(tool_renderers_1.toolRenderers, (chunk) => {
713
- onChunk(chunk);
714
- });
715
- unsubscribeChunks = this.webSocket.subscribe('response-chunk', (a) => {
716
- if (a.userInputId !== userInputId)
717
- return;
718
- const { chunk } = a;
719
- rawChunkBuffer.push(chunk);
720
- const trimmed = chunk.trim();
721
- for (const tag of constants_2.ONE_TIME_TAGS) {
722
- if (trimmed.startsWith(`<${tag}>`) && trimmed.endsWith(`</${tag}>`)) {
723
- if (this.oneTimeFlags[tag]) {
724
- return;
725
- }
726
- spinner_1.Spinner.get().stop();
727
- const warningMessage = trimmed
728
- .replace(`<${tag}>`, '')
729
- .replace(`</${tag}>`, '');
730
- process.stdout.write((0, picocolors_1.yellow)(`\n\n${warningMessage}\n\n`));
731
- this.oneTimeFlags[tag] = true;
732
- return;
733
- }
734
- }
735
- if (chunk && chunk.trim()) {
736
- if (!streamStarted && chunk.trim()) {
737
- streamStarted = true;
738
- onStreamStart();
739
- }
740
- }
741
- try {
742
- xmlStreamParser.write(chunk, 'utf8');
743
- }
744
- catch (e) {
745
- logger_1.logger.error({
746
- errorMessage: e instanceof Error ? e.message : String(e),
747
- errorStack: e instanceof Error ? e.stack : undefined,
748
- chunk,
749
- }, 'Error writing chunk to XML stream parser');
750
- }
751
- });
752
- let stepsCount = 0;
753
- let toolCallsCount = 0;
754
- unsubscribeComplete = this.webSocket.subscribe('prompt-response', async (action) => {
755
- const parsedAction = actions_1.PromptResponseSchema.safeParse(action);
756
- if (!parsedAction.success) {
757
- const message = [
758
- 'Received invalid prompt response from server:',
759
- JSON.stringify(parsedAction.error.errors),
760
- 'If this issues persists, please contact support@codebuff.com',
761
- ].join('\n');
762
- console.error(message);
763
- logger_1.logger.error({
764
- errorMessage: message,
765
- action,
766
- eventId: analytics_events_1.AnalyticsEvent.MALFORMED_PROMPT_RESPONSE,
767
- }, 'Malformed prompt response');
768
- return;
769
- }
770
- if (action.promptId !== userInputId)
771
- return;
772
- const a = parsedAction.data;
773
- let isComplete = false;
774
- spinner_1.Spinner.get().stop();
775
- this.agentState = a.agentState;
776
- const toolResults = [...a.toolResults];
777
- for (const toolCall of a.toolCalls) {
778
- try {
779
- if (toolCall.toolName === 'end_turn') {
780
- this.responseComplete = true;
781
- isComplete = true;
782
- continue;
783
- }
784
- if (toolCall.toolName === 'write_file' ||
785
- toolCall.toolName === 'str_replace' ||
786
- toolCall.toolName === 'create_plan') {
787
- await (0, checkpoint_1.waitForPreviousCheckpoint)();
788
- // Save lastChanges for `diff` command
789
- this.lastChanges.push(actions_1.FileChangeSchema.parse(toolCall.args));
790
- this.hadFileChanges = true;
791
- // Track the changed file path
792
- this.filesChangedForHook.push(toolCall.args.path);
793
- }
794
- if (toolCall.toolName === 'run_terminal_command') {
795
- await (0, checkpoint_1.waitForPreviousCheckpoint)();
796
- if (toolCall.args.mode === 'user') {
797
- // Special case: when terminal command is run as a user command, then no need to reprompt assistant.
798
- this.responseComplete = true;
799
- isComplete = true;
800
- }
801
- if (toolCall.args.mode === 'assistant' &&
802
- toolCall.args.process_type === 'BACKGROUND') {
803
- this.oneTimeFlags[constants_2.SHOULD_ASK_CONFIG] = true;
804
- }
805
- }
806
- const toolResult = await (0, tool_handlers_1.handleToolCall)(toolCall);
807
- toolResults.push(toolResult);
808
- }
809
- catch (error) {
810
- logger_1.logger.error({
811
- errorMessage: error instanceof Error ? error.message : String(error),
812
- errorStack: error instanceof Error ? error.stack : undefined,
813
- toolCallName: toolCall.toolName,
814
- toolCallId: toolCall.toolCallId,
815
- }, 'Error parsing tool call');
816
- console.error('\n\n' +
817
- (0, picocolors_1.red)(`Error parsing tool call ${toolCall.toolName}:\n${error}`) +
818
- '\n');
819
- }
820
- }
821
- stepsCount++;
822
- toolCallsCount += a.toolCalls.length;
823
- if (a.toolCalls.length === 0 && a.toolResults.length === 0) {
824
- this.responseComplete = true;
825
- isComplete = true;
826
- }
827
- console.log('\n');
828
- // If we had any file changes, update the project context
829
- if (this.hadFileChanges) {
830
- this.fileContext = await (0, project_files_1.getProjectFileContext)((0, project_files_1.getProjectRoot)(), {});
831
- }
832
- if (this.filesChangedForHook.length > 0 && isComplete) {
833
- // Run file change hooks with the actual changed files
834
- const { toolResults: hookToolResults, someHooksFailed } = await (0, hooks_1.runFileChangeHooks)(this.filesChangedForHook);
835
- toolResults.push(...hookToolResults);
836
- if (someHooksFailed) {
837
- isComplete = false;
838
- }
839
- this.filesChangedForHook = [];
840
- }
841
- if (!isComplete) {
842
- // Append process updates to existing tool results
843
- toolResults.push(...(0, background_process_manager_1.getBackgroundProcessUpdates)());
844
- this.agentState.fileContext.cwd = (0, project_files_1.getWorkingDirectory)();
845
- // Continue the prompt with the tool results.
846
- spinner_1.Spinner.get().start('Thinking...');
847
- const continuePromptAction = {
848
- type: 'prompt',
849
- promptId: userInputId,
850
- prompt: undefined,
851
- agentState: this.agentState,
852
- toolResults,
853
- fingerprintId: await this.fingerprintId,
854
- authToken: this.user?.authToken,
855
- costMode: this.costMode,
856
- model: this.model,
857
- repoUrl: logger_1.loggerContext.repoUrl,
858
- };
859
- this.webSocket.sendAction(continuePromptAction);
860
- return;
861
- }
862
- const endTime = Date.now();
863
- const latencyMs = endTime - startTime;
864
- (0, analytics_1.trackEvent)(analytics_events_1.AnalyticsEvent.USER_INPUT_COMPLETE, {
865
- userInputId,
866
- latencyMs,
867
- stepsCount,
868
- toolCallsCount,
869
- });
870
- this.lastToolResults = toolResults;
871
- xmlStreamParser.end();
872
- askConfig: if (this.oneTimeFlags[constants_2.SHOULD_ASK_CONFIG] &&
873
- !this.oneTimeFlags[constants_2.ASKED_CONFIG]) {
874
- this.oneTimeFlags[constants_2.ASKED_CONFIG] = true;
875
- if ((0, fs_1.existsSync)(path_1.default.join((0, project_files_1.getProjectRoot)(), constants_3.codebuffConfigFile))) {
876
- break askConfig;
877
- }
878
- console.log('\n\n' +
879
- (0, picocolors_1.yellow)(`✨ Recommended: run the 'init' command in order to create a configuration file!
880
-
881
- If you would like background processes (like this one) to run automatically whenever Codebuff starts, creating a ${constants_3.codebuffConfigFile} config file can improve your workflow.
882
- Go to https://www.codebuff.com/config for more information.`) +
883
- '\n');
884
- }
885
- if (this.agentState) {
886
- (0, chat_storage_1.setMessages)(this.agentState.messageHistory);
887
- }
888
- // Show total credits used for this prompt if significant
889
- const credits = this.creditsByPromptId[userInputId]?.reduce((a, b) => a + b, 0) ?? 0;
890
- if (credits >= constants_2.REQUEST_CREDIT_SHOW_THRESHOLD) {
891
- console.log(`\n\n${(0, string_1.pluralize)(credits, 'credit')} used for this request.`);
892
- }
893
- if (this.hadFileChanges) {
894
- let checkpointAddendum = '';
895
- try {
896
- checkpointAddendum = ` or "checkpoint ${checkpoint_manager_1.checkpointManager.getLatestCheckpoint().id}" to revert`;
897
- }
898
- catch (error) {
899
- // No latest checkpoint, don't show addendum
900
- logger_1.logger.info({
901
- errorMessage: error instanceof Error ? error.message : String(error),
902
- errorStack: error instanceof Error ? error.stack : undefined,
903
- }, 'No latest checkpoint for addendum');
904
- }
905
- console.log(`\n\nComplete! Type "diff" to review changes${checkpointAddendum}.\n`);
906
- this.hadFileChanges = false;
907
- this.freshPrompt();
908
- }
909
- unsubscribeChunks();
910
- unsubscribeComplete();
911
- resolveResponse({ ...a, wasStoppedByUser: false });
912
- });
913
- // Reset flags at the start of each response
914
- this.responseComplete = false;
915
- return {
916
- responsePromise,
917
- stopResponse,
918
- };
919
- }
920
- async getUsage() {
921
- try {
922
- // Check for organization coverage first
923
- const coverage = await this.checkRepositoryCoverage();
924
- const response = await fetch(`${config_1.backendUrl}/api/usage`, {
925
- method: 'POST',
926
- headers: {
927
- 'Content-Type': 'application/json',
928
- },
929
- body: JSON.stringify({
930
- fingerprintId: await this.fingerprintId,
931
- authToken: this.user?.authToken,
932
- ...(coverage.isCovered &&
933
- coverage.organizationId && { orgId: coverage.organizationId }),
934
- }),
935
- });
936
- const data = await response.json();
937
- // Use zod schema to validate response
938
- const parsedResponse = actions_1.UsageReponseSchema.parse(data);
939
- if (data.type === 'action-error') {
940
- console.error((0, picocolors_1.red)(data.message));
941
- logger_1.logger.error({
942
- errorMessage: data.message,
943
- }, 'Action error');
944
- return;
945
- }
946
- this.setUsage(parsedResponse);
947
- // Calculate session usage and total for display
948
- const totalCreditsUsedThisSession = Object.values(this.creditsByPromptId)
949
- .flat()
950
- .reduce((sum, credits) => sum + credits, 0);
951
- let sessionUsageMessage = `Session usage: ${totalCreditsUsedThisSession.toLocaleString()}`;
952
- if (this.usageData.remainingBalance !== null) {
953
- const remainingColor = this.usageData.remainingBalance === null
954
- ? picocolors_1.yellow
955
- : this.usageData.remainingBalance <= 0
956
- ? picocolors_1.red
957
- : this.usageData.remainingBalance <= LOW_BALANCE_THRESHOLD
958
- ? picocolors_1.red
959
- : picocolors_1.green;
960
- sessionUsageMessage += `. Credits Remaining: ${remainingColor(this.usageData.remainingBalance.toLocaleString())}`;
961
- }
962
- else {
963
- sessionUsageMessage += '.';
964
- }
965
- console.log(sessionUsageMessage);
966
- if (coverage.isCovered && coverage.organizationName) {
967
- // When covered by an organization, show organization information
968
- console.log((0, picocolors_1.green)(`🏢 Your usage in this repository is covered by ${(0, picocolors_1.bold)(coverage.organizationName)}.`));
969
- // Try to use organizationSlug from the coverage response
970
- if (coverage.organizationSlug) {
971
- const orgUsageLink = `${config_1.websiteUrl}/orgs/${coverage.organizationSlug}`;
972
- console.log(`View your organization's usage details: ${(0, picocolors_1.underline)((0, picocolors_1.blue)(orgUsageLink))}`);
973
- }
974
- }
975
- else {
976
- // Only show personal usage details when not covered by an organization
977
- const usageLink = `${config_1.websiteUrl}/usage`; // Personal usage link
978
- // Only show personal credit renewal if not covered by an organization
979
- if (this.usageData.next_quota_reset) {
980
- const resetDate = new Date(this.usageData.next_quota_reset);
981
- const today = new Date();
982
- const isToday = resetDate.toDateString() === today.toDateString();
983
- const dateDisplay = isToday
984
- ? resetDate.toLocaleString() // Show full date and time for today
985
- : resetDate.toLocaleDateString(); // Just show date otherwise
986
- console.log(`Free credits will renew on ${dateDisplay}. Details: ${(0, picocolors_1.underline)((0, picocolors_1.blue)(usageLink))}`);
987
- }
988
- this.showUsageWarning();
989
- }
990
- }
991
- catch (error) {
992
- logger_1.logger.error({
993
- errorMessage: error instanceof Error ? error.message : String(error),
994
- errorStack: error instanceof Error ? error.stack : undefined,
995
- }, 'Error checking usage');
996
- console.error((0, picocolors_1.red)(`Error checking usage: Please reach out to ${process.env.NEXT_PUBLIC_SUPPORT_EMAIL} for help.`));
997
- // Check if it's a ZodError for more specific feedback
998
- if (error instanceof zod_1.z.ZodError) {
999
- console.error((0, picocolors_1.red)('Data validation failed:'), error.errors);
1000
- logger_1.logger.error({
1001
- errorMessage: 'Data validation failed',
1002
- errors: error.errors,
1003
- }, 'Data validation failed');
1004
- }
1005
- else {
1006
- console.error(error);
1007
- logger_1.logger.error({
1008
- errorMessage: error instanceof Error ? error.message : String(error),
1009
- errorStack: error instanceof Error ? error.stack : undefined,
1010
- }, 'Error checking usage');
1011
- }
1012
- }
1013
- finally {
1014
- this.freshPrompt();
1015
- }
1016
- }
1017
- async warmContextCache() {
1018
- const fileContext = await (0, project_files_1.getProjectFileContext)((0, project_files_1.getProjectRoot)(), {});
1019
- if (!fileContext) {
1020
- throw new Error('Failed to initialize project file context');
1021
- }
1022
- this.webSocket.subscribe('init-response', (a) => {
1023
- const parsedAction = actions_1.InitResponseSchema.safeParse(a);
1024
- if (!parsedAction.success)
1025
- return;
1026
- // Set initial usage data from the init response
1027
- this.setUsage(parsedAction.data);
1028
- });
1029
- const initAction = {
1030
- type: 'init',
1031
- fingerprintId: await this.fingerprintId,
1032
- authToken: this.user?.authToken,
1033
- fileContext,
1034
- // Add repoUrl here as per the diff for client.ts
1035
- repoUrl: logger_1.loggerContext.repoUrl,
1036
- };
1037
- this.webSocket.sendAction(initAction);
1038
- await this.fetchStoredApiKeyTypes();
1039
- }
1040
- /**
1041
- * Checks if the current repository is covered by an organization.
1042
- * @param remoteUrl Optional remote URL. If not provided, will try to get from git config.
1043
- * @returns Promise<{ isCovered: boolean; organizationName?: string; organizationId?: string; organizationSlug?: string; error?: string }>
1044
- */
1045
- async checkRepositoryCoverage(remoteUrl) {
1046
- try {
1047
- // Always use getRepoMetrics to get repo info, passing remoteUrl if provided
1048
- let repoMetrics;
1049
- try {
1050
- repoMetrics = await (0, git_1.getRepoMetrics)(remoteUrl);
1051
- }
1052
- catch (error) {
1053
- return {
1054
- isCovered: false,
1055
- error: 'Could not get repository information',
1056
- };
1057
- }
1058
- const { repoUrl, owner, repo } = repoMetrics;
1059
- if (!repoUrl) {
1060
- return { isCovered: false, error: 'No remote URL found' };
1061
- }
1062
- if (!owner || !repo) {
1063
- return { isCovered: false, error: 'Could not parse repository URL' };
1064
- }
1065
- // Check if user is authenticated
1066
- if (!this.user || !this.user.authToken) {
1067
- return { isCovered: false, error: 'User not authenticated' };
1068
- }
1069
- // Call backend API to check if repo is covered by organization
1070
- const response = await fetch(`${config_1.backendUrl}/api/orgs/is-repo-covered`, {
1071
- method: 'POST',
1072
- headers: {
1073
- 'Content-Type': 'application/json',
1074
- Authorization: `Bearer ${this.user.authToken}`,
1075
- },
1076
- body: JSON.stringify({
1077
- owner: owner.toLowerCase(),
1078
- repo: repo.toLowerCase(),
1079
- remoteUrl: repoUrl,
1080
- }),
1081
- });
1082
- if (!response.ok) {
1083
- const errorData = await response.json().catch(() => ({}));
1084
- return {
1085
- isCovered: false,
1086
- error: errorData.error ||
1087
- `HTTP ${response.status}: ${response.statusText}`,
1088
- };
1089
- }
1090
- const data = await response.json();
1091
- return {
1092
- isCovered: data.isCovered || false,
1093
- organizationName: data.organizationName,
1094
- organizationId: data.organizationId,
1095
- organizationSlug: data.organizationSlug,
1096
- };
1097
- }
1098
- catch (error) {
1099
- logger_1.logger.error({
1100
- errorMessage: error instanceof Error ? error.message : String(error),
1101
- errorStack: error instanceof Error ? error.stack : undefined,
1102
- remoteUrl,
1103
- }, 'Error checking repository coverage');
1104
- return {
1105
- isCovered: false,
1106
- error: error instanceof Error ? error.message : 'Unknown error',
1107
- };
1108
- }
1109
- }
1110
- }
1111
- exports.Client = Client;
1112
- //# sourceMappingURL=client.js.map