@machina.ai/cell-cli 1.38.1-rc2 → 1.40.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 (338) hide show
  1. package/dist/index.js +124 -29
  2. package/dist/index.js.map +1 -1
  3. package/dist/package.json +4 -4
  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/gemma/constants.d.ts +17 -0
  14. package/dist/src/commands/gemma/constants.js +35 -0
  15. package/dist/src/commands/gemma/constants.js.map +1 -0
  16. package/dist/src/commands/gemma/logs.d.ts +13 -0
  17. package/dist/src/commands/gemma/logs.js +154 -0
  18. package/dist/src/commands/gemma/logs.js.map +1 -0
  19. package/dist/src/commands/gemma/logs.test.d.ts +6 -0
  20. package/dist/src/commands/gemma/logs.test.js +122 -0
  21. package/dist/src/commands/gemma/logs.test.js.map +1 -0
  22. package/dist/src/commands/gemma/platform.d.ts +38 -0
  23. package/dist/src/commands/gemma/platform.js +220 -0
  24. package/dist/src/commands/gemma/platform.js.map +1 -0
  25. package/dist/src/commands/gemma/platform.test.d.ts +6 -0
  26. package/dist/src/commands/gemma/platform.test.js +108 -0
  27. package/dist/src/commands/gemma/platform.test.js.map +1 -0
  28. package/dist/src/commands/gemma/setup.d.ts +9 -0
  29. package/dist/src/commands/gemma/setup.js +392 -0
  30. package/dist/src/commands/gemma/setup.js.map +1 -0
  31. package/dist/src/commands/gemma/setup.test.d.ts +6 -0
  32. package/dist/src/commands/gemma/setup.test.js +36 -0
  33. package/dist/src/commands/gemma/setup.test.js.map +1 -0
  34. package/dist/src/commands/gemma/start.d.ts +8 -0
  35. package/dist/src/commands/gemma/start.js +87 -0
  36. package/dist/src/commands/gemma/start.js.map +1 -0
  37. package/dist/src/commands/gemma/status.d.ts +19 -0
  38. package/dist/src/commands/gemma/status.js +110 -0
  39. package/dist/src/commands/gemma/status.js.map +1 -0
  40. package/dist/src/commands/gemma/stop.d.ts +9 -0
  41. package/dist/src/commands/gemma/stop.js +110 -0
  42. package/dist/src/commands/gemma/stop.js.map +1 -0
  43. package/dist/src/commands/gemma/stop.test.d.ts +6 -0
  44. package/dist/src/commands/gemma/stop.test.js +89 -0
  45. package/dist/src/commands/gemma/stop.test.js.map +1 -0
  46. package/dist/src/commands/gemma.d.ts +7 -0
  47. package/dist/src/commands/gemma.js +30 -0
  48. package/dist/src/commands/gemma.js.map +1 -0
  49. package/dist/src/config/config.d.ts +1 -0
  50. package/dist/src/config/config.js +37 -15
  51. package/dist/src/config/config.js.map +1 -1
  52. package/dist/src/config/config.test.js +12 -0
  53. package/dist/src/config/config.test.js.map +1 -1
  54. package/dist/src/config/extension.test.js +3 -2
  55. package/dist/src/config/extension.test.js.map +1 -1
  56. package/dist/src/config/extensions/github_fetch.js +2 -1
  57. package/dist/src/config/extensions/github_fetch.js.map +1 -1
  58. package/dist/src/config/extensions/github_fetch.test.js +2 -0
  59. package/dist/src/config/extensions/github_fetch.test.js.map +1 -1
  60. package/dist/src/config/footerItems.d.ts +2 -2
  61. package/dist/src/config/footerItems.js +2 -2
  62. package/dist/src/config/footerItems.js.map +1 -1
  63. package/dist/src/config/footerItems.test.js +38 -0
  64. package/dist/src/config/footerItems.test.js.map +1 -1
  65. package/dist/src/config/policy-engine.integration.test.js +14 -5
  66. package/dist/src/config/policy-engine.integration.test.js.map +1 -1
  67. package/dist/src/config/settings.js +20 -11
  68. package/dist/src/config/settings.js.map +1 -1
  69. package/dist/src/config/settings.test.js +10 -4
  70. package/dist/src/config/settings.test.js.map +1 -1
  71. package/dist/src/config/settingsSchema.d.ts +142 -11
  72. package/dist/src/config/settingsSchema.js +135 -10
  73. package/dist/src/config/settingsSchema.js.map +1 -1
  74. package/dist/src/config/settingsSchema.test.js +28 -1
  75. package/dist/src/config/settingsSchema.test.js.map +1 -1
  76. package/dist/src/config/trustedFolders.d.ts +11 -54
  77. package/dist/src/config/trustedFolders.js +13 -267
  78. package/dist/src/config/trustedFolders.js.map +1 -1
  79. package/dist/src/config/trustedFolders.test.js +35 -31
  80. package/dist/src/config/trustedFolders.test.js.map +1 -1
  81. package/dist/src/gemini.d.ts +4 -0
  82. package/dist/src/gemini.js +61 -37
  83. package/dist/src/gemini.js.map +1 -1
  84. package/dist/src/gemini.test.js +15 -0
  85. package/dist/src/gemini.test.js.map +1 -1
  86. package/dist/src/gemini_cleanup.test.js +6 -0
  87. package/dist/src/gemini_cleanup.test.js.map +1 -1
  88. package/dist/src/generated/git-commit.d.ts +2 -2
  89. package/dist/src/generated/git-commit.js +2 -2
  90. package/dist/src/interactiveCli.js +48 -9
  91. package/dist/src/interactiveCli.js.map +1 -1
  92. package/dist/src/nonInteractiveCli.js +1 -1
  93. package/dist/src/nonInteractiveCli.js.map +1 -1
  94. package/dist/src/nonInteractiveCliAgentSession.js +6 -4
  95. package/dist/src/nonInteractiveCliAgentSession.js.map +1 -1
  96. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  97. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  98. package/dist/src/services/SkillCommandLoader.js +3 -1
  99. package/dist/src/services/SkillCommandLoader.js.map +1 -1
  100. package/dist/src/services/SkillCommandLoader.test.js +1 -1
  101. package/dist/src/services/SkillCommandLoader.test.js.map +1 -1
  102. package/dist/src/services/liteRtServerManager.d.ts +9 -0
  103. package/dist/src/services/liteRtServerManager.js +43 -0
  104. package/dist/src/services/liteRtServerManager.js.map +1 -0
  105. package/dist/src/services/liteRtServerManager.test.d.ts +6 -0
  106. package/dist/src/services/liteRtServerManager.test.js +54 -0
  107. package/dist/src/services/liteRtServerManager.test.js.map +1 -0
  108. package/dist/src/test-utils/mockConfig.js +4 -1
  109. package/dist/src/test-utils/mockConfig.js.map +1 -1
  110. package/dist/src/test-utils/render.d.ts +3 -1
  111. package/dist/src/test-utils/render.js +13 -3
  112. package/dist/src/test-utils/render.js.map +1 -1
  113. package/dist/src/ui/AppContainer.js +55 -33
  114. package/dist/src/ui/AppContainer.js.map +1 -1
  115. package/dist/src/ui/AppContainer.test.js +9 -4
  116. package/dist/src/ui/AppContainer.test.js.map +1 -1
  117. package/dist/src/ui/ToolConfirmationFullFrame.test.js +7 -9
  118. package/dist/src/ui/ToolConfirmationFullFrame.test.js.map +1 -1
  119. package/dist/src/ui/auth/ApiAuthDialog.js +1 -1
  120. package/dist/src/ui/auth/ApiAuthDialog.js.map +1 -1
  121. package/dist/src/ui/auth/ApiAuthDialog.test.js +15 -11
  122. package/dist/src/ui/auth/ApiAuthDialog.test.js.map +1 -1
  123. package/dist/src/ui/commands/bugCommand.js +2 -2
  124. package/dist/src/ui/commands/bugCommand.js.map +1 -1
  125. package/dist/src/ui/commands/bugCommand.test.js +3 -0
  126. package/dist/src/ui/commands/bugCommand.test.js.map +1 -1
  127. package/dist/src/ui/commands/clearCommand.js +3 -2
  128. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  129. package/dist/src/ui/commands/clearCommand.test.js +2 -1
  130. package/dist/src/ui/commands/clearCommand.test.js.map +1 -1
  131. package/dist/src/ui/commands/gemmaStatusCommand.d.ts +7 -0
  132. package/dist/src/ui/commands/gemmaStatusCommand.js +34 -0
  133. package/dist/src/ui/commands/gemmaStatusCommand.js.map +1 -0
  134. package/dist/src/ui/commands/memoryCommand.js +36 -0
  135. package/dist/src/ui/commands/memoryCommand.js.map +1 -1
  136. package/dist/src/ui/commands/memoryCommand.test.js +60 -0
  137. package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
  138. package/dist/src/ui/commands/settingsCommand.js +0 -1
  139. package/dist/src/ui/commands/settingsCommand.js.map +1 -1
  140. package/dist/src/ui/components/AppHeader.js +3 -2
  141. package/dist/src/ui/components/AppHeader.js.map +1 -1
  142. package/dist/src/ui/components/AppHeader.test.js +1 -1
  143. package/dist/src/ui/components/AppHeader.test.js.map +1 -1
  144. package/dist/src/ui/components/AsciiArt.d.ts +6 -6
  145. package/dist/src/ui/components/AsciiArt.js +6 -6
  146. package/dist/src/ui/components/AskUserDialog.js +19 -3
  147. package/dist/src/ui/components/AskUserDialog.js.map +1 -1
  148. package/dist/src/ui/components/CodiMascot.d.ts +6 -0
  149. package/dist/src/ui/components/CodiMascot.js +18 -0
  150. package/dist/src/ui/components/CodiMascot.js.map +1 -0
  151. package/dist/src/ui/components/Composer.test.js +12 -8
  152. package/dist/src/ui/components/Composer.test.js.map +1 -1
  153. package/dist/src/ui/components/DialogManager.js +10 -8
  154. package/dist/src/ui/components/DialogManager.js.map +1 -1
  155. package/dist/src/ui/components/DialogManager.test.js +11 -23
  156. package/dist/src/ui/components/DialogManager.test.js.map +1 -1
  157. package/dist/src/ui/components/ExitPlanModeDialog.js +1 -1
  158. package/dist/src/ui/components/ExitPlanModeDialog.js.map +1 -1
  159. package/dist/src/ui/components/ExitPlanModeDialog.test.js +4 -0
  160. package/dist/src/ui/components/ExitPlanModeDialog.test.js.map +1 -1
  161. package/dist/src/ui/components/Footer.js +5 -3
  162. package/dist/src/ui/components/Footer.js.map +1 -1
  163. package/dist/src/ui/components/Footer.test.js +21 -35
  164. package/dist/src/ui/components/Footer.test.js.map +1 -1
  165. package/dist/src/ui/components/FooterConfigDialog.js +8 -10
  166. package/dist/src/ui/components/FooterConfigDialog.js.map +1 -1
  167. package/dist/src/ui/components/FooterConfigDialog.test.js +1 -1
  168. package/dist/src/ui/components/FooterConfigDialog.test.js.map +1 -1
  169. package/dist/src/ui/components/HistoryItemDisplay.d.ts +0 -1
  170. package/dist/src/ui/components/HistoryItemDisplay.js +3 -10
  171. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  172. package/dist/src/ui/components/HistoryItemDisplay.test.js +4 -4
  173. package/dist/src/ui/components/HistoryItemDisplay.test.js.map +1 -1
  174. package/dist/src/ui/components/InputPrompt.js +6 -19
  175. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  176. package/dist/src/ui/components/InputPrompt.test.js +2 -119
  177. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  178. package/dist/src/ui/components/MainContent.js +4 -34
  179. package/dist/src/ui/components/MainContent.js.map +1 -1
  180. package/dist/src/ui/components/ModelDialog.test.js +1 -0
  181. package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
  182. package/dist/src/ui/components/SkillInboxDialog.d.ts +14 -0
  183. package/dist/src/ui/components/SkillInboxDialog.js +420 -0
  184. package/dist/src/ui/components/SkillInboxDialog.js.map +1 -0
  185. package/dist/src/ui/components/SkillInboxDialog.test.d.ts +6 -0
  186. package/dist/src/ui/components/SkillInboxDialog.test.js +467 -0
  187. package/dist/src/ui/components/SkillInboxDialog.test.js.map +1 -0
  188. package/dist/src/ui/components/ThemeDialog.js +4 -4
  189. package/dist/src/ui/components/ThemeDialog.js.map +1 -1
  190. package/dist/src/ui/components/ThemeDialog.test.js +1 -1
  191. package/dist/src/ui/components/ToolConfirmationQueue.js +1 -1
  192. package/dist/src/ui/components/ToolConfirmationQueue.js.map +1 -1
  193. package/dist/src/ui/components/ToolConfirmationQueue.test.js +32 -0
  194. package/dist/src/ui/components/ToolConfirmationQueue.test.js.map +1 -1
  195. package/dist/src/ui/components/messages/DenseToolMessage.js +4 -17
  196. package/dist/src/ui/components/messages/DenseToolMessage.js.map +1 -1
  197. package/dist/src/ui/components/messages/DenseToolMessage.test.js +29 -6
  198. package/dist/src/ui/components/messages/DenseToolMessage.test.js.map +1 -1
  199. package/dist/src/ui/components/messages/ToolGroupMessage.d.ts +0 -1
  200. package/dist/src/ui/components/messages/ToolGroupMessage.js +12 -51
  201. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  202. package/dist/src/ui/components/shared/BaseSelectionList.js +44 -27
  203. package/dist/src/ui/components/shared/BaseSelectionList.js.map +1 -1
  204. package/dist/src/ui/components/shared/BaseSelectionList.test.js +57 -1
  205. package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -1
  206. package/dist/src/ui/components/shared/HalfLinePaddedBox.js +7 -12
  207. package/dist/src/ui/components/shared/HalfLinePaddedBox.js.map +1 -1
  208. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.d.ts +0 -5
  209. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js +13 -5
  210. package/dist/src/ui/components/shared/HalfLinePaddedBox.test.js.map +1 -1
  211. package/dist/src/ui/components/shared/TextInput.js +11 -3
  212. package/dist/src/ui/components/shared/TextInput.js.map +1 -1
  213. package/dist/src/ui/components/shared/TextInput.test.js +17 -0
  214. package/dist/src/ui/components/shared/TextInput.test.js.map +1 -1
  215. package/dist/src/ui/components/views/GemmaStatus.d.ts +10 -0
  216. package/dist/src/ui/components/views/GemmaStatus.js +11 -0
  217. package/dist/src/ui/components/views/GemmaStatus.js.map +1 -0
  218. package/dist/src/ui/contexts/QuotaContext.d.ts +18 -0
  219. package/dist/src/ui/contexts/QuotaContext.js +15 -0
  220. package/dist/src/ui/contexts/QuotaContext.js.map +1 -0
  221. package/dist/src/ui/contexts/ScrollProvider.js +59 -18
  222. package/dist/src/ui/contexts/ScrollProvider.js.map +1 -1
  223. package/dist/src/ui/contexts/SessionContext.d.ts +1 -0
  224. package/dist/src/ui/contexts/SessionContext.js +2 -2
  225. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  226. package/dist/src/ui/contexts/SessionContext.test.js +4 -4
  227. package/dist/src/ui/contexts/SessionContext.test.js.map +1 -1
  228. package/dist/src/ui/contexts/UIStateContext.d.ts +2 -11
  229. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  230. package/dist/src/ui/hooks/atCommandProcessor.js +1 -1
  231. package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
  232. package/dist/src/ui/hooks/slashCommandProcessor.js +8 -5
  233. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  234. package/dist/src/ui/hooks/slashCommandProcessor.test.js +40 -0
  235. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
  236. package/dist/src/ui/hooks/useAgentStream.d.ts +44 -0
  237. package/dist/src/ui/hooks/useAgentStream.js +377 -0
  238. package/dist/src/ui/hooks/useAgentStream.js.map +1 -0
  239. package/dist/src/ui/hooks/useAgentStream.test.d.ts +6 -0
  240. package/dist/src/ui/hooks/useAgentStream.test.js +161 -0
  241. package/dist/src/ui/hooks/useAgentStream.test.js.map +1 -0
  242. package/dist/src/ui/hooks/useAtCompletion.js +24 -5
  243. package/dist/src/ui/hooks/useAtCompletion.js.map +1 -1
  244. package/dist/src/ui/hooks/useAtCompletion.test.js +25 -0
  245. package/dist/src/ui/hooks/useAtCompletion.test.js.map +1 -1
  246. package/dist/src/ui/hooks/useComposerStatus.js +4 -2
  247. package/dist/src/ui/hooks/useComposerStatus.js.map +1 -1
  248. package/dist/src/ui/hooks/useExecutionLifecycle.js +27 -16
  249. package/dist/src/ui/hooks/useExecutionLifecycle.js.map +1 -1
  250. package/dist/src/ui/hooks/useExecutionLifecycle.test.js +38 -9
  251. package/dist/src/ui/hooks/useExecutionLifecycle.test.js.map +1 -1
  252. package/dist/src/ui/hooks/useGeminiStream.js +8 -32
  253. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  254. package/dist/src/ui/hooks/useLogger.d.ts +2 -2
  255. package/dist/src/ui/hooks/useLogger.js +6 -11
  256. package/dist/src/ui/hooks/useLogger.js.map +1 -1
  257. package/dist/src/ui/hooks/useLogger.test.js +4 -17
  258. package/dist/src/ui/hooks/useLogger.test.js.map +1 -1
  259. package/dist/src/ui/hooks/useRunEventNotifications.d.ts +3 -1
  260. package/dist/src/ui/hooks/useRunEventNotifications.js +5 -3
  261. package/dist/src/ui/hooks/useRunEventNotifications.js.map +1 -1
  262. package/dist/src/ui/hooks/useSessionBrowser.js +5 -4
  263. package/dist/src/ui/hooks/useSessionBrowser.js.map +1 -1
  264. package/dist/src/ui/hooks/useSessionBrowser.test.js +6 -7
  265. package/dist/src/ui/hooks/useSessionBrowser.test.js.map +1 -1
  266. package/dist/src/ui/hooks/useShellInactivityStatus.d.ts +2 -2
  267. package/dist/src/ui/hooks/useShellInactivityStatus.js +1 -2
  268. package/dist/src/ui/hooks/useShellInactivityStatus.js.map +1 -1
  269. package/dist/src/ui/hooks/useToolScheduler.d.ts +3 -2
  270. package/dist/src/ui/hooks/useToolScheduler.js +4 -3
  271. package/dist/src/ui/hooks/useToolScheduler.js.map +1 -1
  272. package/dist/src/ui/hooks/useTurnActivityMonitor.d.ts +6 -2
  273. package/dist/src/ui/hooks/useTurnActivityMonitor.js +1 -2
  274. package/dist/src/ui/hooks/useTurnActivityMonitor.js.map +1 -1
  275. package/dist/src/ui/key/keyBindings.js +5 -2
  276. package/dist/src/ui/key/keyBindings.js.map +1 -1
  277. package/dist/src/ui/themes/builtin/dark/github-dark-colorblind.d.ts +7 -0
  278. package/dist/src/ui/themes/builtin/dark/github-dark-colorblind.js +140 -0
  279. package/dist/src/ui/themes/builtin/dark/github-dark-colorblind.js.map +1 -0
  280. package/dist/src/ui/themes/builtin/light/github-light-colorblind.d.ts +7 -0
  281. package/dist/src/ui/themes/builtin/light/github-light-colorblind.js +140 -0
  282. package/dist/src/ui/themes/builtin/light/github-light-colorblind.js.map +1 -0
  283. package/dist/src/ui/themes/theme-manager.js +4 -0
  284. package/dist/src/ui/themes/theme-manager.js.map +1 -1
  285. package/dist/src/ui/types.d.ts +16 -2
  286. package/dist/src/ui/types.js +1 -0
  287. package/dist/src/ui/types.js.map +1 -1
  288. package/dist/src/ui/utils/borderStyles.d.ts +2 -2
  289. package/dist/src/ui/utils/borderStyles.js.map +1 -1
  290. package/dist/src/ui/utils/confirmingTool.js +5 -4
  291. package/dist/src/ui/utils/confirmingTool.js.map +1 -1
  292. package/dist/src/ui/utils/historyUtils.d.ts +5 -0
  293. package/dist/src/ui/utils/historyUtils.js +15 -0
  294. package/dist/src/ui/utils/historyUtils.js.map +1 -1
  295. package/dist/src/ui/utils/terminalCapabilityManager.d.ts +7 -2
  296. package/dist/src/ui/utils/terminalCapabilityManager.js +23 -16
  297. package/dist/src/ui/utils/terminalCapabilityManager.js.map +1 -1
  298. package/dist/src/ui/utils/terminalCapabilityManager.test.js +86 -65
  299. package/dist/src/ui/utils/terminalCapabilityManager.test.js.map +1 -1
  300. package/dist/src/ui/utils/textUtils.d.ts +10 -2
  301. package/dist/src/ui/utils/textUtils.js +18 -9
  302. package/dist/src/ui/utils/textUtils.js.map +1 -1
  303. package/dist/src/ui/utils/textUtils.test.js +14 -0
  304. package/dist/src/ui/utils/textUtils.test.js.map +1 -1
  305. package/dist/src/utils/autoMemory.d.ts +7 -0
  306. package/dist/src/utils/autoMemory.js +15 -0
  307. package/dist/src/utils/autoMemory.js.map +1 -0
  308. package/dist/src/utils/cleanup.d.ts +2 -0
  309. package/dist/src/utils/cleanup.js +12 -0
  310. package/dist/src/utils/cleanup.js.map +1 -1
  311. package/dist/src/utils/devtoolsService.d.ts +2 -2
  312. package/dist/src/utils/devtoolsService.js +3 -17
  313. package/dist/src/utils/devtoolsService.js.map +1 -1
  314. package/dist/src/utils/devtoolsService.test.js +8 -37
  315. package/dist/src/utils/devtoolsService.test.js.map +1 -1
  316. package/dist/src/utils/handleAutoUpdate.test.js +2 -2
  317. package/dist/src/utils/sandbox.js +10 -2
  318. package/dist/src/utils/sandbox.js.map +1 -1
  319. package/dist/src/utils/sandbox.test.js +54 -1
  320. package/dist/src/utils/sandbox.test.js.map +1 -1
  321. package/dist/src/utils/sessionUtils.d.ts +3 -3
  322. package/dist/src/utils/sessionUtils.js +26 -19
  323. package/dist/src/utils/sessionUtils.js.map +1 -1
  324. package/dist/src/utils/sessionUtils.test.js +16 -22
  325. package/dist/src/utils/sessionUtils.test.js.map +1 -1
  326. package/dist/src/utils/sessions.js +2 -2
  327. package/dist/src/utils/sessions.js.map +1 -1
  328. package/dist/src/utils/terminalNotifications.d.ts +8 -1
  329. package/dist/src/utils/terminalNotifications.js +73 -17
  330. package/dist/src/utils/terminalNotifications.js.map +1 -1
  331. package/dist/src/utils/terminalNotifications.test.js +125 -31
  332. package/dist/src/utils/terminalNotifications.test.js.map +1 -1
  333. package/dist/src/utils/userStartupWarnings.js +21 -1
  334. package/dist/src/utils/userStartupWarnings.js.map +1 -1
  335. package/dist/src/utils/userStartupWarnings.test.js +34 -0
  336. package/dist/src/utils/userStartupWarnings.test.js.map +1 -1
  337. package/dist/tsconfig.tsbuildinfo +1 -1
  338. package/package.json +4 -4
@@ -0,0 +1,154 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import fs from 'node:fs';
7
+ import { spawn } from 'node:child_process';
8
+ import { debugLogger } from '@google/gemini-cli-core';
9
+ import { exitCli } from '../utils.js';
10
+ import { getLogFilePath } from './constants.js';
11
+ export async function readLastLines(filePath, count) {
12
+ if (count <= 0) {
13
+ return '';
14
+ }
15
+ const CHUNK_SIZE = 64 * 1024;
16
+ const fileHandle = await fs.promises.open(filePath, fs.constants.O_RDONLY);
17
+ try {
18
+ const stats = await fileHandle.stat();
19
+ if (stats.size === 0) {
20
+ return '';
21
+ }
22
+ const chunks = [];
23
+ let totalBytes = 0;
24
+ let newlineCount = 0;
25
+ let position = stats.size;
26
+ while (position > 0 && newlineCount <= count) {
27
+ const readSize = Math.min(CHUNK_SIZE, position);
28
+ position -= readSize;
29
+ const buffer = Buffer.allocUnsafe(readSize);
30
+ const { bytesRead } = await fileHandle.read(buffer, 0, readSize, position);
31
+ if (bytesRead === 0) {
32
+ break;
33
+ }
34
+ const chunk = bytesRead === readSize ? buffer : buffer.subarray(0, bytesRead);
35
+ chunks.unshift(chunk);
36
+ totalBytes += chunk.length;
37
+ for (const byte of chunk) {
38
+ if (byte === 0x0a) {
39
+ newlineCount += 1;
40
+ }
41
+ }
42
+ }
43
+ const content = Buffer.concat(chunks, totalBytes).toString('utf-8');
44
+ const lines = content.split('\n');
45
+ if (position > 0 && lines.length > 0) {
46
+ const boundary = Buffer.allocUnsafe(1);
47
+ const { bytesRead } = await fileHandle.read(boundary, 0, 1, position - 1);
48
+ if (bytesRead === 1 && boundary[0] !== 0x0a) {
49
+ lines.shift();
50
+ }
51
+ }
52
+ if (lines.length > 0 && lines[lines.length - 1] === '') {
53
+ lines.pop();
54
+ }
55
+ if (lines.length === 0) {
56
+ return '';
57
+ }
58
+ return lines.slice(-count).join('\n') + '\n';
59
+ }
60
+ finally {
61
+ await fileHandle.close();
62
+ }
63
+ }
64
+ function waitForChild(child) {
65
+ return new Promise((resolve, reject) => {
66
+ child.once('error', reject);
67
+ child.once('close', (code) => resolve(code ?? 1));
68
+ });
69
+ }
70
+ async function runTail(logPath, lines, follow) {
71
+ const tailArgs = follow
72
+ ? ['-f', '-n', String(lines), logPath]
73
+ : ['-n', String(lines), logPath];
74
+ const child = spawn('tail', tailArgs, { stdio: 'inherit' });
75
+ if (!follow) {
76
+ return waitForChild(child);
77
+ }
78
+ const handleSigint = () => {
79
+ child.kill('SIGTERM');
80
+ };
81
+ process.once('SIGINT', handleSigint);
82
+ try {
83
+ return await waitForChild(child);
84
+ }
85
+ finally {
86
+ process.off('SIGINT', handleSigint);
87
+ }
88
+ }
89
+ export const logsCommand = {
90
+ command: 'logs',
91
+ describe: 'View LiteRT-LM server logs',
92
+ builder: (yargs) => yargs
93
+ .option('lines', {
94
+ alias: 'n',
95
+ type: 'number',
96
+ description: 'Show the last N lines and exit (omit to follow live)',
97
+ })
98
+ .option('follow', {
99
+ alias: 'f',
100
+ type: 'boolean',
101
+ description: 'Follow log output (defaults to true when --lines is omitted)',
102
+ }),
103
+ handler: async (argv) => {
104
+ const logPath = getLogFilePath();
105
+ try {
106
+ await fs.promises.access(logPath, fs.constants.F_OK);
107
+ }
108
+ catch {
109
+ debugLogger.log(`No log file found at ${logPath}`);
110
+ debugLogger.log('Is the LiteRT server running? Start it with: gemini gemma start');
111
+ await exitCli(1);
112
+ return;
113
+ }
114
+ const lines = argv.lines;
115
+ const follow = argv.follow ?? lines === undefined;
116
+ const requestedLines = lines ?? 20;
117
+ if (follow && process.platform === 'win32') {
118
+ debugLogger.log('Live log following is not supported on Windows. Use --lines N to view recent logs.');
119
+ await exitCli(1);
120
+ return;
121
+ }
122
+ if (process.platform === 'win32') {
123
+ process.stdout.write(await readLastLines(logPath, requestedLines));
124
+ await exitCli(0);
125
+ return;
126
+ }
127
+ try {
128
+ if (follow) {
129
+ debugLogger.log(`Tailing ${logPath} (Ctrl+C to stop)\n`);
130
+ }
131
+ const exitCode = await runTail(logPath, requestedLines, follow);
132
+ await exitCli(exitCode);
133
+ }
134
+ catch (error) {
135
+ if (error instanceof Error &&
136
+ 'code' in error &&
137
+ error.code === 'ENOENT') {
138
+ if (!follow) {
139
+ process.stdout.write(await readLastLines(logPath, requestedLines));
140
+ await exitCli(0);
141
+ }
142
+ else {
143
+ debugLogger.error('"tail" command not found. Use --lines N to view recent logs without tail.');
144
+ await exitCli(1);
145
+ }
146
+ }
147
+ else {
148
+ debugLogger.error(`Failed to read log output: ${error instanceof Error ? error.message : String(error)}`);
149
+ await exitCli(1);
150
+ }
151
+ }
152
+ },
153
+ };
154
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../../src/commands/gemma/logs.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,122 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import fs from 'node:fs';
7
+ import { EventEmitter } from 'node:events';
8
+ import os from 'node:os';
9
+ import path from 'node:path';
10
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
11
+ import { spawn } from 'node:child_process';
12
+ import { exitCli } from '../utils.js';
13
+ import { getLogFilePath } from './constants.js';
14
+ import { logsCommand, readLastLines } from './logs.js';
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('node:child_process', async (importOriginal) => {
22
+ const actual = await importOriginal();
23
+ return {
24
+ ...actual,
25
+ spawn: vi.fn(),
26
+ };
27
+ });
28
+ vi.mock('../utils.js', () => ({
29
+ exitCli: vi.fn(),
30
+ }));
31
+ vi.mock('./constants.js', () => ({
32
+ getLogFilePath: vi.fn(),
33
+ }));
34
+ function createMockChild() {
35
+ return Object.assign(new EventEmitter(), {
36
+ kill: vi.fn(),
37
+ });
38
+ }
39
+ async function flushMicrotasks() {
40
+ await Promise.resolve();
41
+ await Promise.resolve();
42
+ }
43
+ describe('readLastLines', () => {
44
+ const tempFiles = [];
45
+ afterEach(async () => {
46
+ await Promise.all(tempFiles
47
+ .splice(0)
48
+ .map((filePath) => fs.promises.rm(filePath, { force: true })));
49
+ });
50
+ it('returns only the requested tail lines without reading the whole file eagerly', async () => {
51
+ const filePath = path.join(os.tmpdir(), `gemma-logs-${Date.now()}-${Math.random().toString(36).slice(2)}.log`);
52
+ tempFiles.push(filePath);
53
+ const content = Array.from({ length: 2000 }, (_, i) => `line-${i + 1}`)
54
+ .join('\n')
55
+ .concat('\n');
56
+ await fs.promises.writeFile(filePath, content, 'utf-8');
57
+ await expect(readLastLines(filePath, 3)).resolves.toBe('line-1998\nline-1999\nline-2000\n');
58
+ });
59
+ it('returns an empty string when zero lines are requested', async () => {
60
+ const filePath = path.join(os.tmpdir(), `gemma-logs-${Date.now()}-${Math.random().toString(36).slice(2)}.log`);
61
+ tempFiles.push(filePath);
62
+ await fs.promises.writeFile(filePath, 'line-1\nline-2\n', 'utf-8');
63
+ await expect(readLastLines(filePath, 0)).resolves.toBe('');
64
+ });
65
+ });
66
+ describe('logsCommand', () => {
67
+ const originalPlatform = process.platform;
68
+ beforeEach(() => {
69
+ vi.clearAllMocks();
70
+ Object.defineProperty(process, 'platform', {
71
+ value: 'linux',
72
+ configurable: true,
73
+ });
74
+ vi.mocked(getLogFilePath).mockReturnValue('/tmp/gemma.log');
75
+ vi.spyOn(fs.promises, 'access').mockResolvedValue(undefined);
76
+ });
77
+ afterEach(() => {
78
+ Object.defineProperty(process, 'platform', {
79
+ value: originalPlatform,
80
+ configurable: true,
81
+ });
82
+ vi.restoreAllMocks();
83
+ });
84
+ it('waits for the tail process to close before exiting in follow mode', async () => {
85
+ const child = createMockChild();
86
+ vi.mocked(spawn).mockReturnValue(child);
87
+ let resolved = false;
88
+ const handlerPromise = logsCommand.handler({}).then(() => {
89
+ resolved = true;
90
+ });
91
+ await flushMicrotasks();
92
+ expect(spawn).toHaveBeenCalledWith('tail', ['-f', '-n', '20', '/tmp/gemma.log'], { stdio: 'inherit' });
93
+ expect(resolved).toBe(false);
94
+ expect(exitCli).not.toHaveBeenCalled();
95
+ child.emit('close', 0);
96
+ await handlerPromise;
97
+ expect(exitCli).toHaveBeenCalledWith(0);
98
+ });
99
+ it('uses one-shot tail output when follow is disabled', async () => {
100
+ const child = createMockChild();
101
+ vi.mocked(spawn).mockReturnValue(child);
102
+ const handlerPromise = logsCommand.handler({ follow: false });
103
+ await flushMicrotasks();
104
+ expect(spawn).toHaveBeenCalledWith('tail', ['-n', '20', '/tmp/gemma.log'], {
105
+ stdio: 'inherit',
106
+ });
107
+ child.emit('close', 0);
108
+ await handlerPromise;
109
+ expect(exitCli).toHaveBeenCalledWith(0);
110
+ });
111
+ it('follows from the requested line count when both --lines and --follow are set', async () => {
112
+ const child = createMockChild();
113
+ vi.mocked(spawn).mockReturnValue(child);
114
+ const handlerPromise = logsCommand.handler({ lines: 5, follow: true });
115
+ await flushMicrotasks();
116
+ expect(spawn).toHaveBeenCalledWith('tail', ['-f', '-n', '5', '/tmp/gemma.log'], { stdio: 'inherit' });
117
+ child.emit('close', 0);
118
+ await handlerPromise;
119
+ expect(exitCli).toHaveBeenCalledWith(0);
120
+ });
121
+ });
122
+ //# sourceMappingURL=logs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.test.js","sourceRoot":"","sources":["../../../../src/commands/gemma/logs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export interface PlatformInfo {
7
+ key: string;
8
+ binaryName: string;
9
+ }
10
+ export interface GemmaConfigStatus {
11
+ settingsEnabled: boolean;
12
+ configuredPort: number;
13
+ configuredBinaryPath?: string;
14
+ }
15
+ export interface LiteRtServerProcessInfo {
16
+ pid: number;
17
+ binaryPath?: string;
18
+ port?: number;
19
+ }
20
+ export declare function resolveGemmaConfig(fallbackPort: number): GemmaConfigStatus;
21
+ export declare function detectPlatform(): PlatformInfo | null;
22
+ export declare function getBinaryPath(binaryName?: string): string | null;
23
+ export declare function getBinaryDownloadUrl(binaryName: string): string;
24
+ export declare function isBinaryInstalled(binaryPath?: string | null): boolean;
25
+ export declare function isModelDownloaded(binaryPath: string): boolean;
26
+ export declare function isServerRunning(port: number): Promise<boolean>;
27
+ export declare function readServerProcessInfo(): LiteRtServerProcessInfo | null;
28
+ export declare function writeServerProcessInfo(processInfo: LiteRtServerProcessInfo): void;
29
+ export declare function readServerPid(): number | null;
30
+ export declare function isExpectedLiteRtServerCommand(commandLine: string, options: {
31
+ binaryPath?: string | null;
32
+ port?: number;
33
+ }): boolean;
34
+ export declare function isExpectedLiteRtServerProcess(pid: number, options: {
35
+ binaryPath?: string | null;
36
+ port?: number;
37
+ }): boolean;
38
+ export declare function isProcessRunning(pid: number): boolean;
@@ -0,0 +1,220 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { loadSettings, SettingScope } from '../../config/settings.js';
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import { execFileSync } from 'node:child_process';
10
+ import { PLATFORM_BINARY_MAP, LITERT_RELEASE_BASE_URL, LITERT_RELEASE_VERSION, getLiteRtBinDir, GEMMA_MODEL_NAME, HEALTH_CHECK_TIMEOUT_MS, LITERT_API_VERSION, getPidFilePath, } from './constants.js';
11
+ function getUserConfiguredBinaryPath(workspaceDir = process.cwd()) {
12
+ try {
13
+ const userGemmaSettings = loadSettings(workspaceDir).forScope(SettingScope.User).settings.experimental?.gemmaModelRouter;
14
+ return userGemmaSettings?.binaryPath?.trim() || undefined;
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ }
20
+ function parsePortFromHost(host, fallbackPort) {
21
+ if (!host) {
22
+ return fallbackPort;
23
+ }
24
+ try {
25
+ const url = new URL(host);
26
+ const port = Number(url.port);
27
+ return Number.isFinite(port) && port > 0 ? port : fallbackPort;
28
+ }
29
+ catch {
30
+ const match = host.match(/:(\d+)/);
31
+ if (!match) {
32
+ return fallbackPort;
33
+ }
34
+ const port = parseInt(match[1], 10);
35
+ return Number.isFinite(port) && port > 0 ? port : fallbackPort;
36
+ }
37
+ }
38
+ export function resolveGemmaConfig(fallbackPort) {
39
+ let settingsEnabled = false;
40
+ let configuredPort = fallbackPort;
41
+ const configuredBinaryPath = getUserConfiguredBinaryPath();
42
+ try {
43
+ const settings = loadSettings(process.cwd());
44
+ const gemmaSettings = settings.merged.experimental?.gemmaModelRouter;
45
+ settingsEnabled = gemmaSettings?.enabled === true;
46
+ configuredPort = parsePortFromHost(gemmaSettings?.classifier?.host, fallbackPort);
47
+ }
48
+ catch {
49
+ // ignore — settings may fail to load outside a workspace
50
+ }
51
+ return { settingsEnabled, configuredPort, configuredBinaryPath };
52
+ }
53
+ export function detectPlatform() {
54
+ const key = `${process.platform}-${process.arch}`;
55
+ const binaryName = PLATFORM_BINARY_MAP[key];
56
+ if (!binaryName) {
57
+ return null;
58
+ }
59
+ return { key, binaryName };
60
+ }
61
+ export function getBinaryPath(binaryName) {
62
+ const configuredBinaryPath = getUserConfiguredBinaryPath();
63
+ if (configuredBinaryPath) {
64
+ return configuredBinaryPath;
65
+ }
66
+ const name = binaryName ?? detectPlatform()?.binaryName;
67
+ if (!name)
68
+ return null;
69
+ return path.join(getLiteRtBinDir(), name);
70
+ }
71
+ export function getBinaryDownloadUrl(binaryName) {
72
+ return `${LITERT_RELEASE_BASE_URL}/${LITERT_RELEASE_VERSION}/${binaryName}`;
73
+ }
74
+ export function isBinaryInstalled(binaryPath = getBinaryPath()) {
75
+ if (!binaryPath)
76
+ return false;
77
+ return fs.existsSync(binaryPath);
78
+ }
79
+ export function isModelDownloaded(binaryPath) {
80
+ try {
81
+ const output = execFileSync(binaryPath, ['list'], {
82
+ encoding: 'utf-8',
83
+ timeout: 10000,
84
+ });
85
+ return output.includes(GEMMA_MODEL_NAME);
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ export async function isServerRunning(port) {
92
+ try {
93
+ const controller = new AbortController();
94
+ const timeout = setTimeout(() => controller.abort(), HEALTH_CHECK_TIMEOUT_MS);
95
+ const response = await fetch(`http://localhost:${port}/${LITERT_API_VERSION}/models/${GEMMA_MODEL_NAME}:generateContent`, { method: 'POST', signal: controller.signal });
96
+ clearTimeout(timeout);
97
+ // A 400 (bad request) confirms the route exists — the server recognises
98
+ // the model endpoint. Only a 404 means "wrong server / wrong model".
99
+ return response.status !== 404;
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
105
+ function isLiteRtServerProcessInfo(value) {
106
+ if (!value || typeof value !== 'object') {
107
+ return false;
108
+ }
109
+ const isPositiveInteger = (candidate) => typeof candidate === 'number' &&
110
+ Number.isInteger(candidate) &&
111
+ candidate > 0;
112
+ const isNonEmptyString = (candidate) => typeof candidate === 'string' && candidate.length > 0;
113
+ const pid = Object.getOwnPropertyDescriptor(value, 'pid')?.value;
114
+ if (!isPositiveInteger(pid)) {
115
+ return false;
116
+ }
117
+ const binaryPath = Object.getOwnPropertyDescriptor(value, 'binaryPath')?.value;
118
+ if (binaryPath !== undefined && !isNonEmptyString(binaryPath)) {
119
+ return false;
120
+ }
121
+ const port = Object.getOwnPropertyDescriptor(value, 'port')?.value;
122
+ if (port !== undefined && !isPositiveInteger(port)) {
123
+ return false;
124
+ }
125
+ return true;
126
+ }
127
+ export function readServerProcessInfo() {
128
+ const pidPath = getPidFilePath();
129
+ try {
130
+ const content = fs.readFileSync(pidPath, 'utf-8').trim();
131
+ if (!content) {
132
+ return null;
133
+ }
134
+ if (/^\d+$/.test(content)) {
135
+ return { pid: parseInt(content, 10) };
136
+ }
137
+ const parsed = JSON.parse(content);
138
+ return isLiteRtServerProcessInfo(parsed) ? parsed : null;
139
+ }
140
+ catch {
141
+ return null;
142
+ }
143
+ }
144
+ export function writeServerProcessInfo(processInfo) {
145
+ fs.writeFileSync(getPidFilePath(), JSON.stringify(processInfo), 'utf-8');
146
+ }
147
+ export function readServerPid() {
148
+ return readServerProcessInfo()?.pid ?? null;
149
+ }
150
+ function normalizeProcessValue(value) {
151
+ const normalized = value.replace(/\0/g, ' ').trim();
152
+ if (process.platform === 'win32') {
153
+ return normalized.replace(/\\/g, '/').replace(/\s+/g, ' ').toLowerCase();
154
+ }
155
+ return normalized.replace(/\s+/g, ' ');
156
+ }
157
+ function readProcessCommandLine(pid) {
158
+ try {
159
+ if (process.platform === 'linux') {
160
+ const output = fs.readFileSync(`/proc/${pid}/cmdline`, 'utf-8');
161
+ return output.trim() ? output : null;
162
+ }
163
+ if (process.platform === 'win32') {
164
+ const output = execFileSync('powershell.exe', [
165
+ '-NoProfile',
166
+ '-Command',
167
+ `(Get-CimInstance Win32_Process -Filter "ProcessId = ${pid}").CommandLine`,
168
+ ], {
169
+ encoding: 'utf-8',
170
+ timeout: 5000,
171
+ });
172
+ return output.trim() || null;
173
+ }
174
+ const output = execFileSync('ps', ['-p', String(pid), '-o', 'command='], {
175
+ encoding: 'utf-8',
176
+ timeout: 5000,
177
+ });
178
+ return output.trim() || null;
179
+ }
180
+ catch {
181
+ return null;
182
+ }
183
+ }
184
+ export function isExpectedLiteRtServerCommand(commandLine, options) {
185
+ const normalizedCommandLine = normalizeProcessValue(commandLine);
186
+ if (!normalizedCommandLine) {
187
+ return false;
188
+ }
189
+ if (!/(^|\s|")serve(\s|$)/.test(normalizedCommandLine)) {
190
+ return false;
191
+ }
192
+ if (options.port !== undefined &&
193
+ !normalizedCommandLine.includes(`--port=${options.port}`)) {
194
+ return false;
195
+ }
196
+ if (!options.binaryPath) {
197
+ return true;
198
+ }
199
+ const normalizedBinaryPath = normalizeProcessValue(options.binaryPath);
200
+ const normalizedBinaryName = normalizeProcessValue(path.basename(options.binaryPath));
201
+ return (normalizedCommandLine.includes(normalizedBinaryPath) ||
202
+ normalizedCommandLine.includes(normalizedBinaryName));
203
+ }
204
+ export function isExpectedLiteRtServerProcess(pid, options) {
205
+ const commandLine = readProcessCommandLine(pid);
206
+ if (!commandLine) {
207
+ return false;
208
+ }
209
+ return isExpectedLiteRtServerCommand(commandLine, options);
210
+ }
211
+ export function isProcessRunning(pid) {
212
+ try {
213
+ process.kill(pid, 0);
214
+ return true;
215
+ }
216
+ catch {
217
+ return false;
218
+ }
219
+ }
220
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../../src/commands/gemma/platform.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 {};