@kaitranntt/ccs 4.4.0 → 5.0.0

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 (262) hide show
  1. package/README.md +14 -7
  2. package/VERSION +1 -1
  3. package/config/base-agy.settings.json +10 -0
  4. package/config/base-codex.settings.json +10 -0
  5. package/config/base-gemini.settings.json +10 -0
  6. package/dist/auth/auth-commands.d.ts +52 -0
  7. package/dist/auth/auth-commands.d.ts.map +1 -0
  8. package/dist/auth/auth-commands.js +479 -0
  9. package/dist/auth/auth-commands.js.map +1 -0
  10. package/dist/auth/profile-detector.d.ts +68 -0
  11. package/dist/auth/profile-detector.d.ts.map +1 -0
  12. package/dist/auth/profile-detector.js +209 -0
  13. package/dist/auth/profile-detector.js.map +1 -0
  14. package/dist/auth/profile-registry.d.ts +60 -0
  15. package/dist/auth/profile-registry.d.ts.map +1 -0
  16. package/dist/auth/profile-registry.js +188 -0
  17. package/dist/auth/profile-registry.js.map +1 -0
  18. package/dist/ccs.d.ts +10 -0
  19. package/dist/ccs.d.ts.map +1 -0
  20. package/dist/ccs.js +320 -0
  21. package/dist/ccs.js.map +1 -0
  22. package/dist/cliproxy/auth-handler.d.ts +93 -0
  23. package/dist/cliproxy/auth-handler.d.ts.map +1 -0
  24. package/dist/cliproxy/auth-handler.js +402 -0
  25. package/dist/cliproxy/auth-handler.js.map +1 -0
  26. package/dist/cliproxy/base-config-loader.d.ts +42 -0
  27. package/dist/cliproxy/base-config-loader.d.ts.map +1 -0
  28. package/dist/cliproxy/base-config-loader.js +123 -0
  29. package/dist/cliproxy/base-config-loader.js.map +1 -0
  30. package/dist/cliproxy/binary-manager.d.ts +104 -0
  31. package/dist/cliproxy/binary-manager.d.ts.map +1 -0
  32. package/dist/cliproxy/binary-manager.js +567 -0
  33. package/dist/cliproxy/binary-manager.js.map +1 -0
  34. package/dist/cliproxy/cliproxy-executor.d.ts +33 -0
  35. package/dist/cliproxy/cliproxy-executor.d.ts.map +1 -0
  36. package/dist/cliproxy/cliproxy-executor.js +297 -0
  37. package/dist/cliproxy/cliproxy-executor.js.map +1 -0
  38. package/dist/cliproxy/config-generator.d.ts +89 -0
  39. package/dist/cliproxy/config-generator.d.ts.map +1 -0
  40. package/dist/cliproxy/config-generator.js +263 -0
  41. package/dist/cliproxy/config-generator.js.map +1 -0
  42. package/dist/cliproxy/index.d.ts +13 -0
  43. package/dist/cliproxy/index.d.ts.map +1 -0
  44. package/dist/cliproxy/index.js +62 -0
  45. package/dist/cliproxy/index.js.map +1 -0
  46. package/dist/cliproxy/platform-detector.d.ts +48 -0
  47. package/dist/cliproxy/platform-detector.d.ts.map +1 -0
  48. package/dist/cliproxy/platform-detector.js +118 -0
  49. package/dist/cliproxy/platform-detector.js.map +1 -0
  50. package/dist/cliproxy/types.d.ts +169 -0
  51. package/dist/cliproxy/types.d.ts.map +1 -0
  52. package/dist/cliproxy/types.js +7 -0
  53. package/dist/cliproxy/types.js.map +1 -0
  54. package/dist/commands/doctor-command.d.ts +10 -0
  55. package/dist/commands/doctor-command.d.ts.map +1 -0
  56. package/dist/commands/doctor-command.js +44 -0
  57. package/dist/commands/doctor-command.js.map +1 -0
  58. package/dist/commands/help-command.d.ts +5 -0
  59. package/dist/commands/help-command.d.ts.map +1 -0
  60. package/dist/commands/help-command.js +104 -0
  61. package/dist/commands/help-command.js.map +1 -0
  62. package/dist/commands/install-command.d.ts +14 -0
  63. package/dist/commands/install-command.d.ts.map +1 -0
  64. package/dist/commands/install-command.js +39 -0
  65. package/dist/commands/install-command.js.map +1 -0
  66. package/dist/commands/shell-completion-command.d.ts +10 -0
  67. package/dist/commands/shell-completion-command.d.ts.map +1 -0
  68. package/dist/commands/shell-completion-command.js +85 -0
  69. package/dist/commands/shell-completion-command.js.map +1 -0
  70. package/dist/commands/sync-command.d.ts +10 -0
  71. package/dist/commands/sync-command.d.ts.map +1 -0
  72. package/dist/commands/sync-command.js +59 -0
  73. package/dist/commands/sync-command.js.map +1 -0
  74. package/dist/commands/update-command.d.ts +12 -0
  75. package/dist/commands/update-command.d.ts.map +1 -0
  76. package/dist/commands/update-command.js +295 -0
  77. package/dist/commands/update-command.js.map +1 -0
  78. package/dist/commands/version-command.d.ts +10 -0
  79. package/dist/commands/version-command.d.ts.map +1 -0
  80. package/dist/commands/version-command.js +100 -0
  81. package/dist/commands/version-command.js.map +1 -0
  82. package/dist/delegation/delegation-handler.d.ts +60 -0
  83. package/dist/delegation/delegation-handler.d.ts.map +1 -0
  84. package/dist/delegation/delegation-handler.js +174 -0
  85. package/dist/delegation/delegation-handler.js.map +1 -0
  86. package/dist/delegation/headless-executor.d.ts +114 -0
  87. package/dist/delegation/headless-executor.d.ts.map +1 -0
  88. package/dist/delegation/headless-executor.js +562 -0
  89. package/dist/delegation/headless-executor.js.map +1 -0
  90. package/dist/delegation/result-formatter.d.ts +108 -0
  91. package/dist/delegation/result-formatter.d.ts.map +1 -0
  92. package/dist/delegation/result-formatter.js +391 -0
  93. package/dist/delegation/result-formatter.js.map +1 -0
  94. package/dist/delegation/session-manager.d.ts +58 -0
  95. package/dist/delegation/session-manager.d.ts.map +1 -0
  96. package/dist/delegation/session-manager.js +153 -0
  97. package/dist/delegation/session-manager.js.map +1 -0
  98. package/dist/delegation/settings-parser.d.ts +31 -0
  99. package/dist/delegation/settings-parser.d.ts.map +1 -0
  100. package/dist/delegation/settings-parser.js +107 -0
  101. package/dist/delegation/settings-parser.js.map +1 -0
  102. package/dist/glmt/delta-accumulator.d.ts +210 -0
  103. package/dist/glmt/delta-accumulator.d.ts.map +1 -0
  104. package/dist/glmt/delta-accumulator.js +351 -0
  105. package/dist/glmt/delta-accumulator.js.map +1 -0
  106. package/dist/glmt/glmt-proxy.d.ts +72 -0
  107. package/dist/glmt/glmt-proxy.d.ts.map +1 -0
  108. package/dist/glmt/glmt-proxy.js +427 -0
  109. package/dist/glmt/glmt-proxy.js.map +1 -0
  110. package/dist/glmt/glmt-transformer.d.ts +265 -0
  111. package/dist/glmt/glmt-transformer.d.ts.map +1 -0
  112. package/dist/glmt/glmt-transformer.js +832 -0
  113. package/dist/glmt/glmt-transformer.js.map +1 -0
  114. package/dist/glmt/locale-enforcer.d.ts +38 -0
  115. package/dist/glmt/locale-enforcer.d.ts.map +1 -0
  116. package/dist/glmt/locale-enforcer.js +69 -0
  117. package/dist/glmt/locale-enforcer.js.map +1 -0
  118. package/dist/glmt/reasoning-enforcer.d.ts +52 -0
  119. package/dist/glmt/reasoning-enforcer.d.ts.map +1 -0
  120. package/dist/glmt/reasoning-enforcer.js +151 -0
  121. package/dist/glmt/reasoning-enforcer.js.map +1 -0
  122. package/dist/glmt/sse-parser.d.ts +47 -0
  123. package/dist/glmt/sse-parser.d.ts.map +1 -0
  124. package/dist/glmt/sse-parser.js +93 -0
  125. package/dist/glmt/sse-parser.js.map +1 -0
  126. package/dist/management/doctor.d.ts +104 -0
  127. package/dist/management/doctor.d.ts.map +1 -0
  128. package/dist/management/doctor.js +673 -0
  129. package/dist/management/doctor.js.map +1 -0
  130. package/dist/management/instance-manager.d.ts +57 -0
  131. package/dist/management/instance-manager.d.ts.map +1 -0
  132. package/dist/management/instance-manager.js +195 -0
  133. package/dist/management/instance-manager.js.map +1 -0
  134. package/dist/management/recovery-manager.d.ts +39 -0
  135. package/dist/management/recovery-manager.d.ts.map +1 -0
  136. package/dist/management/recovery-manager.js +141 -0
  137. package/dist/management/recovery-manager.js.map +1 -0
  138. package/dist/management/shared-manager.d.ts +47 -0
  139. package/dist/management/shared-manager.d.ts.map +1 -0
  140. package/dist/management/shared-manager.js +388 -0
  141. package/dist/management/shared-manager.js.map +1 -0
  142. package/dist/types/cli.d.ts +50 -0
  143. package/dist/types/cli.d.ts.map +1 -0
  144. package/dist/types/cli.js +16 -0
  145. package/dist/types/cli.js.map +1 -0
  146. package/dist/types/config.d.ts +51 -0
  147. package/dist/types/config.d.ts.map +1 -0
  148. package/dist/types/config.js +26 -0
  149. package/dist/types/config.js.map +1 -0
  150. package/dist/types/delegation.d.ts +61 -0
  151. package/dist/types/delegation.d.ts.map +1 -0
  152. package/dist/types/delegation.js +6 -0
  153. package/dist/types/delegation.js.map +1 -0
  154. package/dist/types/glmt.d.ts +95 -0
  155. package/dist/types/glmt.d.ts.map +1 -0
  156. package/dist/types/glmt.js +7 -0
  157. package/dist/types/glmt.js.map +1 -0
  158. package/dist/types/index.d.ts +13 -0
  159. package/dist/types/index.d.ts.map +1 -0
  160. package/dist/types/index.js +16 -0
  161. package/dist/types/index.js.map +1 -0
  162. package/dist/types/utils.d.ts +36 -0
  163. package/dist/types/utils.d.ts.map +1 -0
  164. package/dist/types/utils.js +22 -0
  165. package/dist/types/utils.js.map +1 -0
  166. package/dist/utils/claude-detector.d.ts +14 -0
  167. package/dist/utils/claude-detector.d.ts.map +1 -0
  168. package/dist/utils/claude-detector.js +112 -0
  169. package/dist/utils/claude-detector.js.map +1 -0
  170. package/dist/utils/claude-dir-installer.d.ts +46 -0
  171. package/dist/utils/claude-dir-installer.d.ts.map +1 -0
  172. package/dist/utils/claude-dir-installer.js +289 -0
  173. package/dist/utils/claude-dir-installer.js.map +1 -0
  174. package/dist/utils/claude-symlink-manager.d.ts +61 -0
  175. package/dist/utils/claude-symlink-manager.d.ts.map +1 -0
  176. package/dist/utils/claude-symlink-manager.js +291 -0
  177. package/dist/utils/claude-symlink-manager.js.map +1 -0
  178. package/dist/utils/config-manager.d.ts +32 -0
  179. package/dist/utils/config-manager.d.ts.map +1 -0
  180. package/dist/utils/config-manager.js +143 -0
  181. package/dist/utils/config-manager.js.map +1 -0
  182. package/dist/utils/delegation-validator.d.ts +39 -0
  183. package/dist/utils/delegation-validator.d.ts.map +1 -0
  184. package/dist/utils/delegation-validator.js +161 -0
  185. package/dist/utils/delegation-validator.js.map +1 -0
  186. package/dist/utils/error-codes.d.ts +36 -0
  187. package/dist/utils/error-codes.d.ts.map +1 -0
  188. package/dist/utils/error-codes.js +63 -0
  189. package/dist/utils/error-codes.js.map +1 -0
  190. package/dist/utils/error-manager.d.ts +59 -0
  191. package/dist/utils/error-manager.d.ts.map +1 -0
  192. package/dist/utils/error-manager.js +228 -0
  193. package/dist/utils/error-manager.js.map +1 -0
  194. package/dist/utils/helpers.d.ts +27 -0
  195. package/dist/utils/helpers.d.ts.map +1 -0
  196. package/dist/utils/helpers.js +150 -0
  197. package/dist/utils/helpers.js.map +1 -0
  198. package/dist/utils/package-manager-detector.d.ts +14 -0
  199. package/dist/utils/package-manager-detector.d.ts.map +1 -0
  200. package/dist/utils/package-manager-detector.js +162 -0
  201. package/dist/utils/package-manager-detector.js.map +1 -0
  202. package/dist/utils/progress-indicator.d.ts +52 -0
  203. package/dist/utils/progress-indicator.d.ts.map +1 -0
  204. package/dist/utils/progress-indicator.js +102 -0
  205. package/dist/utils/progress-indicator.js.map +1 -0
  206. package/dist/utils/prompt.d.ts +29 -0
  207. package/dist/utils/prompt.d.ts.map +1 -0
  208. package/dist/utils/prompt.js +116 -0
  209. package/dist/utils/prompt.js.map +1 -0
  210. package/dist/utils/shell-completion.d.ts +52 -0
  211. package/dist/utils/shell-completion.d.ts.map +1 -0
  212. package/dist/utils/shell-completion.js +231 -0
  213. package/dist/utils/shell-completion.js.map +1 -0
  214. package/dist/utils/shell-executor.d.ts +15 -0
  215. package/dist/utils/shell-executor.d.ts.map +1 -0
  216. package/dist/utils/shell-executor.js +57 -0
  217. package/dist/utils/shell-executor.js.map +1 -0
  218. package/dist/utils/update-checker.d.ts +48 -0
  219. package/dist/utils/update-checker.d.ts.map +1 -0
  220. package/dist/utils/update-checker.js +241 -0
  221. package/dist/utils/update-checker.js.map +1 -0
  222. package/lib/ccs +21 -1907
  223. package/lib/ccs.ps1 +26 -1800
  224. package/lib/error-codes.ps1 +2 -1
  225. package/lib/prompt.ps1 +2 -2
  226. package/package.json +31 -11
  227. package/scripts/add-shebang.js +39 -0
  228. package/scripts/bump-version.sh +25 -37
  229. package/scripts/dev-install.sh +32 -11
  230. package/scripts/postinstall.js +29 -29
  231. package/bin/auth/auth-commands.js +0 -499
  232. package/bin/auth/profile-detector.js +0 -204
  233. package/bin/auth/profile-registry.js +0 -225
  234. package/bin/ccs.js +0 -1034
  235. package/bin/delegation/README.md +0 -191
  236. package/bin/delegation/delegation-handler.js +0 -212
  237. package/bin/delegation/headless-executor.js +0 -618
  238. package/bin/delegation/result-formatter.js +0 -485
  239. package/bin/delegation/session-manager.js +0 -157
  240. package/bin/delegation/settings-parser.js +0 -109
  241. package/bin/glmt/delta-accumulator.js +0 -276
  242. package/bin/glmt/glmt-proxy.js +0 -495
  243. package/bin/glmt/glmt-transformer.js +0 -999
  244. package/bin/glmt/locale-enforcer.js +0 -72
  245. package/bin/glmt/reasoning-enforcer.js +0 -173
  246. package/bin/glmt/sse-parser.js +0 -96
  247. package/bin/management/doctor.js +0 -721
  248. package/bin/management/instance-manager.js +0 -202
  249. package/bin/management/recovery-manager.js +0 -135
  250. package/bin/management/shared-manager.js +0 -402
  251. package/bin/utils/claude-detector.js +0 -73
  252. package/bin/utils/claude-dir-installer.js +0 -283
  253. package/bin/utils/claude-symlink-manager.js +0 -289
  254. package/bin/utils/config-manager.js +0 -103
  255. package/bin/utils/delegation-validator.js +0 -154
  256. package/bin/utils/error-codes.js +0 -59
  257. package/bin/utils/error-manager.js +0 -165
  258. package/bin/utils/helpers.js +0 -136
  259. package/bin/utils/progress-indicator.js +0 -111
  260. package/bin/utils/prompt.js +0 -134
  261. package/bin/utils/shell-completion.js +0 -256
  262. package/bin/utils/update-checker.js +0 -243
@@ -0,0 +1,351 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * DeltaAccumulator - Maintain state across streaming deltas
5
+ *
6
+ * Tracks:
7
+ * - Message metadata (id, model, role)
8
+ * - Content blocks (thinking, text)
9
+ * - Current block index
10
+ * - Accumulated content
11
+ *
12
+ * Usage:
13
+ * const acc = new DeltaAccumulator(thinkingConfig);
14
+ * const events = transformer.transformDelta(openaiEvent, acc);
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.DeltaAccumulator = void 0;
18
+ class DeltaAccumulator {
19
+ constructor(_thinkingConfig = {}, options = {}) {
20
+ // ========== Finish Reason ==========
21
+ this.finishReason = null;
22
+ this.usageReceived = false;
23
+ this.messageId = 'msg_' + Date.now() + '_' + Math.random().toString(36).substring(7);
24
+ this.model = null;
25
+ this.role = 'assistant';
26
+ // Content blocks
27
+ this.contentBlocks = [];
28
+ this.currentBlockIndex = -1;
29
+ // Tool calls tracking
30
+ this.toolCalls = [];
31
+ this.toolCallsIndex = {};
32
+ // Buffers
33
+ this.thinkingBuffer = '';
34
+ this.textBuffer = '';
35
+ // C-02 Fix: Limits to prevent unbounded accumulation
36
+ this.maxBlocks = options.maxBlocks || 100;
37
+ this.maxBufferSize = options.maxBufferSize || 10 * 1024 * 1024; // 10MB
38
+ // Loop detection configuration
39
+ this.loopDetectionThreshold = options.loopDetectionThreshold || 3;
40
+ this.loopDetected = false;
41
+ // State flags
42
+ this.messageStarted = false;
43
+ this.finalized = false;
44
+ // Statistics
45
+ this.inputTokens = 0;
46
+ this.outputTokens = 0;
47
+ }
48
+ /**
49
+ * Get current content block
50
+ * @returns Current block or null
51
+ */
52
+ getCurrentBlock() {
53
+ if (this.currentBlockIndex >= 0 && this.currentBlockIndex < this.contentBlocks.length) {
54
+ return this.contentBlocks[this.currentBlockIndex];
55
+ }
56
+ return null;
57
+ }
58
+ /**
59
+ * Start new content block
60
+ * @param type - Block type ('thinking', 'text', or 'tool_use')
61
+ * @returns New block
62
+ */
63
+ startBlock(type) {
64
+ // C-02 Fix: Enforce max blocks limit
65
+ if (this.contentBlocks.length >= this.maxBlocks) {
66
+ throw new Error(`Maximum ${this.maxBlocks} content blocks exceeded (DoS protection)`);
67
+ }
68
+ this.currentBlockIndex++;
69
+ const block = {
70
+ index: this.currentBlockIndex,
71
+ type: type,
72
+ content: '',
73
+ started: true,
74
+ stopped: false,
75
+ };
76
+ this.contentBlocks.push(block);
77
+ // Reset buffer for new block (tool_use doesn't use buffers)
78
+ if (type === 'thinking') {
79
+ this.thinkingBuffer = '';
80
+ }
81
+ else if (type === 'text') {
82
+ this.textBuffer = '';
83
+ }
84
+ return block;
85
+ }
86
+ /**
87
+ * Add delta to current block
88
+ * @param delta - Content delta
89
+ */
90
+ addDelta(delta) {
91
+ const block = this.getCurrentBlock();
92
+ if (!block) {
93
+ // FIX: Guard against null block (should never happen, but defensive)
94
+ console.error('[DeltaAccumulator] ERROR: addDelta called with no current block');
95
+ return;
96
+ }
97
+ if (block.type === 'thinking') {
98
+ // C-02 Fix: Enforce buffer size limit
99
+ if (this.thinkingBuffer.length + delta.length > this.maxBufferSize) {
100
+ throw new Error(`Thinking buffer exceeded ${this.maxBufferSize} bytes (DoS protection)`);
101
+ }
102
+ this.thinkingBuffer += delta;
103
+ block.content = this.thinkingBuffer;
104
+ // FIX: Verify assignment succeeded (paranoid check for race conditions)
105
+ if (block.content.length !== this.thinkingBuffer.length) {
106
+ console.error('[DeltaAccumulator] ERROR: Block content assignment failed');
107
+ console.error(`Expected: ${this.thinkingBuffer.length}, Got: ${block.content.length}`);
108
+ }
109
+ }
110
+ else if (block.type === 'text') {
111
+ // C-02 Fix: Enforce buffer size limit
112
+ if (this.textBuffer.length + delta.length > this.maxBufferSize) {
113
+ throw new Error(`Text buffer exceeded ${this.maxBufferSize} bytes (DoS protection)`);
114
+ }
115
+ this.textBuffer += delta;
116
+ block.content = this.textBuffer;
117
+ }
118
+ }
119
+ /**
120
+ * Mark current block as stopped
121
+ */
122
+ stopCurrentBlock() {
123
+ const block = this.getCurrentBlock();
124
+ if (block) {
125
+ block.stopped = true;
126
+ // FIX: Log block closure for debugging (helps diagnose timing issues)
127
+ if (block.type === 'thinking' && process.env.CCS_DEBUG === '1') {
128
+ console.error(`[DeltaAccumulator] Stopped thinking block ${block.index}: ${block.content?.length || 0} chars`);
129
+ }
130
+ }
131
+ }
132
+ /**
133
+ * Update usage statistics
134
+ * @param usage - Usage object from OpenAI
135
+ */
136
+ updateUsage(usage) {
137
+ if (usage) {
138
+ this.inputTokens = usage.prompt_tokens || usage.input_tokens || 0;
139
+ this.outputTokens = usage.completion_tokens || usage.output_tokens || 0;
140
+ }
141
+ }
142
+ /**
143
+ * Add or update tool call delta
144
+ * @param toolCallDelta - Tool call delta from OpenAI
145
+ */
146
+ addToolCallDelta(toolCallDelta) {
147
+ const index = toolCallDelta.index;
148
+ // Initialize tool call if not exists
149
+ if (!this.toolCallsIndex[index]) {
150
+ const toolCall = {
151
+ index: index,
152
+ id: '',
153
+ type: 'function',
154
+ function: {
155
+ name: '',
156
+ arguments: '',
157
+ },
158
+ };
159
+ this.toolCalls.push(toolCall);
160
+ this.toolCallsIndex[index] = toolCall;
161
+ }
162
+ const toolCall = this.toolCallsIndex[index];
163
+ // Update id if present
164
+ if (toolCallDelta.id) {
165
+ toolCall.id = toolCallDelta.id;
166
+ }
167
+ // Update type if present
168
+ if (toolCallDelta.type) {
169
+ toolCall.type = toolCallDelta.type;
170
+ }
171
+ // Update function name if present
172
+ if (toolCallDelta.function?.name) {
173
+ toolCall.function.name += toolCallDelta.function.name;
174
+ }
175
+ // Update function arguments if present
176
+ if (toolCallDelta.function?.arguments) {
177
+ toolCall.function.arguments += toolCallDelta.function.arguments;
178
+ }
179
+ }
180
+ /**
181
+ * Get all tool calls
182
+ * @returns Tool calls array
183
+ */
184
+ getToolCalls() {
185
+ return this.toolCalls;
186
+ }
187
+ /**
188
+ * Check for planning loop pattern
189
+ * Loop = N consecutive thinking blocks with no tool calls
190
+ * @returns True if loop detected
191
+ */
192
+ checkForLoop() {
193
+ // Already detected loop
194
+ if (this.loopDetected) {
195
+ return true;
196
+ }
197
+ // Need minimum blocks to detect pattern
198
+ if (this.contentBlocks.length < this.loopDetectionThreshold) {
199
+ return false;
200
+ }
201
+ // Get last N blocks
202
+ const recentBlocks = this.contentBlocks.slice(-this.loopDetectionThreshold);
203
+ // Check if all recent blocks are thinking blocks
204
+ const allThinking = recentBlocks.every((b) => b.type === 'thinking');
205
+ // Check if no tool calls have been made at all
206
+ const noToolCalls = this.toolCalls.length === 0;
207
+ // Loop detected if: all recent blocks are thinking AND no tool calls yet
208
+ if (allThinking && noToolCalls) {
209
+ this.loopDetected = true;
210
+ return true;
211
+ }
212
+ return false;
213
+ }
214
+ /**
215
+ * Reset loop detection state (for testing)
216
+ */
217
+ resetLoopDetection() {
218
+ this.loopDetected = false;
219
+ }
220
+ /**
221
+ * Get summary of accumulated state
222
+ * @returns Summary
223
+ */
224
+ getSummary() {
225
+ return {
226
+ messageId: this.messageId,
227
+ model: this.model,
228
+ role: this.role,
229
+ blockCount: this.contentBlocks.length,
230
+ currentIndex: this.currentBlockIndex,
231
+ toolCallCount: this.toolCalls.length,
232
+ messageStarted: this.messageStarted,
233
+ finalized: this.finalized,
234
+ loopDetected: this.loopDetected,
235
+ usage: {
236
+ input_tokens: this.inputTokens,
237
+ output_tokens: this.outputTokens,
238
+ },
239
+ };
240
+ }
241
+ // ========== State Getters ==========
242
+ /**
243
+ * Check if message has been finalized
244
+ */
245
+ isFinalized() {
246
+ return this.finalized;
247
+ }
248
+ /**
249
+ * Check if message has started
250
+ */
251
+ isMessageStarted() {
252
+ return this.messageStarted;
253
+ }
254
+ /**
255
+ * Get message ID
256
+ */
257
+ getMessageId() {
258
+ return this.messageId;
259
+ }
260
+ /**
261
+ * Get model name
262
+ */
263
+ getModel() {
264
+ return this.model;
265
+ }
266
+ /**
267
+ * Get role
268
+ */
269
+ getRole() {
270
+ return this.role;
271
+ }
272
+ /**
273
+ * Get input tokens
274
+ */
275
+ getInputTokens() {
276
+ return this.inputTokens;
277
+ }
278
+ /**
279
+ * Get output tokens
280
+ */
281
+ getOutputTokens() {
282
+ return this.outputTokens;
283
+ }
284
+ // ========== State Setters ==========
285
+ /**
286
+ * Set model name
287
+ */
288
+ setModel(model) {
289
+ this.model = model;
290
+ }
291
+ /**
292
+ * Set message started flag
293
+ */
294
+ setMessageStarted(started) {
295
+ this.messageStarted = started;
296
+ }
297
+ /**
298
+ * Set role
299
+ */
300
+ setRole(role) {
301
+ this.role = role;
302
+ }
303
+ /**
304
+ * Set finalized flag
305
+ */
306
+ setFinalized(finalized) {
307
+ this.finalized = finalized;
308
+ }
309
+ /**
310
+ * Set finish reason
311
+ */
312
+ setFinishReason(reason) {
313
+ this.finishReason = reason;
314
+ }
315
+ /**
316
+ * Get finish reason
317
+ */
318
+ getFinishReason() {
319
+ return this.finishReason;
320
+ }
321
+ /**
322
+ * Check if usage stats have been received
323
+ */
324
+ hasUsageReceived() {
325
+ return this.usageReceived;
326
+ }
327
+ /**
328
+ * Mark usage as received
329
+ */
330
+ setUsageReceived(received) {
331
+ this.usageReceived = received;
332
+ }
333
+ // ========== Tool Call Helpers ==========
334
+ /**
335
+ * Check if there are any tool calls, or check if a specific index exists
336
+ */
337
+ hasToolCall(index) {
338
+ if (index === undefined) {
339
+ return this.toolCalls.length > 0;
340
+ }
341
+ return this.toolCallsIndex[index] !== undefined;
342
+ }
343
+ /**
344
+ * Get tool call by index
345
+ */
346
+ getToolCall(index) {
347
+ return this.toolCallsIndex[index];
348
+ }
349
+ }
350
+ exports.DeltaAccumulator = DeltaAccumulator;
351
+ //# sourceMappingURL=delta-accumulator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delta-accumulator.js","sourceRoot":"","sources":["../../src/glmt/delta-accumulator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * GlmtProxy - Embedded HTTP proxy for GLM thinking support
3
+ *
4
+ * Architecture:
5
+ * - Intercepts Claude CLI → Z.AI calls
6
+ * - Transforms Anthropic format → OpenAI format
7
+ * - Converts reasoning_content → thinking blocks
8
+ * - Supports both streaming and buffered modes
9
+ *
10
+ * Lifecycle:
11
+ * - Spawned by bin/ccs.js when 'glmt' profile detected
12
+ * - Binds to 127.0.0.1:random_port (security + avoid conflicts)
13
+ * - Terminates when parent process exits
14
+ *
15
+ * Debugging:
16
+ * - Verbose: Pass --verbose to see request/response logs
17
+ * - Debug: Set CCS_DEBUG=1 to write logs to ~/.ccs/logs/
18
+ */
19
+ /// <reference types="node" />
20
+ import * as http from 'http';
21
+ interface GlmtProxyConfig {
22
+ verbose?: boolean;
23
+ debugLog?: boolean;
24
+ timeout?: number;
25
+ }
26
+ export declare class GlmtProxy {
27
+ private transformer;
28
+ private upstreamUrl;
29
+ private server;
30
+ private port;
31
+ private verbose;
32
+ private timeout;
33
+ constructor(config?: GlmtProxyConfig);
34
+ /**
35
+ * Start HTTP server on random port
36
+ */
37
+ start(): Promise<number>;
38
+ /**
39
+ * Handle incoming HTTP request
40
+ */
41
+ handleRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise<void>;
42
+ /**
43
+ * Handle buffered (non-streaming) request
44
+ */
45
+ private handleBufferedRequest;
46
+ /**
47
+ * Handle streaming request
48
+ */
49
+ private handleStreamingRequest;
50
+ /**
51
+ * Read request body
52
+ */
53
+ private readBody;
54
+ /**
55
+ * Forward request to Z.AI upstream
56
+ */
57
+ private forwardToUpstream;
58
+ /**
59
+ * Forward request to Z.AI and stream response
60
+ */
61
+ private forwardAndStreamUpstream;
62
+ /**
63
+ * Stop proxy server
64
+ */
65
+ stop(): void;
66
+ /**
67
+ * Log message if verbose
68
+ */
69
+ private log;
70
+ }
71
+ export default GlmtProxy;
72
+ //# sourceMappingURL=glmt-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glmt-proxy.d.ts","sourceRoot":"","sources":["../../src/glmt/glmt-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAM7B,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA6CD,qBAAa,SAAS;IACpB,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,GAAE,eAAoB;IAexC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAuC9B;;OAEG;IACG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAgFvF;;OAEG;YACW,qBAAqB;IAsCnC;;OAEG;YACW,sBAAsB;IA0CpC;;OAEG;IACH,OAAO,CAAC,QAAQ;IAoBhB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkEzB;;OAEG;YACW,wBAAwB;IA2GtC;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,OAAO,CAAC,GAAG;CAKZ;AAiCD,eAAe,SAAS,CAAC"}