@office-ai/aioncli-core 0.30.0 → 0.30.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/dist/docs/assets/theme-ansi-dark.png +0 -0
  2. package/dist/docs/assets/theme-atom-one-dark.png +0 -0
  3. package/dist/docs/assets/theme-ayu-dark.png +0 -0
  4. package/dist/docs/assets/theme-default-dark.png +0 -0
  5. package/dist/docs/assets/theme-dracula-dark.png +0 -0
  6. package/dist/docs/assets/theme-github-dark.png +0 -0
  7. package/dist/docs/assets/theme-holiday-dark.png +0 -0
  8. package/dist/docs/assets/theme-shades-of-purple-dark.png +0 -0
  9. package/dist/docs/assets/theme-solarized-dark.png +0 -0
  10. package/dist/docs/assets/theme-solarized-light.png +0 -0
  11. package/dist/docs/cli/notifications.md +58 -0
  12. package/dist/docs/redirects.json +20 -0
  13. package/dist/docs/reference/commands.md +563 -0
  14. package/dist/docs/reference/configuration.md +1804 -0
  15. package/dist/docs/reference/keyboard-shortcuts.md +168 -0
  16. package/dist/docs/reference/memport.md +246 -0
  17. package/dist/docs/reference/policy-engine.md +386 -0
  18. package/dist/docs/reference/tools.md +106 -0
  19. package/dist/docs/resources/faq.md +175 -0
  20. package/dist/docs/resources/quota-and-pricing.md +199 -0
  21. package/dist/docs/resources/tos-privacy.md +102 -0
  22. package/dist/docs/resources/troubleshooting.md +176 -0
  23. package/dist/docs/resources/uninstall.md +56 -0
  24. package/dist/src/agents/a2a-errors.d.ts +65 -0
  25. package/dist/src/agents/a2a-errors.js +164 -0
  26. package/dist/src/agents/a2a-errors.js.map +1 -0
  27. package/dist/src/agents/a2a-errors.test.d.ts +6 -0
  28. package/dist/src/agents/a2a-errors.test.js +183 -0
  29. package/dist/src/agents/a2a-errors.test.js.map +1 -0
  30. package/dist/src/agents/auth-provider/api-key-provider.d.ts +30 -0
  31. package/dist/src/agents/auth-provider/api-key-provider.js +66 -0
  32. package/dist/src/agents/auth-provider/api-key-provider.js.map +1 -0
  33. package/dist/src/agents/auth-provider/api-key-provider.test.d.ts +6 -0
  34. package/dist/src/agents/auth-provider/api-key-provider.test.js +130 -0
  35. package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -0
  36. package/dist/src/agents/auth-provider/http-provider.d.ts +28 -0
  37. package/dist/src/agents/auth-provider/http-provider.js +73 -0
  38. package/dist/src/agents/auth-provider/http-provider.js.map +1 -0
  39. package/dist/src/agents/auth-provider/http-provider.test.d.ts +6 -0
  40. package/dist/src/agents/auth-provider/http-provider.test.js +112 -0
  41. package/dist/src/agents/auth-provider/http-provider.test.js.map +1 -0
  42. package/dist/src/agents/auth-provider/oauth2-provider.d.ts +65 -0
  43. package/dist/src/agents/auth-provider/oauth2-provider.js +233 -0
  44. package/dist/src/agents/auth-provider/oauth2-provider.js.map +1 -0
  45. package/dist/src/agents/auth-provider/oauth2-provider.test.d.ts +6 -0
  46. package/dist/src/agents/auth-provider/oauth2-provider.test.js +490 -0
  47. package/dist/src/agents/auth-provider/oauth2-provider.test.js.map +1 -0
  48. package/dist/src/agents/browser/analyzeScreenshot.d.ts +35 -0
  49. package/dist/src/agents/browser/analyzeScreenshot.js +183 -0
  50. package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -0
  51. package/dist/src/agents/browser/analyzeScreenshot.test.d.ts +6 -0
  52. package/dist/src/agents/browser/analyzeScreenshot.test.js +161 -0
  53. package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -0
  54. package/dist/src/agents/browser/automationOverlay.d.ts +26 -0
  55. package/dist/src/agents/browser/automationOverlay.js +100 -0
  56. package/dist/src/agents/browser/automationOverlay.js.map +1 -0
  57. package/dist/src/agents/browser/browserAgentDefinition.d.ts +50 -0
  58. package/dist/src/agents/browser/browserAgentDefinition.js +141 -0
  59. package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -0
  60. package/dist/src/agents/browser/browserAgentFactory.d.ts +42 -0
  61. package/dist/src/agents/browser/browserAgentFactory.js +116 -0
  62. package/dist/src/agents/browser/browserAgentFactory.js.map +1 -0
  63. package/dist/src/agents/browser/browserAgentFactory.test.d.ts +6 -0
  64. package/dist/src/agents/browser/browserAgentFactory.test.js +240 -0
  65. package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -0
  66. package/dist/src/agents/browser/browserAgentInvocation.d.ts +34 -0
  67. package/dist/src/agents/browser/browserAgentInvocation.js +386 -0
  68. package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -0
  69. package/dist/src/agents/browser/browserAgentInvocation.test.d.ts +6 -0
  70. package/dist/src/agents/browser/browserAgentInvocation.test.js +382 -0
  71. package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -0
  72. package/dist/src/agents/browser/browserManager.d.ts +115 -0
  73. package/dist/src/agents/browser/browserManager.js +370 -0
  74. package/dist/src/agents/browser/browserManager.js.map +1 -0
  75. package/dist/src/agents/browser/browserManager.test.d.ts +6 -0
  76. package/dist/src/agents/browser/browserManager.test.js +382 -0
  77. package/dist/src/agents/browser/browserManager.test.js.map +1 -0
  78. package/dist/src/agents/browser/mcpToolWrapper.d.ts +45 -0
  79. package/dist/src/agents/browser/mcpToolWrapper.js +358 -0
  80. package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -0
  81. package/dist/src/agents/browser/mcpToolWrapper.test.d.ts +6 -0
  82. package/dist/src/agents/browser/mcpToolWrapper.test.js +126 -0
  83. package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -0
  84. package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.d.ts +6 -0
  85. package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js +59 -0
  86. package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js.map +1 -0
  87. package/dist/src/agents/browser/modelAvailability.d.ts +23 -0
  88. package/dist/src/agents/browser/modelAvailability.js +23 -0
  89. package/dist/src/agents/browser/modelAvailability.js.map +1 -0
  90. package/dist/src/agents/cli-help-agent.d.ts +2 -2
  91. package/dist/src/billing/billing.d.ts +80 -0
  92. package/dist/src/billing/billing.js +128 -0
  93. package/dist/src/billing/billing.js.map +1 -0
  94. package/dist/src/billing/billing.test.d.ts +6 -0
  95. package/dist/src/billing/billing.test.js +182 -0
  96. package/dist/src/billing/billing.test.js.map +1 -0
  97. package/dist/src/billing/index.d.ts +6 -0
  98. package/dist/src/billing/index.js +7 -0
  99. package/dist/src/billing/index.js.map +1 -0
  100. package/dist/src/code_assist/oauth2.d.ts +1 -1
  101. package/dist/src/code_assist/types.d.ts +26 -26
  102. package/dist/src/config/agent-loop-context.d.ts +22 -0
  103. package/dist/src/config/agent-loop-context.js +7 -0
  104. package/dist/src/config/agent-loop-context.js.map +1 -0
  105. package/dist/src/config/trackerFeatureFlag.test.d.ts +6 -0
  106. package/dist/src/config/trackerFeatureFlag.test.js +43 -0
  107. package/dist/src/config/trackerFeatureFlag.test.js.map +1 -0
  108. package/dist/src/config/userHintService.d.ts +46 -0
  109. package/dist/src/config/userHintService.js +81 -0
  110. package/dist/src/config/userHintService.js.map +1 -0
  111. package/dist/src/config/userHintService.test.d.ts +6 -0
  112. package/dist/src/config/userHintService.test.js +62 -0
  113. package/dist/src/config/userHintService.test.js.map +1 -0
  114. package/dist/src/core/localLiteRtLmClient.d.ts +24 -0
  115. package/dist/src/core/localLiteRtLmClient.js +77 -0
  116. package/dist/src/core/localLiteRtLmClient.js.map +1 -0
  117. package/dist/src/core/localLiteRtLmClient.test.d.ts +6 -0
  118. package/dist/src/core/localLiteRtLmClient.test.js +87 -0
  119. package/dist/src/core/localLiteRtLmClient.test.js.map +1 -0
  120. package/dist/src/core/openaiContentGenerator.d.ts +1 -0
  121. package/dist/src/core/openaiContentGenerator.js +13 -13
  122. package/dist/src/core/openaiContentGenerator.js.map +1 -1
  123. package/dist/src/hooks/runtimeHooks.test.d.ts +6 -0
  124. package/dist/src/hooks/runtimeHooks.test.js +100 -0
  125. package/dist/src/hooks/runtimeHooks.test.js.map +1 -0
  126. package/dist/src/ide/types.d.ts +6 -6
  127. package/dist/src/mcp/mcp-oauth-provider.d.ts +43 -0
  128. package/dist/src/mcp/mcp-oauth-provider.js +67 -0
  129. package/dist/src/mcp/mcp-oauth-provider.js.map +1 -0
  130. package/dist/src/mcp/mcp-oauth-provider.test.d.ts +6 -0
  131. package/dist/src/mcp/mcp-oauth-provider.test.js +63 -0
  132. package/dist/src/mcp/mcp-oauth-provider.test.js.map +1 -0
  133. package/dist/src/policy/integrity.d.ts +45 -0
  134. package/dist/src/policy/integrity.js +121 -0
  135. package/dist/src/policy/integrity.js.map +1 -0
  136. package/dist/src/policy/integrity.test.d.ts +6 -0
  137. package/dist/src/policy/integrity.test.js +132 -0
  138. package/dist/src/policy/integrity.test.js.map +1 -0
  139. package/dist/src/policy/policies/conseca.toml +6 -0
  140. package/dist/src/policy/workspace-policy.test.js +231 -0
  141. package/dist/src/policy/workspace-policy.test.js.map +1 -0
  142. package/dist/src/routing/strategies/approvalModeStrategy.d.ts +18 -0
  143. package/dist/src/routing/strategies/approvalModeStrategy.js +59 -0
  144. package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -0
  145. package/dist/src/routing/strategies/approvalModeStrategy.test.d.ts +6 -0
  146. package/dist/src/routing/strategies/approvalModeStrategy.test.js +140 -0
  147. package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -0
  148. package/dist/src/routing/strategies/gemmaClassifierStrategy.d.ts +14 -0
  149. package/dist/src/routing/strategies/gemmaClassifierStrategy.js +182 -0
  150. package/dist/src/routing/strategies/gemmaClassifierStrategy.js.map +1 -0
  151. package/dist/src/routing/strategies/gemmaClassifierStrategy.test.d.ts +6 -0
  152. package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js +218 -0
  153. package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js.map +1 -0
  154. package/dist/src/safety/conseca/conseca.d.ts +31 -0
  155. package/dist/src/safety/conseca/conseca.js +105 -0
  156. package/dist/src/safety/conseca/conseca.js.map +1 -0
  157. package/dist/src/safety/conseca/conseca.test.js +226 -0
  158. package/dist/src/safety/conseca/conseca.test.js.map +1 -0
  159. package/dist/src/safety/conseca/integration.test.js +19 -0
  160. package/dist/src/safety/conseca/integration.test.js.map +1 -0
  161. package/dist/src/safety/conseca/policy-enforcer.d.ts +13 -0
  162. package/dist/src/safety/conseca/policy-enforcer.js +135 -0
  163. package/dist/src/safety/conseca/policy-enforcer.js.map +1 -0
  164. package/dist/src/safety/conseca/policy-enforcer.test.js +141 -0
  165. package/dist/src/safety/conseca/policy-enforcer.test.js.map +1 -0
  166. package/dist/src/safety/conseca/policy-generator.d.ts +15 -0
  167. package/dist/src/safety/conseca/policy-generator.js +144 -0
  168. package/dist/src/safety/conseca/policy-generator.js.map +1 -0
  169. package/dist/src/safety/conseca/policy-generator.test.d.ts +6 -0
  170. package/dist/src/safety/conseca/policy-generator.test.js +84 -0
  171. package/dist/src/safety/conseca/policy-generator.test.js.map +1 -0
  172. package/dist/src/safety/conseca/types.d.ts +15 -0
  173. package/dist/src/safety/conseca/types.js +7 -0
  174. package/dist/src/safety/conseca/types.js.map +1 -0
  175. package/dist/src/scheduler/scheduler_parallel.test.d.ts +6 -0
  176. package/dist/src/scheduler/scheduler_parallel.test.js +401 -0
  177. package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -0
  178. package/dist/src/services/FolderTrustDiscoveryService.d.ts +32 -0
  179. package/dist/src/services/FolderTrustDiscoveryService.js +169 -0
  180. package/dist/src/services/FolderTrustDiscoveryService.js.map +1 -0
  181. package/dist/src/services/FolderTrustDiscoveryService.test.d.ts +6 -0
  182. package/dist/src/services/FolderTrustDiscoveryService.test.js +118 -0
  183. package/dist/src/services/FolderTrustDiscoveryService.test.js.map +1 -0
  184. package/dist/src/services/fileKeychain.d.ts +24 -0
  185. package/dist/src/services/fileKeychain.js +123 -0
  186. package/dist/src/services/fileKeychain.js.map +1 -0
  187. package/dist/src/services/keychainService.d.ts +51 -0
  188. package/dist/src/services/keychainService.js +133 -0
  189. package/dist/src/services/keychainService.js.map +1 -0
  190. package/dist/src/services/keychainService.test.d.ts +6 -0
  191. package/dist/src/services/keychainService.test.js +150 -0
  192. package/dist/src/services/keychainService.test.js.map +1 -0
  193. package/dist/src/services/keychainTypes.d.ts +41 -0
  194. package/dist/src/services/keychainTypes.js +18 -0
  195. package/dist/src/services/keychainTypes.js.map +1 -0
  196. package/dist/src/services/trackerService.d.ts +49 -0
  197. package/dist/src/services/trackerService.js +193 -0
  198. package/dist/src/services/trackerService.js.map +1 -0
  199. package/dist/src/services/trackerService.test.d.ts +6 -0
  200. package/dist/src/services/trackerService.test.js +117 -0
  201. package/dist/src/services/trackerService.test.js.map +1 -0
  202. package/dist/src/services/trackerTypes.d.ts +51 -0
  203. package/dist/src/services/trackerTypes.js +33 -0
  204. package/dist/src/services/trackerTypes.js.map +1 -0
  205. package/dist/src/telemetry/billingEvents.d.ts +75 -0
  206. package/dist/src/telemetry/billingEvents.js +181 -0
  207. package/dist/src/telemetry/billingEvents.js.map +1 -0
  208. package/dist/src/telemetry/billingEvents.test.d.ts +6 -0
  209. package/dist/src/telemetry/billingEvents.test.js +139 -0
  210. package/dist/src/telemetry/billingEvents.test.js.map +1 -0
  211. package/dist/src/telemetry/conseca-logger.d.ts +9 -0
  212. package/dist/src/telemetry/conseca-logger.js +91 -0
  213. package/dist/src/telemetry/conseca-logger.js.map +1 -0
  214. package/dist/src/telemetry/conseca-logger.test.d.ts +6 -0
  215. package/dist/src/telemetry/conseca-logger.test.js +90 -0
  216. package/dist/src/telemetry/conseca-logger.test.js.map +1 -0
  217. package/dist/src/telemetry/trace.test.d.ts +6 -0
  218. package/dist/src/telemetry/trace.test.js +116 -0
  219. package/dist/src/telemetry/trace.test.js.map +1 -0
  220. package/dist/src/tools/definitions/trackerTools.d.ts +12 -0
  221. package/dist/src/tools/definitions/trackerTools.js +146 -0
  222. package/dist/src/tools/definitions/trackerTools.js.map +1 -0
  223. package/dist/src/tools/diff-utils.d.ts +9 -0
  224. package/dist/src/tools/diff-utils.js +66 -0
  225. package/dist/src/tools/diff-utils.js.map +1 -0
  226. package/dist/src/tools/diff-utils.test.d.ts +6 -0
  227. package/dist/src/tools/diff-utils.test.js +53 -0
  228. package/dist/src/tools/diff-utils.test.js.map +1 -0
  229. package/dist/src/tools/grep-utils.d.ts +49 -0
  230. package/dist/src/tools/grep-utils.js +147 -0
  231. package/dist/src/tools/grep-utils.js.map +1 -0
  232. package/dist/src/tools/omissionPlaceholderDetector.d.ts +15 -0
  233. package/dist/src/tools/omissionPlaceholderDetector.js +90 -0
  234. package/dist/src/tools/omissionPlaceholderDetector.js.map +1 -0
  235. package/dist/src/tools/omissionPlaceholderDetector.test.d.ts +6 -0
  236. package/dist/src/tools/omissionPlaceholderDetector.test.js +49 -0
  237. package/dist/src/tools/omissionPlaceholderDetector.test.js.map +1 -0
  238. package/dist/src/tools/trackerTools.d.ts +122 -0
  239. package/dist/src/tools/trackerTools.js +365 -0
  240. package/dist/src/tools/trackerTools.js.map +1 -0
  241. package/dist/src/tools/trackerTools.test.d.ts +6 -0
  242. package/dist/src/tools/trackerTools.test.js +97 -0
  243. package/dist/src/tools/trackerTools.test.js.map +1 -0
  244. package/dist/src/utils/approvalModeUtils.d.ts +14 -0
  245. package/dist/src/utils/approvalModeUtils.js +35 -0
  246. package/dist/src/utils/approvalModeUtils.js.map +1 -0
  247. package/dist/src/utils/approvalModeUtils.test.d.ts +6 -0
  248. package/dist/src/utils/approvalModeUtils.test.js +36 -0
  249. package/dist/src/utils/approvalModeUtils.test.js.map +1 -0
  250. package/dist/src/utils/cache.d.ts +63 -0
  251. package/dist/src/utils/cache.js +103 -0
  252. package/dist/src/utils/cache.js.map +1 -0
  253. package/dist/src/utils/cache.test.d.ts +6 -0
  254. package/dist/src/utils/cache.test.js +158 -0
  255. package/dist/src/utils/cache.test.js.map +1 -0
  256. package/dist/src/utils/checkpointUtils.d.ts +2 -2
  257. package/dist/src/utils/compatibility.d.ts +41 -0
  258. package/dist/src/utils/compatibility.js +112 -0
  259. package/dist/src/utils/compatibility.js.map +1 -0
  260. package/dist/src/utils/compatibility.test.d.ts +6 -0
  261. package/dist/src/utils/compatibility.test.js +233 -0
  262. package/dist/src/utils/compatibility.test.js.map +1 -0
  263. package/dist/src/utils/envExpansion.d.ts +18 -0
  264. package/dist/src/utils/envExpansion.js +46 -0
  265. package/dist/src/utils/envExpansion.js.map +1 -0
  266. package/dist/src/utils/envExpansion.test.d.ts +6 -0
  267. package/dist/src/utils/envExpansion.test.js +110 -0
  268. package/dist/src/utils/envExpansion.test.js.map +1 -0
  269. package/dist/src/utils/errors_timeout.test.d.ts +6 -0
  270. package/dist/src/utils/errors_timeout.test.js +40 -0
  271. package/dist/src/utils/errors_timeout.test.js.map +1 -0
  272. package/dist/src/utils/fetch.test.d.ts +6 -0
  273. package/dist/src/utils/fetch.test.js +206 -0
  274. package/dist/src/utils/fetch.test.js.map +1 -0
  275. package/dist/src/utils/markdownUtils.d.ts +22 -0
  276. package/dist/src/utils/markdownUtils.js +126 -0
  277. package/dist/src/utils/markdownUtils.js.map +1 -0
  278. package/dist/src/utils/markdownUtils.test.d.ts +6 -0
  279. package/dist/src/utils/markdownUtils.test.js +107 -0
  280. package/dist/src/utils/markdownUtils.test.js.map +1 -0
  281. package/dist/src/utils/oauth-flow.d.ts +105 -0
  282. package/dist/src/utils/oauth-flow.js +370 -0
  283. package/dist/src/utils/oauth-flow.js.map +1 -0
  284. package/dist/src/utils/oauth-flow.test.d.ts +6 -0
  285. package/dist/src/utils/oauth-flow.test.js +360 -0
  286. package/dist/src/utils/oauth-flow.test.js.map +1 -0
  287. package/dist/src/utils/sessionUtils.d.ts +14 -0
  288. package/dist/src/utils/sessionUtils.js +122 -0
  289. package/dist/src/utils/sessionUtils.js.map +1 -0
  290. package/dist/src/utils/sessionUtils.test.d.ts +1 -0
  291. package/dist/src/utils/sessionUtils.test.js +171 -0
  292. package/dist/src/utils/sessionUtils.test.js.map +1 -0
  293. package/dist/src/voice/responseFormatter.d.ts +38 -0
  294. package/dist/src/voice/responseFormatter.js +130 -0
  295. package/dist/src/voice/responseFormatter.js.map +1 -0
  296. package/dist/src/voice/responseFormatter.test.d.ts +6 -0
  297. package/dist/src/voice/responseFormatter.test.js +214 -0
  298. package/dist/src/voice/responseFormatter.test.js.map +1 -0
  299. package/dist/tsconfig.tsbuildinfo +1 -1
  300. package/package.json +1 -1
  301. package/dist/docs/CONTRIBUTING.md +0 -555
  302. package/dist/src/agents/executor.d.ts +0 -114
  303. package/dist/src/agents/executor.js +0 -779
  304. package/dist/src/agents/executor.js.map +0 -1
  305. package/dist/src/agents/executor.test.js +0 -1362
  306. package/dist/src/agents/executor.test.js.map +0 -1
  307. package/dist/src/agents/invocation.d.ts +0 -46
  308. package/dist/src/agents/invocation.js +0 -102
  309. package/dist/src/agents/invocation.js.map +0 -1
  310. package/dist/src/agents/invocation.test.js +0 -215
  311. package/dist/src/agents/invocation.test.js.map +0 -1
  312. package/dist/src/core/subagent.d.ts +0 -236
  313. package/dist/src/core/subagent.js +0 -482
  314. package/dist/src/core/subagent.js.map +0 -1
  315. package/dist/src/core/subagent.test.js +0 -530
  316. package/dist/src/core/subagent.test.js.map +0 -1
  317. package/dist/src/tools/smart-edit.d.ts +0 -78
  318. package/dist/src/tools/smart-edit.js +0 -717
  319. package/dist/src/tools/smart-edit.js.map +0 -1
  320. package/dist/src/tools/smart-edit.test.js +0 -592
  321. package/dist/src/tools/smart-edit.test.js.map +0 -1
  322. /package/dist/src/{agents/executor.test.d.ts → policy/workspace-policy.test.d.ts} +0 -0
  323. /package/dist/src/{agents/invocation.test.d.ts → safety/conseca/conseca.test.d.ts} +0 -0
  324. /package/dist/src/{core/subagent.test.d.ts → safety/conseca/integration.test.d.ts} +0 -0
  325. /package/dist/src/{tools/smart-edit.test.d.ts → safety/conseca/policy-enforcer.test.d.ts} +0 -0
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Detects if the current OS is Windows 10.
8
+ * Windows 11 also reports as version 10.0, but with build numbers >= 22000.
9
+ */
10
+ export declare function isWindows10(): boolean;
11
+ /**
12
+ * Detects if the current terminal is a JetBrains-based IDE terminal.
13
+ */
14
+ export declare function isJetBrainsTerminal(): boolean;
15
+ /**
16
+ * Detects if the current terminal is the default Apple Terminal.app.
17
+ */
18
+ export declare function isAppleTerminal(): boolean;
19
+ /**
20
+ * Detects if the current terminal supports 256 colors (8-bit).
21
+ */
22
+ export declare function supports256Colors(): boolean;
23
+ /**
24
+ * Detects if the current terminal supports true color (24-bit).
25
+ */
26
+ export declare function supportsTrueColor(): boolean;
27
+ export declare enum WarningPriority {
28
+ Low = "low",
29
+ High = "high"
30
+ }
31
+ export interface StartupWarning {
32
+ id: string;
33
+ message: string;
34
+ priority: WarningPriority;
35
+ }
36
+ /**
37
+ * Returns a list of compatibility warnings based on the current environment.
38
+ */
39
+ export declare function getCompatibilityWarnings(options?: {
40
+ isAlternateBuffer?: boolean;
41
+ }): StartupWarning[];
@@ -0,0 +1,112 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import os from 'node:os';
7
+ /**
8
+ * Detects if the current OS is Windows 10.
9
+ * Windows 11 also reports as version 10.0, but with build numbers >= 22000.
10
+ */
11
+ export function isWindows10() {
12
+ if (os.platform() !== 'win32') {
13
+ return false;
14
+ }
15
+ const release = os.release();
16
+ const parts = release.split('.');
17
+ if (parts.length >= 3 && parts[0] === '10' && parts[1] === '0') {
18
+ const build = parseInt(parts[2], 10);
19
+ return build < 22000;
20
+ }
21
+ return false;
22
+ }
23
+ /**
24
+ * Detects if the current terminal is a JetBrains-based IDE terminal.
25
+ */
26
+ export function isJetBrainsTerminal() {
27
+ return process.env['TERMINAL_EMULATOR'] === 'JetBrains-JediTerm';
28
+ }
29
+ /**
30
+ * Detects if the current terminal is the default Apple Terminal.app.
31
+ */
32
+ export function isAppleTerminal() {
33
+ return process.env['TERM_PROGRAM'] === 'Apple_Terminal';
34
+ }
35
+ /**
36
+ * Detects if the current terminal supports 256 colors (8-bit).
37
+ */
38
+ export function supports256Colors() {
39
+ // Check if stdout supports at least 8-bit color depth
40
+ if (process.stdout.getColorDepth && process.stdout.getColorDepth() >= 8) {
41
+ return true;
42
+ }
43
+ // Check TERM environment variable
44
+ const term = process.env['TERM'] || '';
45
+ if (term.includes('256color')) {
46
+ return true;
47
+ }
48
+ return false;
49
+ }
50
+ /**
51
+ * Detects if the current terminal supports true color (24-bit).
52
+ */
53
+ export function supportsTrueColor() {
54
+ // Check COLORTERM environment variable
55
+ if (process.env['COLORTERM'] === 'truecolor' ||
56
+ process.env['COLORTERM'] === '24bit') {
57
+ return true;
58
+ }
59
+ // Check if stdout supports 24-bit color depth
60
+ if (process.stdout.getColorDepth && process.stdout.getColorDepth() >= 24) {
61
+ return true;
62
+ }
63
+ return false;
64
+ }
65
+ export var WarningPriority;
66
+ (function (WarningPriority) {
67
+ WarningPriority["Low"] = "low";
68
+ WarningPriority["High"] = "high";
69
+ })(WarningPriority || (WarningPriority = {}));
70
+ /**
71
+ * Returns a list of compatibility warnings based on the current environment.
72
+ */
73
+ export function getCompatibilityWarnings(options) {
74
+ const warnings = [];
75
+ if (isWindows10()) {
76
+ warnings.push({
77
+ id: 'windows-10',
78
+ message: 'Warning: Windows 10 detected. Some UI features like smooth scrolling may be degraded. Windows 11 is recommended for the best experience.',
79
+ priority: WarningPriority.High,
80
+ });
81
+ }
82
+ if (isJetBrainsTerminal() && options?.isAlternateBuffer) {
83
+ const platformTerminals = {
84
+ win32: 'Windows Terminal',
85
+ darwin: 'iTerm2 or Ghostty',
86
+ linux: 'Ghostty',
87
+ };
88
+ const suggestion = platformTerminals[os.platform()];
89
+ const suggestedTerminals = suggestion ? ` (e.g., ${suggestion})` : '';
90
+ warnings.push({
91
+ id: 'jetbrains-terminal',
92
+ message: `Warning: JetBrains mouse scrolling is unreliable. Disabling alternate buffer mode in settings or using an external terminal${suggestedTerminals} is recommended.`,
93
+ priority: WarningPriority.High,
94
+ });
95
+ }
96
+ if (!supports256Colors()) {
97
+ warnings.push({
98
+ id: '256-color',
99
+ message: 'Warning: 256-color support not detected. Using a terminal with at least 256-color support is recommended for a better visual experience.',
100
+ priority: WarningPriority.High,
101
+ });
102
+ }
103
+ else if (!supportsTrueColor() && !isAppleTerminal()) {
104
+ warnings.push({
105
+ id: 'true-color',
106
+ message: 'Warning: True color (24-bit) support not detected. Using a terminal with true color enabled will result in a better visual experience.',
107
+ priority: WarningPriority.Low,
108
+ });
109
+ }
110
+ return warnings;
111
+ }
112
+ //# sourceMappingURL=compatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../../../src/utils/compatibility.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,233 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import os from 'node:os';
8
+ import { isWindows10, isJetBrainsTerminal, supports256Colors, supportsTrueColor, getCompatibilityWarnings, WarningPriority, } from './compatibility.js';
9
+ vi.mock('node:os', () => ({
10
+ default: {
11
+ platform: vi.fn(),
12
+ release: vi.fn(),
13
+ },
14
+ }));
15
+ describe('compatibility', () => {
16
+ const originalGetColorDepth = process.stdout.getColorDepth;
17
+ afterEach(() => {
18
+ process.stdout.getColorDepth = originalGetColorDepth;
19
+ vi.restoreAllMocks();
20
+ vi.unstubAllEnvs();
21
+ });
22
+ describe('isWindows10', () => {
23
+ it.each([
24
+ {
25
+ platform: 'win32',
26
+ release: '10.0.19041',
27
+ expected: true,
28
+ desc: 'Windows 10 (build < 22000)',
29
+ },
30
+ {
31
+ platform: 'win32',
32
+ release: '10.0.22000',
33
+ expected: false,
34
+ desc: 'Windows 11 (build >= 22000)',
35
+ },
36
+ {
37
+ platform: 'darwin',
38
+ release: '20.6.0',
39
+ expected: false,
40
+ desc: 'non-Windows platforms',
41
+ },
42
+ ])('should return $expected for $desc', ({ platform, release, expected }) => {
43
+ vi.mocked(os.platform).mockReturnValue(platform);
44
+ vi.mocked(os.release).mockReturnValue(release);
45
+ expect(isWindows10()).toBe(expected);
46
+ });
47
+ });
48
+ describe('isJetBrainsTerminal', () => {
49
+ it.each([
50
+ {
51
+ env: 'JetBrains-JediTerm',
52
+ expected: true,
53
+ desc: 'TERMINAL_EMULATOR is JetBrains-JediTerm',
54
+ },
55
+ { env: 'something-else', expected: false, desc: 'other terminals' },
56
+ { env: '', expected: false, desc: 'TERMINAL_EMULATOR is not set' },
57
+ ])('should return $expected when $desc', ({ env, expected }) => {
58
+ vi.stubEnv('TERMINAL_EMULATOR', env);
59
+ expect(isJetBrainsTerminal()).toBe(expected);
60
+ });
61
+ });
62
+ describe('supports256Colors', () => {
63
+ it.each([
64
+ {
65
+ depth: 8,
66
+ term: undefined,
67
+ expected: true,
68
+ desc: 'getColorDepth returns >= 8',
69
+ },
70
+ {
71
+ depth: 4,
72
+ term: 'xterm-256color',
73
+ expected: true,
74
+ desc: 'TERM contains 256color',
75
+ },
76
+ {
77
+ depth: 4,
78
+ term: 'xterm',
79
+ expected: false,
80
+ desc: '256 colors are not supported',
81
+ },
82
+ ])('should return $expected when $desc', ({ depth, term, expected }) => {
83
+ process.stdout.getColorDepth = vi.fn().mockReturnValue(depth);
84
+ if (term !== undefined) {
85
+ vi.stubEnv('TERM', term);
86
+ }
87
+ expect(supports256Colors()).toBe(expected);
88
+ });
89
+ });
90
+ describe('supportsTrueColor', () => {
91
+ it.each([
92
+ {
93
+ colorterm: 'truecolor',
94
+ depth: 8,
95
+ expected: true,
96
+ desc: 'COLORTERM is truecolor',
97
+ },
98
+ {
99
+ colorterm: '24bit',
100
+ depth: 8,
101
+ expected: true,
102
+ desc: 'COLORTERM is 24bit',
103
+ },
104
+ {
105
+ colorterm: '',
106
+ depth: 24,
107
+ expected: true,
108
+ desc: 'getColorDepth returns >= 24',
109
+ },
110
+ {
111
+ colorterm: '',
112
+ depth: 8,
113
+ expected: false,
114
+ desc: 'true color is not supported',
115
+ },
116
+ ])('should return $expected when $desc', ({ colorterm, depth, expected }) => {
117
+ vi.stubEnv('COLORTERM', colorterm);
118
+ process.stdout.getColorDepth = vi.fn().mockReturnValue(depth);
119
+ expect(supportsTrueColor()).toBe(expected);
120
+ });
121
+ });
122
+ describe('getCompatibilityWarnings', () => {
123
+ beforeEach(() => {
124
+ // Default to supporting true color to keep existing tests simple
125
+ vi.stubEnv('COLORTERM', 'truecolor');
126
+ process.stdout.getColorDepth = vi.fn().mockReturnValue(24);
127
+ });
128
+ it('should return Windows 10 warning when detected', () => {
129
+ vi.mocked(os.platform).mockReturnValue('win32');
130
+ vi.mocked(os.release).mockReturnValue('10.0.19041');
131
+ vi.stubEnv('TERMINAL_EMULATOR', '');
132
+ const warnings = getCompatibilityWarnings();
133
+ expect(warnings).toContainEqual(expect.objectContaining({
134
+ id: 'windows-10',
135
+ message: expect.stringContaining('Windows 10 detected'),
136
+ }));
137
+ });
138
+ it.each([
139
+ {
140
+ platform: 'darwin',
141
+ release: '20.6.0',
142
+ externalTerminal: 'iTerm2 or Ghostty',
143
+ desc: 'macOS',
144
+ },
145
+ {
146
+ platform: 'win32',
147
+ release: '10.0.22000',
148
+ externalTerminal: 'Windows Terminal',
149
+ desc: 'Windows',
150
+ }, // Valid Windows 11 release to not trigger the Windows 10 warning
151
+ {
152
+ platform: 'linux',
153
+ release: '5.10.0',
154
+ externalTerminal: 'Ghostty',
155
+ desc: 'Linux',
156
+ },
157
+ ])('should return JetBrains warning when detected and in alternate buffer ($desc)', ({ platform, release, externalTerminal }) => {
158
+ vi.mocked(os.platform).mockReturnValue(platform);
159
+ vi.mocked(os.release).mockReturnValue(release);
160
+ vi.stubEnv('TERMINAL_EMULATOR', 'JetBrains-JediTerm');
161
+ const warnings = getCompatibilityWarnings({ isAlternateBuffer: true });
162
+ expect(warnings).toContainEqual(expect.objectContaining({
163
+ id: 'jetbrains-terminal',
164
+ message: expect.stringContaining(`Warning: JetBrains mouse scrolling is unreliable. Disabling alternate buffer mode in settings or using an external terminal (e.g., ${externalTerminal}) is recommended.`),
165
+ priority: WarningPriority.High,
166
+ }));
167
+ });
168
+ it('should not return JetBrains warning when detected but NOT in alternate buffer', () => {
169
+ vi.mocked(os.platform).mockReturnValue('darwin');
170
+ vi.stubEnv('TERMINAL_EMULATOR', 'JetBrains-JediTerm');
171
+ const warnings = getCompatibilityWarnings({ isAlternateBuffer: false });
172
+ expect(warnings.find((w) => w.id === 'jetbrains-terminal')).toBeUndefined();
173
+ });
174
+ it('should return 256-color warning when 256 colors are not supported', () => {
175
+ vi.mocked(os.platform).mockReturnValue('linux');
176
+ vi.stubEnv('TERMINAL_EMULATOR', '');
177
+ vi.stubEnv('COLORTERM', '');
178
+ vi.stubEnv('TERM', 'xterm');
179
+ process.stdout.getColorDepth = vi.fn().mockReturnValue(4);
180
+ const warnings = getCompatibilityWarnings();
181
+ expect(warnings).toContainEqual(expect.objectContaining({
182
+ id: '256-color',
183
+ message: expect.stringContaining('256-color support not detected'),
184
+ priority: WarningPriority.High,
185
+ }));
186
+ // Should NOT show true-color warning if 256-color warning is shown
187
+ expect(warnings.find((w) => w.id === 'true-color')).toBeUndefined();
188
+ });
189
+ it('should return true color warning when 256 colors are supported but true color is not, and not Apple Terminal', () => {
190
+ vi.mocked(os.platform).mockReturnValue('linux');
191
+ vi.stubEnv('TERMINAL_EMULATOR', '');
192
+ vi.stubEnv('COLORTERM', '');
193
+ vi.stubEnv('TERM_PROGRAM', 'xterm');
194
+ process.stdout.getColorDepth = vi.fn().mockReturnValue(8);
195
+ const warnings = getCompatibilityWarnings();
196
+ expect(warnings).toContainEqual(expect.objectContaining({
197
+ id: 'true-color',
198
+ message: expect.stringContaining('True color (24-bit) support not detected'),
199
+ priority: WarningPriority.Low,
200
+ }));
201
+ });
202
+ it('should NOT return true color warning for Apple Terminal', () => {
203
+ vi.mocked(os.platform).mockReturnValue('darwin');
204
+ vi.stubEnv('TERMINAL_EMULATOR', '');
205
+ vi.stubEnv('COLORTERM', '');
206
+ vi.stubEnv('TERM_PROGRAM', 'Apple_Terminal');
207
+ process.stdout.getColorDepth = vi.fn().mockReturnValue(8);
208
+ const warnings = getCompatibilityWarnings();
209
+ expect(warnings.find((w) => w.id === 'true-color')).toBeUndefined();
210
+ });
211
+ it('should return all warnings when all are detected', () => {
212
+ vi.mocked(os.platform).mockReturnValue('win32');
213
+ vi.mocked(os.release).mockReturnValue('10.0.19041');
214
+ vi.stubEnv('TERMINAL_EMULATOR', 'JetBrains-JediTerm');
215
+ vi.stubEnv('COLORTERM', '');
216
+ vi.stubEnv('TERM_PROGRAM', 'xterm');
217
+ process.stdout.getColorDepth = vi.fn().mockReturnValue(8);
218
+ const warnings = getCompatibilityWarnings({ isAlternateBuffer: true });
219
+ expect(warnings).toHaveLength(3);
220
+ expect(warnings[0].message).toContain('Windows 10 detected');
221
+ expect(warnings[1].message).toContain('JetBrains');
222
+ expect(warnings[2].message).toContain('True color (24-bit) support not detected');
223
+ });
224
+ it('should return no warnings in a standard environment with true color', () => {
225
+ vi.mocked(os.platform).mockReturnValue('darwin');
226
+ vi.stubEnv('TERMINAL_EMULATOR', '');
227
+ vi.stubEnv('COLORTERM', 'truecolor');
228
+ const warnings = getCompatibilityWarnings();
229
+ expect(warnings).toHaveLength(0);
230
+ });
231
+ });
232
+ });
233
+ //# sourceMappingURL=compatibility.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.test.js","sourceRoot":"","sources":["../../../src/utils/compatibility.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Expands environment variables in a string using the provided environment record.
8
+ * Uses the standard `dotenv-expand` library to handle expansion consistently with
9
+ * other tools.
10
+ *
11
+ * Supports POSIX/Bash syntax ($VAR, ${VAR}).
12
+ * Note: Windows syntax (%VAR%) is not natively supported by dotenv-expand.
13
+ *
14
+ * @param str - The string containing environment variable placeholders.
15
+ * @param env - A record of environment variable names and their values.
16
+ * @returns The string with environment variables expanded. Missing variables resolve to an empty string.
17
+ */
18
+ export declare function expandEnvVars(str: string, env: Record<string, string | undefined>): string;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { expand } from 'dotenv-expand';
7
+ /**
8
+ * Expands environment variables in a string using the provided environment record.
9
+ * Uses the standard `dotenv-expand` library to handle expansion consistently with
10
+ * other tools.
11
+ *
12
+ * Supports POSIX/Bash syntax ($VAR, ${VAR}).
13
+ * Note: Windows syntax (%VAR%) is not natively supported by dotenv-expand.
14
+ *
15
+ * @param str - The string containing environment variable placeholders.
16
+ * @param env - A record of environment variable names and their values.
17
+ * @returns The string with environment variables expanded. Missing variables resolve to an empty string.
18
+ */
19
+ export function expandEnvVars(str, env) {
20
+ if (!str)
21
+ return str;
22
+ // 1. Pre-process Windows-style variables (%VAR%) since dotenv-expand only handles POSIX ($VAR).
23
+ // We only do this on Windows to limit the blast radius and avoid conflicts with other
24
+ // systems where % might be a literal character (e.g. in URLs or shell commands).
25
+ const isWindows = process.platform === 'win32';
26
+ const processedStr = isWindows
27
+ ? str.replace(/%(\w+)%/g, (_, name) => env[name] ?? '')
28
+ : str;
29
+ // 2. Use dotenv-expand for POSIX/Bash syntax ($VAR, ${VAR}).
30
+ // dotenv-expand is designed to process an object of key-value pairs (like a .env file).
31
+ // To expand a single string, we wrap it in an object with a temporary key.
32
+ const dummyKey = '__GCLI_EXPAND_TARGET__';
33
+ // Filter out undefined values to satisfy the Record<string, string> requirement safely
34
+ const processEnv = {};
35
+ for (const [key, value] of Object.entries(env)) {
36
+ if (value !== undefined) {
37
+ processEnv[key] = value;
38
+ }
39
+ }
40
+ const result = expand({
41
+ parsed: { [dummyKey]: processedStr },
42
+ processEnv,
43
+ });
44
+ return result.parsed?.[dummyKey] ?? '';
45
+ }
46
+ //# sourceMappingURL=envExpansion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envExpansion.js","sourceRoot":"","sources":["../../../src/utils/envExpansion.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAA2B,MAAM,eAAe,CAAC;AAEhE;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,GAAuC;IAEvC,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IAErB,gGAAgG;IAChG,sFAAsF;IACtF,iFAAiF;IACjF,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC/C,MAAM,YAAY,GAAG,SAAS;QAC5B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACvD,CAAC,CAAC,GAAG,CAAC;IAER,6DAA6D;IAC7D,wFAAwF;IACxF,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,wBAAwB,CAAC;IAE1C,uFAAuF;IACvF,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAuB,MAAM,CAAC;QACxC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE;QACpC,UAAU;KACX,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC"}
@@ -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,110 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { expandEnvVars } from './envExpansion.js';
8
+ describe('expandEnvVars', () => {
9
+ const defaultEnv = {
10
+ USER: 'morty',
11
+ HOME: '/home/morty',
12
+ TEMP: 'C:\\Temp',
13
+ EMPTY: '',
14
+ };
15
+ describe('POSIX behavior (non-Windows)', () => {
16
+ beforeEach(() => {
17
+ vi.spyOn(process, 'platform', 'get').mockReturnValue('darwin');
18
+ });
19
+ afterEach(() => {
20
+ vi.restoreAllMocks();
21
+ });
22
+ it.each([
23
+ ['$VAR (POSIX)', 'Hello $USER', defaultEnv, 'Hello morty'],
24
+ [
25
+ '${VAR} (POSIX)',
26
+ 'Welcome to ${HOME}',
27
+ defaultEnv,
28
+ 'Welcome to /home/morty',
29
+ ],
30
+ [
31
+ 'should NOT expand %VAR% on non-Windows',
32
+ 'Data in %TEMP%',
33
+ defaultEnv,
34
+ 'Data in %TEMP%',
35
+ ],
36
+ [
37
+ 'mixed formats (only POSIX expanded)',
38
+ '$USER lives in ${HOME} on %TEMP%',
39
+ defaultEnv,
40
+ 'morty lives in /home/morty on %TEMP%',
41
+ ],
42
+ [
43
+ 'missing variables (POSIX only)',
44
+ 'Missing $UNDEFINED and ${NONE} and %MISSING%',
45
+ defaultEnv,
46
+ 'Missing and and %MISSING%',
47
+ ],
48
+ [
49
+ 'empty or undefined values',
50
+ 'Value is "$EMPTY"',
51
+ defaultEnv,
52
+ 'Value is ""',
53
+ ],
54
+ [
55
+ 'original string if no variables',
56
+ 'No vars here',
57
+ defaultEnv,
58
+ 'No vars here',
59
+ ],
60
+ ['literal values like "1234"', '1234', defaultEnv, '1234'],
61
+ ['empty input string', '', defaultEnv, ''],
62
+ [
63
+ 'complex paths',
64
+ '${HOME}/bin:$PATH',
65
+ { ...defaultEnv, PATH: '/usr/bin' },
66
+ '/home/morty/bin:/usr/bin',
67
+ ],
68
+ ])('should handle %s', (_, input, env, expected) => {
69
+ expect(expandEnvVars(input, env)).toBe(expected);
70
+ });
71
+ });
72
+ describe('Windows behavior', () => {
73
+ beforeEach(() => {
74
+ vi.spyOn(process, 'platform', 'get').mockReturnValue('win32');
75
+ });
76
+ afterEach(() => {
77
+ vi.restoreAllMocks();
78
+ });
79
+ it.each([
80
+ ['$VAR (POSIX)', 'Hello $USER', defaultEnv, 'Hello morty'],
81
+ [
82
+ '${VAR} (POSIX)',
83
+ 'Welcome to ${HOME}',
84
+ defaultEnv,
85
+ 'Welcome to /home/morty',
86
+ ],
87
+ [
88
+ 'should expand %VAR% on Windows',
89
+ 'Data in %TEMP%',
90
+ defaultEnv,
91
+ 'Data in C:\\Temp',
92
+ ],
93
+ [
94
+ 'mixed formats (both expanded)',
95
+ '$USER lives in ${HOME} on %TEMP%',
96
+ defaultEnv,
97
+ 'morty lives in /home/morty on C:\\Temp',
98
+ ],
99
+ [
100
+ 'missing variables (all expanded to empty)',
101
+ 'Missing $UNDEFINED and ${NONE} and %MISSING%',
102
+ defaultEnv,
103
+ 'Missing and and ',
104
+ ],
105
+ ])('should handle %s', (_, input, env, expected) => {
106
+ expect(expandEnvVars(input, env)).toBe(expected);
107
+ });
108
+ });
109
+ });
110
+ //# sourceMappingURL=envExpansion.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envExpansion.test.js","sourceRoot":"","sources":["../../../src/utils/envExpansion.test.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,40 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { getErrorMessage } from './errors.js';
8
+ import {} from './httpErrors.js';
9
+ describe('getErrorMessage with timeout errors', () => {
10
+ it('should handle undici HeadersTimeoutError correctly', () => {
11
+ // Simulate what undici might throw if it's not a proper Error instance
12
+ // or has a specific code.
13
+ const timeoutError = {
14
+ name: 'HeadersTimeoutError',
15
+ code: 'UND_ERR_HEADERS_TIMEOUT',
16
+ message: 'Headers timeout error',
17
+ };
18
+ // If it's a plain object, getErrorMessage might struggle if it expects an Error
19
+ const message = getErrorMessage(timeoutError);
20
+ // Based on existing implementation:
21
+ // friendlyError = toFriendlyError(timeoutError) -> returns timeoutError
22
+ // if (friendlyError instanceof Error) -> false
23
+ // return String(friendlyError) -> "[object Object]"
24
+ expect(message).toBe('Headers timeout error');
25
+ });
26
+ it('should handle undici HeadersTimeoutError as an Error instance', () => {
27
+ const error = new Error('Headers timeout error');
28
+ error.name = 'HeadersTimeoutError';
29
+ error.status = 504; // simulate status for test
30
+ error.code = 'UND_ERR_HEADERS_TIMEOUT';
31
+ const message = getErrorMessage(error);
32
+ expect(message).toBe('Headers timeout error');
33
+ });
34
+ it('should return String representation for objects without a message property', () => {
35
+ const error = { some: 'other', object: 123 };
36
+ const message = getErrorMessage(error);
37
+ expect(message).toBe('[object Object]');
38
+ });
39
+ });
40
+ //# sourceMappingURL=errors_timeout.test.js.map