@machina.ai/cell-cli 1.38.1-rc2 → 1.40.1-rc1

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 (347) hide show
  1. package/dist/index.js +124 -29
  2. package/dist/index.js.map +1 -1
  3. package/dist/package.json +93 -68
  4. package/dist/src/acp/acpClient.js +8 -3
  5. package/dist/src/acp/acpClient.js.map +1 -1
  6. package/dist/src/acp/acpClient.test.js +27 -0
  7. package/dist/src/acp/acpClient.test.js.map +1 -1
  8. package/dist/src/acp/acpResume.test.js +1 -0
  9. package/dist/src/acp/acpResume.test.js.map +1 -1
  10. package/dist/src/acp/commands/memory.d.ts +6 -1
  11. package/dist/src/acp/commands/memory.js +40 -1
  12. package/dist/src/acp/commands/memory.js.map +1 -1
  13. package/dist/src/commands/extensions/examples/custom-commands/gemini-extension.json +2 -2
  14. package/dist/src/commands/extensions/examples/exclude-tools/gemini-extension.json +3 -3
  15. package/dist/src/commands/extensions/examples/hooks/gemini-extension.json +2 -2
  16. package/dist/src/commands/extensions/examples/hooks/hooks/hooks.json +11 -11
  17. package/dist/src/commands/extensions/examples/mcp-server/gemini-extension.json +8 -8
  18. package/dist/src/commands/extensions/examples/mcp-server/package.json +9 -9
  19. package/dist/src/commands/extensions/examples/policies/gemini-extension.json +3 -3
  20. package/dist/src/commands/extensions/examples/skills/gemini-extension.json +2 -2
  21. package/dist/src/commands/extensions/examples/themes-example/gemini-extension.json +27 -27
  22. package/dist/src/commands/gemma/constants.d.ts +17 -0
  23. package/dist/src/commands/gemma/constants.js +35 -0
  24. package/dist/src/commands/gemma/constants.js.map +1 -0
  25. package/dist/src/commands/gemma/logs.d.ts +13 -0
  26. package/dist/src/commands/gemma/logs.js +154 -0
  27. package/dist/src/commands/gemma/logs.js.map +1 -0
  28. package/dist/src/commands/gemma/logs.test.d.ts +6 -0
  29. package/dist/src/commands/gemma/logs.test.js +122 -0
  30. package/dist/src/commands/gemma/logs.test.js.map +1 -0
  31. package/dist/src/commands/gemma/platform.d.ts +38 -0
  32. package/dist/src/commands/gemma/platform.js +220 -0
  33. package/dist/src/commands/gemma/platform.js.map +1 -0
  34. package/dist/src/commands/gemma/platform.test.d.ts +6 -0
  35. package/dist/src/commands/gemma/platform.test.js +108 -0
  36. package/dist/src/commands/gemma/platform.test.js.map +1 -0
  37. package/dist/src/commands/gemma/setup.d.ts +9 -0
  38. package/dist/src/commands/gemma/setup.js +392 -0
  39. package/dist/src/commands/gemma/setup.js.map +1 -0
  40. package/dist/src/commands/gemma/setup.test.d.ts +6 -0
  41. package/dist/src/commands/gemma/setup.test.js +36 -0
  42. package/dist/src/commands/gemma/setup.test.js.map +1 -0
  43. package/dist/src/commands/gemma/start.d.ts +8 -0
  44. package/dist/src/commands/gemma/start.js +87 -0
  45. package/dist/src/commands/gemma/start.js.map +1 -0
  46. package/dist/src/commands/gemma/status.d.ts +19 -0
  47. package/dist/src/commands/gemma/status.js +110 -0
  48. package/dist/src/commands/gemma/status.js.map +1 -0
  49. package/dist/src/commands/gemma/stop.d.ts +9 -0
  50. package/dist/src/commands/gemma/stop.js +110 -0
  51. package/dist/src/commands/gemma/stop.js.map +1 -0
  52. package/dist/src/commands/gemma/stop.test.d.ts +6 -0
  53. package/dist/src/commands/gemma/stop.test.js +89 -0
  54. package/dist/src/commands/gemma/stop.test.js.map +1 -0
  55. package/dist/src/commands/gemma.d.ts +7 -0
  56. package/dist/src/commands/gemma.js +30 -0
  57. package/dist/src/commands/gemma.js.map +1 -0
  58. package/dist/src/config/config.d.ts +1 -0
  59. package/dist/src/config/config.js +37 -15
  60. package/dist/src/config/config.js.map +1 -1
  61. package/dist/src/config/config.test.js +12 -0
  62. package/dist/src/config/config.test.js.map +1 -1
  63. package/dist/src/config/extension.test.js +3 -2
  64. package/dist/src/config/extension.test.js.map +1 -1
  65. package/dist/src/config/extensions/github_fetch.js +2 -1
  66. package/dist/src/config/extensions/github_fetch.js.map +1 -1
  67. package/dist/src/config/extensions/github_fetch.test.js +2 -0
  68. package/dist/src/config/extensions/github_fetch.test.js.map +1 -1
  69. package/dist/src/config/footerItems.d.ts +2 -2
  70. package/dist/src/config/footerItems.js +2 -2
  71. package/dist/src/config/footerItems.js.map +1 -1
  72. package/dist/src/config/footerItems.test.js +38 -0
  73. package/dist/src/config/footerItems.test.js.map +1 -1
  74. package/dist/src/config/policy-engine.integration.test.js +14 -5
  75. package/dist/src/config/policy-engine.integration.test.js.map +1 -1
  76. package/dist/src/config/settings.js +20 -11
  77. package/dist/src/config/settings.js.map +1 -1
  78. package/dist/src/config/settings.test.js +10 -4
  79. package/dist/src/config/settings.test.js.map +1 -1
  80. package/dist/src/config/settingsSchema.d.ts +142 -11
  81. package/dist/src/config/settingsSchema.js +135 -10
  82. package/dist/src/config/settingsSchema.js.map +1 -1
  83. package/dist/src/config/settingsSchema.test.js +28 -1
  84. package/dist/src/config/settingsSchema.test.js.map +1 -1
  85. package/dist/src/config/trustedFolders.d.ts +11 -54
  86. package/dist/src/config/trustedFolders.js +13 -267
  87. package/dist/src/config/trustedFolders.js.map +1 -1
  88. package/dist/src/config/trustedFolders.test.js +35 -31
  89. package/dist/src/config/trustedFolders.test.js.map +1 -1
  90. package/dist/src/gemini.d.ts +4 -0
  91. package/dist/src/gemini.js +61 -37
  92. package/dist/src/gemini.js.map +1 -1
  93. package/dist/src/gemini.test.js +15 -0
  94. package/dist/src/gemini.test.js.map +1 -1
  95. package/dist/src/gemini_cleanup.test.js +6 -0
  96. package/dist/src/gemini_cleanup.test.js.map +1 -1
  97. package/dist/src/generated/git-commit.d.ts +2 -2
  98. package/dist/src/generated/git-commit.js +2 -2
  99. package/dist/src/interactiveCli.js +48 -9
  100. package/dist/src/interactiveCli.js.map +1 -1
  101. package/dist/src/nonInteractiveCli.js +1 -1
  102. package/dist/src/nonInteractiveCli.js.map +1 -1
  103. package/dist/src/nonInteractiveCliAgentSession.js +6 -4
  104. package/dist/src/nonInteractiveCliAgentSession.js.map +1 -1
  105. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  106. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  107. package/dist/src/services/SkillCommandLoader.js +3 -1
  108. package/dist/src/services/SkillCommandLoader.js.map +1 -1
  109. package/dist/src/services/SkillCommandLoader.test.js +1 -1
  110. package/dist/src/services/SkillCommandLoader.test.js.map +1 -1
  111. package/dist/src/services/liteRtServerManager.d.ts +9 -0
  112. package/dist/src/services/liteRtServerManager.js +43 -0
  113. package/dist/src/services/liteRtServerManager.js.map +1 -0
  114. package/dist/src/services/liteRtServerManager.test.d.ts +6 -0
  115. package/dist/src/services/liteRtServerManager.test.js +54 -0
  116. package/dist/src/services/liteRtServerManager.test.js.map +1 -0
  117. package/dist/src/test-utils/mockConfig.js +4 -1
  118. package/dist/src/test-utils/mockConfig.js.map +1 -1
  119. package/dist/src/test-utils/render.d.ts +3 -1
  120. package/dist/src/test-utils/render.js +13 -3
  121. package/dist/src/test-utils/render.js.map +1 -1
  122. package/dist/src/ui/AppContainer.js +55 -33
  123. package/dist/src/ui/AppContainer.js.map +1 -1
  124. package/dist/src/ui/AppContainer.test.js +9 -4
  125. package/dist/src/ui/AppContainer.test.js.map +1 -1
  126. package/dist/src/ui/ToolConfirmationFullFrame.test.js +7 -9
  127. package/dist/src/ui/ToolConfirmationFullFrame.test.js.map +1 -1
  128. package/dist/src/ui/auth/ApiAuthDialog.js +1 -1
  129. package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -1
  130. package/dist/src/ui/auth/ApiAuthDialog.test.js +15 -11
  131. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +1 -1
  132. package/dist/src/ui/commands/bugCommand.js +2 -2
  133. package/dist/src/ui/commands/bugCommand.js.map +1 -1
  134. package/dist/src/ui/commands/bugCommand.test.js +3 -0
  135. package/dist/src/ui/commands/bugCommand.test.js.map +1 -1
  136. package/dist/src/ui/commands/clearCommand.js +3 -2
  137. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  138. package/dist/src/ui/commands/clearCommand.test.js +2 -1
  139. package/dist/src/ui/commands/clearCommand.test.js.map +1 -1
  140. package/dist/src/ui/commands/gemmaStatusCommand.d.ts +7 -0
  141. package/dist/src/ui/commands/gemmaStatusCommand.js +34 -0
  142. package/dist/src/ui/commands/gemmaStatusCommand.js.map +1 -0
  143. package/dist/src/ui/commands/memoryCommand.js +36 -0
  144. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  145. package/dist/src/ui/commands/memoryCommand.test.js +60 -0
  146. package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
  147. package/dist/src/ui/commands/settingsCommand.js +0 -1
  148. package/dist/src/ui/commands/settingsCommand.js.map +1 -1
  149. package/dist/src/ui/components/AppHeader.js +2 -19
  150. package/dist/src/ui/components/AppHeader.js.map +1 -1
  151. package/dist/src/ui/components/AppHeader.test.js +1 -1
  152. package/dist/src/ui/components/AppHeader.test.js.map +1 -1
  153. package/dist/src/ui/components/AsciiArt.d.ts +6 -6
  154. package/dist/src/ui/components/AsciiArt.js +6 -6
  155. package/dist/src/ui/components/AskUserDialog.js +19 -3
  156. package/dist/src/ui/components/AskUserDialog.js.map +1 -1
  157. package/dist/src/ui/components/CodiMascot.d.ts +6 -0
  158. package/dist/src/ui/components/CodiMascot.js +41 -0
  159. package/dist/src/ui/components/CodiMascot.js.map +1 -0
  160. package/dist/src/ui/components/Composer.test.js +12 -8
  161. package/dist/src/ui/components/Composer.test.js.map +1 -1
  162. package/dist/src/ui/components/DialogManager.js +10 -8
  163. package/dist/src/ui/components/DialogManager.js.map +1 -1
  164. package/dist/src/ui/components/DialogManager.test.js +11 -23
  165. package/dist/src/ui/components/DialogManager.test.js.map +1 -1
  166. package/dist/src/ui/components/ExitPlanModeDialog.js +1 -1
  167. package/dist/src/ui/components/ExitPlanModeDialog.js.map +1 -1
  168. package/dist/src/ui/components/ExitPlanModeDialog.test.js +4 -0
  169. package/dist/src/ui/components/ExitPlanModeDialog.test.js.map +1 -1
  170. package/dist/src/ui/components/Footer.js +5 -3
  171. package/dist/src/ui/components/Footer.js.map +1 -1
  172. package/dist/src/ui/components/Footer.test.js +21 -35
  173. package/dist/src/ui/components/Footer.test.js.map +1 -1
  174. package/dist/src/ui/components/FooterConfigDialog.js +8 -10
  175. package/dist/src/ui/components/FooterConfigDialog.js.map +1 -1
  176. package/dist/src/ui/components/FooterConfigDialog.test.js +1 -1
  177. package/dist/src/ui/components/FooterConfigDialog.test.js.map +1 -1
  178. package/dist/src/ui/components/HistoryItemDisplay.d.ts +0 -1
  179. package/dist/src/ui/components/HistoryItemDisplay.js +3 -10
  180. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  181. package/dist/src/ui/components/HistoryItemDisplay.test.js +4 -4
  182. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  183. package/dist/src/ui/components/InputPrompt.js +6 -19
  184. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  185. package/dist/src/ui/components/InputPrompt.test.js +2 -119
  186. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  187. package/dist/src/ui/components/MainContent.js +4 -34
  188. package/dist/src/ui/components/MainContent.js.map +1 -1
  189. package/dist/src/ui/components/ModelDialog.test.js +1 -0
  190. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  191. package/dist/src/ui/components/SkillInboxDialog.d.ts +14 -0
  192. package/dist/src/ui/components/SkillInboxDialog.js +420 -0
  193. package/dist/src/ui/components/SkillInboxDialog.js.map +1 -0
  194. package/dist/src/ui/components/SkillInboxDialog.test.d.ts +6 -0
  195. package/dist/src/ui/components/SkillInboxDialog.test.js +467 -0
  196. package/dist/src/ui/components/SkillInboxDialog.test.js.map +1 -0
  197. package/dist/src/ui/components/ThemeDialog.js +4 -4
  198. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  199. package/dist/src/ui/components/ThemeDialog.test.js +1 -1
  200. package/dist/src/ui/components/ToolConfirmationQueue.js +1 -1
  201. package/dist/src/ui/components/ToolConfirmationQueue.js.map +1 -1
  202. package/dist/src/ui/components/ToolConfirmationQueue.test.js +32 -0
  203. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +1 -1
  204. package/dist/src/ui/components/messages/DenseToolMessage.js +4 -17
  205. package/dist/src/ui/components/messages/DenseToolMessage.js.map +1 -1
  206. package/dist/src/ui/components/messages/DenseToolMessage.test.js +29 -6
  207. package/dist/src/ui/components/messages/DenseToolMessage.test.js.map +1 -1
  208. package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +0 -1
  209. package/dist/src/ui/components/messages/ToolGroupMessage.js +12 -51
  210. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  211. package/dist/src/ui/components/shared/BaseSelectionList.js +44 -27
  212. package/dist/src/ui/components/shared/BaseSelectionList.js.map +1 -1
  213. package/dist/src/ui/components/shared/BaseSelectionList.test.js +57 -1
  214. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -1
  215. package/dist/src/ui/components/shared/HalfLinePaddedBox.js +7 -12
  216. package/dist/src/ui/components/shared/HalfLinePaddedBox.js.map +1 -1
  217. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.d.ts +0 -5
  218. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js +13 -5
  219. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js.map +1 -1
  220. package/dist/src/ui/components/shared/TextInput.js +11 -3
  221. package/dist/src/ui/components/shared/TextInput.js.map +1 -1
  222. package/dist/src/ui/components/shared/TextInput.test.js +17 -0
  223. package/dist/src/ui/components/shared/TextInput.test.js.map +1 -1
  224. package/dist/src/ui/components/views/GemmaStatus.d.ts +10 -0
  225. package/dist/src/ui/components/views/GemmaStatus.js +11 -0
  226. package/dist/src/ui/components/views/GemmaStatus.js.map +1 -0
  227. package/dist/src/ui/contexts/QuotaContext.d.ts +18 -0
  228. package/dist/src/ui/contexts/QuotaContext.js +15 -0
  229. package/dist/src/ui/contexts/QuotaContext.js.map +1 -0
  230. package/dist/src/ui/contexts/ScrollProvider.js +59 -18
  231. package/dist/src/ui/contexts/ScrollProvider.js.map +1 -1
  232. package/dist/src/ui/contexts/SessionContext.d.ts +1 -0
  233. package/dist/src/ui/contexts/SessionContext.js +2 -2
  234. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  235. package/dist/src/ui/contexts/SessionContext.test.js +4 -4
  236. package/dist/src/ui/contexts/SessionContext.test.js.map +1 -1
  237. package/dist/src/ui/contexts/UIStateContext.d.ts +2 -11
  238. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  239. package/dist/src/ui/hooks/atCommandProcessor.js +1 -1
  240. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  241. package/dist/src/ui/hooks/slashCommandProcessor.js +8 -5
  242. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  243. package/dist/src/ui/hooks/slashCommandProcessor.test.js +40 -0
  244. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
  245. package/dist/src/ui/hooks/useAgentStream.d.ts +44 -0
  246. package/dist/src/ui/hooks/useAgentStream.js +377 -0
  247. package/dist/src/ui/hooks/useAgentStream.js.map +1 -0
  248. package/dist/src/ui/hooks/useAgentStream.test.d.ts +6 -0
  249. package/dist/src/ui/hooks/useAgentStream.test.js +161 -0
  250. package/dist/src/ui/hooks/useAgentStream.test.js.map +1 -0
  251. package/dist/src/ui/hooks/useAtCompletion.js +24 -5
  252. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  253. package/dist/src/ui/hooks/useAtCompletion.test.js +25 -0
  254. package/dist/src/ui/hooks/useAtCompletion.test.js.map +1 -1
  255. package/dist/src/ui/hooks/useComposerStatus.js +4 -2
  256. package/dist/src/ui/hooks/useComposerStatus.js.map +1 -1
  257. package/dist/src/ui/hooks/useExecutionLifecycle.js +27 -16
  258. package/dist/src/ui/hooks/useExecutionLifecycle.js.map +1 -1
  259. package/dist/src/ui/hooks/useExecutionLifecycle.test.js +38 -9
  260. package/dist/src/ui/hooks/useExecutionLifecycle.test.js.map +1 -1
  261. package/dist/src/ui/hooks/useGeminiStream.js +8 -32
  262. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  263. package/dist/src/ui/hooks/useLogger.d.ts +2 -2
  264. package/dist/src/ui/hooks/useLogger.js +6 -11
  265. package/dist/src/ui/hooks/useLogger.js.map +1 -1
  266. package/dist/src/ui/hooks/useLogger.test.js +4 -17
  267. package/dist/src/ui/hooks/useLogger.test.js.map +1 -1
  268. package/dist/src/ui/hooks/useRunEventNotifications.d.ts +3 -1
  269. package/dist/src/ui/hooks/useRunEventNotifications.js +5 -3
  270. package/dist/src/ui/hooks/useRunEventNotifications.js.map +1 -1
  271. package/dist/src/ui/hooks/useSessionBrowser.js +5 -4
  272. package/dist/src/ui/hooks/useSessionBrowser.js.map +1 -1
  273. package/dist/src/ui/hooks/useSessionBrowser.test.js +6 -7
  274. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +1 -1
  275. package/dist/src/ui/hooks/useShellInactivityStatus.d.ts +2 -2
  276. package/dist/src/ui/hooks/useShellInactivityStatus.js +1 -2
  277. package/dist/src/ui/hooks/useShellInactivityStatus.js.map +1 -1
  278. package/dist/src/ui/hooks/useToolScheduler.d.ts +3 -2
  279. package/dist/src/ui/hooks/useToolScheduler.js +4 -3
  280. package/dist/src/ui/hooks/useToolScheduler.js.map +1 -1
  281. package/dist/src/ui/hooks/useTurnActivityMonitor.d.ts +6 -2
  282. package/dist/src/ui/hooks/useTurnActivityMonitor.js +1 -2
  283. package/dist/src/ui/hooks/useTurnActivityMonitor.js.map +1 -1
  284. package/dist/src/ui/key/keyBindings.js +5 -2
  285. package/dist/src/ui/key/keyBindings.js.map +1 -1
  286. package/dist/src/ui/themes/builtin/dark/github-dark-colorblind.d.ts +7 -0
  287. package/dist/src/ui/themes/builtin/dark/github-dark-colorblind.js +140 -0
  288. package/dist/src/ui/themes/builtin/dark/github-dark-colorblind.js.map +1 -0
  289. package/dist/src/ui/themes/builtin/light/github-light-colorblind.d.ts +7 -0
  290. package/dist/src/ui/themes/builtin/light/github-light-colorblind.js +140 -0
  291. package/dist/src/ui/themes/builtin/light/github-light-colorblind.js.map +1 -0
  292. package/dist/src/ui/themes/theme-manager.js +4 -0
  293. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  294. package/dist/src/ui/types.d.ts +16 -2
  295. package/dist/src/ui/types.js +1 -0
  296. package/dist/src/ui/types.js.map +1 -1
  297. package/dist/src/ui/utils/borderStyles.d.ts +2 -2
  298. package/dist/src/ui/utils/borderStyles.js.map +1 -1
  299. package/dist/src/ui/utils/confirmingTool.js +5 -4
  300. package/dist/src/ui/utils/confirmingTool.js.map +1 -1
  301. package/dist/src/ui/utils/historyUtils.d.ts +5 -0
  302. package/dist/src/ui/utils/historyUtils.js +15 -0
  303. package/dist/src/ui/utils/historyUtils.js.map +1 -1
  304. package/dist/src/ui/utils/terminalCapabilityManager.d.ts +7 -2
  305. package/dist/src/ui/utils/terminalCapabilityManager.js +23 -16
  306. package/dist/src/ui/utils/terminalCapabilityManager.js.map +1 -1
  307. package/dist/src/ui/utils/terminalCapabilityManager.test.js +86 -65
  308. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +1 -1
  309. package/dist/src/ui/utils/textUtils.d.ts +10 -2
  310. package/dist/src/ui/utils/textUtils.js +18 -9
  311. package/dist/src/ui/utils/textUtils.js.map +1 -1
  312. package/dist/src/ui/utils/textUtils.test.js +14 -0
  313. package/dist/src/ui/utils/textUtils.test.js.map +1 -1
  314. package/dist/src/utils/autoMemory.d.ts +7 -0
  315. package/dist/src/utils/autoMemory.js +15 -0
  316. package/dist/src/utils/autoMemory.js.map +1 -0
  317. package/dist/src/utils/cleanup.d.ts +2 -0
  318. package/dist/src/utils/cleanup.js +12 -0
  319. package/dist/src/utils/cleanup.js.map +1 -1
  320. package/dist/src/utils/devtoolsService.d.ts +2 -2
  321. package/dist/src/utils/devtoolsService.js +3 -17
  322. package/dist/src/utils/devtoolsService.js.map +1 -1
  323. package/dist/src/utils/devtoolsService.test.js +8 -37
  324. package/dist/src/utils/devtoolsService.test.js.map +1 -1
  325. package/dist/src/utils/handleAutoUpdate.test.js +2 -2
  326. package/dist/src/utils/sandbox.js +10 -2
  327. package/dist/src/utils/sandbox.js.map +1 -1
  328. package/dist/src/utils/sandbox.test.js +54 -1
  329. package/dist/src/utils/sandbox.test.js.map +1 -1
  330. package/dist/src/utils/sessionUtils.d.ts +3 -3
  331. package/dist/src/utils/sessionUtils.js +26 -19
  332. package/dist/src/utils/sessionUtils.js.map +1 -1
  333. package/dist/src/utils/sessionUtils.test.js +16 -22
  334. package/dist/src/utils/sessionUtils.test.js.map +1 -1
  335. package/dist/src/utils/sessions.js +2 -2
  336. package/dist/src/utils/sessions.js.map +1 -1
  337. package/dist/src/utils/terminalNotifications.d.ts +8 -1
  338. package/dist/src/utils/terminalNotifications.js +73 -17
  339. package/dist/src/utils/terminalNotifications.js.map +1 -1
  340. package/dist/src/utils/terminalNotifications.test.js +125 -31
  341. package/dist/src/utils/terminalNotifications.test.js.map +1 -1
  342. package/dist/src/utils/userStartupWarnings.js +21 -1
  343. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  344. package/dist/src/utils/userStartupWarnings.test.js +34 -0
  345. package/dist/src/utils/userStartupWarnings.test.js.map +1 -1
  346. package/dist/tsconfig.tsbuildinfo +1 -1
  347. package/package.json +4 -4
@@ -0,0 +1,110 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import chalk from 'chalk';
7
+ import { DEFAULT_PORT, GEMMA_MODEL_NAME } from './constants.js';
8
+ import { detectPlatform, getBinaryPath, isBinaryInstalled, isModelDownloaded, isServerRunning, readServerPid, isProcessRunning, resolveGemmaConfig, } from './platform.js';
9
+ import { exitCli } from '../utils.js';
10
+ export async function checkGemmaStatus(port) {
11
+ const { settingsEnabled, configuredPort } = resolveGemmaConfig(DEFAULT_PORT);
12
+ const effectivePort = port ?? configuredPort;
13
+ const binaryPath = getBinaryPath();
14
+ const binaryInstalled = isBinaryInstalled(binaryPath);
15
+ const modelDownloaded = binaryInstalled && binaryPath ? isModelDownloaded(binaryPath) : false;
16
+ const serverRunning = await isServerRunning(effectivePort);
17
+ const pid = readServerPid();
18
+ const serverPid = pid && isProcessRunning(pid) ? pid : null;
19
+ const allPassing = binaryInstalled && modelDownloaded && serverRunning && settingsEnabled;
20
+ return {
21
+ binaryInstalled,
22
+ binaryPath,
23
+ modelDownloaded,
24
+ serverRunning,
25
+ serverPid,
26
+ settingsEnabled,
27
+ port: effectivePort,
28
+ allPassing,
29
+ };
30
+ }
31
+ export function formatGemmaStatus(status) {
32
+ const check = (ok) => (ok ? chalk.green('✓') : chalk.red('✗'));
33
+ const lines = [
34
+ '',
35
+ chalk.bold('Gemma Local Model Routing Status'),
36
+ chalk.dim('─'.repeat(40)),
37
+ '',
38
+ ];
39
+ if (status.binaryInstalled) {
40
+ lines.push(` Binary: ${check(true)} Installed (${status.binaryPath})`);
41
+ }
42
+ else {
43
+ const platform = detectPlatform();
44
+ if (platform) {
45
+ lines.push(` Binary: ${check(false)} Not installed`);
46
+ lines.push(chalk.dim(` Run: gemini gemma setup`));
47
+ }
48
+ else {
49
+ lines.push(` Binary: ${check(false)} Unsupported platform (${process.platform}-${process.arch})`);
50
+ }
51
+ }
52
+ if (status.modelDownloaded) {
53
+ lines.push(` Model: ${check(true)} ${GEMMA_MODEL_NAME} downloaded`);
54
+ }
55
+ else {
56
+ lines.push(` Model: ${check(false)} ${GEMMA_MODEL_NAME} not found`);
57
+ if (status.binaryInstalled) {
58
+ lines.push(chalk.dim(` Run: ${status.binaryPath} pull ${GEMMA_MODEL_NAME}`));
59
+ }
60
+ else {
61
+ lines.push(chalk.dim(` Run: gemini gemma setup`));
62
+ }
63
+ }
64
+ if (status.serverRunning) {
65
+ const pidInfo = status.serverPid ? ` (PID ${status.serverPid})` : '';
66
+ lines.push(` Server: ${check(true)} Running on port ${status.port}${pidInfo}`);
67
+ }
68
+ else {
69
+ lines.push(` Server: ${check(false)} Not running on port ${status.port}`);
70
+ lines.push(chalk.dim(` Run: gemini gemma start`));
71
+ }
72
+ if (status.settingsEnabled) {
73
+ lines.push(` Settings: ${check(true)} Enabled in settings.json`);
74
+ }
75
+ else {
76
+ lines.push(` Settings: ${check(false)} Not enabled in settings.json`);
77
+ lines.push(chalk.dim(` Run: gemini gemma setup (auto-configures settings)`));
78
+ }
79
+ lines.push('');
80
+ if (status.allPassing) {
81
+ lines.push(chalk.green(' Routing is active — no action needed.'));
82
+ lines.push('');
83
+ lines.push(chalk.dim(' Simple requests → Flash (fast) | Complex requests → Pro (powerful)'));
84
+ lines.push(chalk.dim(' This happens automatically on every request.'));
85
+ }
86
+ else {
87
+ lines.push(chalk.yellow(' Some checks failed. Run "gemini gemma setup" for guided installation.'));
88
+ }
89
+ lines.push('');
90
+ return lines.join('\n');
91
+ }
92
+ export const statusCommand = {
93
+ command: 'status',
94
+ describe: 'Check Gemma local model routing status',
95
+ builder: (yargs) => yargs.option('port', {
96
+ type: 'number',
97
+ description: 'Port to check for the LiteRT server',
98
+ }),
99
+ handler: async (argv) => {
100
+ let port;
101
+ if (argv['port'] !== undefined) {
102
+ port = Number(argv['port']);
103
+ }
104
+ const status = await checkGemmaStatus(port);
105
+ const output = formatGemmaStatus(status);
106
+ process.stdout.write(output);
107
+ await exitCli(status.allPassing ? 0 : 1);
108
+ },
109
+ };
110
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/commands/gemma/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { CommandModule } from 'yargs';
7
+ export type StopServerResult = 'stopped' | 'not-running' | 'unexpected-process' | 'failed';
8
+ export declare function stopServer(expectedPort?: number): Promise<StopServerResult>;
9
+ export declare const stopCommand: CommandModule;
@@ -0,0 +1,110 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import fs from 'node:fs';
7
+ import chalk from 'chalk';
8
+ import { debugLogger } from '@google/gemini-cli-core';
9
+ import { exitCli } from '../utils.js';
10
+ import { DEFAULT_PORT, getPidFilePath } from './constants.js';
11
+ import { getBinaryPath, isExpectedLiteRtServerProcess, isProcessRunning, isServerRunning, readServerPid, readServerProcessInfo, resolveGemmaConfig, } from './platform.js';
12
+ export async function stopServer(expectedPort) {
13
+ const processInfo = readServerProcessInfo();
14
+ const pidPath = getPidFilePath();
15
+ if (!processInfo) {
16
+ return 'not-running';
17
+ }
18
+ const { pid } = processInfo;
19
+ if (!isProcessRunning(pid)) {
20
+ debugLogger.log(`Stale PID file found (PID ${pid} is not running), removing ${pidPath}`);
21
+ try {
22
+ fs.unlinkSync(pidPath);
23
+ }
24
+ catch {
25
+ // ignore
26
+ }
27
+ return 'not-running';
28
+ }
29
+ const binaryPath = processInfo.binaryPath ?? getBinaryPath();
30
+ const port = processInfo.port ?? expectedPort;
31
+ if (!isExpectedLiteRtServerProcess(pid, { binaryPath, port })) {
32
+ debugLogger.warn(`Refusing to stop PID ${pid} because it does not match the expected LiteRT server process.`);
33
+ return 'unexpected-process';
34
+ }
35
+ try {
36
+ process.kill(pid, 'SIGTERM');
37
+ }
38
+ catch {
39
+ return 'failed';
40
+ }
41
+ await new Promise((resolve) => setTimeout(resolve, 1000));
42
+ if (isProcessRunning(pid)) {
43
+ try {
44
+ process.kill(pid, 'SIGKILL');
45
+ }
46
+ catch {
47
+ // ignore
48
+ }
49
+ await new Promise((resolve) => setTimeout(resolve, 500));
50
+ if (isProcessRunning(pid)) {
51
+ return 'failed';
52
+ }
53
+ }
54
+ try {
55
+ fs.unlinkSync(pidPath);
56
+ }
57
+ catch {
58
+ // ignore
59
+ }
60
+ return 'stopped';
61
+ }
62
+ export const stopCommand = {
63
+ command: 'stop',
64
+ describe: 'Stop the LiteRT-LM server',
65
+ builder: (yargs) => yargs.option('port', {
66
+ type: 'number',
67
+ description: 'Port where the LiteRT server is running',
68
+ }),
69
+ handler: async (argv) => {
70
+ let port;
71
+ if (argv['port'] !== undefined) {
72
+ port = Number(argv['port']);
73
+ }
74
+ if (!port) {
75
+ const { configuredPort } = resolveGemmaConfig(DEFAULT_PORT);
76
+ port = configuredPort;
77
+ }
78
+ const processInfo = readServerProcessInfo();
79
+ const pid = processInfo?.pid ?? readServerPid();
80
+ if (pid !== null && isProcessRunning(pid)) {
81
+ debugLogger.log(`Stopping LiteRT server (PID ${pid})...`);
82
+ const result = await stopServer(port);
83
+ if (result === 'stopped') {
84
+ debugLogger.log(chalk.green('LiteRT server stopped.'));
85
+ await exitCli(0);
86
+ }
87
+ else if (result === 'unexpected-process') {
88
+ debugLogger.error(chalk.red(`Refusing to stop PID ${pid} because it does not match the expected LiteRT server process.`));
89
+ debugLogger.error(chalk.dim('Remove the stale pid file after verifying the process, or stop the process manually.'));
90
+ await exitCli(1);
91
+ }
92
+ else {
93
+ debugLogger.error(chalk.red('Failed to stop LiteRT server.'));
94
+ await exitCli(1);
95
+ }
96
+ return;
97
+ }
98
+ const running = await isServerRunning(port);
99
+ if (running) {
100
+ debugLogger.log(chalk.yellow(`A server is responding on port ${port}, but it was not started by "gemini gemma start".`));
101
+ debugLogger.log(chalk.dim('If you started it manually, stop it from the terminal where it is running.'));
102
+ await exitCli(1);
103
+ }
104
+ else {
105
+ debugLogger.log('No LiteRT server is currently running.');
106
+ await exitCli(0);
107
+ }
108
+ },
109
+ };
110
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../../src/commands/gemma/stop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import fs from 'node:fs';
7
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
8
+ const mockGetBinaryPath = vi.hoisted(() => vi.fn());
9
+ const mockIsExpectedLiteRtServerProcess = vi.hoisted(() => vi.fn());
10
+ const mockIsProcessRunning = vi.hoisted(() => vi.fn());
11
+ const mockIsServerRunning = vi.hoisted(() => vi.fn());
12
+ const mockReadServerPid = vi.hoisted(() => vi.fn());
13
+ const mockReadServerProcessInfo = vi.hoisted(() => vi.fn());
14
+ const mockResolveGemmaConfig = vi.hoisted(() => vi.fn());
15
+ vi.mock('@google/gemini-cli-core', async (importOriginal) => {
16
+ const { mockCoreDebugLogger } = await import('../../test-utils/mockDebugLogger.js');
17
+ return mockCoreDebugLogger(await importOriginal(), {
18
+ stripAnsi: false,
19
+ });
20
+ });
21
+ vi.mock('./constants.js', () => ({
22
+ DEFAULT_PORT: 9379,
23
+ getPidFilePath: vi.fn(() => '/tmp/litert-server.pid'),
24
+ }));
25
+ vi.mock('./platform.js', () => ({
26
+ getBinaryPath: mockGetBinaryPath,
27
+ isExpectedLiteRtServerProcess: mockIsExpectedLiteRtServerProcess,
28
+ isProcessRunning: mockIsProcessRunning,
29
+ isServerRunning: mockIsServerRunning,
30
+ readServerPid: mockReadServerPid,
31
+ readServerProcessInfo: mockReadServerProcessInfo,
32
+ resolveGemmaConfig: mockResolveGemmaConfig,
33
+ }));
34
+ vi.mock('../utils.js', () => ({
35
+ exitCli: vi.fn(),
36
+ }));
37
+ import { stopServer } from './stop.js';
38
+ describe('gemma stop command', () => {
39
+ beforeEach(() => {
40
+ vi.clearAllMocks();
41
+ vi.useFakeTimers();
42
+ mockGetBinaryPath.mockReturnValue('/custom/lit');
43
+ mockResolveGemmaConfig.mockReturnValue({ configuredPort: 9379 });
44
+ });
45
+ afterEach(() => {
46
+ vi.useRealTimers();
47
+ vi.restoreAllMocks();
48
+ });
49
+ it('refuses to signal a pid that does not match the expected LiteRT server', async () => {
50
+ mockReadServerProcessInfo.mockReturnValue({
51
+ pid: 1234,
52
+ binaryPath: '/custom/lit',
53
+ port: 8123,
54
+ });
55
+ mockIsProcessRunning.mockReturnValue(true);
56
+ mockIsExpectedLiteRtServerProcess.mockReturnValue(false);
57
+ const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true);
58
+ await expect(stopServer(8123)).resolves.toBe('unexpected-process');
59
+ expect(killSpy).not.toHaveBeenCalled();
60
+ });
61
+ it('stops the verified LiteRT server and removes the pid file', async () => {
62
+ mockReadServerProcessInfo.mockReturnValue({
63
+ pid: 1234,
64
+ binaryPath: '/custom/lit',
65
+ port: 8123,
66
+ });
67
+ mockIsProcessRunning.mockReturnValueOnce(true).mockReturnValueOnce(false);
68
+ mockIsExpectedLiteRtServerProcess.mockReturnValue(true);
69
+ const unlinkSpy = vi.spyOn(fs, 'unlinkSync').mockImplementation(() => { });
70
+ const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true);
71
+ const stopPromise = stopServer(8123);
72
+ await vi.runAllTimersAsync();
73
+ await expect(stopPromise).resolves.toBe('stopped');
74
+ expect(killSpy).toHaveBeenCalledWith(1234, 'SIGTERM');
75
+ expect(unlinkSpy).toHaveBeenCalledWith('/tmp/litert-server.pid');
76
+ });
77
+ it('cleans up a stale pid file when the recorded process is no longer running', async () => {
78
+ mockReadServerProcessInfo.mockReturnValue({
79
+ pid: 1234,
80
+ binaryPath: '/custom/lit',
81
+ port: 8123,
82
+ });
83
+ mockIsProcessRunning.mockReturnValue(false);
84
+ const unlinkSpy = vi.spyOn(fs, 'unlinkSync').mockImplementation(() => { });
85
+ await expect(stopServer(8123)).resolves.toBe('not-running');
86
+ expect(unlinkSpy).toHaveBeenCalledWith('/tmp/litert-server.pid');
87
+ });
88
+ });
89
+ //# sourceMappingURL=stop.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.test.js","sourceRoot":"","sources":["../../../../src/commands/gemma/stop.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,MAAM,iBAAiB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACpD,MAAM,iCAAiC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACpE,MAAM,oBAAoB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACvD,MAAM,mBAAmB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACtD,MAAM,iBAAiB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACpD,MAAM,yBAAyB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5D,MAAM,sBAAsB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAEzD,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IAC1D,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAC1C,qCAAqC,CACtC,CAAC;IACF,OAAO,mBAAmB,CACxB,MAAM,cAAc,EAA4C,EAChE;QACE,SAAS,EAAE,KAAK;KACjB,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,YAAY,EAAE,IAAI;IAClB,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC;CACtD,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,aAAa,EAAE,iBAAiB;IAChC,6BAA6B,EAAE,iCAAiC;IAChE,gBAAgB,EAAE,oBAAoB;IACtC,eAAe,EAAE,mBAAmB;IACpC,aAAa,EAAE,iBAAiB;IAChC,qBAAqB,EAAE,yBAAyB;IAChD,kBAAkB,EAAE,sBAAsB;CAC3C,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;CACjB,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,iBAAiB,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QACjD,sBAAsB,CAAC,eAAe,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,yBAAyB,CAAC,eAAe,CAAC;YACxC,GAAG,EAAE,IAAI;YACT,UAAU,EAAE,aAAa;YACzB,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,oBAAoB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3C,iCAAiC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAEzE,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACnE,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,yBAAyB,CAAC,eAAe,CAAC;YACxC,GAAG,EAAE,IAAI;YACT,UAAU,EAAE,aAAa;YACzB,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,oBAAoB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC1E,iCAAiC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAExD,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAEzE,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAE7B,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,yBAAyB,CAAC,eAAe,CAAC;YACxC,GAAG,EAAE,IAAI;YACT,UAAU,EAAE,aAAa;YACzB,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,oBAAoB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAE5C,MAAM,SAAS,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE1E,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5D,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { CommandModule } from 'yargs';
7
+ export declare const gemmaCommand: CommandModule;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { initializeOutputListenersAndFlush } from '../gemini.js';
7
+ import { defer } from '../deferred.js';
8
+ import { setupCommand } from './gemma/setup.js';
9
+ import { startCommand } from './gemma/start.js';
10
+ import { stopCommand } from './gemma/stop.js';
11
+ import { statusCommand } from './gemma/status.js';
12
+ import { logsCommand } from './gemma/logs.js';
13
+ export const gemmaCommand = {
14
+ command: 'gemma',
15
+ describe: 'Manage local Gemma model routing',
16
+ builder: (yargs) => yargs
17
+ .middleware((argv) => {
18
+ initializeOutputListenersAndFlush();
19
+ argv['isCommand'] = true;
20
+ })
21
+ .command(defer(setupCommand, 'gemma'))
22
+ .command(defer(startCommand, 'gemma'))
23
+ .command(defer(stopCommand, 'gemma'))
24
+ .command(defer(statusCommand, 'gemma'))
25
+ .command(defer(logsCommand, 'gemma'))
26
+ .demandCommand(1, 'You need at least one command before continuing.')
27
+ .version(false),
28
+ handler: () => { },
29
+ };
30
+ //# sourceMappingURL=gemma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemma.js","sourceRoot":"","sources":["../../../src/commands/gemma.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iCAAiC,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,kCAAkC;IAC5C,OAAO,EAAE,CAAC,KAAW,EAAE,EAAE,CACvB,KAAK;SACF,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;QACnB,iCAAiC,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;IAC3B,CAAC,CAAC;SACD,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;SACrC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;SACrC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;SACpC,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;SACtC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;SACpC,aAAa,CAAC,CAAC,EAAE,kDAAkD,CAAC;SACpE,OAAO,CAAC,KAAK,CAAC;IACnB,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;CAClB,CAAC"}
@@ -38,6 +38,7 @@ export interface CliArgs {
38
38
  startupMessages?: string[];
39
39
  rawOutput: boolean | undefined;
40
40
  acceptRawOutputRisk: boolean | undefined;
41
+ skipTrust: boolean | undefined;
41
42
  isCommand: boolean | undefined;
42
43
  }
43
44
  /**
@@ -12,11 +12,13 @@ import { mcpCommand } from '../commands/mcp.js';
12
12
  import { extensionsCommand } from '../commands/extensions.js';
13
13
  import { skillsCommand } from '../commands/skills.js';
14
14
  import { hooksCommand } from '../commands/hooks.js';
15
- import { setGeminiMdFilename as setServerGeminiMdFilename, getCurrentGeminiMdFilename, ApprovalMode, DEFAULT_GEMINI_EMBEDDING_MODEL, DEFAULT_FILE_FILTERING_OPTIONS, DEFAULT_MEMORY_FILE_FILTERING_OPTIONS, FileDiscoveryService, resolveTelemetrySettings, FatalConfigError, getPty, debugLogger, loadServerHierarchicalMemory, ASK_USER_TOOL_NAME, getVersion, PREVIEW_GEMINI_MODEL_AUTO, coreEvents, GEMINI_MODEL_ALIAS_AUTO, getAdminErrorMessage, isHeadlessMode, Config, resolveToRealPath, applyAdminAllowlist, applyRequiredServers, getAdminBlockedMcpServersMessage, getProjectRootForWorktree, isGeminiWorktree, detectIdeFromEnv, generalistProfile, } from '@google/gemini-cli-core';
15
+ import { gemmaCommand } from '../commands/gemma.js';
16
+ import { setGeminiMdFilename as setServerGeminiMdFilename, getCurrentGeminiMdFilename, ApprovalMode, DEFAULT_GEMINI_EMBEDDING_MODEL, DEFAULT_FILE_FILTERING_OPTIONS, DEFAULT_MEMORY_FILE_FILTERING_OPTIONS, FileDiscoveryService, resolveTelemetrySettings, FatalConfigError, getErrorMessage, getPty, debugLogger, loadServerHierarchicalMemory, ASK_USER_TOOL_NAME, getVersion, PREVIEW_GEMINI_MODEL_AUTO, coreEvents, GEMINI_MODEL_ALIAS_AUTO, getAdminErrorMessage, isHeadlessMode, Config, resolveToRealPath, applyAdminAllowlist, applyRequiredServers, getAdminBlockedMcpServersMessage, getProjectRootForWorktree, isGeminiWorktree, detectIdeFromEnv, generalistProfile, } from '@google/gemini-cli-core';
16
17
  import { AuthProviderKeycloak } from '@machina.ai/auth-keycloak';
17
18
  import { saveModelChange, loadSettings, isWorktreeEnabled, } from './settings.js';
18
19
  import { loadSandboxConfig } from './sandboxConfig.js';
19
20
  import { resolvePath } from '../utils/resolvePath.js';
21
+ import { isRecord } from '../utils/settingsUtils.js';
20
22
  import { RESUME_LATEST } from '../utils/sessionUtils.js';
21
23
  import { isWorkspaceTrusted } from './trustedFolders.js';
22
24
  import { createPolicyEngineConfig, resolveWorkspacePolicyState, } from './policy.js';
@@ -87,6 +89,7 @@ export async function parseArguments(settings) {
87
89
  extensionsCommand,
88
90
  skillsCommand,
89
91
  hooksCommand,
92
+ gemmaCommand,
90
93
  ];
91
94
  const subcommands = commandModules.flatMap((mod) => {
92
95
  const names = [];
@@ -158,6 +161,7 @@ export async function parseArguments(settings) {
158
161
  yargsInstance.command(extensionsCommand);
159
162
  yargsInstance.command(skillsCommand);
160
163
  yargsInstance.command(hooksCommand);
164
+ yargsInstance.command(gemmaCommand);
161
165
  yargsInstance
162
166
  .command('$0 [query..]', 'Launch Cell CLI', (yargsInstance) => yargsInstance
163
167
  .positional('query', {
@@ -180,6 +184,11 @@ export async function parseArguments(settings) {
180
184
  type: 'string',
181
185
  nargs: 1,
182
186
  description: 'Execute the provided prompt and continue in interactive mode',
187
+ })
188
+ .option('skip-trust', {
189
+ type: 'boolean',
190
+ description: 'Trust the current workspace for this session.',
191
+ default: false,
183
192
  })
184
193
  .option('worktree', {
185
194
  alias: 'w',
@@ -337,10 +346,17 @@ export async function parseArguments(settings) {
337
346
  yargsInstance.wrap(yargsInstance.terminalWidth());
338
347
  let result;
339
348
  try {
340
- result = await yargsInstance.parse();
349
+ const parsed = await yargsInstance.parse();
350
+ if (!isRecord(parsed)) {
351
+ throw new Error('Failed to parse arguments');
352
+ }
353
+ result = parsed;
354
+ if (result['skip-trust']) {
355
+ process.env['CELL_CLI_TRUST_WORKSPACE'] = 'true';
356
+ }
341
357
  }
342
358
  catch (e) {
343
- const msg = e instanceof Error ? e.message : String(e);
359
+ const msg = getErrorMessage(e);
344
360
  debugLogger.error(msg);
345
361
  yargsInstance.showHelp();
346
362
  await runExitCleanup();
@@ -352,11 +368,14 @@ export async function parseArguments(settings) {
352
368
  process.exit(0);
353
369
  }
354
370
  // Normalize query args: handle both quoted "@path file" and unquoted @path file
355
- // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
356
- const queryArg = result.query;
357
- const q = Array.isArray(queryArg)
358
- ? queryArg.join(' ')
359
- : queryArg;
371
+ const queryArg = result['query'];
372
+ let q;
373
+ if (Array.isArray(queryArg)) {
374
+ q = queryArg.join(' ');
375
+ }
376
+ else if (typeof queryArg === 'string') {
377
+ q = queryArg;
378
+ }
360
379
  // -p/--prompt forces non-interactive mode; positional args default to interactive in TTY
361
380
  if (q && !result['prompt']) {
362
381
  if (!isHeadlessMode()) {
@@ -406,7 +425,7 @@ export async function loadCliConfig(settings, sessionId, argv, options = {}) {
406
425
  process.env['VITEST'] === 'true'
407
426
  ? false
408
427
  : (settings.security?.folderTrust?.enabled ?? false);
409
- const trustedFolder = isWorkspaceTrusted(settings, cwd, undefined, {
428
+ const trustedFolder = isWorkspaceTrusted(settings, cwd, {
410
429
  prompt: argv.prompt,
411
430
  query: argv.query,
412
431
  })?.isTrusted ?? false;
@@ -448,7 +467,7 @@ export async function loadCliConfig(settings, sessionId, argv, options = {}) {
448
467
  return resolveToRealPath(trimmedPath) !== realCwd;
449
468
  }
450
469
  catch (e) {
451
- debugLogger.debug(`[IDE] Skipping inaccessible workspace folder: ${trimmedPath} (${e instanceof Error ? e.message : String(e)})`);
470
+ debugLogger.debug(`[IDE] Skipping inaccessible workspace folder: ${trimmedPath} (${getErrorMessage(e)})`);
452
471
  return false;
453
472
  }
454
473
  });
@@ -468,7 +487,7 @@ export async function loadCliConfig(settings, sessionId, argv, options = {}) {
468
487
  const extensionPlanSettings = extensionManager
469
488
  .getExtensions()
470
489
  .find((ext) => ext.isActive && ext.plan?.directory)?.plan;
471
- const experimentalJitContext = settings.experimental.jitContext;
490
+ const experimentalJitContext = settings.experimental.jitContext ?? true;
472
491
  let extensionRegistryURI = process.env['CELL_CLI_EXTENSION_REGISTRY_URI'] ??
473
492
  (trustedFolder ? settings.experimental?.extensionRegistryURI : undefined);
474
493
  if (extensionRegistryURI && !extensionRegistryURI.startsWith('http')) {
@@ -753,11 +772,13 @@ export async function loadCliConfig(settings, sessionId, argv, options = {}) {
753
772
  enableEventDrivenScheduler: true,
754
773
  skillsSupport: settings.skills?.enabled ?? true,
755
774
  disabledSkills: settings.skills?.disabled,
756
- experimentalJitContext: settings.experimental?.jitContext,
757
- experimentalMemoryManager: settings.experimental?.memoryManager,
775
+ experimentalJitContext,
776
+ experimentalMemoryV2: settings.experimental?.memoryV2,
777
+ experimentalAutoMemory: settings.experimental?.autoMemory,
758
778
  contextManagement,
759
779
  modelSteering: settings.experimental?.modelSteering,
760
- topicUpdateNarration: settings.experimental?.topicUpdateNarration,
780
+ topicUpdateNarration: settings.general?.topicUpdateNarration ??
781
+ settings.experimental?.topicUpdateNarration,
761
782
  noBrowser: !!process.env['NO_BROWSER'],
762
783
  summarizeToolOutput: settings.model?.summarizeToolOutput,
763
784
  ideMode,
@@ -790,6 +811,7 @@ export async function loadCliConfig(settings, sessionId, argv, options = {}) {
790
811
  recordResponses: argv.recordResponses,
791
812
  retryFetchErrors: settings.general?.retryFetchErrors,
792
813
  billing: settings.billing,
814
+ vertexAiRouting: settings.billing?.vertexAi,
793
815
  maxAttempts: settings.general?.maxAttempts,
794
816
  ptyInfo: ptyInfo?.name,
795
817
  disableLLMCorrection: settings.tools?.disableLLMCorrection,
@@ -847,7 +869,7 @@ async function resolveWorktreeSettings(cwd) {
847
869
  worktreeBaseSha = stdout.trim();
848
870
  }
849
871
  catch (e) {
850
- debugLogger.debug(`Failed to resolve worktree base SHA at ${worktreePath}: ${e instanceof Error ? e.message : String(e)}`);
872
+ debugLogger.debug(`Failed to resolve worktree base SHA at ${worktreePath}: ${getErrorMessage(e)}`);
851
873
  }
852
874
  if (!worktreeBaseSha) {
853
875
  return undefined;