codecane 1.0.293 → 1.0.296

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 (300) hide show
  1. package/README.md +87 -0
  2. package/dist/background-process-manager.d.ts +50 -0
  3. package/dist/background-process-manager.js +359 -0
  4. package/dist/background-process-manager.js.map +1 -0
  5. package/dist/browser-runner.d.ts +35 -0
  6. package/dist/browser-runner.js +680 -0
  7. package/dist/browser-runner.js.map +1 -0
  8. package/dist/chat-storage.d.ts +2 -0
  9. package/dist/chat-storage.js +93 -0
  10. package/dist/chat-storage.js.map +1 -0
  11. package/dist/checkpoints/checkpoint-manager.d.ts +94 -0
  12. package/dist/checkpoints/checkpoint-manager.js +280 -0
  13. package/dist/checkpoints/checkpoint-manager.js.map +1 -0
  14. package/dist/checkpoints/file-manager.d.ts +72 -0
  15. package/dist/checkpoints/file-manager.js +294 -0
  16. package/dist/checkpoints/file-manager.js.map +1 -0
  17. package/dist/cli-handlers/api-key.d.ts +25 -0
  18. package/dist/cli-handlers/api-key.js +66 -0
  19. package/dist/cli-handlers/api-key.js.map +1 -0
  20. package/dist/cli-handlers/checkpoint.d.ts +18 -0
  21. package/dist/cli-handlers/checkpoint.js +195 -0
  22. package/dist/cli-handlers/checkpoint.js.map +1 -0
  23. package/dist/cli-handlers/diff.d.ts +2 -0
  24. package/dist/cli-handlers/diff.js +31 -0
  25. package/dist/cli-handlers/diff.js.map +1 -0
  26. package/dist/cli-handlers/easter-egg.d.ts +1 -0
  27. package/dist/cli-handlers/easter-egg.js +126 -0
  28. package/dist/cli-handlers/easter-egg.js.map +1 -0
  29. package/dist/cli-handlers/inititalization-flow.d.ts +1 -0
  30. package/dist/cli-handlers/inititalization-flow.js +24 -0
  31. package/dist/cli-handlers/inititalization-flow.js.map +1 -0
  32. package/dist/cli.d.ts +44 -0
  33. package/dist/cli.js +494 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/client.d.ts +151 -0
  36. package/dist/client.js +835 -0
  37. package/dist/client.js.map +1 -0
  38. package/dist/code-map/languages.d.ts +13 -0
  39. package/dist/code-map/languages.d.ts.map +1 -0
  40. package/dist/code-map/languages.js +129 -0
  41. package/dist/code-map/languages.js.map +1 -0
  42. package/dist/code-map/parse.d.ts +12 -0
  43. package/dist/code-map/parse.d.ts.map +1 -0
  44. package/dist/code-map/parse.js +127 -0
  45. package/dist/code-map/parse.js.map +1 -0
  46. package/dist/code-map/test-langs/test.d.ts +12 -0
  47. package/dist/code-map/test-langs/test.d.ts.map +1 -0
  48. package/dist/code-map/test-langs/test.js +23 -0
  49. package/dist/code-map/test-langs/test.js.map +1 -0
  50. package/dist/code-map/tree-sitter-queries/readme.md +23 -0
  51. package/dist/code-map/tree-sitter-queries/tree-sitter-c-tags.scm +11 -0
  52. package/dist/code-map/tree-sitter-queries/tree-sitter-c_sharp-tags.scm +13 -0
  53. package/dist/code-map/tree-sitter-queries/tree-sitter-cpp-tags.scm +17 -0
  54. package/dist/code-map/tree-sitter-queries/tree-sitter-go-tags.scm +26 -0
  55. package/dist/code-map/tree-sitter-queries/tree-sitter-java-tags.scm +19 -0
  56. package/dist/code-map/tree-sitter-queries/tree-sitter-javascript-tags.scm +15 -0
  57. package/dist/code-map/tree-sitter-queries/tree-sitter-php-tags.scm +26 -0
  58. package/dist/code-map/tree-sitter-queries/tree-sitter-python-tags.scm +9 -0
  59. package/dist/code-map/tree-sitter-queries/tree-sitter-ruby-tags.scm +58 -0
  60. package/dist/code-map/tree-sitter-queries/tree-sitter-rust-tags.scm +26 -0
  61. package/dist/code-map/tree-sitter-queries/tree-sitter-typescript-tags.scm +15 -0
  62. package/dist/code-map/tsconfig.tsbuildinfo +1 -0
  63. package/dist/common/actions.d.ts +2592 -0
  64. package/dist/common/actions.js +144 -0
  65. package/dist/common/actions.js.map +1 -0
  66. package/dist/common/analytics.d.ts +4 -0
  67. package/dist/common/analytics.js +40 -0
  68. package/dist/common/analytics.js.map +1 -0
  69. package/dist/common/api-keys/constants.d.ts +8 -0
  70. package/dist/common/api-keys/constants.js +26 -0
  71. package/dist/common/api-keys/constants.js.map +1 -0
  72. package/dist/common/api-keys/crypto.d.ts +24 -0
  73. package/dist/common/api-keys/crypto.js +186 -0
  74. package/dist/common/api-keys/crypto.js.map +1 -0
  75. package/dist/common/browser-actions.d.ts +4415 -0
  76. package/dist/common/browser-actions.js +343 -0
  77. package/dist/common/browser-actions.js.map +1 -0
  78. package/dist/common/constants/analytics-events.d.ts +19 -0
  79. package/dist/common/constants/analytics-events.js +27 -0
  80. package/dist/common/constants/analytics-events.js.map +1 -0
  81. package/dist/common/constants/grant-priorities.d.ts +2 -0
  82. package/dist/common/constants/grant-priorities.js +10 -0
  83. package/dist/common/constants/grant-priorities.js.map +1 -0
  84. package/dist/common/constants/tools.d.ts +17 -0
  85. package/dist/common/constants/tools.js +45 -0
  86. package/dist/common/constants/tools.js.map +1 -0
  87. package/dist/common/constants.d.ts +134 -0
  88. package/dist/common/constants.js +180 -0
  89. package/dist/common/constants.js.map +1 -0
  90. package/dist/common/db/drizzle.config.d.ts +2 -0
  91. package/dist/common/db/drizzle.config.js +17 -0
  92. package/dist/common/db/drizzle.config.js.map +1 -0
  93. package/dist/common/db/env.d.mts +1 -0
  94. package/dist/common/db/env.mjs +26 -0
  95. package/dist/common/db/env.mjs.map +1 -0
  96. package/dist/common/db/index.d.ts +6 -0
  97. package/dist/common/db/index.js +35 -0
  98. package/dist/common/db/index.js.map +1 -0
  99. package/dist/common/db/schema.d.ts +1419 -0
  100. package/dist/common/db/schema.js +175 -0
  101. package/dist/common/db/schema.js.map +1 -0
  102. package/dist/common/db/transaction.d.ts +12 -0
  103. package/dist/common/db/transaction.js +36 -0
  104. package/dist/common/db/transaction.js.map +1 -0
  105. package/dist/common/env.d.mts +1 -0
  106. package/dist/common/env.mjs +40 -0
  107. package/dist/common/env.mjs.map +1 -0
  108. package/dist/common/json-config/__tests__/stringify-schema.test.d.ts +1 -0
  109. package/dist/common/json-config/__tests__/stringify-schema.test.js +66 -0
  110. package/dist/common/json-config/__tests__/stringify-schema.test.js.map +1 -0
  111. package/dist/common/json-config/constants.d.ts +82 -0
  112. package/dist/common/json-config/constants.js +48 -0
  113. package/dist/common/json-config/constants.js.map +1 -0
  114. package/dist/common/json-config/parser.d.ts +7 -0
  115. package/dist/common/json-config/parser.js +51 -0
  116. package/dist/common/json-config/parser.js.map +1 -0
  117. package/dist/common/json-config/stringify-schema.d.ts +9 -0
  118. package/dist/common/json-config/stringify-schema.js +131 -0
  119. package/dist/common/json-config/stringify-schema.js.map +1 -0
  120. package/dist/common/project-file-tree.d.ts +11 -0
  121. package/dist/common/project-file-tree.js +200 -0
  122. package/dist/common/project-file-tree.js.map +1 -0
  123. package/dist/common/types/agent-state.d.ts +464 -0
  124. package/dist/common/types/agent-state.js +32 -0
  125. package/dist/common/types/agent-state.js.map +1 -0
  126. package/dist/common/types/grant.d.ts +2 -0
  127. package/dist/common/types/grant.js +10 -0
  128. package/dist/common/types/grant.js.map +1 -0
  129. package/dist/common/types/message.d.ts +311 -0
  130. package/dist/common/types/message.js +54 -0
  131. package/dist/common/types/message.js.map +1 -0
  132. package/dist/common/types/referral.d.ts +2 -0
  133. package/dist/common/types/referral.js +5 -0
  134. package/dist/common/types/referral.js.map +1 -0
  135. package/dist/common/types/tools.d.ts +5 -0
  136. package/dist/common/types/tools.js +3 -0
  137. package/dist/common/types/tools.js.map +1 -0
  138. package/dist/common/types/usage.d.ts +40 -0
  139. package/dist/common/types/usage.js +15 -0
  140. package/dist/common/types/usage.js.map +1 -0
  141. package/dist/common/util/__tests__/messages.test.d.ts +1 -0
  142. package/dist/common/util/__tests__/messages.test.js +70 -0
  143. package/dist/common/util/__tests__/messages.test.js.map +1 -0
  144. package/dist/common/util/__tests__/saxy.test.d.ts +1 -0
  145. package/dist/common/util/__tests__/saxy.test.js +387 -0
  146. package/dist/common/util/__tests__/saxy.test.js.map +1 -0
  147. package/dist/common/util/__tests__/string.test.d.ts +1 -0
  148. package/dist/common/util/__tests__/string.test.js +82 -0
  149. package/dist/common/util/__tests__/string.test.js.map +1 -0
  150. package/dist/common/util/array.d.ts +6 -0
  151. package/dist/common/util/array.js +32 -0
  152. package/dist/common/util/array.js.map +1 -0
  153. package/dist/common/util/changes.d.ts +7 -0
  154. package/dist/common/util/changes.js +78 -0
  155. package/dist/common/util/changes.js.map +1 -0
  156. package/dist/common/util/credentials.d.ts +25 -0
  157. package/dist/common/util/credentials.js +24 -0
  158. package/dist/common/util/credentials.js.map +1 -0
  159. package/dist/common/util/currency.d.ts +14 -0
  160. package/dist/common/util/currency.js +23 -0
  161. package/dist/common/util/currency.js.map +1 -0
  162. package/dist/common/util/dates.d.ts +10 -0
  163. package/dist/common/util/dates.js +22 -0
  164. package/dist/common/util/dates.js.map +1 -0
  165. package/dist/common/util/file.d.ts +159 -0
  166. package/dist/common/util/file.js +192 -0
  167. package/dist/common/util/file.js.map +1 -0
  168. package/dist/common/util/git.d.ts +6 -0
  169. package/dist/common/util/git.js +81 -0
  170. package/dist/common/util/git.js.map +1 -0
  171. package/dist/common/util/logger.d.ts +8 -0
  172. package/dist/common/util/logger.js +52 -0
  173. package/dist/common/util/logger.js.map +1 -0
  174. package/dist/common/util/lru-cache.d.ts +30 -0
  175. package/dist/common/util/lru-cache.js +68 -0
  176. package/dist/common/util/lru-cache.js.map +1 -0
  177. package/dist/common/util/messages.d.ts +9 -0
  178. package/dist/common/util/messages.js +69 -0
  179. package/dist/common/util/messages.js.map +1 -0
  180. package/dist/common/util/min-heap.d.ts +15 -0
  181. package/dist/common/util/min-heap.js +73 -0
  182. package/dist/common/util/min-heap.js.map +1 -0
  183. package/dist/common/util/object.d.ts +18 -0
  184. package/dist/common/util/object.js +91 -0
  185. package/dist/common/util/object.js.map +1 -0
  186. package/dist/common/util/patch.d.ts +1 -0
  187. package/dist/common/util/patch.js +215 -0
  188. package/dist/common/util/patch.js.map +1 -0
  189. package/dist/common/util/promise.d.ts +17 -0
  190. package/dist/common/util/promise.js +80 -0
  191. package/dist/common/util/promise.js.map +1 -0
  192. package/dist/common/util/referral.d.ts +1 -0
  193. package/dist/common/util/referral.js +6 -0
  194. package/dist/common/util/referral.js.map +1 -0
  195. package/dist/common/util/saxy.d.ts +164 -0
  196. package/dist/common/util/saxy.js +503 -0
  197. package/dist/common/util/saxy.js.map +1 -0
  198. package/dist/common/util/string.d.ts +61 -0
  199. package/dist/common/util/string.js +220 -0
  200. package/dist/common/util/string.js.map +1 -0
  201. package/dist/common/util/stripe.d.ts +3 -0
  202. package/dist/common/util/stripe.js +22 -0
  203. package/dist/common/util/stripe.js.map +1 -0
  204. package/dist/common/util/sync-failure.d.ts +1 -0
  205. package/dist/common/util/sync-failure.js +57 -0
  206. package/dist/common/util/sync-failure.js.map +1 -0
  207. package/dist/common/websockets/websocket-client.d.ts +42 -0
  208. package/dist/common/websockets/websocket-client.js +216 -0
  209. package/dist/common/websockets/websocket-client.js.map +1 -0
  210. package/dist/common/websockets/websocket-schema.d.ts +4876 -0
  211. package/dist/common/websockets/websocket-schema.js +55 -0
  212. package/dist/common/websockets/websocket-schema.js.map +1 -0
  213. package/dist/config.d.ts +4 -0
  214. package/dist/config.js +12 -0
  215. package/dist/config.js.map +1 -0
  216. package/dist/create-template-project.d.ts +1 -0
  217. package/dist/create-template-project.js +107 -0
  218. package/dist/create-template-project.js.map +1 -0
  219. package/dist/credentials.d.ts +4 -0
  220. package/dist/credentials.js +38 -0
  221. package/dist/credentials.js.map +1 -0
  222. package/dist/dev-process-manager.d.ts +10 -0
  223. package/dist/dev-process-manager.js +55 -0
  224. package/dist/dev-process-manager.js.map +1 -0
  225. package/dist/display.d.ts +9 -0
  226. package/dist/display.js +68 -0
  227. package/dist/display.js.map +1 -0
  228. package/dist/fingerprint.d.ts +1 -0
  229. package/dist/fingerprint.js +48 -0
  230. package/dist/fingerprint.js.map +1 -0
  231. package/dist/index.d.ts +2 -0
  232. package/dist/index.js +130 -0
  233. package/dist/index.js.map +1 -0
  234. package/dist/menu.d.ts +3 -0
  235. package/dist/menu.js +170 -0
  236. package/dist/menu.js.map +1 -0
  237. package/dist/project-files.d.ts +129 -0
  238. package/dist/project-files.js +556 -0
  239. package/dist/project-files.js.map +1 -0
  240. package/dist/startup-process-handler.d.ts +2 -0
  241. package/dist/startup-process-handler.js +21 -0
  242. package/dist/startup-process-handler.js.map +1 -0
  243. package/dist/tool-handlers.d.ts +30 -0
  244. package/dist/tool-handlers.js +245 -0
  245. package/dist/tool-handlers.js.map +1 -0
  246. package/dist/types.d.ts +15 -0
  247. package/dist/types.js +3 -0
  248. package/dist/types.js.map +1 -0
  249. package/dist/update-codebuff.d.ts +1 -0
  250. package/dist/update-codebuff.js +161 -0
  251. package/dist/update-codebuff.js.map +1 -0
  252. package/dist/utils/__tests__/background-process-manager.test.d.ts +1 -0
  253. package/dist/utils/__tests__/background-process-manager.test.js +327 -0
  254. package/dist/utils/__tests__/background-process-manager.test.js.map +1 -0
  255. package/dist/utils/__tests__/response-example-4-files.txt +621 -0
  256. package/dist/utils/__tests__/tool-renderers.test.d.ts +1 -0
  257. package/dist/utils/__tests__/tool-renderers.test.js +51 -0
  258. package/dist/utils/__tests__/tool-renderers.test.js.map +1 -0
  259. package/dist/utils/__tests__/xml-stream-parser.test.d.ts +1 -0
  260. package/dist/utils/__tests__/xml-stream-parser.test.js +229 -0
  261. package/dist/utils/__tests__/xml-stream-parser.test.js.map +1 -0
  262. package/dist/utils/analytics.d.ts +6 -0
  263. package/dist/utils/analytics.js +83 -0
  264. package/dist/utils/analytics.js.map +1 -0
  265. package/dist/utils/detect-shell.d.ts +1 -0
  266. package/dist/utils/detect-shell.js +60 -0
  267. package/dist/utils/detect-shell.js.map +1 -0
  268. package/dist/utils/git.d.ts +2 -0
  269. package/dist/utils/git.js +40 -0
  270. package/dist/utils/git.js.map +1 -0
  271. package/dist/utils/logger.d.ts +21 -0
  272. package/dist/utils/logger.js +105 -0
  273. package/dist/utils/logger.js.map +1 -0
  274. package/dist/utils/spinner.d.ts +11 -0
  275. package/dist/utils/spinner.js +87 -0
  276. package/dist/utils/spinner.js.map +1 -0
  277. package/dist/utils/system-info.d.ts +8 -0
  278. package/dist/utils/system-info.js +22 -0
  279. package/dist/utils/system-info.js.map +1 -0
  280. package/dist/utils/terminal.d.ts +43 -0
  281. package/dist/utils/terminal.js +546 -0
  282. package/dist/utils/terminal.js.map +1 -0
  283. package/dist/utils/tool-renderers.d.ts +16 -0
  284. package/dist/utils/tool-renderers.js +163 -0
  285. package/dist/utils/tool-renderers.js.map +1 -0
  286. package/dist/utils/xml-stream-parser.d.ts +9 -0
  287. package/dist/utils/xml-stream-parser.js +128 -0
  288. package/dist/utils/xml-stream-parser.js.map +1 -0
  289. package/dist/web-scraper.d.ts +3 -0
  290. package/dist/web-scraper.js +57 -0
  291. package/dist/web-scraper.js.map +1 -0
  292. package/dist/workers/checkpoint-worker.d.ts +1 -0
  293. package/dist/workers/checkpoint-worker.js +48 -0
  294. package/dist/workers/checkpoint-worker.js.map +1 -0
  295. package/dist/workers/project-context.d.ts +1 -0
  296. package/dist/workers/project-context.js +20 -0
  297. package/dist/workers/project-context.js.map +1 -0
  298. package/package.json +69 -22
  299. package/bin/launcher.js +0 -21
  300. package/scripts/postinstall.js +0 -100
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stripNullChars = exports.generateCompactId = exports.transformJsonInString = exports.hasLazyEdit = exports.safeReplace = exports.ensureUrlProtocol = exports.snakeToTitleCase = exports.capitalize = exports.pluralize = exports.randBoolFromStr = exports.replaceNonStandardPlaceholderComments = exports.isWhitespace = exports.truncateStringWithMessage = exports.truncateString = void 0;
4
+ exports.stripColors = stripColors;
5
+ const lodash_1 = require("lodash");
6
+ const truncateString = (str, maxLength) => {
7
+ if (str.length <= maxLength) {
8
+ return str;
9
+ }
10
+ return str.slice(0, maxLength) + '...';
11
+ };
12
+ exports.truncateString = truncateString;
13
+ const truncateStringWithMessage = ({ str, maxLength, message = 'TRUNCATED_DUE_TO_LENGTH', remove = 'END', }) => {
14
+ if (str.length <= maxLength) {
15
+ return str;
16
+ }
17
+ if (remove === 'END') {
18
+ const suffix = `\n[...${message}]`;
19
+ return str.slice(0, maxLength - suffix.length) + suffix;
20
+ }
21
+ if (remove === 'START') {
22
+ const prefix = `[${message}...]\n`;
23
+ return prefix + str.slice(0, maxLength - prefix.length);
24
+ }
25
+ const middle = `\n[...${message}...]\n`;
26
+ const length = Math.floor((maxLength - middle.length) / 2);
27
+ return str.slice(0, length) + middle + str.slice(-length);
28
+ };
29
+ exports.truncateStringWithMessage = truncateStringWithMessage;
30
+ /**
31
+ * Check if a character is a whitespace character according
32
+ * to the XML spec (space, carriage return, line feed or tab)
33
+ *
34
+ * @param character Character to check
35
+ * @return Whether the character is whitespace or not
36
+ */
37
+ const isWhitespace = (character) => /\s/.test(character);
38
+ exports.isWhitespace = isWhitespace;
39
+ const replaceNonStandardPlaceholderComments = (content, replacement) => {
40
+ const commentPatterns = [
41
+ // JSX comments (match this first)
42
+ {
43
+ regex: /{\s*\/\*\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\s*\.{3})?\s*\*\/\s*}/gi,
44
+ placeholder: replacement,
45
+ },
46
+ // C-style comments (C, C++, Java, JavaScript, TypeScript, etc.)
47
+ {
48
+ regex: /\/\/\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\s*\.{3})?/gi,
49
+ placeholder: replacement,
50
+ },
51
+ {
52
+ regex: /\/\*\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\s*\.{3})?\s*\*\//gi,
53
+ placeholder: replacement,
54
+ },
55
+ // Python, Ruby, R comments
56
+ {
57
+ regex: /#\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\s*\.{3})?/gi,
58
+ placeholder: replacement,
59
+ },
60
+ // HTML-style comments
61
+ {
62
+ regex: /<!--\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\s*\.{3})?\s*-->/gi,
63
+ placeholder: replacement,
64
+ },
65
+ // SQL, Haskell, Lua comments
66
+ {
67
+ regex: /--\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\s*\.{3})?/gi,
68
+ placeholder: replacement,
69
+ },
70
+ // MATLAB comments
71
+ {
72
+ regex: /%\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\s*\.{3})?/gi,
73
+ placeholder: replacement,
74
+ },
75
+ ];
76
+ let updatedContent = content;
77
+ for (const { regex, placeholder } of commentPatterns) {
78
+ updatedContent = updatedContent.replaceAll(regex, placeholder);
79
+ }
80
+ return updatedContent;
81
+ };
82
+ exports.replaceNonStandardPlaceholderComments = replaceNonStandardPlaceholderComments;
83
+ const randBoolFromStr = (str) => {
84
+ return (0, lodash_1.sumBy)(str.split(''), (char) => char.charCodeAt(0)) % 2 === 0;
85
+ };
86
+ exports.randBoolFromStr = randBoolFromStr;
87
+ const pluralize = (count, word) => {
88
+ if (count === 1)
89
+ return `${count} ${word}`;
90
+ // Handle words ending in 'y' (unless preceded by a vowel)
91
+ if (word.endsWith('y') && !word.match(/[aeiou]y$/)) {
92
+ return `${count} ${word.slice(0, -1) + 'ies'}`;
93
+ }
94
+ // Handle words ending in s, sh, ch, x, z, o
95
+ if (word.match(/[sxz]$/) || word.match(/[cs]h$/) || word.match(/o$/)) {
96
+ return `${count} ${word + 'es'}`;
97
+ }
98
+ // Handle words ending in f/fe
99
+ if (word.endsWith('f')) {
100
+ return `${count} ${word.slice(0, -1) + 'ves'}`;
101
+ }
102
+ if (word.endsWith('fe')) {
103
+ return `${count} ${word.slice(0, -2) + 'ves'}`;
104
+ }
105
+ return `${count} ${word + 's'}`;
106
+ };
107
+ exports.pluralize = pluralize;
108
+ /**
109
+ * Safely replaces all occurrences of a search string with a replacement string,
110
+ * escaping special replacement patterns (like $) in the replacement string.
111
+ */
112
+ const capitalize = (str) => {
113
+ if (!str)
114
+ return str;
115
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
116
+ };
117
+ exports.capitalize = capitalize;
118
+ /**
119
+ * Converts a snake_case string to Title Case
120
+ * Example: "add_subgoal" -> "Add Subgoal"
121
+ */
122
+ const snakeToTitleCase = (str) => {
123
+ return str
124
+ .split('_')
125
+ .map((word) => (0, exports.capitalize)(word))
126
+ .join(' ');
127
+ };
128
+ exports.snakeToTitleCase = snakeToTitleCase;
129
+ /**
130
+ * Ensures a URL has the appropriate protocol (http:// or https://)
131
+ * Uses http:// for localhost and local IPs, https:// for all other domains
132
+ */
133
+ const ensureUrlProtocol = (url) => {
134
+ if (url.startsWith('http://') || url.startsWith('https://')) {
135
+ return url;
136
+ }
137
+ if (url.startsWith('localhost') || url.match(/^127\.\d+\.\d+\.\d+/)) {
138
+ return `http://${url}`;
139
+ }
140
+ return `https://${url}`;
141
+ };
142
+ exports.ensureUrlProtocol = ensureUrlProtocol;
143
+ const safeReplace = (content, searchStr, replaceStr) => {
144
+ const escapedReplaceStr = replaceStr.replace(/\$/g, '$$$$');
145
+ return content.replace(searchStr, escapedReplaceStr);
146
+ };
147
+ exports.safeReplace = safeReplace;
148
+ const hasLazyEdit = (content) => {
149
+ const cleanedContent = content.toLowerCase().trim();
150
+ return (cleanedContent.includes('... existing code ...') ||
151
+ cleanedContent.includes('// rest of the') ||
152
+ cleanedContent.includes('# rest of the') ||
153
+ // Match various comment styles with ellipsis and specific words
154
+ /\/\/\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\.{3})?/.test(cleanedContent) || // C-style single line
155
+ /\/\*\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\.{3})?\s*\*\//.test(cleanedContent) || // C-style multi-line
156
+ /#\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\.{3})?/.test(cleanedContent) || // Python/Ruby style
157
+ /<!--\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\.{3})?\s*-->/.test(cleanedContent) || // HTML style
158
+ /--\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\.{3})?/.test(cleanedContent) || // SQL/Haskell style
159
+ /%\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\.{3})?/.test(cleanedContent) || // MATLAB style
160
+ /{\s*\/\*\s*\.{3}.*(?:rest|unchanged|keep|file|existing|some).*(?:\.{3})?\s*\*\/\s*}/.test(cleanedContent) // JSX style
161
+ );
162
+ };
163
+ exports.hasLazyEdit = hasLazyEdit;
164
+ /**
165
+ * Extracts a JSON field from a string, transforms it, and puts it back.
166
+ * Handles both array and object JSON values.
167
+ * @param content The string containing JSON-like content
168
+ * @param field The field name to find and transform
169
+ * @param transform Function to transform the parsed JSON value
170
+ * @param fallback String to use if parsing fails
171
+ * @returns The content string with the transformed JSON field
172
+ */
173
+ const transformJsonInString = (content, field, transform, fallback) => {
174
+ // Use a non-greedy match for objects/arrays to prevent over-matching
175
+ const pattern = new RegExp(`"${field}"\\s*:\\s*(\\{[^}]*?\\}|\\[[^\\]]*?\\])`);
176
+ const match = content.match(pattern);
177
+ if (!match) {
178
+ return content;
179
+ }
180
+ try {
181
+ const json = JSON.parse(match[1]);
182
+ const transformed = transform(json);
183
+ // Important: Only replace the exact matched portion to prevent duplicates
184
+ return content.replace(match[0], `"${field}":${JSON.stringify(transformed)}`);
185
+ }
186
+ catch (error) {
187
+ // Only replace the exact matched portion even in error case
188
+ return content.replace(match[0], `"${field}":${fallback}`);
189
+ }
190
+ };
191
+ exports.transformJsonInString = transformJsonInString;
192
+ /**
193
+ * Generates a compact unique identifier by combining timestamp bits with random bits.
194
+ * Takes last 24 bits of timestamp (enough for months) and 8 random bits.
195
+ * Encodes in base36 for very compact strings (~5-6 chars).
196
+ * @param prefix Optional prefix to add to the ID
197
+ * @returns A unique string ID
198
+ * @example
199
+ * generateCompactId() // => "1a2b3c"
200
+ * generateCompactId('msg-') // => "msg-1a2b3c"
201
+ */
202
+ const generateCompactId = (prefix) => {
203
+ const timestamp = Date.now() & 0xffffff; // Last 24 bits of timestamp
204
+ const random = Math.floor(Math.random() * 0xff); // 8 random bits
205
+ const str = ((timestamp << 8) | random).toString(36).replace(/^-/, ''); // Remove leading dash if present
206
+ return prefix ? `${prefix}${str}` : str;
207
+ };
208
+ exports.generateCompactId = generateCompactId;
209
+ /**
210
+ * Removes null characters from a string
211
+ */
212
+ const stripNullChars = (str) => {
213
+ return str.replace(/\u0000/g, '');
214
+ };
215
+ exports.stripNullChars = stripNullChars;
216
+ const ansiRegex = /\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g;
217
+ function stripColors(str) {
218
+ return str.replace(ansiRegex, '');
219
+ }
220
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../src/util/string.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import Stripe from 'stripe';
2
+ export declare const stripeServer: Stripe;
3
+ export declare function getCurrentSubscription(customerId: string): Promise<Stripe.Subscription>;
@@ -0,0 +1,22 @@
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.stripeServer = void 0;
7
+ exports.getCurrentSubscription = getCurrentSubscription;
8
+ const stripe_1 = __importDefault(require("stripe"));
9
+ const env_mjs_1 = require("../env.mjs");
10
+ exports.stripeServer = new stripe_1.default(env_mjs_1.env.STRIPE_SECRET_KEY, {
11
+ apiVersion: '2024-06-20',
12
+ typescript: true,
13
+ });
14
+ async function getCurrentSubscription(customerId) {
15
+ const subscriptions = await exports.stripeServer.subscriptions.list({
16
+ customer: customerId,
17
+ status: 'active',
18
+ limit: 1,
19
+ });
20
+ return subscriptions.data[0];
21
+ }
22
+ //# sourceMappingURL=stripe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../src/util/stripe.ts"],"names":[],"mappings":";;;;;;AAQA,wDAOC;AAfD,oDAA2B;AAC3B,wCAAgC;AAEnB,QAAA,YAAY,GAAG,IAAI,gBAAM,CAAC,aAAG,CAAC,iBAAiB,EAAE;IAC5D,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,IAAI;CACjB,CAAC,CAAA;AAEK,KAAK,UAAU,sBAAsB,CAAC,UAAkB;IAC7D,MAAM,aAAa,GAAG,MAAM,oBAAY,CAAC,aAAa,CAAC,IAAI,CAAC;QAC1D,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,CAAC;KACT,CAAC,CAAA;IACF,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AAC9B,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function logSyncFailure(id: string, errorMessage: string, provider?: string): Promise<void>;
@@ -0,0 +1,57 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.logSyncFailure = logSyncFailure;
30
+ const drizzle_orm_1 = require("drizzle-orm");
31
+ const db_1 = __importDefault(require("../db"));
32
+ const schema = __importStar(require("../db/schema"));
33
+ const logger_1 = require("./logger");
34
+ async function logSyncFailure(id, errorMessage, provider = 'stripe') {
35
+ try {
36
+ await db_1.default
37
+ .insert(schema.syncFailure)
38
+ .values({
39
+ message_id: id,
40
+ provider,
41
+ last_error: errorMessage,
42
+ last_attempt_at: new Date(),
43
+ })
44
+ .onConflictDoUpdate({
45
+ target: schema.syncFailure.message_id,
46
+ set: {
47
+ last_error: errorMessage,
48
+ last_attempt_at: new Date(),
49
+ retry_count: (0, drizzle_orm_1.sql) `${schema.syncFailure.retry_count} + 1`,
50
+ },
51
+ });
52
+ }
53
+ catch (dbError) {
54
+ logger_1.logger.error({ id, provider, error: dbError }, 'Failed to log sync failure to database.');
55
+ }
56
+ }
57
+ //# sourceMappingURL=sync-failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-failure.js","sourceRoot":"","sources":["../../src/util/sync-failure.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wCA4BC;AAjCD,6CAAiC;AACjC,+CAAsB;AACtB,qDAAsC;AACtC,qCAAiC;AAE1B,KAAK,UAAU,cAAc,CAClC,EAAU,EACV,YAAoB,EACpB,QAAQ,GAAG,QAAQ;IAEnB,IAAI,CAAC;QACH,MAAM,YAAE;aACL,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;aAC1B,MAAM,CAAC;YACN,UAAU,EAAE,EAAE;YACd,QAAQ;YACR,UAAU,EAAE,YAAY;YACxB,eAAe,EAAE,IAAI,IAAI,EAAE;SAC5B,CAAC;aACD,kBAAkB,CAAC;YAClB,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,UAAU;YACrC,GAAG,EAAE;gBACH,UAAU,EAAE,YAAY;gBACxB,eAAe,EAAE,IAAI,IAAI,EAAE;gBAC3B,WAAW,EAAE,IAAA,iBAAG,EAAA,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,MAAM;aACxD;SACF,CAAC,CAAA;IACN,CAAC;IAAC,OAAO,OAAO,EAAE,CAAC;QACjB,eAAM,CAAC,KAAK,CACV,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAChC,yCAAyC,CAC1C,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { WebSocket } from 'ws';
2
+ import { ClientAction, ServerAction } from '../actions';
3
+ import { ClientMessage, ClientMessageType, ServerMessage } from './websocket-schema';
4
+ type ConnectingState = typeof WebSocket.CONNECTING;
5
+ type OpenState = typeof WebSocket.OPEN;
6
+ type ClosingState = typeof WebSocket.CLOSING;
7
+ type ClosedState = typeof WebSocket.CLOSED;
8
+ export type ReadyState = OpenState | ConnectingState | ClosedState | ClosingState;
9
+ export declare function formatState(state: ReadyState): "connecting" | "open" | "closing" | "closed";
10
+ type OutstandingTxn = {
11
+ resolve: () => void;
12
+ reject: (err: Error) => void;
13
+ timeout?: any;
14
+ };
15
+ /** Client for the API websocket realtime server. Automatically manages reconnection
16
+ * and resubscription on disconnect, and allows subscribers to get a callback
17
+ * when something is broadcasted. */
18
+ export declare class APIRealtimeClient {
19
+ ws: WebSocket;
20
+ url: string;
21
+ subscribers: Map<ServerAction['type'], ((action: ServerAction) => void)[]>;
22
+ txid: number;
23
+ txns: Map<number, OutstandingTxn>;
24
+ connectTimeout?: any;
25
+ heartbeat?: any;
26
+ hadError: boolean;
27
+ onError: () => void;
28
+ onReconnect: () => void;
29
+ constructor(url: string, onError: () => void, onReconnect: () => void);
30
+ get state(): ReadyState;
31
+ close(): void;
32
+ connect(): Promise<void>;
33
+ waitAndReconnect(): void;
34
+ forceReconnect(): void;
35
+ receiveMessage(msg: ServerMessage): void;
36
+ sendMessage<T extends ClientMessageType>(type: T, data: Omit<ClientMessage<T>, 'type' | 'txid'>): Promise<void>;
37
+ sendAction(action: ClientAction): Promise<void>;
38
+ subscribe<T extends ServerAction['type']>(action: T, callback: (action: Extract<ServerAction, {
39
+ type: T;
40
+ }>) => void): () => void;
41
+ }
42
+ export {};
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.APIRealtimeClient = void 0;
4
+ exports.formatState = formatState;
5
+ const ws_1 = require("ws");
6
+ // mqp: useful for debugging
7
+ const VERBOSE_LOGGING = false;
8
+ const TIMEOUT_MS = 120_000;
9
+ const RECONNECT_WAIT_MS = 5_000;
10
+ function formatState(state) {
11
+ switch (state) {
12
+ case ws_1.WebSocket.CONNECTING:
13
+ return 'connecting';
14
+ case ws_1.WebSocket.OPEN:
15
+ return 'open';
16
+ case ws_1.WebSocket.CLOSING:
17
+ return 'closing';
18
+ case ws_1.WebSocket.CLOSED:
19
+ return 'closed';
20
+ default:
21
+ throw new Error('Invalid websocket state.');
22
+ }
23
+ }
24
+ /** Client for the API websocket realtime server. Automatically manages reconnection
25
+ * and resubscription on disconnect, and allows subscribers to get a callback
26
+ * when something is broadcasted. */
27
+ class APIRealtimeClient {
28
+ ws;
29
+ url;
30
+ // Callbacks subscribed to individual actions.
31
+ subscribers;
32
+ txid;
33
+ // all txns that are in flight, with no ack/error/timeout
34
+ txns;
35
+ connectTimeout;
36
+ heartbeat;
37
+ hadError = false;
38
+ onError;
39
+ onReconnect;
40
+ constructor(url, onError, onReconnect) {
41
+ this.url = url;
42
+ this.txid = 0;
43
+ this.txns = new Map();
44
+ this.subscribers = new Map();
45
+ this.onError = onError;
46
+ this.onReconnect = onReconnect;
47
+ }
48
+ get state() {
49
+ return this.ws.readyState;
50
+ }
51
+ close() {
52
+ this.ws.close(1000, 'Closed manually.');
53
+ clearTimeout(this.connectTimeout);
54
+ }
55
+ connect() {
56
+ // you may wish to refer to https://websockets.spec.whatwg.org/
57
+ // in order to check the semantics of events etc.
58
+ this.ws = new ws_1.WebSocket(this.url);
59
+ this.ws.onmessage = (ev) => {
60
+ if (this.hadError) {
61
+ this.hadError = false;
62
+ this.onReconnect();
63
+ }
64
+ this.receiveMessage(JSON.parse(ev.data));
65
+ };
66
+ this.ws.onerror = (ev) => {
67
+ if (!this.hadError) {
68
+ this.onError();
69
+ this.hadError = true;
70
+ }
71
+ // this can fire without an onclose if this is the first time we ever try
72
+ // to connect, so we need to turn on our reconnect in that case
73
+ this.waitAndReconnect();
74
+ };
75
+ this.ws.onclose = (ev) => {
76
+ // note that if the connection closes due to an error, onerror fires and then this
77
+ if (VERBOSE_LOGGING) {
78
+ console.info(`API websocket closed with code=${ev.code}: ${ev.reason}`);
79
+ }
80
+ clearInterval(this.heartbeat);
81
+ // mqp: we might need to change how the txn stuff works if we ever want to
82
+ // implement "wait until i am subscribed, and then do something" in a component.
83
+ // right now it cannot be reliably used to detect that in the presence of reconnects
84
+ for (const txn of Array.from(this.txns.values())) {
85
+ clearTimeout(txn.timeout);
86
+ // NOTE (James): Don't throw an error when the websocket is closed...
87
+ // This seems to be happening, but the client can recover.
88
+ txn.resolve();
89
+ // txn.reject(new Error('Websocket was closed.'))
90
+ }
91
+ this.txns.clear();
92
+ // 1000 is RFC code for normal on-purpose closure
93
+ if (ev.code !== 1000) {
94
+ this.waitAndReconnect();
95
+ }
96
+ };
97
+ return new Promise((resolve) => {
98
+ this.ws.onopen = (_ev) => {
99
+ if (VERBOSE_LOGGING) {
100
+ console.info('API websocket opened.');
101
+ }
102
+ this.heartbeat = setInterval(async () => this.sendMessage('ping', {}).catch(() => { }), 30000);
103
+ resolve();
104
+ };
105
+ });
106
+ }
107
+ waitAndReconnect() {
108
+ if (this.connectTimeout == null) {
109
+ this.connectTimeout = setTimeout(() => {
110
+ this.connectTimeout = undefined;
111
+ this.connect();
112
+ }, RECONNECT_WAIT_MS);
113
+ }
114
+ }
115
+ forceReconnect() {
116
+ // Close the current connection if it's open
117
+ if (this.ws && this.state !== ws_1.WebSocket.CLOSED) {
118
+ this.ws.close(1000, 'Forced reconnection due to server shutdown notice');
119
+ }
120
+ // Immediately attempt to reconnect
121
+ this.connect().catch((err) => {
122
+ console.error('Failed to reconnect after server shutdown notice:', err);
123
+ // Still set up delayed reconnect as fallback
124
+ this.waitAndReconnect();
125
+ });
126
+ }
127
+ receiveMessage(msg) {
128
+ if (VERBOSE_LOGGING) {
129
+ console.info('< Incoming API websocket message: ', msg);
130
+ }
131
+ switch (msg.type) {
132
+ case 'action': {
133
+ const action = msg.data;
134
+ const subscribers = this.subscribers.get(action.type) ?? [];
135
+ for (const callback of subscribers) {
136
+ callback(action);
137
+ }
138
+ return;
139
+ }
140
+ case 'ack': {
141
+ if (msg.txid != null) {
142
+ const txn = this.txns.get(msg.txid);
143
+ if (txn == null) {
144
+ // mqp: only reason this should happen is getting an ack after timeout
145
+ console.warn(`Websocket message with old txid=${msg.txid}.`);
146
+ }
147
+ else {
148
+ clearTimeout(txn.timeout);
149
+ if (msg.error != null) {
150
+ txn.reject(new Error(msg.error));
151
+ }
152
+ else {
153
+ txn.resolve();
154
+ }
155
+ this.txns.delete(msg.txid);
156
+ }
157
+ }
158
+ return;
159
+ }
160
+ default:
161
+ console.warn(`Unknown API websocket message type received: ${msg}`);
162
+ }
163
+ }
164
+ async sendMessage(type, data) {
165
+ if (VERBOSE_LOGGING) {
166
+ console.info(`> Outgoing API websocket ${type} message: `, data);
167
+ }
168
+ if (this.state === ws_1.WebSocket.OPEN) {
169
+ return new Promise((resolve, reject) => {
170
+ const txid = this.txid++;
171
+ const timeout = setTimeout(() => {
172
+ this.txns.delete(txid);
173
+ reject(new Error(`Websocket message with txid ${txid} timed out.`));
174
+ }, TIMEOUT_MS);
175
+ this.txns.set(txid, { resolve, reject, timeout });
176
+ this.ws.send(JSON.stringify({ type, txid, ...data }));
177
+ });
178
+ }
179
+ else {
180
+ // expected if components in the code try to subscribe or unsubscribe
181
+ // while the socket is closed -- in this case we expect to get the state
182
+ // fixed up in the websocket onopen handler when we reconnect
183
+ }
184
+ }
185
+ async sendAction(action) {
186
+ try {
187
+ return await this.sendMessage('action', {
188
+ data: action,
189
+ });
190
+ }
191
+ catch (e) {
192
+ // Print the error message for debugging.
193
+ console.error('Error sending action:', action.type, typeof e === 'object' && e !== null && 'message' in e ? e.message : e);
194
+ console.log();
195
+ console.log('Codebuff is exiting due to an error.');
196
+ console.log('Make sure you are on the latest version of Codebuff!');
197
+ console.log('-----------------------------------');
198
+ console.log('Please run: npm install -g codebuff');
199
+ console.log('-----------------------------------');
200
+ process.exit(1);
201
+ }
202
+ }
203
+ subscribe(action, callback) {
204
+ const currSubscribers = this.subscribers.get(action) ?? [];
205
+ this.subscribers.set(action, [
206
+ ...currSubscribers,
207
+ callback,
208
+ ]);
209
+ return () => {
210
+ const newSubscribers = currSubscribers.filter((cb) => cb !== callback);
211
+ this.subscribers.set(action, newSubscribers);
212
+ };
213
+ }
214
+ }
215
+ exports.APIRealtimeClient = APIRealtimeClient;
216
+ //# sourceMappingURL=websocket-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-client.js","sourceRoot":"","sources":["../../src/websockets/websocket-client.ts"],"names":[],"mappings":"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"}