@machina.ai/cell-cli-core 1.41.1-rc2 → 1.45.1-rc2

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 (834) hide show
  1. package/dist/docs/AFTER_MERGE_PROMPT.md +1 -1
  2. package/dist/docs/changelogs/index.md +63 -0
  3. package/dist/docs/changelogs/latest.md +200 -244
  4. package/dist/docs/changelogs/preview.md +198 -385
  5. package/dist/docs/cli/auto-memory.md +61 -40
  6. package/dist/docs/cli/cli-reference.md +2 -1
  7. package/dist/docs/cli/creating-skills.md +165 -38
  8. package/dist/docs/cli/custom-commands.md +1 -0
  9. package/dist/docs/cli/gemini-md.md +0 -3
  10. package/dist/docs/cli/model-routing.md +3 -3
  11. package/dist/docs/cli/plan-mode.md +2 -2
  12. package/dist/docs/cli/settings.md +20 -19
  13. package/dist/docs/cli/skills-best-practices.md +78 -0
  14. package/dist/docs/cli/skills.md +98 -176
  15. package/dist/docs/cli/tutorials/memory-management.md +3 -3
  16. package/dist/docs/cli/tutorials/session-management.md +13 -0
  17. package/dist/docs/cli/tutorials/skills-getting-started.md +140 -92
  18. package/dist/docs/cli/using-agent-skills.md +90 -0
  19. package/dist/docs/core/gemma-setup.md +83 -0
  20. package/dist/docs/core/index.md +3 -2
  21. package/dist/docs/core/local-model-routing.md +14 -7
  22. package/dist/docs/extensions/reference.md +16 -0
  23. package/dist/docs/extensions/releasing.md +58 -24
  24. package/dist/docs/extensions/writing-extensions.md +7 -0
  25. package/dist/docs/get-started/installation.mdx +2 -2
  26. package/dist/docs/model-routing-spec.md +683 -0
  27. package/dist/docs/reference/commands.md +14 -7
  28. package/dist/docs/reference/configuration.md +264 -88
  29. package/dist/docs/reference/keyboard-shortcuts.md +24 -1
  30. package/dist/docs/reference/policy-engine.md +14 -3
  31. package/dist/docs/reference/tools.md +48 -1
  32. package/dist/docs/releases.md +2 -2
  33. package/dist/docs/sidebar.json +24 -2
  34. package/dist/docs/tools/activate-skill.md +1 -1
  35. package/dist/docs/tools/mcp-server.md +24 -3
  36. package/dist/docs/tools/memory.md +10 -13
  37. package/dist/docs/tools/shell.md +17 -0
  38. package/dist/package.json +18 -18
  39. package/dist/src/agent/content-utils.js +6 -1
  40. package/dist/src/agent/content-utils.js.map +1 -1
  41. package/dist/src/agent/content-utils.test.js +5 -1
  42. package/dist/src/agent/content-utils.test.js.map +1 -1
  43. package/dist/src/agent/event-translator.js +8 -7
  44. package/dist/src/agent/event-translator.js.map +1 -1
  45. package/dist/src/agent/event-translator.test.js +2 -2
  46. package/dist/src/agent/event-translator.test.js.map +1 -1
  47. package/dist/src/agent/legacy-agent-session.js +5 -1
  48. package/dist/src/agent/legacy-agent-session.js.map +1 -1
  49. package/dist/src/agent/legacy-agent-session.test.js +11 -3
  50. package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
  51. package/dist/src/agent/tool-display-utils.d.ts +3 -2
  52. package/dist/src/agent/tool-display-utils.js +3 -2
  53. package/dist/src/agent/tool-display-utils.js.map +1 -1
  54. package/dist/src/agent/types.d.ts +33 -3
  55. package/dist/src/agents/a2aUtils.d.ts +1 -1
  56. package/dist/src/agents/a2aUtils.js +5 -4
  57. package/dist/src/agents/a2aUtils.js.map +1 -1
  58. package/dist/src/agents/a2aUtils.test.js +18 -0
  59. package/dist/src/agents/a2aUtils.test.js.map +1 -1
  60. package/dist/src/agents/agent-tool.d.ts +3 -1
  61. package/dist/src/agents/agent-tool.js +19 -3
  62. package/dist/src/agents/agent-tool.js.map +1 -1
  63. package/dist/src/agents/agent-tool.test.js +76 -0
  64. package/dist/src/agents/agent-tool.test.js.map +1 -1
  65. package/dist/src/agents/agentLoader.d.ts +127 -22
  66. package/dist/src/agents/agentLoader.js +20 -0
  67. package/dist/src/agents/agentLoader.js.map +1 -1
  68. package/dist/src/agents/agentLoader.test.js +60 -0
  69. package/dist/src/agents/agentLoader.test.js.map +1 -1
  70. package/dist/src/agents/auth-provider/types.d.ts +5 -0
  71. package/dist/src/agents/browser/browserAgentInvocation.js +24 -19
  72. package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
  73. package/dist/src/agents/browser/snapshotSuperseder.js +11 -8
  74. package/dist/src/agents/browser/snapshotSuperseder.js.map +1 -1
  75. package/dist/src/agents/browser/snapshotSuperseder.test.js +6 -1
  76. package/dist/src/agents/browser/snapshotSuperseder.test.js.map +1 -1
  77. package/dist/src/agents/generalist-agent.js +8 -1
  78. package/dist/src/agents/generalist-agent.js.map +1 -1
  79. package/dist/src/agents/generalist-agent.test.js +24 -0
  80. package/dist/src/agents/generalist-agent.test.js.map +1 -1
  81. package/dist/src/agents/local-executor.d.ts +1 -0
  82. package/dist/src/agents/local-executor.js +76 -45
  83. package/dist/src/agents/local-executor.js.map +1 -1
  84. package/dist/src/agents/local-executor.test.js +199 -27
  85. package/dist/src/agents/local-executor.test.js.map +1 -1
  86. package/dist/src/agents/local-invocation.d.ts +1 -1
  87. package/dist/src/agents/local-invocation.js +47 -48
  88. package/dist/src/agents/local-invocation.js.map +1 -1
  89. package/dist/src/agents/local-invocation.test.js +13 -15
  90. package/dist/src/agents/local-invocation.test.js.map +1 -1
  91. package/dist/src/agents/local-session-invocation.d.ts +51 -0
  92. package/dist/src/agents/local-session-invocation.js +320 -0
  93. package/dist/src/agents/local-session-invocation.js.map +1 -0
  94. package/dist/src/agents/local-session-invocation.test.js +512 -0
  95. package/dist/src/agents/local-session-invocation.test.js.map +1 -0
  96. package/dist/src/agents/local-subagent-protocol.d.ts +18 -0
  97. package/dist/src/agents/local-subagent-protocol.js +357 -0
  98. package/dist/src/agents/local-subagent-protocol.js.map +1 -0
  99. package/dist/src/agents/local-subagent-protocol.test.js +676 -0
  100. package/dist/src/agents/local-subagent-protocol.test.js.map +1 -0
  101. package/dist/src/agents/registry.d.ts +8 -4
  102. package/dist/src/agents/registry.js +112 -47
  103. package/dist/src/agents/registry.js.map +1 -1
  104. package/dist/src/agents/registry.test.js +9 -20
  105. package/dist/src/agents/registry.test.js.map +1 -1
  106. package/dist/src/agents/remote-invocation.js +6 -6
  107. package/dist/src/agents/remote-invocation.js.map +1 -1
  108. package/dist/src/agents/remote-invocation.test.js +23 -12
  109. package/dist/src/agents/remote-invocation.test.js.map +1 -1
  110. package/dist/src/agents/remote-session-invocation.d.ts +48 -0
  111. package/dist/src/agents/remote-session-invocation.js +193 -0
  112. package/dist/src/agents/remote-session-invocation.js.map +1 -0
  113. package/dist/src/agents/remote-session-invocation.test.d.ts +6 -0
  114. package/dist/src/agents/remote-session-invocation.test.js +405 -0
  115. package/dist/src/agents/remote-session-invocation.test.js.map +1 -0
  116. package/dist/src/agents/remote-subagent-protocol.d.ts +42 -0
  117. package/dist/src/agents/remote-subagent-protocol.js +348 -0
  118. package/dist/src/agents/remote-subagent-protocol.js.map +1 -0
  119. package/dist/src/agents/remote-subagent-protocol.test.d.ts +6 -0
  120. package/dist/src/agents/remote-subagent-protocol.test.js +652 -0
  121. package/dist/src/agents/remote-subagent-protocol.test.js.map +1 -0
  122. package/dist/src/agents/skill-extraction-agent.d.ts +8 -1
  123. package/dist/src/agents/skill-extraction-agent.js +171 -21
  124. package/dist/src/agents/skill-extraction-agent.js.map +1 -1
  125. package/dist/src/agents/skill-extraction-agent.test.js +66 -2
  126. package/dist/src/agents/skill-extraction-agent.test.js.map +1 -1
  127. package/dist/src/agents/types.d.ts +38 -2
  128. package/dist/src/agents/types.js +7 -0
  129. package/dist/src/agents/types.js.map +1 -1
  130. package/dist/src/availability/autoRoutingFallback.integration.test.d.ts +6 -0
  131. package/dist/src/availability/autoRoutingFallback.integration.test.js +288 -0
  132. package/dist/src/availability/autoRoutingFallback.integration.test.js.map +1 -0
  133. package/dist/src/availability/fallbackIntegration.test.js +29 -0
  134. package/dist/src/availability/fallbackIntegration.test.js.map +1 -1
  135. package/dist/src/availability/modelAvailabilityService.d.ts +6 -6
  136. package/dist/src/availability/modelAvailabilityService.js +16 -8
  137. package/dist/src/availability/modelAvailabilityService.js.map +1 -1
  138. package/dist/src/availability/modelAvailabilityService.test.js +39 -0
  139. package/dist/src/availability/modelAvailabilityService.test.js.map +1 -1
  140. package/dist/src/availability/modelPolicy.d.ts +1 -0
  141. package/dist/src/availability/policyCatalog.d.ts +2 -0
  142. package/dist/src/availability/policyCatalog.js +38 -9
  143. package/dist/src/availability/policyCatalog.js.map +1 -1
  144. package/dist/src/availability/policyCatalog.test.js +5 -4
  145. package/dist/src/availability/policyCatalog.test.js.map +1 -1
  146. package/dist/src/availability/policyHelpers.js +42 -27
  147. package/dist/src/availability/policyHelpers.js.map +1 -1
  148. package/dist/src/availability/policyHelpers.test.js +47 -7
  149. package/dist/src/availability/policyHelpers.test.js.map +1 -1
  150. package/dist/src/availability/testUtils.js +1 -1
  151. package/dist/src/availability/testUtils.js.map +1 -1
  152. package/dist/src/code_assist/admin/admin_controls.js +3 -1
  153. package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
  154. package/dist/src/code_assist/experiments/flagNames.d.ts +1 -1
  155. package/dist/src/code_assist/experiments/flagNames.js +1 -1
  156. package/dist/src/code_assist/experiments/flagNames.js.map +1 -1
  157. package/dist/src/code_assist/oauth-credential-storage.js +12 -3
  158. package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
  159. package/dist/src/code_assist/oauth-credential-storage.test.js +29 -2
  160. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
  161. package/dist/src/code_assist/oauth2.js +12 -3
  162. package/dist/src/code_assist/oauth2.js.map +1 -1
  163. package/dist/src/code_assist/oauth2.test.js +38 -0
  164. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  165. package/dist/src/code_assist/setup.d.ts +3 -0
  166. package/dist/src/code_assist/setup.js +9 -0
  167. package/dist/src/code_assist/setup.js.map +1 -1
  168. package/dist/src/code_assist/setup.test.js +10 -1
  169. package/dist/src/code_assist/setup.test.js.map +1 -1
  170. package/dist/src/commands/memory.d.ts +83 -2
  171. package/dist/src/commands/memory.js +479 -28
  172. package/dist/src/commands/memory.js.map +1 -1
  173. package/dist/src/commands/memory.test.js +414 -58
  174. package/dist/src/commands/memory.test.js.map +1 -1
  175. package/dist/src/config/config.d.ts +61 -37
  176. package/dist/src/config/config.js +294 -101
  177. package/dist/src/config/config.js.map +1 -1
  178. package/dist/src/config/config.test.js +365 -113
  179. package/dist/src/config/config.test.js.map +1 -1
  180. package/dist/src/config/defaultModelConfigs.js +185 -61
  181. package/dist/src/config/defaultModelConfigs.js.map +1 -1
  182. package/dist/src/config/flashFallback.test.js +31 -0
  183. package/dist/src/config/flashFallback.test.js.map +1 -1
  184. package/dist/src/config/models.d.ts +20 -10
  185. package/dist/src/config/models.js +105 -34
  186. package/dist/src/config/models.js.map +1 -1
  187. package/dist/src/config/models.test.js +204 -47
  188. package/dist/src/config/models.test.js.map +1 -1
  189. package/dist/src/config/projectRegistry.d.ts +1 -0
  190. package/dist/src/config/projectRegistry.js +14 -3
  191. package/dist/src/config/projectRegistry.js.map +1 -1
  192. package/dist/src/config/projectRegistry.test.js +43 -0
  193. package/dist/src/config/projectRegistry.test.js.map +1 -1
  194. package/dist/src/config/scoped-config.d.ts +22 -0
  195. package/dist/src/config/scoped-config.js +32 -0
  196. package/dist/src/config/scoped-config.js.map +1 -1
  197. package/dist/src/config/storage.d.ts +0 -1
  198. package/dist/src/config/storage.js +0 -3
  199. package/dist/src/config/storage.js.map +1 -1
  200. package/dist/src/confirmation-bus/message-bus.d.ts +3 -1
  201. package/dist/src/confirmation-bus/message-bus.js +14 -5
  202. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  203. package/dist/src/confirmation-bus/message-bus.test.js +34 -0
  204. package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
  205. package/dist/src/context/chatCompressionService.js +7 -5
  206. package/dist/src/context/chatCompressionService.js.map +1 -1
  207. package/dist/src/context/chatCompressionService.test.js +1 -1
  208. package/dist/src/context/chatCompressionService.test.js.map +1 -1
  209. package/dist/src/context/config/configLoader.js +4 -1
  210. package/dist/src/context/config/configLoader.js.map +1 -1
  211. package/dist/src/context/config/profiles.d.ts +10 -0
  212. package/dist/src/context/config/profiles.js +98 -3
  213. package/dist/src/context/config/profiles.js.map +1 -1
  214. package/dist/src/context/config/schema.d.ts +4 -0
  215. package/dist/src/context/config/schema.js +4 -0
  216. package/dist/src/context/config/schema.js.map +1 -1
  217. package/dist/src/context/config/types.d.ts +13 -1
  218. package/dist/src/context/contextCompressionService.test.js +7 -3
  219. package/dist/src/context/contextCompressionService.test.js.map +1 -1
  220. package/dist/src/context/contextManager.barrier.test.js +39 -16
  221. package/dist/src/context/contextManager.barrier.test.js.map +1 -1
  222. package/dist/src/context/contextManager.d.ts +25 -28
  223. package/dist/src/context/contextManager.hotstart.test.d.ts +6 -0
  224. package/dist/src/context/contextManager.hotstart.test.js +65 -0
  225. package/dist/src/context/contextManager.hotstart.test.js.map +1 -0
  226. package/dist/src/context/contextManager.incremental.test.d.ts +6 -0
  227. package/dist/src/context/contextManager.incremental.test.js +101 -0
  228. package/dist/src/context/contextManager.incremental.test.js.map +1 -0
  229. package/dist/src/context/contextManager.js +276 -79
  230. package/dist/src/context/contextManager.js.map +1 -1
  231. package/dist/src/context/contextManager.test.d.ts +6 -0
  232. package/dist/src/context/contextManager.test.js +142 -0
  233. package/dist/src/context/contextManager.test.js.map +1 -0
  234. package/dist/src/context/eventBus.d.ts +13 -0
  235. package/dist/src/context/eventBus.js +12 -0
  236. package/dist/src/context/eventBus.js.map +1 -1
  237. package/dist/src/context/graph/behaviorRegistry.d.ts +4 -12
  238. package/dist/src/context/graph/behaviorRegistry.js.map +1 -1
  239. package/dist/src/context/graph/builtinBehaviors.d.ts +6 -1
  240. package/dist/src/context/graph/builtinBehaviors.js +23 -108
  241. package/dist/src/context/graph/builtinBehaviors.js.map +1 -1
  242. package/dist/src/context/graph/fromGraph.d.ts +8 -3
  243. package/dist/src/context/graph/fromGraph.js +46 -30
  244. package/dist/src/context/graph/fromGraph.js.map +1 -1
  245. package/dist/src/context/graph/fromGraph.test.d.ts +6 -0
  246. package/dist/src/context/graph/fromGraph.test.js +186 -0
  247. package/dist/src/context/graph/fromGraph.test.js.map +1 -0
  248. package/dist/src/context/graph/mapper.d.ts +8 -10
  249. package/dist/src/context/graph/mapper.js +11 -19
  250. package/dist/src/context/graph/mapper.js.map +1 -1
  251. package/dist/src/context/graph/mapper.test.d.ts +6 -0
  252. package/dist/src/context/graph/mapper.test.js +101 -0
  253. package/dist/src/context/graph/mapper.test.js.map +1 -0
  254. package/dist/src/context/graph/nodeIdService.d.ts +17 -0
  255. package/dist/src/context/graph/nodeIdService.js +24 -0
  256. package/dist/src/context/graph/nodeIdService.js.map +1 -0
  257. package/dist/src/context/graph/render.d.ts +24 -5
  258. package/dist/src/context/graph/render.js +129 -34
  259. package/dist/src/context/graph/render.js.map +1 -1
  260. package/dist/src/context/graph/render.test.d.ts +6 -0
  261. package/dist/src/context/graph/render.test.js +280 -0
  262. package/dist/src/context/graph/render.test.js.map +1 -0
  263. package/dist/src/context/graph/toGraph.d.ts +16 -14
  264. package/dist/src/context/graph/toGraph.js +180 -202
  265. package/dist/src/context/graph/toGraph.js.map +1 -1
  266. package/dist/src/context/graph/toGraph.test.d.ts +6 -0
  267. package/dist/src/context/graph/toGraph.test.js +116 -0
  268. package/dist/src/context/graph/toGraph.test.js.map +1 -0
  269. package/dist/src/context/graph/types.d.ts +36 -73
  270. package/dist/src/context/graph/types.js +23 -14
  271. package/dist/src/context/graph/types.js.map +1 -1
  272. package/dist/src/context/initializer.js +26 -5
  273. package/dist/src/context/initializer.js.map +1 -1
  274. package/dist/src/context/pipeline/contextWorkingBuffer.d.ts +5 -8
  275. package/dist/src/context/pipeline/contextWorkingBuffer.js +105 -35
  276. package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -1
  277. package/dist/src/context/pipeline/contextWorkingBuffer.test.js +81 -13
  278. package/dist/src/context/pipeline/contextWorkingBuffer.test.js.map +1 -1
  279. package/dist/src/context/pipeline/environment.d.ts +4 -0
  280. package/dist/src/context/pipeline/environmentImpl.d.ts +6 -5
  281. package/dist/src/context/pipeline/environmentImpl.js +7 -9
  282. package/dist/src/context/pipeline/environmentImpl.js.map +1 -1
  283. package/dist/src/context/pipeline/environmentImpl.test.js +5 -1
  284. package/dist/src/context/pipeline/environmentImpl.test.js.map +1 -1
  285. package/dist/src/context/pipeline/orchestrator.d.ts +20 -6
  286. package/dist/src/context/pipeline/orchestrator.js +97 -80
  287. package/dist/src/context/pipeline/orchestrator.js.map +1 -1
  288. package/dist/src/context/pipeline/orchestrator.test.js +33 -36
  289. package/dist/src/context/pipeline/orchestrator.test.js.map +1 -1
  290. package/dist/src/context/pipeline.d.ts +0 -1
  291. package/dist/src/context/processors/blobDegradationProcessor.js +43 -84
  292. package/dist/src/context/processors/blobDegradationProcessor.js.map +1 -1
  293. package/dist/src/context/processors/blobDegradationProcessor.test.js +33 -37
  294. package/dist/src/context/processors/blobDegradationProcessor.test.js.map +1 -1
  295. package/dist/src/context/processors/nodeDistillationProcessor.js +58 -80
  296. package/dist/src/context/processors/nodeDistillationProcessor.js.map +1 -1
  297. package/dist/src/context/processors/nodeDistillationProcessor.test.js +21 -15
  298. package/dist/src/context/processors/nodeDistillationProcessor.test.js.map +1 -1
  299. package/dist/src/context/processors/nodeTruncationProcessor.js +16 -60
  300. package/dist/src/context/processors/nodeTruncationProcessor.js.map +1 -1
  301. package/dist/src/context/processors/nodeTruncationProcessor.test.js +16 -19
  302. package/dist/src/context/processors/nodeTruncationProcessor.test.js.map +1 -1
  303. package/dist/src/context/processors/rollingSummaryProcessor.js +12 -25
  304. package/dist/src/context/processors/rollingSummaryProcessor.js.map +1 -1
  305. package/dist/src/context/processors/rollingSummaryProcessor.test.js +10 -9
  306. package/dist/src/context/processors/rollingSummaryProcessor.test.js.map +1 -1
  307. package/dist/src/context/processors/stateSnapshotAsyncProcessor.d.ts +7 -0
  308. package/dist/src/context/processors/stateSnapshotAsyncProcessor.js +37 -19
  309. package/dist/src/context/processors/stateSnapshotAsyncProcessor.js.map +1 -1
  310. package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js +35 -10
  311. package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js.map +1 -1
  312. package/dist/src/context/processors/stateSnapshotProcessor.d.ts +2 -0
  313. package/dist/src/context/processors/stateSnapshotProcessor.js +53 -21
  314. package/dist/src/context/processors/stateSnapshotProcessor.js.map +1 -1
  315. package/dist/src/context/processors/stateSnapshotProcessor.test.js +52 -12
  316. package/dist/src/context/processors/stateSnapshotProcessor.test.js.map +1 -1
  317. package/dist/src/context/processors/toolMaskingProcessor.js +96 -117
  318. package/dist/src/context/processors/toolMaskingProcessor.js.map +1 -1
  319. package/dist/src/context/processors/toolMaskingProcessor.test.js +50 -17
  320. package/dist/src/context/processors/toolMaskingProcessor.test.js.map +1 -1
  321. package/dist/src/context/system-tests/hysteresis.test.d.ts +6 -0
  322. package/dist/src/context/system-tests/hysteresis.test.js +100 -0
  323. package/dist/src/context/system-tests/hysteresis.test.js.map +1 -0
  324. package/dist/src/context/system-tests/lifecycle.golden.test.js +107 -72
  325. package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -1
  326. package/dist/src/context/system-tests/powerUserLifecycle.test.d.ts +6 -0
  327. package/dist/src/context/system-tests/powerUserLifecycle.test.js +91 -0
  328. package/dist/src/context/system-tests/powerUserLifecycle.test.js.map +1 -0
  329. package/dist/src/context/system-tests/simulationHarness.d.ts +2 -5
  330. package/dist/src/context/system-tests/simulationHarness.js +34 -35
  331. package/dist/src/context/system-tests/simulationHarness.js.map +1 -1
  332. package/dist/src/context/testing/contextTestUtils.d.ts +5 -3
  333. package/dist/src/context/testing/contextTestUtils.js +74 -53
  334. package/dist/src/context/testing/contextTestUtils.js.map +1 -1
  335. package/dist/src/context/testing/testProfile.js +1 -0
  336. package/dist/src/context/testing/testProfile.js.map +1 -1
  337. package/dist/src/context/toolOutputMaskingService.js +1 -2
  338. package/dist/src/context/toolOutputMaskingService.js.map +1 -1
  339. package/dist/src/context/toolOutputMaskingService.test.js +5 -20
  340. package/dist/src/context/toolOutputMaskingService.test.js.map +1 -1
  341. package/dist/src/context/utils/adaptiveTokenCalculator.d.ts +70 -0
  342. package/dist/src/context/utils/adaptiveTokenCalculator.js +138 -0
  343. package/dist/src/context/utils/adaptiveTokenCalculator.js.map +1 -0
  344. package/dist/src/context/utils/adaptiveTokenCalculator.test.d.ts +6 -0
  345. package/dist/src/context/utils/adaptiveTokenCalculator.test.js +129 -0
  346. package/dist/src/context/utils/adaptiveTokenCalculator.test.js.map +1 -0
  347. package/dist/src/context/utils/contextTokenCalculator.d.ts +63 -2
  348. package/dist/src/context/utils/contextTokenCalculator.js +80 -5
  349. package/dist/src/context/utils/contextTokenCalculator.js.map +1 -1
  350. package/dist/src/context/utils/contextTokenCalculator.test.d.ts +6 -0
  351. package/dist/src/context/utils/contextTokenCalculator.test.js +54 -0
  352. package/dist/src/context/utils/contextTokenCalculator.test.js.map +1 -0
  353. package/dist/src/context/utils/formatNodesForLlm.d.ts +21 -0
  354. package/dist/src/context/utils/formatNodesForLlm.js +69 -0
  355. package/dist/src/context/utils/formatNodesForLlm.js.map +1 -0
  356. package/dist/src/context/utils/formatNodesForLlm.test.d.ts +6 -0
  357. package/dist/src/context/utils/formatNodesForLlm.test.js +110 -0
  358. package/dist/src/context/utils/formatNodesForLlm.test.js.map +1 -0
  359. package/dist/src/context/utils/invariantChecker.d.ts +11 -0
  360. package/dist/src/context/utils/invariantChecker.js +36 -0
  361. package/dist/src/context/utils/invariantChecker.js.map +1 -0
  362. package/dist/src/context/utils/snapshotGenerator.d.ts +43 -1
  363. package/dist/src/context/utils/snapshotGenerator.js +332 -33
  364. package/dist/src/context/utils/snapshotGenerator.js.map +1 -1
  365. package/dist/src/context/utils/snapshotGenerator.test.d.ts +6 -0
  366. package/dist/src/context/utils/snapshotGenerator.test.js +362 -0
  367. package/dist/src/context/utils/snapshotGenerator.test.js.map +1 -0
  368. package/dist/src/context/utils/tokenCalibration.d.ts +9 -0
  369. package/dist/src/context/utils/tokenCalibration.js +30 -0
  370. package/dist/src/context/utils/tokenCalibration.js.map +1 -0
  371. package/dist/src/core/agentChatHistory.d.ts +29 -14
  372. package/dist/src/core/agentChatHistory.js +27 -27
  373. package/dist/src/core/agentChatHistory.js.map +1 -1
  374. package/dist/src/core/baseLlmClient.d.ts +8 -0
  375. package/dist/src/core/baseLlmClient.js +23 -3
  376. package/dist/src/core/baseLlmClient.js.map +1 -1
  377. package/dist/src/core/baseLlmClient.test.js +27 -23
  378. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  379. package/dist/src/core/client.d.ts +7 -5
  380. package/dist/src/core/client.js +65 -40
  381. package/dist/src/core/client.js.map +1 -1
  382. package/dist/src/core/client.test.js +35 -131
  383. package/dist/src/core/client.test.js.map +1 -1
  384. package/dist/src/core/contentGenerator.js +46 -21
  385. package/dist/src/core/contentGenerator.js.map +1 -1
  386. package/dist/src/core/contentGenerator.test.js +191 -13
  387. package/dist/src/core/contentGenerator.test.js.map +1 -1
  388. package/dist/src/core/fakeContentGenerator.d.ts +15 -3
  389. package/dist/src/core/fakeContentGenerator.js +29 -9
  390. package/dist/src/core/fakeContentGenerator.js.map +1 -1
  391. package/dist/src/core/geminiChat.d.ts +18 -7
  392. package/dist/src/core/geminiChat.js +312 -54
  393. package/dist/src/core/geminiChat.js.map +1 -1
  394. package/dist/src/core/geminiChat.test.js +448 -54
  395. package/dist/src/core/geminiChat.test.js.map +1 -1
  396. package/dist/src/core/geminiChat_network_retry.test.js +39 -0
  397. package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
  398. package/dist/src/core/localLiteRtLmClient.js +6 -2
  399. package/dist/src/core/localLiteRtLmClient.js.map +1 -1
  400. package/dist/src/core/prompts.test.js +12 -7
  401. package/dist/src/core/prompts.test.js.map +1 -1
  402. package/dist/src/core/turn.d.ts +7 -2
  403. package/dist/src/core/turn.js +61 -4
  404. package/dist/src/core/turn.js.map +1 -1
  405. package/dist/src/core/turn.test.js +19 -10
  406. package/dist/src/core/turn.test.js.map +1 -1
  407. package/dist/src/fallback/handler.js +16 -6
  408. package/dist/src/fallback/handler.js.map +1 -1
  409. package/dist/src/fallback/handler.test.js +8 -2
  410. package/dist/src/fallback/handler.test.js.map +1 -1
  411. package/dist/src/generated/git-commit.d.ts +2 -2
  412. package/dist/src/generated/git-commit.js +2 -2
  413. package/dist/src/hooks/hookEventHandler.js +3 -2
  414. package/dist/src/hooks/hookEventHandler.js.map +1 -1
  415. package/dist/src/hooks/hookEventHandler.test.js +80 -0
  416. package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
  417. package/dist/src/hooks/hookRunner.test.js +3 -3
  418. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  419. package/dist/src/hooks/hookTranslator.js +95 -5
  420. package/dist/src/hooks/hookTranslator.js.map +1 -1
  421. package/dist/src/hooks/hookTranslator.test.js +171 -0
  422. package/dist/src/hooks/hookTranslator.test.js.map +1 -1
  423. package/dist/src/ide/ide-client.js +5 -3
  424. package/dist/src/ide/ide-client.js.map +1 -1
  425. package/dist/src/ide/ide-connection-utils.js +12 -10
  426. package/dist/src/ide/ide-connection-utils.js.map +1 -1
  427. package/dist/src/ide/ide-connection-utils.test.js +25 -2
  428. package/dist/src/ide/ide-connection-utils.test.js.map +1 -1
  429. package/dist/src/ide/types.d.ts +16 -16
  430. package/dist/src/index.d.ts +5 -2
  431. package/dist/src/index.js +5 -3
  432. package/dist/src/index.js.map +1 -1
  433. package/dist/src/mcp/oauth-provider.d.ts +8 -0
  434. package/dist/src/mcp/oauth-provider.js +41 -0
  435. package/dist/src/mcp/oauth-provider.js.map +1 -1
  436. package/dist/src/mcp/oauth-token-storage.js +7 -1
  437. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  438. package/dist/src/mcp/oauth-token-storage.test.js +55 -0
  439. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  440. package/dist/src/mcp/stored-token-provider.d.ts +27 -0
  441. package/dist/src/mcp/stored-token-provider.js +76 -0
  442. package/dist/src/mcp/stored-token-provider.js.map +1 -0
  443. package/dist/src/mcp/token-storage/keychain-token-storage.js +2 -2
  444. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  445. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +14 -1
  446. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
  447. package/dist/src/output/json-formatter.d.ts +1 -1
  448. package/dist/src/output/json-formatter.js +4 -1
  449. package/dist/src/output/json-formatter.js.map +1 -1
  450. package/dist/src/output/json-formatter.test.js +7 -0
  451. package/dist/src/output/json-formatter.test.js.map +1 -1
  452. package/dist/src/output/types.d.ts +1 -0
  453. package/dist/src/output/types.js.map +1 -1
  454. package/dist/src/policy/config.js +25 -0
  455. package/dist/src/policy/config.js.map +1 -1
  456. package/dist/src/policy/config.test.js +80 -0
  457. package/dist/src/policy/config.test.js.map +1 -1
  458. package/dist/src/policy/core-tools-mapping.test.js +9 -1
  459. package/dist/src/policy/core-tools-mapping.test.js.map +1 -1
  460. package/dist/src/policy/policies/plan.toml +1 -1
  461. package/dist/src/policy/policies/write.toml +0 -7
  462. package/dist/src/policy/policy-engine.test.js +0 -8
  463. package/dist/src/policy/policy-engine.test.js.map +1 -1
  464. package/dist/src/policy/sandboxPolicyManager.d.ts +20 -20
  465. package/dist/src/policy/stable-stringify.js +10 -6
  466. package/dist/src/policy/stable-stringify.js.map +1 -1
  467. package/dist/src/policy/stable-stringify.test.js +157 -0
  468. package/dist/src/policy/stable-stringify.test.js.map +1 -0
  469. package/dist/src/policy/types.d.ts +1 -0
  470. package/dist/src/policy/types.js.map +1 -1
  471. package/dist/src/prompts/promptProvider.js +8 -9
  472. package/dist/src/prompts/promptProvider.js.map +1 -1
  473. package/dist/src/prompts/promptProvider.test.js +3 -1
  474. package/dist/src/prompts/promptProvider.test.js.map +1 -1
  475. package/dist/src/prompts/snippets-memory.test.d.ts +6 -0
  476. package/dist/src/prompts/{snippets-memory-v2.test.js → snippets-memory.test.js} +5 -23
  477. package/dist/src/prompts/snippets-memory.test.js.map +1 -0
  478. package/dist/src/prompts/snippets.d.ts +6 -11
  479. package/dist/src/prompts/snippets.js +28 -30
  480. package/dist/src/prompts/snippets.js.map +1 -1
  481. package/dist/src/prompts/snippets.legacy.d.ts +0 -1
  482. package/dist/src/prompts/snippets.legacy.js +8 -15
  483. package/dist/src/prompts/snippets.legacy.js.map +1 -1
  484. package/dist/src/routing/strategies/approvalModeStrategy.js +5 -3
  485. package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -1
  486. package/dist/src/routing/strategies/approvalModeStrategy.test.js +9 -0
  487. package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -1
  488. package/dist/src/routing/strategies/classifierStrategy.js +18 -4
  489. package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
  490. package/dist/src/routing/strategies/classifierStrategy.test.js +77 -1
  491. package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
  492. package/dist/src/routing/strategies/defaultStrategy.js +1 -1
  493. package/dist/src/routing/strategies/defaultStrategy.js.map +1 -1
  494. package/dist/src/routing/strategies/fallbackStrategy.js +1 -1
  495. package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
  496. package/dist/src/routing/strategies/gemmaClassifierStrategy.js +7 -1
  497. package/dist/src/routing/strategies/gemmaClassifierStrategy.js.map +1 -1
  498. package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js +15 -1
  499. package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js.map +1 -1
  500. package/dist/src/routing/strategies/numericalClassifierStrategy.d.ts +1 -0
  501. package/dist/src/routing/strategies/numericalClassifierStrategy.js +32 -5
  502. package/dist/src/routing/strategies/numericalClassifierStrategy.js.map +1 -1
  503. package/dist/src/routing/strategies/numericalClassifierStrategy.test.js +247 -25
  504. package/dist/src/routing/strategies/numericalClassifierStrategy.test.js.map +1 -1
  505. package/dist/src/routing/strategies/overrideStrategy.js +1 -1
  506. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  507. package/dist/src/sandbox/utils/commandSafety.js +22 -2
  508. package/dist/src/sandbox/utils/commandSafety.js.map +1 -1
  509. package/dist/src/sandbox/utils/commandSafety.test.d.ts +6 -0
  510. package/dist/src/sandbox/utils/commandSafety.test.js +85 -0
  511. package/dist/src/sandbox/utils/commandSafety.test.js.map +1 -0
  512. package/dist/src/scheduler/confirmation.test.js +29 -0
  513. package/dist/src/scheduler/confirmation.test.js.map +1 -1
  514. package/dist/src/scheduler/scheduler.js +15 -0
  515. package/dist/src/scheduler/scheduler.js.map +1 -1
  516. package/dist/src/scheduler/scheduler.test.js +1 -1
  517. package/dist/src/scheduler/scheduler.test.js.map +1 -1
  518. package/dist/src/scheduler/scheduler_parallel.test.js +37 -0
  519. package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -1
  520. package/dist/src/scheduler/state-manager.js +5 -1
  521. package/dist/src/scheduler/state-manager.js.map +1 -1
  522. package/dist/src/scheduler/tool-executor.js +7 -4
  523. package/dist/src/scheduler/tool-executor.js.map +1 -1
  524. package/dist/src/scheduler/types.d.ts +5 -1
  525. package/dist/src/scheduler/types.js.map +1 -1
  526. package/dist/src/services/chatRecordingService.d.ts +14 -7
  527. package/dist/src/services/chatRecordingService.js +157 -133
  528. package/dist/src/services/chatRecordingService.js.map +1 -1
  529. package/dist/src/services/chatRecordingService.test.js +189 -52
  530. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  531. package/dist/src/services/fileDiscoveryService.js +2 -1
  532. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  533. package/dist/src/services/fileDiscoveryService.test.js +36 -0
  534. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  535. package/dist/src/services/gitService.js +43 -4
  536. package/dist/src/services/gitService.js.map +1 -1
  537. package/dist/src/services/gitService.test.js +105 -1
  538. package/dist/src/services/gitService.test.js.map +1 -1
  539. package/dist/src/services/keychainService.js +14 -5
  540. package/dist/src/services/keychainService.js.map +1 -1
  541. package/dist/src/services/memoryPatchUtils.d.ts +93 -0
  542. package/dist/src/services/memoryPatchUtils.js +310 -2
  543. package/dist/src/services/memoryPatchUtils.js.map +1 -1
  544. package/dist/src/services/memoryService.d.ts +2 -0
  545. package/dist/src/services/memoryService.js +214 -9
  546. package/dist/src/services/memoryService.js.map +1 -1
  547. package/dist/src/services/memoryService.test.js +133 -0
  548. package/dist/src/services/memoryService.test.js.map +1 -1
  549. package/dist/src/services/modelConfigService.d.ts +3 -0
  550. package/dist/src/services/modelConfigService.js +22 -13
  551. package/dist/src/services/modelConfigService.js.map +1 -1
  552. package/dist/src/services/modelConfigService.test.js +73 -0
  553. package/dist/src/services/modelConfigService.test.js.map +1 -1
  554. package/dist/src/services/shellExecutionService.js +88 -41
  555. package/dist/src/services/shellExecutionService.js.map +1 -1
  556. package/dist/src/services/shellExecutionService.test.js +22 -9
  557. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  558. package/dist/src/services/shellExecutionService.windows.integration.test.d.ts +6 -0
  559. package/dist/src/services/shellExecutionService.windows.integration.test.js +63 -0
  560. package/dist/src/services/shellExecutionService.windows.integration.test.js.map +1 -0
  561. package/dist/src/services/test-data/resolved-aliases-retry.golden.json +85 -7
  562. package/dist/src/services/test-data/resolved-aliases.golden.json +85 -7
  563. package/dist/src/services/trackerTypes.d.ts +4 -4
  564. package/dist/src/skills/skillManager.d.ts +4 -0
  565. package/dist/src/skills/skillManager.js +6 -0
  566. package/dist/src/skills/skillManager.js.map +1 -1
  567. package/dist/src/skills/skillManager.test.js +10 -0
  568. package/dist/src/skills/skillManager.test.js.map +1 -1
  569. package/dist/src/telemetry/file-exporters.d.ts +4 -1
  570. package/dist/src/telemetry/file-exporters.js +21 -3
  571. package/dist/src/telemetry/file-exporters.js.map +1 -1
  572. package/dist/src/telemetry/file-exporters.test.js +32 -2
  573. package/dist/src/telemetry/file-exporters.test.js.map +1 -1
  574. package/dist/src/telemetry/gcp-exporters.d.ts +3 -0
  575. package/dist/src/telemetry/gcp-exporters.js +72 -5
  576. package/dist/src/telemetry/gcp-exporters.js.map +1 -1
  577. package/dist/src/telemetry/gcp-exporters.test.js +52 -0
  578. package/dist/src/telemetry/gcp-exporters.test.js.map +1 -1
  579. package/dist/src/telemetry/heap-snapshot.d.ts +12 -0
  580. package/dist/src/telemetry/heap-snapshot.js +35 -0
  581. package/dist/src/telemetry/heap-snapshot.js.map +1 -0
  582. package/dist/src/telemetry/heap-snapshot.test.d.ts +6 -0
  583. package/dist/src/telemetry/heap-snapshot.test.js +38 -0
  584. package/dist/src/telemetry/heap-snapshot.test.js.map +1 -0
  585. package/dist/src/telemetry/index.d.ts +1 -0
  586. package/dist/src/telemetry/index.js +1 -0
  587. package/dist/src/telemetry/index.js.map +1 -1
  588. package/dist/src/telemetry/loggers.test.js +1 -0
  589. package/dist/src/telemetry/loggers.test.js.map +1 -1
  590. package/dist/src/telemetry/memory-monitor.d.ts +5 -0
  591. package/dist/src/telemetry/memory-monitor.js +8 -0
  592. package/dist/src/telemetry/memory-monitor.js.map +1 -1
  593. package/dist/src/telemetry/metrics.js +13 -2
  594. package/dist/src/telemetry/metrics.js.map +1 -1
  595. package/dist/src/telemetry/metrics.test.js +61 -1
  596. package/dist/src/telemetry/metrics.test.js.map +1 -1
  597. package/dist/src/test-utils/config.js +10 -1
  598. package/dist/src/test-utils/config.js.map +1 -1
  599. package/dist/src/tools/ask-user.js +25 -1
  600. package/dist/src/tools/ask-user.js.map +1 -1
  601. package/dist/src/tools/ask-user.test.js +46 -1
  602. package/dist/src/tools/ask-user.test.js.map +1 -1
  603. package/dist/src/tools/definitions/base-declarations.d.ts +0 -3
  604. package/dist/src/tools/definitions/base-declarations.js +0 -4
  605. package/dist/src/tools/definitions/base-declarations.js.map +1 -1
  606. package/dist/src/tools/definitions/coreTools.d.ts +1 -2
  607. package/dist/src/tools/definitions/coreTools.js +2 -8
  608. package/dist/src/tools/definitions/coreTools.js.map +1 -1
  609. package/dist/src/tools/definitions/coreToolsModelSnapshots.test.js +1 -2
  610. package/dist/src/tools/definitions/coreToolsModelSnapshots.test.js.map +1 -1
  611. package/dist/src/tools/definitions/model-family-sets/default-legacy.js +7 -31
  612. package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
  613. package/dist/src/tools/definitions/model-family-sets/gemini-3.js +9 -26
  614. package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
  615. package/dist/src/tools/definitions/types.d.ts +0 -1
  616. package/dist/src/tools/edit.js +27 -5
  617. package/dist/src/tools/edit.js.map +1 -1
  618. package/dist/src/tools/edit.test.js +37 -0
  619. package/dist/src/tools/edit.test.js.map +1 -1
  620. package/dist/src/tools/grep.js +14 -2
  621. package/dist/src/tools/grep.js.map +1 -1
  622. package/dist/src/tools/grep.test.js +17 -0
  623. package/dist/src/tools/grep.test.js.map +1 -1
  624. package/dist/src/tools/jit-context.d.ts +1 -1
  625. package/dist/src/tools/jit-context.js +1 -4
  626. package/dist/src/tools/jit-context.js.map +1 -1
  627. package/dist/src/tools/jit-context.test.js +1 -13
  628. package/dist/src/tools/jit-context.test.js.map +1 -1
  629. package/dist/src/tools/ls.js +5 -0
  630. package/dist/src/tools/ls.js.map +1 -1
  631. package/dist/src/tools/mcp-client-manager.js +2 -1
  632. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  633. package/dist/src/tools/mcp-client-manager.test.js +29 -0
  634. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  635. package/dist/src/tools/mcp-client.js +89 -50
  636. package/dist/src/tools/mcp-client.js.map +1 -1
  637. package/dist/src/tools/mcp-client.test.js +353 -59
  638. package/dist/src/tools/mcp-client.test.js.map +1 -1
  639. package/dist/src/tools/{xcode-mcp-fix-transport.d.ts → mcp-compliance-transport.d.ts} +6 -6
  640. package/dist/src/tools/{xcode-mcp-fix-transport.js → mcp-compliance-transport.js} +6 -6
  641. package/dist/src/tools/mcp-compliance-transport.js.map +1 -0
  642. package/dist/src/tools/mcp-compliance-transport.test.d.ts +6 -0
  643. package/dist/src/tools/mcp-compliance-transport.test.js +162 -0
  644. package/dist/src/tools/mcp-compliance-transport.test.js.map +1 -0
  645. package/dist/src/tools/memoryTool.d.ts +9 -31
  646. package/dist/src/tools/memoryTool.js +47 -262
  647. package/dist/src/tools/memoryTool.js.map +1 -1
  648. package/dist/src/tools/memoryTool.test.js +41 -312
  649. package/dist/src/tools/memoryTool.test.js.map +1 -1
  650. package/dist/src/tools/read-file.js +11 -6
  651. package/dist/src/tools/read-file.js.map +1 -1
  652. package/dist/src/tools/read-file.test.js +20 -8
  653. package/dist/src/tools/read-file.test.js.map +1 -1
  654. package/dist/src/tools/read-many-files.js +2 -2
  655. package/dist/src/tools/read-many-files.js.map +1 -1
  656. package/dist/src/tools/ripGrep.d.ts +3 -7
  657. package/dist/src/tools/ripGrep.js +57 -35
  658. package/dist/src/tools/ripGrep.js.map +1 -1
  659. package/dist/src/tools/ripGrep.test.js +197 -276
  660. package/dist/src/tools/ripGrep.test.js.map +1 -1
  661. package/dist/src/tools/shell.d.ts +5 -3
  662. package/dist/src/tools/shell.js +130 -36
  663. package/dist/src/tools/shell.js.map +1 -1
  664. package/dist/src/tools/shell.test.js +186 -14
  665. package/dist/src/tools/shell.test.js.map +1 -1
  666. package/dist/src/tools/shell_proactive.test.js +1 -0
  667. package/dist/src/tools/shell_proactive.test.js.map +1 -1
  668. package/dist/src/tools/tool-names.d.ts +3 -3
  669. package/dist/src/tools/tool-names.js +4 -5
  670. package/dist/src/tools/tool-names.js.map +1 -1
  671. package/dist/src/tools/tool-registry.js +1 -1
  672. package/dist/src/tools/tool-registry.js.map +1 -1
  673. package/dist/src/tools/tools.d.ts +6 -0
  674. package/dist/src/tools/tools.js.map +1 -1
  675. package/dist/src/tools/topicTool.js +5 -0
  676. package/dist/src/tools/topicTool.js.map +1 -1
  677. package/dist/src/tools/write-file.js +13 -0
  678. package/dist/src/tools/write-file.js.map +1 -1
  679. package/dist/src/tools/write-file.test.js +8 -0
  680. package/dist/src/tools/write-file.test.js.map +1 -1
  681. package/dist/src/utils/atCommandUtils.d.ts +35 -0
  682. package/dist/src/utils/atCommandUtils.js +163 -0
  683. package/dist/src/utils/atCommandUtils.js.map +1 -0
  684. package/dist/src/utils/atCommandUtils.test.d.ts +6 -0
  685. package/dist/src/utils/atCommandUtils.test.js +292 -0
  686. package/dist/src/utils/atCommandUtils.test.js.map +1 -0
  687. package/dist/src/utils/channel.d.ts +8 -0
  688. package/dist/src/utils/channel.js +21 -10
  689. package/dist/src/utils/channel.js.map +1 -1
  690. package/dist/src/utils/cryptoUtils.d.ts +11 -0
  691. package/dist/src/utils/cryptoUtils.js +19 -0
  692. package/dist/src/utils/cryptoUtils.js.map +1 -0
  693. package/dist/src/utils/cryptoUtils.test.d.ts +6 -0
  694. package/dist/src/utils/cryptoUtils.test.js +31 -0
  695. package/dist/src/utils/cryptoUtils.test.js.map +1 -0
  696. package/dist/src/utils/editor.d.ts +29 -3
  697. package/dist/src/utils/editor.js +94 -3
  698. package/dist/src/utils/editor.js.map +1 -1
  699. package/dist/src/utils/editor.test.js +176 -2
  700. package/dist/src/utils/editor.test.js.map +1 -1
  701. package/dist/src/utils/environmentContext.d.ts +2 -1
  702. package/dist/src/utils/environmentContext.js +15 -8
  703. package/dist/src/utils/environmentContext.js.map +1 -1
  704. package/dist/src/utils/environmentContext.test.js +4 -14
  705. package/dist/src/utils/environmentContext.test.js.map +1 -1
  706. package/dist/src/utils/errors.js +3 -8
  707. package/dist/src/utils/errors.js.map +1 -1
  708. package/dist/src/utils/events.d.ts +26 -1
  709. package/dist/src/utils/events.js +21 -2
  710. package/dist/src/utils/events.js.map +1 -1
  711. package/dist/src/utils/events.test.js +39 -0
  712. package/dist/src/utils/events.test.js.map +1 -1
  713. package/dist/src/utils/extensionLoader.js +2 -2
  714. package/dist/src/utils/extensionLoader.js.map +1 -1
  715. package/dist/src/utils/extensionLoader.test.js +22 -15
  716. package/dist/src/utils/extensionLoader.test.js.map +1 -1
  717. package/dist/src/utils/fetch.d.ts +3 -3
  718. package/dist/src/utils/fetch.js +44 -20
  719. package/dist/src/utils/fetch.js.map +1 -1
  720. package/dist/src/utils/fetch.test.js +93 -17
  721. package/dist/src/utils/fetch.test.js.map +1 -1
  722. package/dist/src/utils/fileUtils.js +4 -1
  723. package/dist/src/utils/fileUtils.js.map +1 -1
  724. package/dist/src/utils/filesearch/fileSearch.js +20 -9
  725. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  726. package/dist/src/utils/filesearch/ignore.js +4 -1
  727. package/dist/src/utils/filesearch/ignore.js.map +1 -1
  728. package/dist/src/utils/generateContentResponseUtilities.d.ts +1 -0
  729. package/dist/src/utils/generateContentResponseUtilities.js +37 -7
  730. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
  731. package/dist/src/utils/generateContentResponseUtilities.test.js +33 -0
  732. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
  733. package/dist/src/utils/gitUtils.d.ts +5 -0
  734. package/dist/src/utils/gitUtils.js +11 -0
  735. package/dist/src/utils/gitUtils.js.map +1 -1
  736. package/dist/src/utils/historyHardening.d.ts +37 -0
  737. package/dist/src/utils/historyHardening.js +332 -0
  738. package/dist/src/utils/historyHardening.js.map +1 -0
  739. package/dist/src/utils/historyHardening.test.d.ts +6 -0
  740. package/dist/src/utils/historyHardening.test.js +317 -0
  741. package/dist/src/utils/historyHardening.test.js.map +1 -0
  742. package/dist/src/utils/ignoreFileParser.js +1 -1
  743. package/dist/src/utils/ignoreFileParser.js.map +1 -1
  744. package/dist/src/utils/ignorePatterns.js +2 -0
  745. package/dist/src/utils/ignorePatterns.js.map +1 -1
  746. package/dist/src/utils/ignorePatterns.test.js +1 -0
  747. package/dist/src/utils/ignorePatterns.test.js.map +1 -1
  748. package/dist/src/utils/memoryDiscovery.d.ts +0 -20
  749. package/dist/src/utils/memoryDiscovery.js +57 -220
  750. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  751. package/dist/src/utils/memoryDiscovery.test.js +112 -403
  752. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  753. package/dist/src/utils/modelUtils.d.ts +14 -0
  754. package/dist/src/utils/modelUtils.js +17 -0
  755. package/dist/src/utils/modelUtils.js.map +1 -0
  756. package/dist/src/utils/modelUtils.test.d.ts +6 -0
  757. package/dist/src/utils/modelUtils.test.js +23 -0
  758. package/dist/src/utils/modelUtils.test.js.map +1 -0
  759. package/dist/src/utils/partUtils.d.ts +26 -1
  760. package/dist/src/utils/partUtils.js +37 -0
  761. package/dist/src/utils/partUtils.js.map +1 -1
  762. package/dist/src/utils/path-validator.d.ts +17 -0
  763. package/dist/src/utils/path-validator.js +76 -0
  764. package/dist/src/utils/path-validator.js.map +1 -0
  765. package/dist/src/utils/path-validator.test.d.ts +6 -0
  766. package/dist/src/utils/path-validator.test.js +91 -0
  767. package/dist/src/utils/path-validator.test.js.map +1 -0
  768. package/dist/src/utils/pathReader.js +12 -0
  769. package/dist/src/utils/pathReader.js.map +1 -1
  770. package/dist/src/utils/pathReader.test.js +95 -0
  771. package/dist/src/utils/pathReader.test.js.map +1 -1
  772. package/dist/src/utils/paths.d.ts +19 -1
  773. package/dist/src/utils/paths.js +74 -9
  774. package/dist/src/utils/paths.js.map +1 -1
  775. package/dist/src/utils/paths.test.js +111 -1
  776. package/dist/src/utils/paths.test.js.map +1 -1
  777. package/dist/src/utils/quotaErrorDetection.js +23 -12
  778. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  779. package/dist/src/utils/ragLogger.d.ts +32 -0
  780. package/dist/src/utils/ragLogger.js +56 -0
  781. package/dist/src/utils/ragLogger.js.map +1 -0
  782. package/dist/src/utils/ragLogger.test.d.ts +6 -0
  783. package/dist/src/utils/ragLogger.test.js +97 -0
  784. package/dist/src/utils/ragLogger.test.js.map +1 -0
  785. package/dist/src/utils/retry.js +8 -3
  786. package/dist/src/utils/retry.js.map +1 -1
  787. package/dist/src/utils/retry.test.js +17 -0
  788. package/dist/src/utils/retry.test.js.map +1 -1
  789. package/dist/src/utils/safeJsonStringify.js +0 -2
  790. package/dist/src/utils/safeJsonStringify.js.map +1 -1
  791. package/dist/src/utils/sessionOperations.d.ts +26 -0
  792. package/dist/src/utils/sessionOperations.js +177 -8
  793. package/dist/src/utils/sessionOperations.js.map +1 -1
  794. package/dist/src/utils/sessionUtils.d.ts +11 -5
  795. package/dist/src/utils/sessionUtils.js +139 -68
  796. package/dist/src/utils/sessionUtils.js.map +1 -1
  797. package/dist/src/utils/sessionUtils.test.js +31 -5
  798. package/dist/src/utils/sessionUtils.test.js.map +1 -1
  799. package/dist/src/utils/shell-utils.d.ts +9 -1
  800. package/dist/src/utils/shell-utils.js +51 -20
  801. package/dist/src/utils/shell-utils.js.map +1 -1
  802. package/dist/src/utils/shell-utils.test.js +87 -46
  803. package/dist/src/utils/shell-utils.test.js.map +1 -1
  804. package/dist/src/utils/textUtils.d.ts +12 -2
  805. package/dist/src/utils/textUtils.js +30 -3
  806. package/dist/src/utils/textUtils.js.map +1 -1
  807. package/dist/src/utils/textUtils.test.js +96 -1
  808. package/dist/src/utils/textUtils.test.js.map +1 -1
  809. package/dist/src/utils/tokenCalculation.d.ts +3 -2
  810. package/dist/src/utils/tokenCalculation.js +9 -5
  811. package/dist/src/utils/tokenCalculation.js.map +1 -1
  812. package/dist/src/utils/tokenCalculation.test.js +15 -0
  813. package/dist/src/utils/tokenCalculation.test.js.map +1 -1
  814. package/dist/tsconfig.tsbuildinfo +1 -1
  815. package/package.json +18 -18
  816. package/dist/src/context/historyObserver.d.ts +0 -28
  817. package/dist/src/context/historyObserver.js +0 -63
  818. package/dist/src/context/historyObserver.js.map +0 -1
  819. package/dist/src/policy/memory-manager-policy.test.js +0 -80
  820. package/dist/src/policy/memory-manager-policy.test.js.map +0 -1
  821. package/dist/src/policy/policies/memory-manager.toml +0 -20
  822. package/dist/src/prompts/snippets-memory-v2.test.js.map +0 -1
  823. package/dist/src/tools/xcode-mcp-fix-transport.js.map +0 -1
  824. package/dist/src/tools/xcode-mcp-fix-transport.test.d.ts +0 -1
  825. package/dist/src/tools/xcode-mcp-fix-transport.test.js +0 -98
  826. package/dist/src/tools/xcode-mcp-fix-transport.test.js.map +0 -1
  827. package/dist/src/utils/systemEncoding.d.ts +0 -40
  828. package/dist/src/utils/systemEncoding.js +0 -150
  829. package/dist/src/utils/systemEncoding.js.map +0 -1
  830. package/dist/src/utils/systemEncoding.test.js +0 -369
  831. package/dist/src/utils/systemEncoding.test.js.map +0 -1
  832. /package/dist/src/{policy/memory-manager-policy.test.d.ts → agents/local-session-invocation.test.d.ts} +0 -0
  833. /package/dist/src/{prompts/snippets-memory-v2.test.d.ts → agents/local-subagent-protocol.test.d.ts} +0 -0
  834. /package/dist/src/{utils/systemEncoding.test.d.ts → policy/stable-stringify.test.d.ts} +0 -0
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
7
  import { ApiError, ThinkingLevel, } from '@google/genai';
8
- import { GeminiChat, InvalidStreamError, StreamEventType, SYNTHETIC_THOUGHT_SIGNATURE, } from './geminiChat.js';
8
+ import { GeminiChat, InvalidStreamError, StreamEventType, SYNTHETIC_THOUGHT_SIGNATURE, stripToolCallIdPrefixes, } from './geminiChat.js';
9
9
  import { CoreToolCallStatus, } from '../scheduler/types.js';
10
10
  import { MockTool } from '../test-utils/mock-tool.js';
11
11
  import { setSimulate429 } from '../utils/testUtils.js';
@@ -19,6 +19,7 @@ import { createAvailabilityServiceMock } from '../availability/testUtils.js';
19
19
  import * as policyHelpers from '../availability/policyHelpers.js';
20
20
  import { makeResolvedModelConfig } from '../services/modelConfigServiceTestUtils.js';
21
21
  import { LlmRole } from '../telemetry/types.js';
22
+ import { BINARY_INJECTION_KEY } from '../utils/generateContentResponseUtilities.js';
22
23
  // Mock fs module to prevent actual file system operations during tests
23
24
  const mockFileSystem = new Map();
24
25
  vi.mock('node:fs', () => {
@@ -118,6 +119,7 @@ describe('GeminiChat', () => {
118
119
  getTelemetryLogPromptsEnabled: () => true,
119
120
  getTelemetryTracesEnabled: () => false,
120
121
  getUsageStatisticsEnabled: () => true,
122
+ hasGemini35FlashGAAccess: vi.fn().mockReturnValue(false),
121
123
  getDebugMode: () => false,
122
124
  getContentGeneratorConfig: vi.fn().mockImplementation(() => ({
123
125
  authType: 'oauth-personal',
@@ -192,8 +194,8 @@ describe('GeminiChat', () => {
192
194
  describe('constructor', () => {
193
195
  it('should initialize lastPromptTokenCount based on history size', () => {
194
196
  const history = [
195
- { role: 'user', parts: [{ text: 'Hello' }] },
196
- { role: 'model', parts: [{ text: 'Hi there' }] },
197
+ { id: '1', content: { role: 'user', parts: [{ text: 'Hello' }] } },
198
+ { id: '2', content: { role: 'model', parts: [{ text: 'Hi there' }] } },
197
199
  ];
198
200
  const chatWithHistory = new GeminiChat(mockConfig, '', [], history);
199
201
  // 'Hello': 5 chars * 0.25 = 1.25
@@ -205,22 +207,69 @@ describe('GeminiChat', () => {
205
207
  const chatEmpty = new GeminiChat(mockConfig);
206
208
  expect(chatEmpty.getLastPromptTokenCount()).toBe(0);
207
209
  });
210
+ it('should prioritize in-memory history over resumedSessionData', () => {
211
+ // This test simulates a "hot restart" after a context management operation
212
+ // like compression, where the in-memory history is shorter and more up-to-date
213
+ // than the session data that might be on disk.
214
+ // 1. A stale, longer history from a persisted session record
215
+ const resumedSessionData = {
216
+ conversation: {
217
+ messages: [
218
+ {
219
+ id: 'a',
220
+ type: 'user',
221
+ content: [{ text: 'turn 1' }],
222
+ create_time: new Date(),
223
+ },
224
+ {
225
+ id: 'b',
226
+ type: 'gemini',
227
+ content: [{ text: 'turn 2' }],
228
+ create_time: new Date(),
229
+ },
230
+ {
231
+ id: 'c',
232
+ type: 'user',
233
+ content: [{ text: 'turn 3' }],
234
+ create_time: new Date(),
235
+ },
236
+ ],
237
+ },
238
+ };
239
+ // 2. A fresh, compressed in-memory history
240
+ const compressedHistory = [
241
+ {
242
+ id: 'summary-1',
243
+ content: { role: 'user', parts: [{ text: 'summary of turns 1-3' }] },
244
+ },
245
+ ];
246
+ // 3. Instantiate the chat, providing both.
247
+ const chat = new GeminiChat(mockConfig, '', [], compressedHistory, // This should be prioritized
248
+ resumedSessionData);
249
+ // 4. Assert that the shorter, in-memory history was used.
250
+ const finalHistory = chat.getHistoryTurns();
251
+ expect(finalHistory).toHaveLength(1);
252
+ expect(finalHistory[0].id).toBe('summary-1');
253
+ });
208
254
  });
209
255
  describe('setHistory', () => {
210
256
  it('should recalculate lastPromptTokenCount when history is updated', () => {
211
257
  const initialHistory = [
212
- { role: 'user', parts: [{ text: 'Hello' }] },
258
+ { id: '1', content: { role: 'user', parts: [{ text: 'Hello' }] } },
213
259
  ];
214
260
  const chatWithHistory = new GeminiChat(mockConfig, '', [], initialHistory);
215
261
  const initialCount = chatWithHistory.getLastPromptTokenCount();
216
262
  const newHistory = [
217
263
  {
218
- role: 'user',
219
- parts: [
220
- {
221
- text: 'This is a much longer history item that should result in more tokens than just hello.',
222
- },
223
- ],
264
+ id: '2',
265
+ content: {
266
+ role: 'user',
267
+ parts: [
268
+ {
269
+ text: 'This is a much longer history item that should result in more tokens than just hello.',
270
+ },
271
+ ],
272
+ },
224
273
  },
225
274
  ];
226
275
  chatWithHistory.setHistory(newHistory);
@@ -263,9 +312,9 @@ describe('GeminiChat', () => {
263
312
  }
264
313
  })()).resolves.not.toThrow();
265
314
  // 3. Verify history was recorded correctly
266
- const history = chat.getHistory();
315
+ const history = chat.getHistoryTurns();
267
316
  expect(history.length).toBe(2); // user turn + model turn
268
- const modelTurn = history[1];
317
+ const modelTurn = history[1].content;
269
318
  expect(modelTurn?.parts?.length).toBe(1); // The empty part is discarded
270
319
  expect(modelTurn?.parts[0].functionCall).toBeDefined();
271
320
  });
@@ -338,9 +387,9 @@ describe('GeminiChat', () => {
338
387
  }
339
388
  })()).resolves.not.toThrow();
340
389
  // 3. Verify history was recorded correctly with only the valid part.
341
- const history = chat.getHistory();
390
+ const history = chat.getHistoryTurns();
342
391
  expect(history.length).toBe(2); // user turn + model turn
343
- const modelTurn = history[1];
392
+ const modelTurn = history[1].content;
344
393
  expect(modelTurn?.parts?.length).toBe(1);
345
394
  expect(modelTurn?.parts[0].text).toBe('Initial valid content...');
346
395
  });
@@ -371,9 +420,9 @@ describe('GeminiChat', () => {
371
420
  // Consume the stream
372
421
  }
373
422
  // 3. Assert: Check that the final history was correctly consolidated.
374
- const history = chat.getHistory();
423
+ const history = chat.getHistoryTurns();
375
424
  expect(history.length).toBe(2);
376
- const modelTurn = history[1];
425
+ const modelTurn = history[1].content;
377
426
  expect(modelTurn?.parts?.length).toBe(1);
378
427
  expect(modelTurn?.parts[0].text).toBe('Hello World!');
379
428
  });
@@ -419,10 +468,10 @@ describe('GeminiChat', () => {
419
468
  // Consume the stream to trigger history recording.
420
469
  }
421
470
  // 3. Assert: Check that the final history was correctly consolidated.
422
- const history = chat.getHistory();
471
+ const history = chat.getHistoryTurns();
423
472
  // The history should contain the user's turn and ONE consolidated model turn.
424
473
  expect(history.length).toBe(2);
425
- const modelTurn = history[1];
474
+ const modelTurn = history[1].content;
426
475
  expect(modelTurn.role).toBe('model');
427
476
  // The model turn should have 3 distinct parts: the merged text, the function call, and the final text.
428
477
  expect(modelTurn?.parts?.length).toBe(3);
@@ -430,6 +479,86 @@ describe('GeminiChat', () => {
430
479
  expect(modelTurn.parts[1].functionCall).toBeDefined();
431
480
  expect(modelTurn.parts[2].text).toBe('This is the second part.');
432
481
  });
482
+ it('repro: should not overwrite parallel tool calls when they arrive in separate streaming chunks', async () => {
483
+ vi.mocked(mockConfig.isContextManagementEnabled).mockReturnValue(true);
484
+ // 1. Mock the API to return parallel tool calls in separate chunks.
485
+ const parallelCallsStream = (async function* () {
486
+ yield {
487
+ candidates: [
488
+ {
489
+ content: {
490
+ role: 'model',
491
+ parts: [{ functionCall: { name: 'tool_A' } }],
492
+ },
493
+ },
494
+ ],
495
+ functionCalls: [{ name: 'tool_A' }],
496
+ };
497
+ yield {
498
+ candidates: [
499
+ {
500
+ content: {
501
+ role: 'model',
502
+ parts: [{ functionCall: { name: 'tool_B' } }],
503
+ },
504
+ finishReason: 'STOP',
505
+ },
506
+ ],
507
+ functionCalls: [{ name: 'tool_B' }],
508
+ };
509
+ })();
510
+ vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue(parallelCallsStream);
511
+ // 2. Action: Send a message and consume the stream to trigger history recording.
512
+ const stream = await chat.sendMessageStream({ model: 'test-model' }, 'test parallel tools', 'prompt-parallel-tools', new AbortController().signal, LlmRole.MAIN);
513
+ for await (const _ of stream) {
514
+ // Consume
515
+ }
516
+ // 3. Assert: Check that the final history contains both function calls.
517
+ const history = chat.getHistoryTurns();
518
+ expect(history.length).toBe(2);
519
+ const modelTurn = history[1].content;
520
+ expect(modelTurn.role).toBe('model');
521
+ expect(modelTurn.parts?.length).toBe(2);
522
+ expect(modelTurn.parts[0].functionCall?.name).toBe('tool_A');
523
+ expect(modelTurn.parts[1].functionCall?.name).toBe('tool_B');
524
+ });
525
+ it('repro: should not collide when multiple tool calls with the same name arrive in the same chunk', async () => {
526
+ vi.mocked(mockConfig.isContextManagementEnabled).mockReturnValue(true);
527
+ const sameNameStream = (async function* () {
528
+ yield {
529
+ candidates: [
530
+ {
531
+ content: {
532
+ role: 'model',
533
+ parts: [
534
+ { functionCall: { name: 'tool_X', args: { id: 1 } } },
535
+ { functionCall: { name: 'tool_X', args: { id: 2 } } },
536
+ ],
537
+ },
538
+ finishReason: 'STOP',
539
+ },
540
+ ],
541
+ functionCalls: [
542
+ { name: 'tool_X', args: { id: 1 } },
543
+ { name: 'tool_X', args: { id: 2 } },
544
+ ],
545
+ };
546
+ })();
547
+ vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue(sameNameStream);
548
+ const stream = await chat.sendMessageStream({ model: 'test-model' }, 'test same name tools', 'prompt-same-name', new AbortController().signal, LlmRole.MAIN);
549
+ for await (const _ of stream) {
550
+ // Consume the stream to trigger history recording
551
+ }
552
+ const history = chat.getHistoryTurns();
553
+ const modelTurn = history[1].content;
554
+ expect(modelTurn.parts?.length).toBe(2);
555
+ expect(modelTurn.parts[0].functionCall?.name).toBe('tool_X');
556
+ expect(modelTurn.parts[0].functionCall?.args).toEqual({ id: 1 });
557
+ expect(modelTurn.parts[1].functionCall?.name).toBe('tool_X');
558
+ expect(modelTurn.parts[1].functionCall?.args).toEqual({ id: 2 });
559
+ // If findIndex was used, both would likely point to index 0, and the second one might overwrite the first if consolidated incorrectly,
560
+ // or they both might end up with the same callIndex and thus the same args in final assembly.
561
+ });
433
562
  it('should preserve text parts that stream in the same chunk as a thought', async () => {
434
563
  // 1. Mock the API to return a single chunk containing both a thought and visible text.
435
564
  const mixedContentStream = (async function* () {
@@ -455,10 +584,10 @@ describe('GeminiChat', () => {
455
584
  // This loop consumes the stream.
456
585
  }
457
586
  // 3. Assert: Check the final state of the history.
458
- const history = chat.getHistory();
587
+ const history = chat.getHistoryTurns();
459
588
  // The history should contain two turns: the user's message and the model's response.
460
589
  expect(history.length).toBe(2);
461
- const modelTurn = history[1];
590
+ const modelTurn = history[1].content;
462
591
  expect(modelTurn.role).toBe('model');
463
592
  // CRUCIAL ASSERTION:
464
593
  // The buggy code would fail here, resulting in parts.length being 0.
@@ -470,19 +599,25 @@ describe('GeminiChat', () => {
470
599
  // 1. Setup: A history where the model has just made a function call.
471
600
  const initialHistory = [
472
601
  {
473
- role: 'user',
474
- parts: [{ text: 'Find a good Italian restaurant for me.' }],
602
+ id: '1',
603
+ content: {
604
+ role: 'user',
605
+ parts: [{ text: 'Find a good Italian restaurant for me.' }],
606
+ },
475
607
  },
476
608
  {
477
- role: 'model',
478
- parts: [
479
- {
480
- functionCall: {
481
- name: 'find_restaurant',
482
- args: { cuisine: 'Italian' },
609
+ id: '2',
610
+ content: {
611
+ role: 'model',
612
+ parts: [
613
+ {
614
+ functionCall: {
615
+ name: 'find_restaurant',
616
+ args: { cuisine: 'Italian' },
617
+ },
483
618
  },
484
- },
485
- ],
619
+ ],
620
+ },
486
621
  },
487
622
  ];
488
623
  chat.setHistory(initialHistory);
@@ -566,28 +701,48 @@ describe('GeminiChat', () => {
566
701
  }
567
702
  })()).rejects.toThrow(InvalidStreamError);
568
703
  });
569
- it('should throw InvalidStreamError when no tool call and empty response text', async () => {
570
- // Setup: Stream with finish reason but empty response (only thoughts)
571
- const streamWithEmptyResponse = (async function* () {
704
+ it('should throw InvalidStreamError without retrying when no tool call and empty response text', async () => {
705
+ vi.mocked(mockContentGenerator.generateContentStream)
706
+ .mockImplementationOnce(async () =>
707
+ // First attempt: finish reason is present, but the stream has no
708
+ // non-thought text, which is NO_RESPONSE_TEXT.
709
+ (async function* () {
572
710
  yield {
573
711
  candidates: [
574
712
  {
575
713
  content: {
576
714
  role: 'model',
577
- parts: [{ thought: 'thinking...' }],
715
+ parts: [{ thought: true, text: 'thinking...' }],
578
716
  },
579
717
  finishReason: 'STOP',
580
718
  },
581
719
  ],
582
720
  };
583
- })();
584
- vi.mocked(mockContentGenerator.generateContentStream).mockResolvedValue(streamWithEmptyResponse);
721
+ })())
722
+ .mockImplementationOnce(async () =>
723
+ // This would succeed if NO_RESPONSE_TEXT were retried.
724
+ (async function* () {
725
+ yield {
726
+ candidates: [
727
+ {
728
+ content: {
729
+ role: 'model',
730
+ parts: [{ text: 'valid response after retry' }],
731
+ },
732
+ finishReason: 'STOP',
733
+ },
734
+ ],
735
+ };
736
+ })());
585
737
  const stream = await chat.sendMessageStream({ model: 'gemini-2.0-flash' }, 'test message', 'prompt-id-1', new AbortController().signal, LlmRole.MAIN);
586
738
  await expect((async () => {
587
739
  for await (const _ of stream) {
588
740
  // consume stream
589
741
  }
590
742
  })()).rejects.toThrow(InvalidStreamError);
743
+ expect(mockContentGenerator.generateContentStream).toHaveBeenCalledTimes(1);
744
+ expect(mockLogContentRetry).not.toHaveBeenCalled();
745
+ expect(mockLogContentRetryFailure).toHaveBeenCalledTimes(1);
591
746
  });
592
747
  it('should succeed when there is finish reason and response text', async () => {
593
748
  // Setup: Stream with both finish reason and text content
@@ -821,30 +976,39 @@ describe('GeminiChat', () => {
821
976
  });
822
977
  describe('addHistory', () => {
823
978
  it('should add a new content item to the history', () => {
824
- const newContent = {
825
- role: 'user',
826
- parts: [{ text: 'A new message' }],
979
+ const newTurn = {
980
+ id: '1',
981
+ content: {
982
+ role: 'user',
983
+ parts: [{ text: 'A new message' }],
984
+ },
827
985
  };
828
- chat.addHistory(newContent);
829
- const history = chat.getHistory();
986
+ chat.addHistory(newTurn);
987
+ const history = chat.getHistoryTurns();
830
988
  expect(history.length).toBe(1);
831
- expect(history[0]).toEqual(newContent);
989
+ expect(history[0]).toEqual(newTurn);
832
990
  });
833
991
  it('should add multiple items correctly', () => {
834
- const content1 = {
835
- role: 'user',
836
- parts: [{ text: 'Message 1' }],
992
+ const turn1 = {
993
+ id: '1',
994
+ content: {
995
+ role: 'user',
996
+ parts: [{ text: 'Message 1' }],
997
+ },
837
998
  };
838
- const content2 = {
839
- role: 'model',
840
- parts: [{ text: 'Message 2' }],
999
+ const turn2 = {
1000
+ id: '2',
1001
+ content: {
1002
+ role: 'model',
1003
+ parts: [{ text: 'Message 2' }],
1004
+ },
841
1005
  };
842
- chat.addHistory(content1);
843
- chat.addHistory(content2);
844
- const history = chat.getHistory();
1006
+ chat.addHistory(turn1);
1007
+ chat.addHistory(turn2);
1008
+ const history = chat.getHistoryTurns();
845
1009
  expect(history.length).toBe(2);
846
- expect(history[0]).toEqual(content1);
847
- expect(history[1]).toEqual(content2);
1010
+ expect(history[0]).toEqual(turn1);
1011
+ expect(history[1]).toEqual(turn2);
848
1012
  });
849
1013
  });
850
1014
  describe('sendMessageStream with retries', () => {
@@ -1448,7 +1612,13 @@ describe('GeminiChat', () => {
1448
1612
  role: 'model',
1449
1613
  parts: [
1450
1614
  { text: 'thinking...' },
1451
- { functionCall: { name: 'test', args: {} } },
1615
+ {
1616
+ functionCall: {
1617
+ name: 'test',
1618
+ args: {},
1619
+ id: expect.stringMatching(/^synth_test_/),
1620
+ },
1621
+ },
1452
1622
  ],
1453
1623
  },
1454
1624
  ]);
@@ -1817,6 +1987,117 @@ describe('GeminiChat', () => {
1817
1987
  });
1818
1988
  });
1819
1989
  });
1990
+ describe('automated binary injection', () => {
1991
+ it('should expand history with synthetic turns when __binary_injection__ is detected', async () => {
1992
+ const audioParts = [
1993
+ {
1994
+ functionResponse: {
1995
+ id: 'call-123',
1996
+ name: 'read_file',
1997
+ response: {
1998
+ output: 'Success',
1999
+ [BINARY_INJECTION_KEY]: [
2000
+ { inlineData: { mimeType: 'audio/mpeg', data: 'base64' } },
2001
+ ],
2002
+ },
2003
+ },
2004
+ },
2005
+ ];
2006
+ // Mock API to capture the history it receives
2007
+ let capturedContents = [];
2008
+ vi.mocked(mockContentGenerator.generateContentStream).mockImplementation(async (req) => {
2009
+ capturedContents = req.contents;
2010
+ return (async function* () {
2011
+ yield {
2012
+ candidates: [
2013
+ {
2014
+ content: { parts: [{ text: 'Analysis done' }] },
2015
+ finishReason: 'STOP',
2016
+ },
2017
+ ],
2018
+ };
2019
+ })();
2020
+ });
2021
+ const stream = await chat.sendMessageStream({ model: 'gemini-pro' }, audioParts, 'test-id', new AbortController().signal, LlmRole.MAIN);
2022
+ for await (const _ of stream) {
2023
+ // No-op
2024
+ }
2025
+ // Verify history expansion
2026
+ // Turn 1: Tool response (cleaned)
2027
+ // Turn 2: Model Ack (synthetic)
2028
+ // Turn 3: User Binary data (current request)
2029
+ expect(capturedContents).toHaveLength(3);
2030
+ expect(capturedContents[0].role).toBe('user');
2031
+ expect(capturedContents[0].parts[0].functionResponse.response).toEqual({
2032
+ output: 'Success',
2033
+ });
2034
+ expect(capturedContents[1].role).toBe('model');
2035
+ expect(capturedContents[1].parts[0].text).toContain('Binary content received');
2036
+ expect(capturedContents[1].parts[0].thoughtSignature).toBe(SYNTHETIC_THOUGHT_SIGNATURE);
2037
+ expect(capturedContents[2].role).toBe('user');
2038
+ expect(capturedContents[2].parts[0].inlineData.mimeType).toBe('audio/mpeg');
2039
+ });
2040
+ it('should handle multiple parallel binary injections', async () => {
2041
+ const parallelParts = [
2042
+ {
2043
+ functionResponse: {
2044
+ id: 'call-1',
2045
+ name: 'read_file',
2046
+ response: {
2047
+ output: 'Success 1',
2048
+ [BINARY_INJECTION_KEY]: [
2049
+ { inlineData: { mimeType: 'audio/mpeg', data: 'audio1' } },
2050
+ ],
2051
+ },
2052
+ },
2053
+ },
2054
+ {
2055
+ functionResponse: {
2056
+ id: 'call-2',
2057
+ name: 'read_file',
2058
+ response: {
2059
+ output: 'Success 2',
2060
+ [BINARY_INJECTION_KEY]: [
2061
+ { inlineData: { mimeType: 'video/mp4', data: 'video2' } },
2062
+ ],
2063
+ },
2064
+ },
2065
+ },
2066
+ ];
2067
+ let capturedContents = [];
2068
+ vi.mocked(mockContentGenerator.generateContentStream).mockImplementation(async (req) => {
2069
+ capturedContents = req.contents;
2070
+ return (async function* () {
2071
+ yield {
2072
+ candidates: [
2073
+ {
2074
+ content: { parts: [{ text: 'Done' }] },
2075
+ finishReason: 'STOP',
2076
+ },
2077
+ ],
2078
+ };
2079
+ })();
2080
+ });
2081
+ const stream = await chat.sendMessageStream({ model: 'gemini-pro' }, parallelParts, 'test-id', new AbortController().signal, LlmRole.MAIN);
2082
+ for await (const _ of stream) {
2083
+ // No-op
2084
+ }
2085
+ // Turn 1: Cleaned tool responses (both)
2086
+ // Turn 2: Model Ack
2087
+ // Turn 3: Both binary parts combined
2088
+ expect(capturedContents).toHaveLength(3);
2089
+ expect(capturedContents[0].parts).toHaveLength(2);
2090
+ expect(capturedContents[0].parts[0].functionResponse.response).toEqual({
2091
+ output: 'Success 1',
2092
+ });
2093
+ expect(capturedContents[0].parts[1].functionResponse.response).toEqual({
2094
+ output: 'Success 2',
2095
+ });
2096
+ expect(capturedContents[2].parts).toHaveLength(2);
2097
+ expect(capturedContents[2].parts[0].inlineData.mimeType).toBe('audio/mpeg');
2098
+ expect(capturedContents[2].parts[1].inlineData.mimeType).toBe('video/mp4');
2099
+ });
2100
+ });
1820
2101
  describe('recordCompletedToolCalls', () => {
1821
2102
  it('should use originalRequestName and originalRequestArgs if present', () => {
1822
2103
  const completedCall = {
@@ -1883,5 +2164,118 @@ describe('GeminiChat', () => {
1883
2164
  ]);
1884
2165
  });
1885
2166
  });
2167
+ describe('stripToolCallIdPrefixes', () => {
2168
+ it('should strip tool name prefix matching the tool name', () => {
2169
+ const contents = [
2170
+ {
2171
+ role: 'model',
2172
+ parts: [
2173
+ {
2174
+ functionCall: {
2175
+ id: 'my_tool__call_123',
2176
+ name: 'my_tool',
2177
+ args: {},
2178
+ },
2179
+ },
2180
+ ],
2181
+ },
2182
+ {
2183
+ role: 'user',
2184
+ parts: [
2185
+ {
2186
+ functionResponse: {
2187
+ id: 'my_tool__call_123',
2188
+ name: 'my_tool',
2189
+ response: { result: 'success' },
2190
+ },
2191
+ },
2192
+ ],
2193
+ },
2194
+ ];
2195
+ const stripped = stripToolCallIdPrefixes(contents);
2196
+ expect(stripped[0].parts[0].functionCall.id).toBe('call_123');
2197
+ expect(stripped[1].parts[0].functionResponse.id).toBe('call_123');
2198
+ });
2199
+ it('should correctly handle tool names that contain double underscores', () => {
2200
+ const contents = [
2201
+ {
2202
+ role: 'model',
2203
+ parts: [
2204
+ {
2205
+ functionCall: {
2206
+ id: 'my__custom__tool__call_abc',
2207
+ name: 'my__custom__tool',
2208
+ args: {},
2209
+ },
2210
+ },
2211
+ ],
2212
+ },
2213
+ {
2214
+ role: 'user',
2215
+ parts: [
2216
+ {
2217
+ functionResponse: {
2218
+ id: 'my__custom__tool__call_abc',
2219
+ name: 'my__custom__tool',
2220
+ response: { result: 'success' },
2221
+ },
2222
+ },
2223
+ ],
2224
+ },
2225
+ ];
2226
+ const stripped = stripToolCallIdPrefixes(contents);
2227
+ expect(stripped[0].parts[0].functionCall.id).toBe('call_abc');
2228
+ expect(stripped[1].parts[0].functionResponse.id).toBe('call_abc');
2229
+ });
2230
+ it('should not strip if prefix does not match the tool name', () => {
2231
+ const contents = [
2232
+ {
2233
+ role: 'model',
2234
+ parts: [
2235
+ {
2236
+ functionCall: {
2237
+ id: 'other_tool__call_123',
2238
+ name: 'my_tool',
2239
+ args: {},
2240
+ },
2241
+ },
2242
+ ],
2243
+ },
2244
+ ];
2245
+ const stripped = stripToolCallIdPrefixes(contents);
2246
+ expect(stripped[0].parts[0].functionCall.id).toBe('other_tool__call_123');
2247
+ });
2248
+ it('should correctly handle fallback to generic_tool when name is missing or has whitespace', () => {
2249
+ const contents = [
2250
+ {
2251
+ role: 'model',
2252
+ parts: [
2253
+ {
2254
+ functionCall: {
2255
+ id: 'generic_tool__call_123',
2256
+ name: ' ',
2257
+ args: {},
2258
+ },
2259
+ },
2260
+ ],
2261
+ },
2262
+ {
2263
+ role: 'user',
2264
+ parts: [
2265
+ {
2266
+ functionResponse: {
2267
+ id: 'generic_tool__call_123',
2268
+ name: undefined,
2269
+ response: { result: 'success' },
2270
+ },
2271
+ },
2272
+ ],
2273
+ },
2274
+ ];
2275
+ const stripped = stripToolCallIdPrefixes(contents);
2276
+ expect(stripped[0].parts[0].functionCall.id).toBe('call_123');
2277
+ expect(stripped[1].parts[0].functionResponse.id).toBe('call_123');
2278
+ });
2279
+ });
1886
2280
  });
1887
2281
  //# sourceMappingURL=geminiChat.test.js.map