@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 @@
1
+ {"version":3,"file":"errors_timeout.test.js","sourceRoot":"","sources":["../../../src/utils/errors_timeout.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAkB,MAAM,iBAAiB,CAAC;AAEjD,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,uEAAuE;QACvE,0BAA0B;QAC1B,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,qBAAqB;YAC3B,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,uBAAuB;SACjC,CAAC;QAEF,gFAAgF;QAChF,MAAM,OAAO,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;QAC9C,oCAAoC;QACpC,wEAAwE;QACxE,+CAA+C;QAC/C,oDAAoD;QAEpD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAChD,KAAmB,CAAC,IAAI,GAAG,qBAAqB,CAAC;QACjD,KAAmB,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,2BAA2B;QAC7D,KAAuC,CAAC,IAAI,GAAG,yBAAyB,CAAC;QAE1E,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,206 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterAll } from 'vitest';
7
+ import { isPrivateIp, isPrivateIpAsync, isAddressPrivate, safeLookup, safeFetch, fetchWithTimeout, PrivateIpError, } from './fetch.js';
8
+ import * as dnsPromises from 'node:dns/promises';
9
+ import * as dns from 'node:dns';
10
+ vi.mock('node:dns/promises', () => ({
11
+ lookup: vi.fn(),
12
+ }));
13
+ // We need to mock node:dns for safeLookup since it uses the callback API
14
+ vi.mock('node:dns', () => ({
15
+ lookup: vi.fn(),
16
+ }));
17
+ // Mock global fetch
18
+ const originalFetch = global.fetch;
19
+ global.fetch = vi.fn();
20
+ describe('fetch utils', () => {
21
+ beforeEach(() => {
22
+ vi.clearAllMocks();
23
+ });
24
+ afterAll(() => {
25
+ global.fetch = originalFetch;
26
+ });
27
+ describe('isAddressPrivate', () => {
28
+ it('should identify private IPv4 addresses', () => {
29
+ expect(isAddressPrivate('10.0.0.1')).toBe(true);
30
+ expect(isAddressPrivate('127.0.0.1')).toBe(true);
31
+ expect(isAddressPrivate('172.16.0.1')).toBe(true);
32
+ expect(isAddressPrivate('192.168.1.1')).toBe(true);
33
+ });
34
+ it('should identify non-routable and reserved IPv4 addresses (RFC 6890)', () => {
35
+ expect(isAddressPrivate('0.0.0.0')).toBe(true);
36
+ expect(isAddressPrivate('100.64.0.1')).toBe(true);
37
+ expect(isAddressPrivate('192.0.0.1')).toBe(true);
38
+ expect(isAddressPrivate('192.0.2.1')).toBe(true);
39
+ expect(isAddressPrivate('192.88.99.1')).toBe(true);
40
+ // Benchmark range (198.18.0.0/15)
41
+ expect(isAddressPrivate('198.18.0.0')).toBe(true);
42
+ expect(isAddressPrivate('198.18.0.1')).toBe(true);
43
+ expect(isAddressPrivate('198.19.255.255')).toBe(true);
44
+ expect(isAddressPrivate('198.51.100.1')).toBe(true);
45
+ expect(isAddressPrivate('203.0.113.1')).toBe(true);
46
+ expect(isAddressPrivate('224.0.0.1')).toBe(true);
47
+ expect(isAddressPrivate('240.0.0.1')).toBe(true);
48
+ });
49
+ it('should identify private IPv6 addresses', () => {
50
+ expect(isAddressPrivate('::1')).toBe(true);
51
+ expect(isAddressPrivate('fc00::')).toBe(true);
52
+ expect(isAddressPrivate('fd00::')).toBe(true);
53
+ expect(isAddressPrivate('fe80::')).toBe(true);
54
+ expect(isAddressPrivate('febf::')).toBe(true);
55
+ });
56
+ it('should identify special local addresses', () => {
57
+ expect(isAddressPrivate('0.0.0.0')).toBe(true);
58
+ expect(isAddressPrivate('::')).toBe(true);
59
+ expect(isAddressPrivate('localhost')).toBe(true);
60
+ });
61
+ it('should identify link-local addresses', () => {
62
+ expect(isAddressPrivate('169.254.169.254')).toBe(true);
63
+ });
64
+ it('should identify IPv4-mapped IPv6 private addresses', () => {
65
+ expect(isAddressPrivate('::ffff:127.0.0.1')).toBe(true);
66
+ expect(isAddressPrivate('::ffff:10.0.0.1')).toBe(true);
67
+ expect(isAddressPrivate('::ffff:169.254.169.254')).toBe(true);
68
+ expect(isAddressPrivate('::ffff:192.168.1.1')).toBe(true);
69
+ expect(isAddressPrivate('::ffff:172.16.0.1')).toBe(true);
70
+ expect(isAddressPrivate('::ffff:0.0.0.0')).toBe(true);
71
+ expect(isAddressPrivate('::ffff:100.64.0.1')).toBe(true);
72
+ expect(isAddressPrivate('::ffff:a9fe:101')).toBe(true); // 169.254.1.1
73
+ });
74
+ it('should identify public addresses as non-private', () => {
75
+ expect(isAddressPrivate('8.8.8.8')).toBe(false);
76
+ expect(isAddressPrivate('93.184.216.34')).toBe(false);
77
+ expect(isAddressPrivate('2001:4860:4860::8888')).toBe(false);
78
+ expect(isAddressPrivate('::ffff:8.8.8.8')).toBe(false);
79
+ });
80
+ });
81
+ describe('isPrivateIp', () => {
82
+ it('should identify private IPs in URLs', () => {
83
+ expect(isPrivateIp('http://10.0.0.1/')).toBe(true);
84
+ expect(isPrivateIp('https://127.0.0.1:8080/')).toBe(true);
85
+ expect(isPrivateIp('http://localhost/')).toBe(true);
86
+ expect(isPrivateIp('http://[::1]/')).toBe(true);
87
+ });
88
+ it('should identify public IPs in URLs as non-private', () => {
89
+ expect(isPrivateIp('http://8.8.8.8/')).toBe(false);
90
+ expect(isPrivateIp('https://google.com/')).toBe(false);
91
+ });
92
+ });
93
+ describe('isPrivateIpAsync', () => {
94
+ it('should identify private IPs directly', async () => {
95
+ expect(await isPrivateIpAsync('http://10.0.0.1/')).toBe(true);
96
+ });
97
+ it('should identify domains resolving to private IPs', async () => {
98
+ vi.mocked(dnsPromises.lookup).mockImplementation(async () =>
99
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
100
+ [{ address: '10.0.0.1', family: 4 }]);
101
+ expect(await isPrivateIpAsync('http://malicious.com/')).toBe(true);
102
+ });
103
+ it('should identify domains resolving to public IPs as non-private', async () => {
104
+ vi.mocked(dnsPromises.lookup).mockImplementation(async () =>
105
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
106
+ [{ address: '8.8.8.8', family: 4 }]);
107
+ expect(await isPrivateIpAsync('http://google.com/')).toBe(false);
108
+ });
109
+ it('should throw error if DNS resolution fails (fail closed)', async () => {
110
+ vi.mocked(dnsPromises.lookup).mockRejectedValue(new Error('DNS Error'));
111
+ await expect(isPrivateIpAsync('http://unreachable.com/')).rejects.toThrow('Failed to verify if URL resolves to private IP');
112
+ });
113
+ it('should return false for invalid URLs instead of throwing verification error', async () => {
114
+ expect(await isPrivateIpAsync('not-a-url')).toBe(false);
115
+ });
116
+ });
117
+ describe('safeLookup', () => {
118
+ it('should filter out private IPs', async () => {
119
+ const addresses = [
120
+ { address: '8.8.8.8', family: 4 },
121
+ { address: '10.0.0.1', family: 4 },
122
+ ];
123
+ vi.mocked(dns.lookup).mockImplementation(((_h, _o, cb) => {
124
+ cb(null, addresses);
125
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
126
+ }));
127
+ const result = await new Promise((resolve, reject) => {
128
+ safeLookup('example.com', { all: true }, (err, filtered) => {
129
+ if (err)
130
+ reject(err);
131
+ else
132
+ resolve(filtered);
133
+ });
134
+ });
135
+ expect(result).toHaveLength(1);
136
+ expect(result[0].address).toBe('8.8.8.8');
137
+ });
138
+ it('should allow explicit localhost', async () => {
139
+ const addresses = [{ address: '127.0.0.1', family: 4 }];
140
+ vi.mocked(dns.lookup).mockImplementation(((_h, _o, cb) => {
141
+ cb(null, addresses);
142
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
143
+ }));
144
+ const result = await new Promise((resolve, reject) => {
145
+ safeLookup('localhost', { all: true }, (err, filtered) => {
146
+ if (err)
147
+ reject(err);
148
+ else
149
+ resolve(filtered);
150
+ });
151
+ });
152
+ expect(result).toHaveLength(1);
153
+ expect(result[0].address).toBe('127.0.0.1');
154
+ });
155
+ it('should error if all resolved IPs are private', async () => {
156
+ const addresses = [{ address: '10.0.0.1', family: 4 }];
157
+ vi.mocked(dns.lookup).mockImplementation(((_h, _o, cb) => {
158
+ cb(null, addresses);
159
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
160
+ }));
161
+ await expect(new Promise((resolve, reject) => {
162
+ safeLookup('malicious.com', { all: true }, (err, filtered) => {
163
+ if (err)
164
+ reject(err);
165
+ else
166
+ resolve(filtered);
167
+ });
168
+ })).rejects.toThrow(PrivateIpError);
169
+ });
170
+ });
171
+ describe('safeFetch', () => {
172
+ it('should forward to fetch with dispatcher', async () => {
173
+ vi.mocked(global.fetch).mockResolvedValue(new Response('ok'));
174
+ const response = await safeFetch('https://example.com');
175
+ expect(response.status).toBe(200);
176
+ expect(global.fetch).toHaveBeenCalledWith('https://example.com', expect.objectContaining({
177
+ dispatcher: expect.any(Object),
178
+ }));
179
+ });
180
+ it('should handle Refusing to connect errors', async () => {
181
+ vi.mocked(global.fetch).mockRejectedValue(new PrivateIpError());
182
+ await expect(safeFetch('http://10.0.0.1')).rejects.toThrow('Access to private network is blocked');
183
+ });
184
+ });
185
+ describe('fetchWithTimeout', () => {
186
+ it('should handle timeouts', async () => {
187
+ vi.mocked(global.fetch).mockImplementation((_input, init) => new Promise((_resolve, reject) => {
188
+ if (init?.signal) {
189
+ init.signal.addEventListener('abort', () => {
190
+ const error = new Error('The operation was aborted');
191
+ error.name = 'AbortError';
192
+ // @ts-expect-error - for mocking purposes
193
+ error.code = 'ABORT_ERR';
194
+ reject(error);
195
+ });
196
+ }
197
+ }));
198
+ await expect(fetchWithTimeout('http://example.com', 50)).rejects.toThrow('Request timed out after 50ms');
199
+ });
200
+ it('should handle private IP errors via handleFetchError', async () => {
201
+ vi.mocked(global.fetch).mockRejectedValue(new PrivateIpError());
202
+ await expect(fetchWithTimeout('http://10.0.0.1', 1000)).rejects.toThrow('Access to private network is blocked: http://10.0.0.1');
203
+ });
204
+ });
205
+ });
206
+ //# sourceMappingURL=fetch.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.test.js","sourceRoot":"","sources":["../../../src/utils/fetch.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Converts a JSON-compatible value into a readable Markdown representation.
8
+ *
9
+ * @param data The data to convert.
10
+ * @param indent The current indentation level (for internal recursion).
11
+ * @returns A Markdown string representing the data.
12
+ */
13
+ export declare function jsonToMarkdown(data: unknown, indent?: number): string;
14
+ /**
15
+ * Safely attempts to parse a string as JSON and convert it to Markdown.
16
+ * If parsing fails, returns the original string.
17
+ *
18
+ * @param text The text to potentially convert.
19
+ * @returns The Markdown representation or the original text.
20
+ */
21
+ export declare function safeJsonToMarkdown(text: string): string;
22
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
@@ -0,0 +1,126 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Converts a camelCase string to a Space Case string.
8
+ * e.g., "camelCaseString" -> "Camel Case String"
9
+ */
10
+ function camelToSpace(text) {
11
+ const result = text.replace(/([A-Z])/g, ' $1');
12
+ return result.charAt(0).toUpperCase() + result.slice(1).trim();
13
+ }
14
+ /**
15
+ * Converts a JSON-compatible value into a readable Markdown representation.
16
+ *
17
+ * @param data The data to convert.
18
+ * @param indent The current indentation level (for internal recursion).
19
+ * @returns A Markdown string representing the data.
20
+ */
21
+ export function jsonToMarkdown(data, indent = 0) {
22
+ const spacing = ' '.repeat(indent);
23
+ if (data === null) {
24
+ return 'null';
25
+ }
26
+ if (data === undefined) {
27
+ return 'undefined';
28
+ }
29
+ if (Array.isArray(data)) {
30
+ if (data.length === 0) {
31
+ return '[]';
32
+ }
33
+ if (isArrayOfSimilarObjects(data)) {
34
+ return renderTable(data, indent);
35
+ }
36
+ return data
37
+ .map((item) => {
38
+ if (typeof item === 'object' &&
39
+ item !== null &&
40
+ Object.keys(item).length > 0) {
41
+ const rendered = jsonToMarkdown(item, indent + 1);
42
+ return `${spacing}-\n${rendered}`;
43
+ }
44
+ const rendered = jsonToMarkdown(item, indent + 1).trimStart();
45
+ return `${spacing}- ${rendered}`;
46
+ })
47
+ .join('\n');
48
+ }
49
+ if (typeof data === 'object') {
50
+ const entries = Object.entries(data);
51
+ if (entries.length === 0) {
52
+ return '{}';
53
+ }
54
+ return entries
55
+ .map(([key, value]) => {
56
+ const displayKey = camelToSpace(key);
57
+ if (typeof value === 'object' &&
58
+ value !== null &&
59
+ Object.keys(value).length > 0) {
60
+ const renderedValue = jsonToMarkdown(value, indent + 1);
61
+ return `${spacing}- **${displayKey}**:\n${renderedValue}`;
62
+ }
63
+ const renderedValue = jsonToMarkdown(value, indent + 1).trimStart();
64
+ return `${spacing}- **${displayKey}**: ${renderedValue}`;
65
+ })
66
+ .join('\n');
67
+ }
68
+ if (typeof data === 'string') {
69
+ return data
70
+ .split('\n')
71
+ .map((line, i) => (i === 0 ? line : spacing + line))
72
+ .join('\n');
73
+ }
74
+ return String(data);
75
+ }
76
+ /**
77
+ * Safely attempts to parse a string as JSON and convert it to Markdown.
78
+ * If parsing fails, returns the original string.
79
+ *
80
+ * @param text The text to potentially convert.
81
+ * @returns The Markdown representation or the original text.
82
+ */
83
+ export function safeJsonToMarkdown(text) {
84
+ try {
85
+ const parsed = JSON.parse(text);
86
+ return jsonToMarkdown(parsed);
87
+ }
88
+ catch {
89
+ return text;
90
+ }
91
+ }
92
+ export function isRecord(value) {
93
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
94
+ }
95
+ function isArrayOfSimilarObjects(data) {
96
+ if (data.length === 0) {
97
+ return false;
98
+ }
99
+ if (!data.every(isRecord))
100
+ return false;
101
+ const firstKeys = Object.keys(data[0]).sort().join(',');
102
+ return data.every((item) => Object.keys(item).sort().join(',') === firstKeys);
103
+ }
104
+ function renderTable(data, indent = 0) {
105
+ const spacing = ' '.repeat(indent);
106
+ const keys = Object.keys(data[0]);
107
+ const displayKeys = keys.map(camelToSpace);
108
+ const header = `${spacing}| ${displayKeys.join(' | ')} |`;
109
+ const separator = `${spacing}| ${keys.map(() => '---').join(' | ')} |`;
110
+ const rows = data.map((item) => `${spacing}| ${keys
111
+ .map((key) => {
112
+ const val = item[key];
113
+ if (typeof val === 'object' && val !== null) {
114
+ return JSON.stringify(val)
115
+ .replace(/\\/g, '\\\\')
116
+ .replace(/\|/g, '\\|');
117
+ }
118
+ return String(val)
119
+ .replace(/\\/g, '\\\\')
120
+ .replace(/\|/g, '\\|')
121
+ .replace(/\n/g, ' ');
122
+ })
123
+ .join(' | ')} |`);
124
+ return [header, separator, ...rows].join('\n');
125
+ }
126
+ //# sourceMappingURL=markdownUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdownUtils.js","sourceRoot":"","sources":["../../../src/utils/markdownUtils.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,107 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, expect, it } from 'vitest';
7
+ import { jsonToMarkdown, safeJsonToMarkdown } from './markdownUtils.js';
8
+ describe('markdownUtils', () => {
9
+ describe('jsonToMarkdown', () => {
10
+ it('should handle primitives', () => {
11
+ expect(jsonToMarkdown('hello')).toBe('hello');
12
+ expect(jsonToMarkdown(123)).toBe('123');
13
+ expect(jsonToMarkdown(true)).toBe('true');
14
+ expect(jsonToMarkdown(null)).toBe('null');
15
+ expect(jsonToMarkdown(undefined)).toBe('undefined');
16
+ });
17
+ it('should handle simple arrays', () => {
18
+ const data = ['a', 'b', 'c'];
19
+ expect(jsonToMarkdown(data)).toBe('- a\n- b\n- c');
20
+ });
21
+ it('should handle simple objects and convert camelCase to Space Case', () => {
22
+ const data = { userName: 'Alice', userAge: 30 };
23
+ expect(jsonToMarkdown(data)).toBe('- **User Name**: Alice\n- **User Age**: 30');
24
+ });
25
+ it('should handle empty structures', () => {
26
+ expect(jsonToMarkdown([])).toBe('[]');
27
+ expect(jsonToMarkdown({})).toBe('{}');
28
+ });
29
+ it('should handle nested structures with proper indentation', () => {
30
+ const data = {
31
+ userInfo: {
32
+ fullName: 'Bob Smith',
33
+ userRoles: ['admin', 'user'],
34
+ },
35
+ isActive: true,
36
+ };
37
+ const result = jsonToMarkdown(data);
38
+ expect(result).toBe('- **User Info**:\n' +
39
+ ' - **Full Name**: Bob Smith\n' +
40
+ ' - **User Roles**:\n' +
41
+ ' - admin\n' +
42
+ ' - user\n' +
43
+ '- **Is Active**: true');
44
+ });
45
+ it('should render tables for arrays of similar objects with Space Case keys', () => {
46
+ const data = [
47
+ { userId: 1, userName: 'Item 1' },
48
+ { userId: 2, userName: 'Item 2' },
49
+ ];
50
+ const result = jsonToMarkdown(data);
51
+ expect(result).toBe('| User Id | User Name |\n| --- | --- |\n| 1 | Item 1 |\n| 2 | Item 2 |');
52
+ });
53
+ it('should handle pipe characters, backslashes, and newlines in table data', () => {
54
+ const data = [
55
+ { colInfo: 'val|ue', otherInfo: 'line\nbreak', pathInfo: 'C:\\test' },
56
+ ];
57
+ const result = jsonToMarkdown(data);
58
+ expect(result).toBe('| Col Info | Other Info | Path Info |\n| --- | --- | --- |\n| val\\|ue | line break | C:\\\\test |');
59
+ });
60
+ it('should fallback to lists for arrays with mixed objects', () => {
61
+ const data = [
62
+ { userId: 1, userName: 'Item 1' },
63
+ { userId: 2, somethingElse: 'Item 2' },
64
+ ];
65
+ const result = jsonToMarkdown(data);
66
+ expect(result).toContain('- **User Id**: 1');
67
+ expect(result).toContain('- **Something Else**: Item 2');
68
+ });
69
+ it('should properly indent nested tables', () => {
70
+ const data = {
71
+ items: [
72
+ { id: 1, name: 'A' },
73
+ { id: 2, name: 'B' },
74
+ ],
75
+ };
76
+ const result = jsonToMarkdown(data);
77
+ const lines = result.split('\n');
78
+ expect(lines[0]).toBe('- **Items**:');
79
+ expect(lines[1]).toBe(' | Id | Name |');
80
+ expect(lines[2]).toBe(' | --- | --- |');
81
+ expect(lines[3]).toBe(' | 1 | A |');
82
+ expect(lines[4]).toBe(' | 2 | B |');
83
+ });
84
+ it('should indent subsequent lines of multiline strings', () => {
85
+ const data = {
86
+ description: 'Line 1\nLine 2\nLine 3',
87
+ };
88
+ const result = jsonToMarkdown(data);
89
+ expect(result).toBe('- **Description**: Line 1\n Line 2\n Line 3');
90
+ });
91
+ });
92
+ describe('safeJsonToMarkdown', () => {
93
+ it('should convert valid JSON', () => {
94
+ const json = JSON.stringify({ keyName: 'value' });
95
+ expect(safeJsonToMarkdown(json)).toBe('- **Key Name**: value');
96
+ });
97
+ it('should return original string for invalid JSON', () => {
98
+ const notJson = 'Not a JSON string';
99
+ expect(safeJsonToMarkdown(notJson)).toBe(notJson);
100
+ });
101
+ it('should handle plain strings that look like numbers or booleans but are valid JSON', () => {
102
+ expect(safeJsonToMarkdown('123')).toBe('123');
103
+ expect(safeJsonToMarkdown('true')).toBe('true');
104
+ });
105
+ });
106
+ });
107
+ //# sourceMappingURL=markdownUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdownUtils.test.js","sourceRoot":"","sources":["../../../src/utils/markdownUtils.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExE,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;YAC1E,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAChD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAC/B,4CAA4C,CAC7C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,IAAI,GAAG;gBACX,QAAQ,EAAE;oBACR,QAAQ,EAAE,WAAW;oBACrB,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;iBAC7B;gBACD,QAAQ,EAAE,IAAI;aACf,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,oBAAoB;gBAClB,gCAAgC;gBAChC,uBAAuB;gBACvB,eAAe;gBACf,cAAc;gBACd,uBAAuB,CAC1B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;YACjF,MAAM,IAAI,GAAG;gBACX,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBACjC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE;aAClC,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,wEAAwE,CACzE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;YAChF,MAAM,IAAI,GAAG;gBACX,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE;aACtE,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACjB,oGAAoG,CACrG,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,IAAI,GAAG;gBACX,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBACjC,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE;aACvC,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,IAAI,GAAG;gBACX,KAAK,EAAE;oBACL,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE;oBACpB,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE;iBACrB;aACF,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,IAAI,GAAG;gBACX,WAAW,EAAE,wBAAwB;aACtC,CAAC;YACF,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YAClD,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,OAAO,GAAG,mBAAmB,CAAC;YACpC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;YAC3F,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Configuration for an OAuth 2.0 Authorization Code flow.
8
+ * Contains only the fields needed by the shared flow utilities.
9
+ */
10
+ export interface OAuthFlowConfig {
11
+ clientId: string;
12
+ clientSecret?: string;
13
+ authorizationUrl: string;
14
+ tokenUrl: string;
15
+ scopes?: string[];
16
+ audiences?: string[];
17
+ redirectUri?: string;
18
+ }
19
+ /**
20
+ * Configuration subset needed for token refresh operations.
21
+ */
22
+ export type OAuthRefreshConfig = Pick<OAuthFlowConfig, 'clientId' | 'clientSecret' | 'scopes' | 'audiences'>;
23
+ /**
24
+ * PKCE (Proof Key for Code Exchange) parameters.
25
+ */
26
+ export interface PKCEParams {
27
+ codeVerifier: string;
28
+ codeChallenge: string;
29
+ state: string;
30
+ }
31
+ /**
32
+ * OAuth authorization response from the callback server.
33
+ */
34
+ export interface OAuthAuthorizationResponse {
35
+ code: string;
36
+ state: string;
37
+ }
38
+ /**
39
+ * OAuth token response from the authorization server.
40
+ */
41
+ export interface OAuthTokenResponse {
42
+ access_token: string;
43
+ token_type: string;
44
+ expires_in?: number;
45
+ refresh_token?: string;
46
+ scope?: string;
47
+ }
48
+ /** The path the local callback server listens on. */
49
+ export declare const REDIRECT_PATH = "/oauth/callback";
50
+ /**
51
+ * Generate PKCE parameters for OAuth flow.
52
+ *
53
+ * @returns PKCE parameters including code verifier, challenge, and state
54
+ */
55
+ export declare function generatePKCEParams(): PKCEParams;
56
+ /**
57
+ * Start a local HTTP server to handle OAuth callback.
58
+ * The server will listen on the specified port (or port 0 for OS assignment).
59
+ *
60
+ * @param expectedState The state parameter to validate
61
+ * @param port Optional preferred port to listen on
62
+ * @returns Object containing the port (available immediately) and a promise for the auth response
63
+ */
64
+ export declare function startCallbackServer(expectedState: string, port?: number): {
65
+ port: Promise<number>;
66
+ response: Promise<OAuthAuthorizationResponse>;
67
+ };
68
+ /**
69
+ * Extract the port number from a URL string if available and valid.
70
+ *
71
+ * @param urlString The URL string to parse
72
+ * @returns The port number or undefined if not found or invalid
73
+ */
74
+ export declare function getPortFromUrl(urlString?: string): number | undefined;
75
+ /**
76
+ * Build the authorization URL for the OAuth flow.
77
+ *
78
+ * @param config OAuth flow configuration
79
+ * @param pkceParams PKCE parameters
80
+ * @param redirectPort The port to use for the redirect URI
81
+ * @param resource Optional resource parameter value (RFC 8707)
82
+ * @returns The authorization URL
83
+ */
84
+ export declare function buildAuthorizationUrl(config: OAuthFlowConfig, pkceParams: PKCEParams, redirectPort: number, resource?: string): string;
85
+ /**
86
+ * Exchange an authorization code for tokens.
87
+ *
88
+ * @param config OAuth flow configuration
89
+ * @param code Authorization code
90
+ * @param codeVerifier PKCE code verifier
91
+ * @param redirectPort The port to use for the redirect URI
92
+ * @param resource Optional resource parameter value (RFC 8707)
93
+ * @returns The token response
94
+ */
95
+ export declare function exchangeCodeForToken(config: OAuthFlowConfig, code: string, codeVerifier: string, redirectPort: number, resource?: string): Promise<OAuthTokenResponse>;
96
+ /**
97
+ * Refresh an access token using a refresh token.
98
+ *
99
+ * @param config OAuth configuration subset needed for refresh
100
+ * @param refreshToken The refresh token
101
+ * @param tokenUrl The token endpoint URL
102
+ * @param resource Optional resource parameter value (RFC 8707)
103
+ * @returns The new token response
104
+ */
105
+ export declare function refreshAccessToken(config: OAuthRefreshConfig, refreshToken: string, tokenUrl: string, resource?: string): Promise<OAuthTokenResponse>;