@kaitranntt/ccs 6.7.0 → 6.7.1-dev.1

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 (623) hide show
  1. package/README.md +45 -23
  2. package/dist/api/index.d.ts +7 -0
  3. package/dist/api/index.d.ts.map +1 -0
  4. package/dist/api/index.js +24 -0
  5. package/dist/api/index.js.map +1 -0
  6. package/dist/api/services/index.d.ts +10 -0
  7. package/dist/api/services/index.d.ts.map +1 -0
  8. package/dist/api/services/index.js +26 -0
  9. package/dist/api/services/index.js.map +1 -0
  10. package/dist/api/services/profile-reader.d.ts +28 -0
  11. package/dist/api/services/profile-reader.d.ts.map +1 -0
  12. package/dist/api/services/profile-reader.js +148 -0
  13. package/dist/api/services/profile-reader.js.map +1 -0
  14. package/dist/api/services/profile-types.d.ts +42 -0
  15. package/dist/api/services/profile-types.d.ts.map +1 -0
  16. package/dist/api/services/profile-types.js +8 -0
  17. package/dist/api/services/profile-types.js.map +1 -0
  18. package/dist/api/services/profile-writer.d.ts +6 -0
  19. package/dist/api/services/profile-writer.d.ts.map +1 -0
  20. package/dist/api/services/profile-writer.js +176 -0
  21. package/dist/api/services/profile-writer.js.map +1 -0
  22. package/dist/api/services/validation-service.d.ts +26 -0
  23. package/dist/api/services/validation-service.d.ts.map +1 -0
  24. package/dist/api/services/validation-service.js +77 -0
  25. package/dist/api/services/validation-service.js.map +1 -0
  26. package/dist/auth/auth-commands.d.ts +16 -22
  27. package/dist/auth/auth-commands.d.ts.map +1 -1
  28. package/dist/auth/auth-commands.js +29 -467
  29. package/dist/auth/auth-commands.js.map +1 -1
  30. package/dist/auth/commands/create-command.d.ts +11 -0
  31. package/dist/auth/commands/create-command.d.ts.map +1 -0
  32. package/dist/auth/commands/create-command.js +137 -0
  33. package/dist/auth/commands/create-command.js.map +1 -0
  34. package/dist/auth/commands/default-command.d.ts +15 -0
  35. package/dist/auth/commands/default-command.d.ts.map +1 -0
  36. package/dist/auth/commands/default-command.js +71 -0
  37. package/dist/auth/commands/default-command.js.map +1 -0
  38. package/dist/auth/commands/index.d.ts +12 -0
  39. package/dist/auth/commands/index.d.ts.map +1 -0
  40. package/dist/auth/commands/index.js +25 -0
  41. package/dist/auth/commands/index.js.map +1 -0
  42. package/dist/auth/commands/list-command.d.ts +11 -0
  43. package/dist/auth/commands/list-command.d.ts.map +1 -0
  44. package/dist/auth/commands/list-command.js +124 -0
  45. package/dist/auth/commands/list-command.js.map +1 -0
  46. package/dist/auth/commands/remove-command.d.ts +11 -0
  47. package/dist/auth/commands/remove-command.d.ts.map +1 -0
  48. package/dist/auth/commands/remove-command.js +102 -0
  49. package/dist/auth/commands/remove-command.js.map +1 -0
  50. package/dist/auth/commands/show-command.d.ts +11 -0
  51. package/dist/auth/commands/show-command.d.ts.map +1 -0
  52. package/dist/auth/commands/show-command.js +103 -0
  53. package/dist/auth/commands/show-command.js.map +1 -0
  54. package/dist/auth/commands/types.d.ts +50 -0
  55. package/dist/auth/commands/types.d.ts.map +1 -0
  56. package/dist/auth/commands/types.js +26 -0
  57. package/dist/auth/commands/types.js.map +1 -0
  58. package/dist/auth/index.d.ts +8 -0
  59. package/dist/auth/index.d.ts.map +1 -0
  60. package/dist/auth/index.js +16 -0
  61. package/dist/auth/index.js.map +1 -0
  62. package/dist/auth/profile-detector.d.ts +0 -5
  63. package/dist/auth/profile-detector.d.ts.map +1 -1
  64. package/dist/auth/profile-detector.js +1 -9
  65. package/dist/auth/profile-detector.js.map +1 -1
  66. package/dist/auth/profile-registry.d.ts +0 -4
  67. package/dist/auth/profile-registry.d.ts.map +1 -1
  68. package/dist/auth/profile-registry.js +3 -10
  69. package/dist/auth/profile-registry.js.map +1 -1
  70. package/dist/ccs.js +21 -4
  71. package/dist/ccs.js.map +1 -1
  72. package/dist/cliproxy/auth/auth-types.d.ts +85 -0
  73. package/dist/cliproxy/auth/auth-types.d.ts.map +1 -0
  74. package/dist/cliproxy/auth/auth-types.js +100 -0
  75. package/dist/cliproxy/auth/auth-types.js.map +1 -0
  76. package/dist/cliproxy/auth/environment-detector.d.ts +30 -0
  77. package/dist/cliproxy/auth/environment-detector.d.ts.map +1 -0
  78. package/dist/cliproxy/auth/environment-detector.js +124 -0
  79. package/dist/cliproxy/auth/environment-detector.js.map +1 -0
  80. package/dist/cliproxy/auth/index.d.ts +11 -0
  81. package/dist/cliproxy/auth/index.d.ts.map +1 -0
  82. package/dist/cliproxy/auth/index.js +35 -0
  83. package/dist/cliproxy/auth/index.js.map +1 -0
  84. package/dist/cliproxy/auth/oauth-handler.d.ts +29 -0
  85. package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -0
  86. package/dist/cliproxy/auth/oauth-handler.js +205 -0
  87. package/dist/cliproxy/auth/oauth-handler.js.map +1 -0
  88. package/dist/cliproxy/auth/oauth-process.d.ts +27 -0
  89. package/dist/cliproxy/auth/oauth-process.d.ts.map +1 -0
  90. package/dist/cliproxy/auth/oauth-process.js +209 -0
  91. package/dist/cliproxy/auth/oauth-process.js.map +1 -0
  92. package/dist/cliproxy/auth/token-manager.d.ts +53 -0
  93. package/dist/cliproxy/auth/token-manager.d.ts.map +1 -0
  94. package/dist/cliproxy/auth/token-manager.js +250 -0
  95. package/dist/cliproxy/auth/token-manager.js.map +1 -0
  96. package/dist/cliproxy/auth-handler.d.ts +13 -103
  97. package/dist/cliproxy/auth-handler.d.ts.map +1 -1
  98. package/dist/cliproxy/auth-handler.js +35 -766
  99. package/dist/cliproxy/auth-handler.js.map +1 -1
  100. package/dist/cliproxy/binary/downloader.d.ts +29 -0
  101. package/dist/cliproxy/binary/downloader.d.ts.map +1 -0
  102. package/dist/cliproxy/binary/downloader.js +218 -0
  103. package/dist/cliproxy/binary/downloader.js.map +1 -0
  104. package/dist/cliproxy/binary/extractor.d.ts +12 -0
  105. package/dist/cliproxy/binary/extractor.d.ts.map +1 -0
  106. package/dist/cliproxy/binary/extractor.js +27 -0
  107. package/dist/cliproxy/binary/extractor.js.map +1 -0
  108. package/dist/cliproxy/binary/index.d.ts +13 -0
  109. package/dist/cliproxy/binary/index.d.ts.map +1 -0
  110. package/dist/cliproxy/binary/index.js +53 -0
  111. package/dist/cliproxy/binary/index.js.map +1 -0
  112. package/dist/cliproxy/binary/installer.d.ts +24 -0
  113. package/dist/cliproxy/binary/installer.d.ts.map +1 -0
  114. package/dist/cliproxy/binary/installer.js +117 -0
  115. package/dist/cliproxy/binary/installer.js.map +1 -0
  116. package/dist/cliproxy/binary/lifecycle.d.ts +11 -0
  117. package/dist/cliproxy/binary/lifecycle.d.ts.map +1 -0
  118. package/dist/cliproxy/binary/lifecycle.js +106 -0
  119. package/dist/cliproxy/binary/lifecycle.js.map +1 -0
  120. package/dist/cliproxy/binary/tar-extractor.d.ts +9 -0
  121. package/dist/cliproxy/binary/tar-extractor.d.ts.map +1 -0
  122. package/dist/cliproxy/binary/tar-extractor.js +118 -0
  123. package/dist/cliproxy/binary/tar-extractor.js.map +1 -0
  124. package/dist/cliproxy/binary/types.d.ts +24 -0
  125. package/dist/cliproxy/binary/types.d.ts.map +1 -0
  126. package/dist/cliproxy/binary/types.js +14 -0
  127. package/dist/cliproxy/binary/types.js.map +1 -0
  128. package/dist/cliproxy/binary/updater.d.ts +7 -0
  129. package/dist/cliproxy/binary/updater.d.ts.map +1 -0
  130. package/dist/cliproxy/binary/updater.js +18 -0
  131. package/dist/cliproxy/binary/updater.js.map +1 -0
  132. package/dist/cliproxy/binary/verifier.d.ts +18 -0
  133. package/dist/cliproxy/binary/verifier.d.ts.map +1 -0
  134. package/dist/cliproxy/binary/verifier.js +82 -0
  135. package/dist/cliproxy/binary/verifier.js.map +1 -0
  136. package/dist/cliproxy/binary/version-cache.d.ts +46 -0
  137. package/dist/cliproxy/binary/version-cache.d.ts.map +1 -0
  138. package/dist/cliproxy/binary/version-cache.js +171 -0
  139. package/dist/cliproxy/binary/version-cache.js.map +1 -0
  140. package/dist/cliproxy/binary/version-checker.d.ts +19 -0
  141. package/dist/cliproxy/binary/version-checker.d.ts.map +1 -0
  142. package/dist/cliproxy/binary/version-checker.js +77 -0
  143. package/dist/cliproxy/binary/version-checker.js.map +1 -0
  144. package/dist/cliproxy/binary/zip-extractor.d.ts +9 -0
  145. package/dist/cliproxy/binary/zip-extractor.d.ts.map +1 -0
  146. package/dist/cliproxy/binary/zip-extractor.js +110 -0
  147. package/dist/cliproxy/binary/zip-extractor.js.map +1 -0
  148. package/dist/cliproxy/binary-manager.d.ts +16 -170
  149. package/dist/cliproxy/binary-manager.d.ts.map +1 -1
  150. package/dist/cliproxy/binary-manager.js +38 -865
  151. package/dist/cliproxy/binary-manager.js.map +1 -1
  152. package/dist/cliproxy/services/binary-service.d.ts +65 -0
  153. package/dist/cliproxy/services/binary-service.d.ts.map +1 -0
  154. package/dist/cliproxy/services/binary-service.js +140 -0
  155. package/dist/cliproxy/services/binary-service.js.map +1 -0
  156. package/dist/cliproxy/services/index.d.ts +8 -0
  157. package/dist/cliproxy/services/index.d.ts.map +1 -0
  158. package/dist/cliproxy/services/index.js +31 -0
  159. package/dist/cliproxy/services/index.js.map +1 -0
  160. package/dist/cliproxy/services/proxy-lifecycle-service.d.ts +38 -0
  161. package/dist/cliproxy/services/proxy-lifecycle-service.d.ts.map +1 -0
  162. package/dist/cliproxy/services/proxy-lifecycle-service.js +41 -0
  163. package/dist/cliproxy/services/proxy-lifecycle-service.js.map +1 -0
  164. package/dist/cliproxy/services/variant-config-adapter.d.ts +38 -0
  165. package/dist/cliproxy/services/variant-config-adapter.d.ts.map +1 -0
  166. package/dist/cliproxy/services/variant-config-adapter.js +172 -0
  167. package/dist/cliproxy/services/variant-config-adapter.js.map +1 -0
  168. package/dist/cliproxy/services/variant-service.d.ts +37 -0
  169. package/dist/cliproxy/services/variant-service.d.ts.map +1 -0
  170. package/dist/cliproxy/services/variant-service.js +128 -0
  171. package/dist/cliproxy/services/variant-service.js.map +1 -0
  172. package/dist/cliproxy/services/variant-settings.d.ts +32 -0
  173. package/dist/cliproxy/services/variant-settings.d.ts.map +1 -0
  174. package/dist/cliproxy/services/variant-settings.js +128 -0
  175. package/dist/cliproxy/services/variant-settings.js.map +1 -0
  176. package/dist/commands/api-command.d.ts +3 -6
  177. package/dist/commands/api-command.d.ts.map +1 -1
  178. package/dist/commands/api-command.js +84 -445
  179. package/dist/commands/api-command.js.map +1 -1
  180. package/dist/commands/cliproxy-command.d.ts +0 -3
  181. package/dist/commands/cliproxy-command.d.ts.map +1 -1
  182. package/dist/commands/cliproxy-command.js +182 -621
  183. package/dist/commands/cliproxy-command.js.map +1 -1
  184. package/dist/commands/index.d.ts +17 -0
  185. package/dist/commands/index.d.ts.map +1 -0
  186. package/dist/commands/index.js +33 -0
  187. package/dist/commands/index.js.map +1 -0
  188. package/dist/config/unified-config-loader.d.ts +7 -0
  189. package/dist/config/unified-config-loader.d.ts.map +1 -1
  190. package/dist/config/unified-config-loader.js +11 -1
  191. package/dist/config/unified-config-loader.js.map +1 -1
  192. package/dist/delegation/executor/index.d.ts +7 -0
  193. package/dist/delegation/executor/index.d.ts.map +1 -0
  194. package/dist/delegation/executor/index.js +28 -0
  195. package/dist/delegation/executor/index.js.map +1 -0
  196. package/dist/delegation/executor/result-aggregator.d.ts +30 -0
  197. package/dist/delegation/executor/result-aggregator.d.ts.map +1 -0
  198. package/dist/delegation/executor/result-aggregator.js +66 -0
  199. package/dist/delegation/executor/result-aggregator.js.map +1 -0
  200. package/dist/delegation/executor/stream-parser.d.ts +28 -0
  201. package/dist/delegation/executor/stream-parser.d.ts.map +1 -0
  202. package/dist/delegation/executor/stream-parser.js +140 -0
  203. package/dist/delegation/executor/stream-parser.js.map +1 -0
  204. package/dist/delegation/executor/types.d.ts +121 -0
  205. package/dist/delegation/executor/types.d.ts.map +1 -0
  206. package/dist/delegation/executor/types.js +6 -0
  207. package/dist/delegation/executor/types.js.map +1 -0
  208. package/dist/delegation/headless-executor.d.ts +13 -91
  209. package/dist/delegation/headless-executor.d.ts.map +1 -1
  210. package/dist/delegation/headless-executor.js +84 -291
  211. package/dist/delegation/headless-executor.js.map +1 -1
  212. package/dist/delegation/index.d.ts +11 -0
  213. package/dist/delegation/index.d.ts.map +1 -0
  214. package/dist/delegation/index.js +33 -0
  215. package/dist/delegation/index.js.map +1 -0
  216. package/dist/delegation/result-formatter.d.ts +1 -30
  217. package/dist/delegation/result-formatter.d.ts.map +1 -1
  218. package/dist/delegation/result-formatter.js.map +1 -1
  219. package/dist/errors/cleanup-registry.d.ts +64 -0
  220. package/dist/errors/cleanup-registry.d.ts.map +1 -0
  221. package/dist/errors/cleanup-registry.js +141 -0
  222. package/dist/errors/cleanup-registry.js.map +1 -0
  223. package/dist/errors/error-handler.d.ts +45 -0
  224. package/dist/errors/error-handler.d.ts.map +1 -0
  225. package/dist/errors/error-handler.js +150 -0
  226. package/dist/errors/error-handler.js.map +1 -0
  227. package/dist/errors/error-types.d.ts +102 -0
  228. package/dist/errors/error-types.d.ts.map +1 -0
  229. package/dist/errors/error-types.js +158 -0
  230. package/dist/errors/error-types.js.map +1 -0
  231. package/dist/errors/exit-codes.d.ts +49 -0
  232. package/dist/errors/exit-codes.d.ts.map +1 -0
  233. package/dist/errors/exit-codes.js +72 -0
  234. package/dist/errors/exit-codes.js.map +1 -0
  235. package/dist/errors/index.d.ts +29 -0
  236. package/dist/errors/index.d.ts.map +1 -0
  237. package/dist/errors/index.js +62 -0
  238. package/dist/errors/index.js.map +1 -0
  239. package/dist/glmt/glmt-transformer.d.ts +29 -248
  240. package/dist/glmt/glmt-transformer.d.ts.map +1 -1
  241. package/dist/glmt/glmt-transformer.js +63 -718
  242. package/dist/glmt/glmt-transformer.js.map +1 -1
  243. package/dist/glmt/index.d.ts +14 -0
  244. package/dist/glmt/index.d.ts.map +1 -0
  245. package/dist/glmt/index.js +41 -0
  246. package/dist/glmt/index.js.map +1 -0
  247. package/dist/glmt/pipeline/content-transformer.d.ts +39 -0
  248. package/dist/glmt/pipeline/content-transformer.d.ts.map +1 -0
  249. package/dist/glmt/pipeline/content-transformer.js +162 -0
  250. package/dist/glmt/pipeline/content-transformer.js.map +1 -0
  251. package/dist/glmt/pipeline/index.d.ts +12 -0
  252. package/dist/glmt/pipeline/index.d.ts.map +1 -0
  253. package/dist/glmt/pipeline/index.js +20 -0
  254. package/dist/glmt/pipeline/index.js.map +1 -0
  255. package/dist/glmt/pipeline/request-transformer.d.ts +31 -0
  256. package/dist/glmt/pipeline/request-transformer.d.ts.map +1 -0
  257. package/dist/glmt/pipeline/request-transformer.js +116 -0
  258. package/dist/glmt/pipeline/request-transformer.js.map +1 -0
  259. package/dist/glmt/pipeline/response-builder.d.ts +52 -0
  260. package/dist/glmt/pipeline/response-builder.d.ts.map +1 -0
  261. package/dist/glmt/pipeline/response-builder.js +205 -0
  262. package/dist/glmt/pipeline/response-builder.js.map +1 -0
  263. package/dist/glmt/pipeline/stream-parser.d.ts +59 -0
  264. package/dist/glmt/pipeline/stream-parser.d.ts.map +1 -0
  265. package/dist/glmt/pipeline/stream-parser.js +241 -0
  266. package/dist/glmt/pipeline/stream-parser.js.map +1 -0
  267. package/dist/glmt/pipeline/tool-call-handler.d.ts +22 -0
  268. package/dist/glmt/pipeline/tool-call-handler.d.ts.map +1 -0
  269. package/dist/glmt/pipeline/tool-call-handler.js +87 -0
  270. package/dist/glmt/pipeline/tool-call-handler.js.map +1 -0
  271. package/dist/glmt/pipeline/types.d.ts +159 -0
  272. package/dist/glmt/pipeline/types.d.ts.map +1 -0
  273. package/dist/glmt/pipeline/types.js +6 -0
  274. package/dist/glmt/pipeline/types.js.map +1 -0
  275. package/dist/management/checks/cliproxy-check.d.ts +37 -0
  276. package/dist/management/checks/cliproxy-check.d.ts.map +1 -0
  277. package/dist/management/checks/cliproxy-check.js +187 -0
  278. package/dist/management/checks/cliproxy-check.js.map +1 -0
  279. package/dist/management/checks/config-check.d.ts +27 -0
  280. package/dist/management/checks/config-check.d.ts.map +1 -0
  281. package/dist/management/checks/config-check.js +158 -0
  282. package/dist/management/checks/config-check.js.map +1 -0
  283. package/dist/management/checks/env-check.d.ts +17 -0
  284. package/dist/management/checks/env-check.d.ts.map +1 -0
  285. package/dist/management/checks/env-check.js +71 -0
  286. package/dist/management/checks/env-check.js.map +1 -0
  287. package/dist/management/checks/index.d.ts +12 -0
  288. package/dist/management/checks/index.d.ts.map +1 -0
  289. package/dist/management/checks/index.js +48 -0
  290. package/dist/management/checks/index.js.map +1 -0
  291. package/dist/management/checks/oauth-check.d.ts +16 -0
  292. package/dist/management/checks/oauth-check.d.ts.map +1 -0
  293. package/dist/management/checks/oauth-check.js +68 -0
  294. package/dist/management/checks/oauth-check.js.map +1 -0
  295. package/dist/management/checks/profile-check.d.ts +36 -0
  296. package/dist/management/checks/profile-check.d.ts.map +1 -0
  297. package/dist/management/checks/profile-check.js +165 -0
  298. package/dist/management/checks/profile-check.js.map +1 -0
  299. package/dist/management/checks/symlink-check.d.ts +30 -0
  300. package/dist/management/checks/symlink-check.d.ts.map +1 -0
  301. package/dist/management/checks/symlink-check.js +204 -0
  302. package/dist/management/checks/symlink-check.js.map +1 -0
  303. package/dist/management/checks/system-check.d.ts +25 -0
  304. package/dist/management/checks/system-check.d.ts.map +1 -0
  305. package/dist/management/checks/system-check.js +136 -0
  306. package/dist/management/checks/system-check.js.map +1 -0
  307. package/dist/management/checks/types.d.ts +64 -0
  308. package/dist/management/checks/types.d.ts.map +1 -0
  309. package/dist/management/checks/types.js +63 -0
  310. package/dist/management/checks/types.js.map +1 -0
  311. package/dist/management/doctor.d.ts +3 -92
  312. package/dist/management/doctor.d.ts.map +1 -1
  313. package/dist/management/doctor.js +15 -831
  314. package/dist/management/doctor.js.map +1 -1
  315. package/dist/management/index.d.ts +15 -0
  316. package/dist/management/index.d.ts.map +1 -0
  317. package/dist/management/index.js +56 -0
  318. package/dist/management/index.js.map +1 -0
  319. package/dist/management/repair/auto-repair.d.ts +13 -0
  320. package/dist/management/repair/auto-repair.d.ts.map +1 -0
  321. package/dist/management/repair/auto-repair.js +170 -0
  322. package/dist/management/repair/auto-repair.js.map +1 -0
  323. package/dist/management/repair/index.d.ts +5 -0
  324. package/dist/management/repair/index.d.ts.map +1 -0
  325. package/dist/management/repair/index.js +9 -0
  326. package/dist/management/repair/index.js.map +1 -0
  327. package/dist/types/delegation.d.ts +1 -13
  328. package/dist/types/delegation.d.ts.map +1 -1
  329. package/dist/types/utils.d.ts +27 -0
  330. package/dist/types/utils.d.ts.map +1 -1
  331. package/dist/ui/assets/{accounts-p1_nf0Jy.js → accounts-BqDNXZu4.js} +1 -1
  332. package/dist/ui/assets/analytics-DQMyOsqI.js +1 -0
  333. package/dist/ui/assets/api-Bzyq4XP7.js +1 -0
  334. package/dist/ui/assets/{card-CCDc-Mx9.js → card-CIN0KDsX.js} +1 -1
  335. package/dist/ui/assets/cliproxy-5iKdPrEG.js +3 -0
  336. package/dist/ui/assets/cliproxy-control-panel-CJ2CfYod.js +1 -0
  337. package/dist/ui/assets/{code-editor-Br9x-r-E.js → code-editor-CDmNFLQ6.js} +1 -1
  338. package/dist/ui/assets/confirm-dialog-CaiDQikc.js +1 -0
  339. package/dist/ui/assets/copilot-nS6iAyk2.js +4 -0
  340. package/dist/ui/assets/form-utils-DP6ILe7Z.js +20 -0
  341. package/dist/ui/assets/health-DYOQfC7u.js +1 -0
  342. package/dist/ui/assets/{icons-BOsxPbiD.js → icons-ZmwVoUeR.js} +1 -1
  343. package/dist/ui/assets/index-C6Dah-xh.js +46 -0
  344. package/dist/ui/assets/index-It66SkKf.css +1 -0
  345. package/dist/ui/assets/{radix-ui-DFHQr9A5.js → radix-ui-CV3R9pD6.js} +3 -3
  346. package/dist/ui/assets/settings-DABC9b5G.js +1 -0
  347. package/dist/ui/assets/{shared-BfYhSN4-.js → shared-BwU4OKQc.js} +1 -1
  348. package/dist/ui/assets/{switch-CMk95lwf.js → switch-BQ6sBBUv.js} +1 -1
  349. package/dist/ui/assets/{tanstack-C4gT2P7V.js → tanstack-Df9bCj5R.js} +1 -1
  350. package/dist/ui/index.html +6 -6
  351. package/dist/utils/claude-spawner.d.ts +54 -0
  352. package/dist/utils/claude-spawner.d.ts.map +1 -0
  353. package/dist/utils/claude-spawner.js +118 -0
  354. package/dist/utils/claude-spawner.js.map +1 -0
  355. package/dist/utils/delegation-validator.d.ts +8 -4
  356. package/dist/utils/delegation-validator.d.ts.map +1 -1
  357. package/dist/utils/delegation-validator.js.map +1 -1
  358. package/dist/utils/helpers.d.ts +0 -11
  359. package/dist/utils/helpers.d.ts.map +1 -1
  360. package/dist/utils/helpers.js +1 -57
  361. package/dist/utils/helpers.js.map +1 -1
  362. package/dist/utils/index.d.ts +15 -0
  363. package/dist/utils/index.d.ts.map +1 -0
  364. package/dist/utils/index.js +50 -0
  365. package/dist/utils/index.js.map +1 -0
  366. package/dist/utils/time.d.ts +10 -0
  367. package/dist/utils/time.d.ts.map +1 -0
  368. package/dist/utils/time.js +27 -0
  369. package/dist/utils/time.js.map +1 -0
  370. package/dist/utils/ui/boxes.d.ts +24 -0
  371. package/dist/utils/ui/boxes.d.ts.map +1 -0
  372. package/dist/utils/ui/boxes.js +108 -0
  373. package/dist/utils/ui/boxes.js.map +1 -0
  374. package/dist/utils/ui/colors.d.ts +25 -0
  375. package/dist/utils/ui/colors.d.ts.map +1 -0
  376. package/dist/utils/ui/colors.js +70 -0
  377. package/dist/utils/ui/colors.js.map +1 -0
  378. package/dist/utils/ui/index.d.ts +51 -0
  379. package/dist/utils/ui/index.d.ts.map +1 -0
  380. package/dist/utils/ui/index.js +96 -0
  381. package/dist/utils/ui/index.js.map +1 -0
  382. package/dist/utils/ui/indicators.d.ts +23 -0
  383. package/dist/utils/ui/indicators.d.ts.map +1 -0
  384. package/dist/utils/ui/indicators.js +39 -0
  385. package/dist/utils/ui/indicators.js.map +1 -0
  386. package/dist/utils/ui/init.d.ts +30 -0
  387. package/dist/utils/ui/init.d.ts.map +1 -0
  388. package/dist/utils/ui/init.js +102 -0
  389. package/dist/utils/ui/init.js.map +1 -0
  390. package/dist/utils/ui/spinner.d.ts +13 -0
  391. package/dist/utils/ui/spinner.d.ts.map +1 -0
  392. package/dist/utils/ui/spinner.js +89 -0
  393. package/dist/utils/ui/spinner.js.map +1 -0
  394. package/dist/utils/ui/tables.d.ts +12 -0
  395. package/dist/utils/ui/tables.d.ts.map +1 -0
  396. package/dist/utils/ui/tables.js +69 -0
  397. package/dist/utils/ui/tables.js.map +1 -0
  398. package/dist/utils/ui/tasks.d.ts +26 -0
  399. package/dist/utils/ui/tasks.d.ts.map +1 -0
  400. package/dist/utils/ui/tasks.js +102 -0
  401. package/dist/utils/ui/tasks.js.map +1 -0
  402. package/dist/utils/ui/text.d.ts +24 -0
  403. package/dist/utils/ui/text.d.ts.map +1 -0
  404. package/dist/utils/ui/text.js +60 -0
  405. package/dist/utils/ui/text.js.map +1 -0
  406. package/dist/utils/ui/types.d.ts +36 -0
  407. package/dist/utils/ui/types.d.ts.map +1 -0
  408. package/dist/utils/ui/types.js +33 -0
  409. package/dist/utils/ui/types.js.map +1 -0
  410. package/dist/utils/ui.d.ts +3 -138
  411. package/dist/utils/ui.d.ts.map +1 -1
  412. package/dist/utils/ui.js +40 -567
  413. package/dist/utils/ui.js.map +1 -1
  414. package/dist/utils/websearch/gemini-cli.d.ts +36 -0
  415. package/dist/utils/websearch/gemini-cli.d.ts.map +1 -0
  416. package/dist/utils/websearch/gemini-cli.js +132 -0
  417. package/dist/utils/websearch/gemini-cli.js.map +1 -0
  418. package/dist/utils/websearch/grok-cli.d.ts +26 -0
  419. package/dist/utils/websearch/grok-cli.d.ts.map +1 -0
  420. package/dist/utils/websearch/grok-cli.js +81 -0
  421. package/dist/utils/websearch/grok-cli.js.map +1 -0
  422. package/dist/utils/websearch/hook-config.d.ts +21 -0
  423. package/dist/utils/websearch/hook-config.d.ts.map +1 -0
  424. package/dist/utils/websearch/hook-config.js +183 -0
  425. package/dist/utils/websearch/hook-config.js.map +1 -0
  426. package/dist/utils/websearch/hook-env.d.ts +16 -0
  427. package/dist/utils/websearch/hook-env.d.ts.map +1 -0
  428. package/dist/utils/websearch/hook-env.js +62 -0
  429. package/dist/utils/websearch/hook-env.js.map +1 -0
  430. package/dist/utils/websearch/hook-installer.d.ts +27 -0
  431. package/dist/utils/websearch/hook-installer.d.ts.map +1 -0
  432. package/dist/utils/websearch/hook-installer.js +141 -0
  433. package/dist/utils/websearch/hook-installer.js.map +1 -0
  434. package/dist/utils/websearch/index.d.ts +15 -0
  435. package/dist/utils/websearch/index.d.ts.map +1 -0
  436. package/dist/utils/websearch/index.js +44 -0
  437. package/dist/utils/websearch/index.js.map +1 -0
  438. package/dist/utils/websearch/opencode-cli.d.ts +26 -0
  439. package/dist/utils/websearch/opencode-cli.d.ts.map +1 -0
  440. package/dist/utils/websearch/opencode-cli.js +81 -0
  441. package/dist/utils/websearch/opencode-cli.js.map +1 -0
  442. package/dist/utils/websearch/status.d.ts +35 -0
  443. package/dist/utils/websearch/status.d.ts.map +1 -0
  444. package/dist/utils/websearch/status.js +185 -0
  445. package/dist/utils/websearch/status.js.map +1 -0
  446. package/dist/utils/websearch/types.d.ts +85 -0
  447. package/dist/utils/websearch/types.d.ts.map +1 -0
  448. package/dist/utils/websearch/types.js +10 -0
  449. package/dist/utils/websearch/types.js.map +1 -0
  450. package/dist/utils/websearch-manager.d.ts +7 -186
  451. package/dist/utils/websearch-manager.d.ts.map +1 -1
  452. package/dist/utils/websearch-manager.js +37 -710
  453. package/dist/utils/websearch-manager.js.map +1 -1
  454. package/dist/web-server/data-aggregator.d.ts +3 -51
  455. package/dist/web-server/data-aggregator.d.ts.map +1 -1
  456. package/dist/web-server/data-aggregator.js +18 -386
  457. package/dist/web-server/data-aggregator.js.map +1 -1
  458. package/dist/web-server/health/cliproxy-checks.d.ts +23 -0
  459. package/dist/web-server/health/cliproxy-checks.d.ts.map +1 -0
  460. package/dist/web-server/health/cliproxy-checks.js +145 -0
  461. package/dist/web-server/health/cliproxy-checks.js.map +1 -0
  462. package/dist/web-server/health/config-checks.d.ts +19 -0
  463. package/dist/web-server/health/config-checks.d.ts.map +1 -0
  464. package/dist/web-server/health/config-checks.js +174 -0
  465. package/dist/web-server/health/config-checks.js.map +1 -0
  466. package/dist/web-server/health/environment-checks.d.ts +11 -0
  467. package/dist/web-server/health/environment-checks.d.ts.map +1 -0
  468. package/dist/web-server/health/environment-checks.js +40 -0
  469. package/dist/web-server/health/environment-checks.js.map +1 -0
  470. package/dist/web-server/health/index.d.ts +13 -0
  471. package/dist/web-server/health/index.d.ts.map +1 -0
  472. package/dist/web-server/health/index.js +41 -0
  473. package/dist/web-server/health/index.js.map +1 -0
  474. package/dist/web-server/health/oauth-checks.d.ts +11 -0
  475. package/dist/web-server/health/oauth-checks.d.ts.map +1 -0
  476. package/dist/web-server/health/oauth-checks.js +34 -0
  477. package/dist/web-server/health/oauth-checks.js.map +1 -0
  478. package/dist/web-server/health/profile-checks.d.ts +19 -0
  479. package/dist/web-server/health/profile-checks.d.ts.map +1 -0
  480. package/dist/web-server/health/profile-checks.js +152 -0
  481. package/dist/web-server/health/profile-checks.js.map +1 -0
  482. package/dist/web-server/health/symlink-checks.d.ts +15 -0
  483. package/dist/web-server/health/symlink-checks.d.ts.map +1 -0
  484. package/dist/web-server/health/symlink-checks.js +173 -0
  485. package/dist/web-server/health/symlink-checks.js.map +1 -0
  486. package/dist/web-server/health/system-checks.d.ts +19 -0
  487. package/dist/web-server/health/system-checks.d.ts.map +1 -0
  488. package/dist/web-server/health/system-checks.js +127 -0
  489. package/dist/web-server/health/system-checks.js.map +1 -0
  490. package/dist/web-server/health/types.d.ts +34 -0
  491. package/dist/web-server/health/types.d.ts.map +1 -0
  492. package/dist/web-server/health/types.js +8 -0
  493. package/dist/web-server/health/types.js.map +1 -0
  494. package/dist/web-server/health/websearch-checks.d.ts +11 -0
  495. package/dist/web-server/health/websearch-checks.d.ts.map +1 -0
  496. package/dist/web-server/health/websearch-checks.js +53 -0
  497. package/dist/web-server/health/websearch-checks.js.map +1 -0
  498. package/dist/web-server/health-service.d.ts +4 -30
  499. package/dist/web-server/health-service.d.ts.map +1 -1
  500. package/dist/web-server/health-service.js +28 -695
  501. package/dist/web-server/health-service.js.map +1 -1
  502. package/dist/web-server/index.d.ts.map +1 -1
  503. package/dist/web-server/index.js +2 -5
  504. package/dist/web-server/index.js.map +1 -1
  505. package/dist/web-server/routes/cliproxy-auth-routes.d.ts +6 -0
  506. package/dist/web-server/routes/cliproxy-auth-routes.d.ts.map +1 -0
  507. package/dist/web-server/routes/cliproxy-auth-routes.js +202 -0
  508. package/dist/web-server/routes/cliproxy-auth-routes.js.map +1 -0
  509. package/dist/web-server/routes/cliproxy-stats-routes.d.ts +6 -0
  510. package/dist/web-server/routes/cliproxy-stats-routes.d.ts.map +1 -0
  511. package/dist/web-server/routes/cliproxy-stats-routes.js +253 -0
  512. package/dist/web-server/routes/cliproxy-stats-routes.js.map +1 -0
  513. package/dist/web-server/routes/config-routes.d.ts +6 -0
  514. package/dist/web-server/routes/config-routes.d.ts.map +1 -0
  515. package/dist/web-server/routes/config-routes.js +145 -0
  516. package/dist/web-server/routes/config-routes.js.map +1 -0
  517. package/dist/web-server/routes/copilot-routes.d.ts +6 -0
  518. package/dist/web-server/routes/copilot-routes.d.ts.map +1 -0
  519. package/dist/web-server/routes/copilot-routes.js +195 -0
  520. package/dist/web-server/routes/copilot-routes.js.map +1 -0
  521. package/dist/web-server/routes/copilot-settings-routes.d.ts +6 -0
  522. package/dist/web-server/routes/copilot-settings-routes.d.ts.map +1 -0
  523. package/dist/web-server/routes/copilot-settings-routes.js +122 -0
  524. package/dist/web-server/routes/copilot-settings-routes.js.map +1 -0
  525. package/dist/web-server/routes/health-routes.d.ts +6 -0
  526. package/dist/web-server/routes/health-routes.d.ts.map +1 -0
  527. package/dist/web-server/routes/health-routes.js +30 -0
  528. package/dist/web-server/routes/health-routes.js.map +1 -0
  529. package/dist/web-server/routes/index.d.ts +8 -0
  530. package/dist/web-server/routes/index.d.ts.map +1 -0
  531. package/dist/web-server/routes/index.js +54 -0
  532. package/dist/web-server/routes/index.js.map +1 -0
  533. package/dist/web-server/routes/misc-routes.d.ts +6 -0
  534. package/dist/web-server/routes/misc-routes.d.ts.map +1 -0
  535. package/dist/web-server/routes/misc-routes.js +219 -0
  536. package/dist/web-server/routes/misc-routes.js.map +1 -0
  537. package/dist/web-server/routes/profile-routes.d.ts +6 -0
  538. package/dist/web-server/routes/profile-routes.d.ts.map +1 -0
  539. package/dist/web-server/routes/profile-routes.js +164 -0
  540. package/dist/web-server/routes/profile-routes.js.map +1 -0
  541. package/dist/web-server/routes/provider-routes.d.ts +6 -0
  542. package/dist/web-server/routes/provider-routes.d.ts.map +1 -0
  543. package/dist/web-server/routes/provider-routes.js +146 -0
  544. package/dist/web-server/routes/provider-routes.js.map +1 -0
  545. package/dist/web-server/routes/route-helpers.d.ts +55 -0
  546. package/dist/web-server/routes/route-helpers.d.ts.map +1 -0
  547. package/dist/web-server/routes/route-helpers.js +201 -0
  548. package/dist/web-server/routes/route-helpers.js.map +1 -0
  549. package/dist/web-server/routes/settings-routes.d.ts +6 -0
  550. package/dist/web-server/routes/settings-routes.d.ts.map +1 -0
  551. package/dist/web-server/routes/settings-routes.js +207 -0
  552. package/dist/web-server/routes/settings-routes.js.map +1 -0
  553. package/dist/web-server/routes/variant-routes.d.ts +6 -0
  554. package/dist/web-server/routes/variant-routes.d.ts.map +1 -0
  555. package/dist/web-server/routes/variant-routes.js +158 -0
  556. package/dist/web-server/routes/variant-routes.js.map +1 -0
  557. package/dist/web-server/routes/websearch-routes.d.ts +6 -0
  558. package/dist/web-server/routes/websearch-routes.d.ts.map +1 -0
  559. package/dist/web-server/routes/websearch-routes.js +130 -0
  560. package/dist/web-server/routes/websearch-routes.js.map +1 -0
  561. package/dist/web-server/services/index.d.ts +7 -0
  562. package/dist/web-server/services/index.d.ts.map +1 -0
  563. package/dist/web-server/services/index.js +21 -0
  564. package/dist/web-server/services/index.js.map +1 -0
  565. package/dist/web-server/services/usage-aggregator.d.ts +7 -0
  566. package/dist/web-server/services/usage-aggregator.d.ts.map +1 -0
  567. package/dist/web-server/services/usage-aggregator.js +23 -0
  568. package/dist/web-server/services/usage-aggregator.js.map +1 -0
  569. package/dist/web-server/usage/aggregator.d.ts +54 -0
  570. package/dist/web-server/usage/aggregator.d.ts.map +1 -0
  571. package/dist/web-server/usage/aggregator.js +470 -0
  572. package/dist/web-server/usage/aggregator.js.map +1 -0
  573. package/dist/web-server/usage/data-aggregator.d.ts +55 -0
  574. package/dist/web-server/usage/data-aggregator.d.ts.map +1 -0
  575. package/dist/web-server/usage/data-aggregator.js +391 -0
  576. package/dist/web-server/usage/data-aggregator.js.map +1 -0
  577. package/dist/web-server/usage/disk-cache.d.ts +46 -0
  578. package/dist/web-server/usage/disk-cache.d.ts.map +1 -0
  579. package/dist/web-server/usage/disk-cache.js +162 -0
  580. package/dist/web-server/usage/disk-cache.js.map +1 -0
  581. package/dist/web-server/usage/handlers.d.ts +50 -0
  582. package/dist/web-server/usage/handlers.d.ts.map +1 -0
  583. package/dist/web-server/usage/handlers.js +524 -0
  584. package/dist/web-server/usage/handlers.js.map +1 -0
  585. package/dist/web-server/usage/index.d.ts +12 -0
  586. package/dist/web-server/usage/index.d.ts.map +1 -0
  587. package/dist/web-server/usage/index.js +54 -0
  588. package/dist/web-server/usage/index.js.map +1 -0
  589. package/dist/web-server/usage/routes.d.ts +11 -0
  590. package/dist/web-server/usage/routes.d.ts.map +1 -0
  591. package/dist/web-server/usage/routes.js +37 -0
  592. package/dist/web-server/usage/routes.js.map +1 -0
  593. package/dist/web-server/usage/types.d.ts +119 -0
  594. package/dist/web-server/usage/types.d.ts.map +1 -0
  595. package/dist/web-server/usage/types.js +9 -0
  596. package/dist/web-server/usage/types.js.map +1 -0
  597. package/dist/web-server/usage-disk-cache.d.ts +3 -42
  598. package/dist/web-server/usage-disk-cache.d.ts.map +1 -1
  599. package/dist/web-server/usage-disk-cache.js +5 -144
  600. package/dist/web-server/usage-disk-cache.js.map +1 -1
  601. package/dist/web-server/usage-routes.d.ts +3 -31
  602. package/dist/web-server/usage-routes.d.ts.map +1 -1
  603. package/dist/web-server/usage-routes.js +8 -1139
  604. package/dist/web-server/usage-routes.js.map +1 -1
  605. package/dist/web-server/usage-types.d.ts +3 -115
  606. package/dist/web-server/usage-types.d.ts.map +1 -1
  607. package/dist/web-server/usage-types.js +17 -3
  608. package/dist/web-server/usage-types.js.map +1 -1
  609. package/package.json +1 -1
  610. package/dist/ui/assets/analytics-D1k2nYcF.js +0 -1
  611. package/dist/ui/assets/api-D9VVmZ1j.js +0 -1
  612. package/dist/ui/assets/cliproxy-CTt_Nsft.js +0 -1
  613. package/dist/ui/assets/cliproxy-control-panel-DKMAi4_4.js +0 -1
  614. package/dist/ui/assets/copilot-C6F8PT_L.js +0 -4
  615. package/dist/ui/assets/form-utils-BuXDJb0w.js +0 -20
  616. package/dist/ui/assets/health-DiAvJaSn.js +0 -1
  617. package/dist/ui/assets/index-Brq6EBKZ.css +0 -1
  618. package/dist/ui/assets/index-ByU8ZhED.js +0 -48
  619. package/dist/ui/assets/settings-CEomZLGl.js +0 -1
  620. package/dist/web-server/routes.d.ts +0 -7
  621. package/dist/web-server/routes.d.ts.map +0 -1
  622. package/dist/web-server/routes.js +0 -1891
  623. package/dist/web-server/routes.js.map +0 -1
@@ -1,19 +1,12 @@
1
1
  "use strict";
2
2
  /**
3
- * GlmtTransformer - Convert between Anthropic and OpenAI formats with thinking and tool support
3
+ * GlmtTransformer - Orchestrator for Anthropic OpenAI format transformation
4
4
  *
5
- * Features:
6
- * - Request: Anthropic → OpenAI (inject reasoning params, transform tools)
7
- * - Response: OpenAI reasoning_content Anthropic thinking blocks
8
- * - Tool Support: Anthropic tools ↔ OpenAI function calling (bidirectional)
9
- * - Streaming: Real-time tool calls with input_json deltas
10
- * - Debug mode: Log raw data to ~/.ccs/logs/ (CCS_DEBUG=1)
11
- * - Verbose mode: Console logging with timestamps
12
- * - Validation: Self-test transformation results
13
- *
14
- * Control Tags (in user prompt):
15
- * <Thinking:On|Off> - Enable/disable reasoning
16
- * <Effort:Low|Medium|High> - Control reasoning depth
5
+ * Pipeline Architecture:
6
+ * - RequestTransformer: Anthropic → OpenAI request conversion
7
+ * - StreamParser: Delta processing for streaming responses
8
+ * - ResponseBuilder: SSE event generation
9
+ * - ToolCallHandler: Tool call processing
17
10
  */
18
11
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
12
  if (k2 === undefined) k2 = k;
@@ -40,436 +33,132 @@ var __importStar = (this && this.__importStar) || function (mod) {
40
33
  };
41
34
  Object.defineProperty(exports, "__esModule", { value: true });
42
35
  exports.GlmtTransformer = void 0;
43
- const crypto = __importStar(require("crypto"));
44
36
  const fs = __importStar(require("fs"));
45
37
  const path = __importStar(require("path"));
46
38
  const os = __importStar(require("os"));
47
- const locale_enforcer_1 = require("./locale-enforcer");
48
- const reasoning_enforcer_1 = require("./reasoning-enforcer");
39
+ const pipeline_1 = require("./pipeline");
49
40
  class GlmtTransformer {
50
41
  constructor(config = {}) {
51
- this.defaultThinking = config.defaultThinking ?? true;
52
42
  this.verbose = config.verbose || false;
53
- // CCS_DEBUG controls all debug logging (file + console)
54
43
  const debugEnabled = process.env.CCS_DEBUG === '1';
55
44
  this.debugLog = config.debugLog ?? debugEnabled;
56
- this.debugMode = config.debugMode ?? debugEnabled;
57
45
  this.debugLogDir = config.debugLogDir || path.join(os.homedir(), '.ccs', 'logs');
58
- this.modelMaxTokens = {
59
- 'GLM-4.6': 128000,
60
- 'GLM-4.5': 96000,
61
- 'GLM-4.5-air': 16000,
62
- };
63
- // Initialize locale enforcer (always enforce English)
64
- this.localeEnforcer = new locale_enforcer_1.LocaleEnforcer();
65
- // Initialize reasoning enforcer (enabled by default for all GLMT usage)
66
- this.reasoningEnforcer = new reasoning_enforcer_1.ReasoningEnforcer({
67
- enabled: config.explicitReasoning ?? true,
46
+ // Initialize pipeline components
47
+ this.requestTransformer = new pipeline_1.RequestTransformer({
48
+ defaultThinking: config.defaultThinking ?? true,
49
+ verbose: this.verbose,
50
+ explicitReasoning: config.explicitReasoning ?? true,
51
+ log: (msg) => this.log(msg),
52
+ });
53
+ this.responseBuilder = new pipeline_1.ResponseBuilder(this.verbose);
54
+ this.toolCallHandler = new pipeline_1.ToolCallHandler();
55
+ this.contentTransformer = new pipeline_1.ContentTransformer(config.defaultThinking ?? true);
56
+ this.streamParser = new pipeline_1.StreamParser({
57
+ verbose: this.verbose,
58
+ debugMode: config.debugMode ?? debugEnabled,
59
+ debugLog: this.debugLog,
60
+ writeDebugLog: (type, data) => this.writeDebugLog(type, data),
68
61
  });
69
62
  }
70
- /**
71
- * Transform Anthropic request to OpenAI format
72
- */
63
+ /** Transform Anthropic request to OpenAI format */
73
64
  transformRequest(anthropicRequest) {
74
- // Log original request
75
65
  this.writeDebugLog('request-anthropic', anthropicRequest);
76
- try {
77
- // 1. Extract thinking control from messages (tags like <Thinking:On|Off>)
78
- const thinkingConfig = this.extractThinkingControl(anthropicRequest.messages || []);
79
- const hasControlTags = this.hasThinkingTags(anthropicRequest.messages || []);
80
- // 2. Detect "think" keywords in user prompts (Anthropic-style)
81
- const keywordConfig = this.detectThinkKeywords(anthropicRequest.messages || []);
82
- if (keywordConfig && !anthropicRequest.thinking && !hasControlTags) {
83
- thinkingConfig.thinking = keywordConfig.thinking;
84
- thinkingConfig.effort = keywordConfig.effort;
85
- this.log(`Detected think keyword: ${keywordConfig.keyword}, effort=${keywordConfig.effort}`);
86
- }
87
- // 3. Check anthropicRequest.thinking parameter (takes precedence)
88
- if (anthropicRequest.thinking) {
89
- if (anthropicRequest.thinking.type === 'enabled') {
90
- thinkingConfig.thinking = true;
91
- this.log('Claude CLI explicitly enabled thinking (overrides budget)');
92
- }
93
- else if (anthropicRequest.thinking.type === 'disabled') {
94
- thinkingConfig.thinking = false;
95
- this.log('Claude CLI explicitly disabled thinking (overrides budget)');
96
- }
97
- else {
98
- this.log(`Warning: Unknown thinking type: ${anthropicRequest.thinking.type}`);
99
- }
100
- }
101
- this.log(`Final thinking control: ${JSON.stringify(thinkingConfig)}`);
102
- // 3. Map model
103
- const glmModel = this.mapModel(anthropicRequest.model);
104
- // 4. Inject locale instruction before sanitization
105
- const messagesWithLocale = this.localeEnforcer.injectInstruction((anthropicRequest.messages || []));
106
- // 4.5. Inject reasoning instruction (if enabled or thinking requested)
107
- const messagesWithReasoning = this.reasoningEnforcer.injectInstruction(messagesWithLocale, thinkingConfig);
108
- // 5. Convert to OpenAI format
109
- const openaiRequest = {
110
- model: glmModel,
111
- messages: this.sanitizeMessages(messagesWithReasoning),
112
- max_tokens: this.getMaxTokens(glmModel),
113
- stream: anthropicRequest.stream ?? false,
114
- };
115
- // 5.5. Transform tools parameter if present
116
- if (anthropicRequest.tools && anthropicRequest.tools.length > 0) {
117
- openaiRequest.tools = this.transformTools(anthropicRequest.tools);
118
- // Always use "auto" as Z.AI doesn't support other modes
119
- openaiRequest.tool_choice = 'auto';
120
- this.log(`Transformed ${anthropicRequest.tools.length} tools for OpenAI format`);
121
- }
122
- // 6. Preserve optional parameters
123
- if (anthropicRequest.temperature !== undefined) {
124
- openaiRequest.temperature = anthropicRequest.temperature;
125
- }
126
- if (anthropicRequest.top_p !== undefined) {
127
- openaiRequest.top_p = anthropicRequest.top_p;
128
- }
129
- // 7. Handle streaming
130
- if (anthropicRequest.stream !== undefined) {
131
- openaiRequest.stream = anthropicRequest.stream;
132
- }
133
- // 8. Inject reasoning parameters
134
- this.injectReasoningParams(openaiRequest, thinkingConfig);
135
- // Log transformed request
136
- this.writeDebugLog('request-openai', openaiRequest);
137
- return { openaiRequest, thinkingConfig };
138
- }
139
- catch (error) {
140
- const err = error;
141
- console.error('[glmt-transformer] Request transformation error:', err);
142
- // Return original request with warning
143
- return {
144
- openaiRequest: anthropicRequest,
145
- thinkingConfig: { thinking: false, effort: 'medium' },
146
- error: err.message,
147
- };
148
- }
66
+ const result = this.requestTransformer.transform(anthropicRequest);
67
+ this.writeDebugLog('request-openai', result.openaiRequest);
68
+ return result;
149
69
  }
150
- /**
151
- * Transform OpenAI response to Anthropic format
152
- */
70
+ /** Transform OpenAI response to Anthropic format */
153
71
  transformResponse(openaiResponse, _thinkingConfig = { thinking: false, effort: 'medium' }) {
154
- // Log original response
155
72
  this.writeDebugLog('response-openai', openaiResponse);
156
73
  try {
157
74
  const choice = openaiResponse.choices?.[0];
158
- if (!choice) {
75
+ if (!choice)
159
76
  throw new Error('No choices in OpenAI response');
160
- }
161
77
  const message = choice.message;
162
78
  const content = [];
163
- // Add thinking block if reasoning_content exists
164
79
  if (message.reasoning_content) {
165
- const length = message.reasoning_content.length;
166
- const lineCount = message.reasoning_content.split('\n').length;
167
- const preview = message.reasoning_content.substring(0, 100).replace(/\n/g, ' ').trim();
168
- this.log(`Detected reasoning_content:`);
169
- this.log(` Length: ${length} characters`);
170
- this.log(` Lines: ${lineCount}`);
171
- this.log(` Preview: ${preview}...`);
80
+ this.log(`Detected reasoning_content: ${message.reasoning_content.length} chars`);
172
81
  content.push({
173
82
  type: 'thinking',
174
83
  thinking: message.reasoning_content,
175
- signature: this.generateThinkingSignature(message.reasoning_content),
84
+ signature: this.responseBuilder.generateThinkingSignature(message.reasoning_content),
176
85
  });
177
86
  }
178
- else {
179
- this.log('No reasoning_content in OpenAI response');
180
- this.log('Note: This is expected if thinking not requested or model cannot reason');
181
- }
182
- // Add text content
183
87
  if (message.content) {
184
- content.push({
185
- type: 'text',
186
- text: message.content,
187
- });
88
+ content.push({ type: 'text', text: message.content });
188
89
  }
189
- // Handle tool_calls if present
190
- if (message.tool_calls && message.tool_calls.length > 0) {
191
- message.tool_calls.forEach((toolCall) => {
192
- let parsedInput;
193
- try {
194
- parsedInput = JSON.parse(toolCall.function.arguments || '{}');
195
- }
196
- catch (parseError) {
197
- const err = parseError;
198
- this.log(`Warning: Invalid JSON in tool arguments: ${err.message}`);
199
- parsedInput = { _error: 'Invalid JSON', _raw: toolCall.function.arguments };
200
- }
201
- content.push({
202
- type: 'tool_use',
203
- id: toolCall.id,
204
- name: toolCall.function.name,
205
- input: parsedInput,
206
- });
207
- });
90
+ if (message.tool_calls?.length) {
91
+ content.push(...this.toolCallHandler.processToolCalls(message.tool_calls));
208
92
  }
209
93
  const anthropicResponse = {
210
94
  id: openaiResponse.id || 'msg_' + Date.now(),
211
95
  type: 'message',
212
96
  role: 'assistant',
213
- content: content,
97
+ content,
214
98
  model: openaiResponse.model || 'glm-4.6',
215
- stop_reason: this.mapStopReason(choice.finish_reason || 'stop'),
99
+ stop_reason: this.responseBuilder.mapStopReason(choice.finish_reason || 'stop'),
216
100
  usage: {
217
101
  input_tokens: openaiResponse.usage?.prompt_tokens || 0,
218
102
  output_tokens: openaiResponse.usage?.completion_tokens || 0,
219
103
  },
220
104
  };
221
- // Validate transformation in verbose mode
222
- if (this.verbose) {
223
- const validation = this.validateTransformation(anthropicResponse);
224
- this.log(`Transformation validation: ${validation.passed}/${validation.total} checks passed`);
225
- if (!validation.valid) {
226
- this.log(`Failed checks: ${JSON.stringify(validation.checks, null, 2)}`);
227
- }
228
- }
229
- // Log transformed response
230
105
  this.writeDebugLog('response-anthropic', anthropicResponse);
231
106
  return anthropicResponse;
232
107
  }
233
108
  catch (error) {
234
109
  const err = error;
235
110
  console.error('[glmt-transformer] Response transformation error:', err);
236
- // Return minimal valid response
237
111
  return {
238
112
  id: 'msg_error_' + Date.now(),
239
113
  type: 'message',
240
114
  role: 'assistant',
241
- content: [
242
- {
243
- type: 'text',
244
- text: '[Transformation Error] ' + err.message,
245
- },
246
- ],
115
+ content: [{ type: 'text', text: '[Transformation Error] ' + err.message }],
247
116
  model: 'glm-4.6',
248
117
  stop_reason: 'end_turn',
249
118
  usage: { input_tokens: 0, output_tokens: 0 },
250
119
  };
251
120
  }
252
121
  }
253
- /**
254
- * Sanitize messages for OpenAI API compatibility
255
- */
256
- sanitizeMessages(messages) {
257
- const result = [];
258
- for (const msg of messages) {
259
- // If content is a string, add as-is
260
- if (typeof msg.content === 'string') {
261
- result.push(msg);
262
- continue;
263
- }
264
- // If content is an array, process blocks
265
- if (Array.isArray(msg.content)) {
266
- // Separate tool_result blocks from other content
267
- const toolResults = msg.content.filter((block) => block.type === 'tool_result');
268
- const textBlocks = msg.content.filter((block) => block.type === 'text');
269
- // const toolUseBlocks = msg.content.filter(block => block.type === 'tool_use');
270
- // CRITICAL: Tool messages must come BEFORE user text in OpenAI API
271
- for (const toolResult of toolResults) {
272
- result.push({
273
- role: 'tool',
274
- content: typeof toolResult.content === 'string'
275
- ? toolResult.content
276
- : JSON.stringify(toolResult.content),
277
- });
278
- }
279
- // Add text content as user/assistant message AFTER tool messages
280
- if (textBlocks.length > 0) {
281
- const textContent = textBlocks.length === 1
282
- ? textBlocks[0].text || ''
283
- : textBlocks.map((b) => b.text || '').join('\n');
284
- result.push({
285
- role: msg.role,
286
- content: textContent,
287
- });
288
- }
289
- // If no content at all, add empty message
290
- if (textBlocks.length === 0 && toolResults.length === 0) {
291
- result.push({
292
- role: msg.role,
293
- content: '',
294
- });
295
- }
296
- continue;
297
- }
298
- // Fallback: return message as-is
299
- result.push(msg);
300
- }
301
- return result;
302
- }
303
- /**
304
- * Transform Anthropic tools to OpenAI tools format
305
- */
306
- transformTools(anthropicTools) {
307
- return anthropicTools.map((tool) => ({
308
- type: 'function',
309
- function: {
310
- name: tool.name,
311
- description: tool.description,
312
- parameters: tool.input_schema || {},
313
- },
314
- }));
315
- }
316
- /**
317
- * Check if messages contain thinking control tags
318
- */
319
- hasThinkingTags(messages) {
320
- for (const msg of messages) {
321
- if (msg.role !== 'user')
322
- continue;
323
- const content = msg.content;
324
- if (typeof content !== 'string')
325
- continue;
326
- // Check for control tags
327
- if (/<Thinking:(On|Off)>/i.test(content) || /<Effort:(Low|Medium|High)>/i.test(content)) {
328
- return true;
329
- }
330
- }
331
- return false;
332
- }
333
- /**
334
- * Extract thinking control tags from user messages
335
- */
336
- extractThinkingControl(messages) {
337
- const config = {
338
- thinking: this.defaultThinking,
339
- effort: 'medium',
340
- };
341
- // Scan user messages for control tags
342
- for (const msg of messages) {
343
- if (msg.role !== 'user')
344
- continue;
345
- const content = msg.content;
346
- if (typeof content !== 'string')
347
- continue;
348
- // Check for <Thinking:On|Off>
349
- const thinkingMatch = content.match(/<Thinking:(On|Off)>/i);
350
- if (thinkingMatch) {
351
- config.thinking = thinkingMatch[1].toLowerCase() === 'on';
352
- }
353
- // Check for <Effort:Low|Medium|High>
354
- const effortMatch = content.match(/<Effort:(Low|Medium|High)>/i);
355
- if (effortMatch) {
356
- config.effort = effortMatch[1].toLowerCase();
357
- }
358
- }
359
- return config;
360
- }
361
- /**
362
- * Generate thinking signature for Claude Code UI
363
- */
364
- generateThinkingSignature(thinking) {
365
- // Generate signature hash
366
- const hash = crypto.createHash('sha256').update(thinking).digest('hex').substring(0, 16);
367
- return {
368
- type: 'thinking_signature',
369
- hash: hash,
370
- length: thinking.length,
371
- timestamp: Date.now(),
372
- };
373
- }
374
- /**
375
- * Detect Anthropic-style "think" keywords in user prompts
376
- */
377
- detectThinkKeywords(messages) {
378
- if (!messages || messages.length === 0)
379
- return null;
380
- // Extract text from user messages
381
- const text = messages
382
- .filter((m) => m.role === 'user')
383
- .map((m) => {
384
- if (typeof m.content === 'string')
385
- return m.content;
386
- if (Array.isArray(m.content)) {
387
- return m.content
388
- .filter((block) => block.type === 'text')
389
- .map((block) => block.text || '')
390
- .join(' ');
391
- }
392
- return '';
393
- })
394
- .join(' ');
395
- // Priority: ultrathink > think harder > think hard > think
396
- if (/\bultrathink\b/i.test(text)) {
397
- return { thinking: true, effort: 'max', keyword: 'ultrathink' };
398
- }
399
- if (/\bthink\s+harder\b/i.test(text)) {
400
- return { thinking: true, effort: 'high', keyword: 'think harder' };
401
- }
402
- if (/\bthink\s+hard\b/i.test(text)) {
403
- return { thinking: true, effort: 'medium', keyword: 'think hard' };
404
- }
405
- if (/\bthink\b/i.test(text)) {
406
- return { thinking: true, effort: 'low', keyword: 'think' };
407
- }
408
- return null; // No keywords detected
409
- }
410
- /**
411
- * Inject reasoning parameters into OpenAI request
412
- */
413
- injectReasoningParams(openaiRequest, thinkingConfig) {
414
- // Always enable sampling for temperature/top_p to work
415
- openaiRequest.do_sample = true;
416
- // Add thinking-specific parameters if enabled
417
- if (thinkingConfig.thinking) {
418
- openaiRequest.reasoning = true;
419
- openaiRequest.reasoning_effort = thinkingConfig.effort;
420
- }
421
- }
422
- /**
423
- * Map Anthropic model to GLM model
424
- */
425
- mapModel(_anthropicModel) {
426
- // Default to GLM-4.6 (latest and most capable)
427
- return 'GLM-4.6';
428
- }
429
- /**
430
- * Get max tokens for model
431
- */
432
- getMaxTokens(model) {
433
- return this.modelMaxTokens[model] || 128000;
122
+ /** Transform streaming delta (delegates to StreamParser) */
123
+ transformDelta(openaiEvent, accumulator) {
124
+ return this.streamParser.transformDelta(openaiEvent, accumulator);
434
125
  }
435
- /**
436
- * Map OpenAI stop reason to Anthropic stop reason
437
- */
438
- mapStopReason(openaiReason) {
439
- const mapping = {
440
- stop: 'end_turn',
441
- length: 'max_tokens',
442
- tool_calls: 'tool_use',
443
- content_filter: 'stop_sequence',
444
- };
445
- return mapping[openaiReason] || 'end_turn';
126
+ /** Finalize streaming (delegates to StreamParser) */
127
+ finalizeDelta(accumulator) {
128
+ return this.streamParser.finalizeDelta(accumulator);
446
129
  }
447
- /**
448
- * Write debug log to file
449
- */
450
130
  writeDebugLog(type, data) {
451
131
  if (!this.debugLog)
452
132
  return;
453
133
  try {
454
134
  const timestamp = new Date().toISOString().replace(/[:.]/g, '-').split('.')[0];
455
- const filename = `${timestamp}-${type}.json`;
456
- const filepath = path.join(this.debugLogDir, filename);
457
- // Ensure directory exists
135
+ const filepath = path.join(this.debugLogDir, `${timestamp}-${type}.json`);
458
136
  fs.mkdirSync(this.debugLogDir, { recursive: true });
459
- // Write file (pretty-printed)
460
137
  fs.writeFileSync(filepath, JSON.stringify(data, null, 2) + '\n', 'utf8');
461
- if (this.verbose) {
462
- this.log(`Debug log written: ${filepath}`);
463
- }
464
138
  }
465
139
  catch (error) {
466
- const err = error;
467
- console.error(`[glmt-transformer] Failed to write debug log: ${err.message}`);
140
+ console.error(`[glmt-transformer] Debug log error: ${error.message}`);
141
+ }
142
+ }
143
+ log(message) {
144
+ if (this.verbose) {
145
+ console.error(`[glmt-transformer] [${new Date().toTimeString().split(' ')[0]}] ${message}`);
468
146
  }
469
147
  }
470
- /**
471
- * Validate transformed Anthropic response
472
- */
148
+ // ========== Backwards-compatible public methods ==========
149
+ /** Generate thinking signature (delegates to ResponseBuilder) */
150
+ generateThinkingSignature(thinking) {
151
+ return this.responseBuilder.generateThinkingSignature(thinking);
152
+ }
153
+ /** Map stop reason (delegates to ResponseBuilder) */
154
+ mapStopReason(openaiReason) {
155
+ return this.responseBuilder.mapStopReason(openaiReason);
156
+ }
157
+ /** Detect think keywords (delegates to ContentTransformer) */
158
+ detectThinkKeywords(messages) {
159
+ return this.contentTransformer.detectThinkKeywords(messages);
160
+ }
161
+ /** Validate transformation result */
473
162
  validateTransformation(anthropicResponse) {
474
163
  const checks = {
475
164
  hasContent: Boolean(anthropicResponse.content && anthropicResponse.content.length > 0),
@@ -482,350 +171,6 @@ class GlmtTransformer {
482
171
  const total = Object.keys(checks).length;
483
172
  return { checks, passed, total, valid: passed === total };
484
173
  }
485
- /**
486
- * Transform OpenAI streaming delta to Anthropic events
487
- */
488
- transformDelta(openaiEvent, accumulator) {
489
- const events = [];
490
- // Debug logging for streaming deltas
491
- if (this.debugLog && openaiEvent.data) {
492
- this.writeDebugLog('delta-openai', openaiEvent.data);
493
- }
494
- // Handle [DONE] marker
495
- if (openaiEvent.event === 'done') {
496
- if (!accumulator.isFinalized()) {
497
- return this.finalizeDelta(accumulator);
498
- }
499
- return []; // Already finalized
500
- }
501
- // Usage update (appears in final chunk, may be before choice data)
502
- if (openaiEvent.data?.usage) {
503
- accumulator.updateUsage(openaiEvent.data.usage);
504
- // If we have both usage AND finish_reason, finalize immediately
505
- if (accumulator.getFinishReason()) {
506
- events.push(...this.finalizeDelta(accumulator));
507
- return events;
508
- }
509
- }
510
- const choice = openaiEvent.data?.choices?.[0];
511
- if (!choice)
512
- return events;
513
- const delta = choice.delta;
514
- if (!delta)
515
- return events;
516
- // Message start
517
- if (!accumulator.isMessageStarted()) {
518
- if (openaiEvent.data?.model) {
519
- accumulator.setModel(openaiEvent.data.model);
520
- }
521
- events.push(this.createMessageStartEvent(accumulator));
522
- accumulator.setMessageStarted(true);
523
- }
524
- // Role
525
- if (delta.role) {
526
- accumulator.setRole(delta.role);
527
- }
528
- // Reasoning content delta
529
- if (delta.reasoning_content) {
530
- const currentBlock = accumulator.getCurrentBlock();
531
- if (this.debugMode) {
532
- console.error(`[GLMT-DEBUG] Reasoning delta: ${delta.reasoning_content.length} chars`);
533
- console.error(`[GLMT-DEBUG] Current block: ${currentBlock?.type || 'none'}, index: ${currentBlock?.index ?? 'N/A'}`);
534
- }
535
- if (!currentBlock || currentBlock.type !== 'thinking') {
536
- // Start thinking block
537
- const block = accumulator.startBlock('thinking');
538
- events.push(this.createContentBlockStartEvent(block));
539
- if (this.debugMode) {
540
- console.error(`[GLMT-DEBUG] Started new thinking block ${block.index}`);
541
- }
542
- }
543
- accumulator.addDelta(delta.reasoning_content);
544
- const currentThinkingBlock = accumulator.getCurrentBlock();
545
- if (currentThinkingBlock) {
546
- events.push(this.createThinkingDeltaEvent(currentThinkingBlock, delta.reasoning_content));
547
- }
548
- }
549
- // Text content delta
550
- if (delta.content) {
551
- const currentBlock = accumulator.getCurrentBlock();
552
- // Close thinking block if transitioning from thinking to text
553
- if (currentBlock && currentBlock.type === 'thinking' && !currentBlock.stopped) {
554
- const signatureEvent = this.createSignatureDeltaEvent(currentBlock);
555
- if (signatureEvent) {
556
- events.push(signatureEvent);
557
- }
558
- events.push(this.createContentBlockStopEvent(currentBlock));
559
- accumulator.stopCurrentBlock();
560
- }
561
- if (!accumulator.getCurrentBlock() || accumulator.getCurrentBlock()?.type !== 'text') {
562
- // Start text block
563
- const block = accumulator.startBlock('text');
564
- events.push(this.createContentBlockStartEvent(block));
565
- }
566
- accumulator.addDelta(delta.content);
567
- const currentTextBlock = accumulator.getCurrentBlock();
568
- if (currentTextBlock) {
569
- events.push(this.createTextDeltaEvent(currentTextBlock, delta.content));
570
- }
571
- }
572
- // Check for planning loop
573
- if (accumulator.checkForLoop()) {
574
- this.log('WARNING: Planning loop detected - 3 consecutive thinking blocks with no tool calls');
575
- this.log('Forcing early finalization to prevent unbounded planning');
576
- // Close current block if any
577
- const currentBlock = accumulator.getCurrentBlock();
578
- if (currentBlock && !currentBlock.stopped) {
579
- if (currentBlock.type === 'thinking') {
580
- const signatureEvent = this.createSignatureDeltaEvent(currentBlock);
581
- if (signatureEvent) {
582
- events.push(signatureEvent);
583
- }
584
- }
585
- events.push(this.createContentBlockStopEvent(currentBlock));
586
- accumulator.stopCurrentBlock();
587
- }
588
- // Force finalization
589
- events.push(...this.finalizeDelta(accumulator));
590
- return events;
591
- }
592
- // Tool calls deltas
593
- if (delta.tool_calls && delta.tool_calls.length > 0) {
594
- // Close current content block ONCE before processing any tool calls
595
- const currentBlock = accumulator.getCurrentBlock();
596
- if (currentBlock && !currentBlock.stopped) {
597
- if (currentBlock.type === 'thinking') {
598
- const signatureEvent = this.createSignatureDeltaEvent(currentBlock);
599
- if (signatureEvent) {
600
- events.push(signatureEvent);
601
- }
602
- }
603
- events.push(this.createContentBlockStopEvent(currentBlock));
604
- accumulator.stopCurrentBlock();
605
- }
606
- // Process each tool call delta
607
- for (const toolCallDelta of delta.tool_calls) {
608
- // Track tool call state
609
- const isNewToolCall = !accumulator.hasToolCall(toolCallDelta.index);
610
- accumulator.addToolCallDelta(toolCallDelta);
611
- // Emit tool use events (start + input_json deltas)
612
- if (isNewToolCall) {
613
- // Start new tool_use block in accumulator
614
- const block = accumulator.startBlock('tool_use');
615
- const toolCall = accumulator.getToolCall(toolCallDelta.index);
616
- events.push({
617
- event: 'content_block_start',
618
- data: {
619
- type: 'content_block_start',
620
- index: block.index,
621
- content_block: {
622
- type: 'tool_use',
623
- id: toolCall?.id || `tool_${toolCallDelta.index}`,
624
- name: toolCall?.function?.name || '',
625
- },
626
- },
627
- });
628
- }
629
- // Emit input_json delta if arguments present
630
- if (toolCallDelta.function?.arguments) {
631
- const currentToolBlock = accumulator.getCurrentBlock();
632
- if (currentToolBlock && currentToolBlock.type === 'tool_use') {
633
- events.push({
634
- event: 'content_block_delta',
635
- data: {
636
- type: 'content_block_delta',
637
- index: currentToolBlock.index,
638
- delta: {
639
- type: 'input_json_delta',
640
- partial_json: toolCallDelta.function.arguments,
641
- },
642
- },
643
- });
644
- }
645
- }
646
- }
647
- }
648
- // Finish reason
649
- if (choice.finish_reason) {
650
- accumulator.setFinishReason(choice.finish_reason);
651
- // If we have both finish_reason AND usage, finalize immediately
652
- if (accumulator.hasUsageReceived()) {
653
- events.push(...this.finalizeDelta(accumulator));
654
- }
655
- }
656
- // Debug logging for generated events
657
- if (this.debugLog && events.length > 0) {
658
- this.writeDebugLog('delta-anthropic-events', {
659
- events,
660
- accumulator: accumulator.getSummary(),
661
- });
662
- }
663
- return events;
664
- }
665
- /**
666
- * Finalize streaming and generate closing events
667
- */
668
- finalizeDelta(accumulator) {
669
- if (accumulator.isFinalized()) {
670
- return []; // Already finalized
671
- }
672
- const events = [];
673
- // Close current content block if any
674
- const currentBlock = accumulator.getCurrentBlock();
675
- if (currentBlock && !currentBlock.stopped) {
676
- if (currentBlock.type === 'thinking') {
677
- const signatureEvent = this.createSignatureDeltaEvent(currentBlock);
678
- if (signatureEvent) {
679
- events.push(signatureEvent);
680
- }
681
- }
682
- events.push(this.createContentBlockStopEvent(currentBlock));
683
- accumulator.stopCurrentBlock();
684
- }
685
- // Message delta (stop reason + usage)
686
- events.push({
687
- event: 'message_delta',
688
- data: {
689
- type: 'message_delta',
690
- delta: {
691
- stop_reason: this.mapStopReason(accumulator.getFinishReason() || 'stop'),
692
- },
693
- usage: {
694
- input_tokens: accumulator.getInputTokens(),
695
- output_tokens: accumulator.getOutputTokens(),
696
- },
697
- },
698
- });
699
- // Message stop
700
- events.push({
701
- event: 'message_stop',
702
- data: {
703
- type: 'message_stop',
704
- },
705
- });
706
- accumulator.setFinalized(true);
707
- return events;
708
- }
709
- /**
710
- * Create message_start event
711
- */
712
- createMessageStartEvent(accumulator) {
713
- return {
714
- event: 'message_start',
715
- data: {
716
- type: 'message_start',
717
- message: {
718
- id: accumulator.getMessageId(),
719
- type: 'message',
720
- role: accumulator.getRole(),
721
- content: [],
722
- model: accumulator.getModel() || 'glm-4.6',
723
- stop_reason: null,
724
- usage: {
725
- input_tokens: accumulator.getInputTokens(),
726
- output_tokens: 0,
727
- },
728
- },
729
- },
730
- };
731
- }
732
- /**
733
- * Create content_block_start event
734
- */
735
- createContentBlockStartEvent(block) {
736
- return {
737
- event: 'content_block_start',
738
- data: {
739
- type: 'content_block_start',
740
- index: block.index,
741
- content_block: {
742
- type: block.type,
743
- [block.type]: '',
744
- },
745
- },
746
- };
747
- }
748
- /**
749
- * Create thinking_delta event
750
- */
751
- createThinkingDeltaEvent(block, delta) {
752
- return {
753
- event: 'content_block_delta',
754
- data: {
755
- type: 'content_block_delta',
756
- index: block.index,
757
- delta: {
758
- type: 'thinking_delta',
759
- thinking: delta,
760
- },
761
- },
762
- };
763
- }
764
- /**
765
- * Create text_delta event
766
- */
767
- createTextDeltaEvent(block, delta) {
768
- return {
769
- event: 'content_block_delta',
770
- data: {
771
- type: 'content_block_delta',
772
- index: block.index,
773
- delta: {
774
- type: 'text_delta',
775
- text: delta,
776
- },
777
- },
778
- };
779
- }
780
- /**
781
- * Create thinking signature delta event
782
- */
783
- createSignatureDeltaEvent(block) {
784
- // FIX: Guard against empty content (signature timing race)
785
- if (!block.content || block.content.length === 0) {
786
- if (this.verbose) {
787
- this.log(`WARNING: Skipping signature for empty thinking block ${block.index}`);
788
- this.log(`This indicates a race condition - signature requested before content accumulated`);
789
- }
790
- return null;
791
- }
792
- const signature = this.generateThinkingSignature(block.content);
793
- if (this.verbose) {
794
- this.log(`Generating signature for block ${block.index}: ${block.content.length} chars`);
795
- }
796
- return {
797
- event: 'content_block_delta',
798
- data: {
799
- type: 'content_block_delta',
800
- index: block.index,
801
- delta: {
802
- type: 'thinking_signature_delta',
803
- signature: signature,
804
- },
805
- },
806
- };
807
- }
808
- /**
809
- * Create content_block_stop event
810
- */
811
- createContentBlockStopEvent(block) {
812
- return {
813
- event: 'content_block_stop',
814
- data: {
815
- type: 'content_block_stop',
816
- index: block.index,
817
- },
818
- };
819
- }
820
- /**
821
- * Log message if verbose
822
- */
823
- log(message) {
824
- if (this.verbose) {
825
- const timestamp = new Date().toTimeString().split(' ')[0]; // HH:MM:SS
826
- console.error(`[glmt-transformer] [${timestamp}] ${message}`);
827
- }
828
- }
829
174
  }
830
175
  exports.GlmtTransformer = GlmtTransformer;
831
176
  exports.default = GlmtTransformer;