@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,401 @@
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 { randomUUID } from 'node:crypto';
8
+ vi.mock('node:crypto', () => ({
9
+ randomUUID: vi.fn(),
10
+ }));
11
+ const runInDevTraceSpan = vi.hoisted(() => vi.fn(async (opts, fn) => {
12
+ const metadata = { name: '', attributes: opts.attributes || {} };
13
+ return fn({
14
+ metadata,
15
+ endSpan: vi.fn(),
16
+ });
17
+ }));
18
+ vi.mock('../telemetry/trace.js', () => ({
19
+ runInDevTraceSpan,
20
+ }));
21
+ vi.mock('../telemetry/loggers.js', () => ({
22
+ logToolCall: vi.fn(),
23
+ }));
24
+ vi.mock('../telemetry/types.js', () => ({
25
+ ToolCallEvent: vi.fn().mockImplementation((call) => ({ ...call })),
26
+ }));
27
+ import { SchedulerStateManager, } from './state-manager.js';
28
+ import { checkPolicy, updatePolicy } from './policy.js';
29
+ import { ToolExecutor } from './tool-executor.js';
30
+ import { ToolModificationHandler } from './tool-modifier.js';
31
+ vi.mock('./state-manager.js');
32
+ vi.mock('./confirmation.js');
33
+ vi.mock('./policy.js', async (importOriginal) => {
34
+ const actual = await importOriginal();
35
+ return {
36
+ ...actual,
37
+ checkPolicy: vi.fn(),
38
+ updatePolicy: vi.fn(),
39
+ };
40
+ });
41
+ vi.mock('./tool-executor.js');
42
+ vi.mock('./tool-modifier.js');
43
+ import { Scheduler } from './scheduler.js';
44
+ import { ApprovalMode, PolicyDecision } from '../policy/types.js';
45
+ import { Kind, } from '../tools/tools.js';
46
+ import { ROOT_SCHEDULER_ID, } from './types.js';
47
+ import { GeminiCliOperation } from '../telemetry/constants.js';
48
+ describe('Scheduler Parallel Execution', () => {
49
+ let scheduler;
50
+ let signal;
51
+ let abortController;
52
+ let mockConfig;
53
+ let mockMessageBus;
54
+ let mockPolicyEngine;
55
+ let mockToolRegistry;
56
+ let getPreferredEditor;
57
+ let mockStateManager;
58
+ let mockExecutor;
59
+ let mockModifier;
60
+ const req1 = {
61
+ callId: 'call-1',
62
+ name: 'read-tool-1',
63
+ args: { path: 'a.txt' },
64
+ isClientInitiated: false,
65
+ prompt_id: 'p1',
66
+ schedulerId: ROOT_SCHEDULER_ID,
67
+ };
68
+ const req2 = {
69
+ callId: 'call-2',
70
+ name: 'read-tool-2',
71
+ args: { path: 'b.txt' },
72
+ isClientInitiated: false,
73
+ prompt_id: 'p1',
74
+ schedulerId: ROOT_SCHEDULER_ID,
75
+ };
76
+ const req3 = {
77
+ callId: 'call-3',
78
+ name: 'write-tool',
79
+ args: { path: 'c.txt', content: 'hi' },
80
+ isClientInitiated: false,
81
+ prompt_id: 'p1',
82
+ schedulerId: ROOT_SCHEDULER_ID,
83
+ };
84
+ const agentReq1 = {
85
+ callId: 'agent-1',
86
+ name: 'agent-tool-1',
87
+ args: { query: 'do thing 1' },
88
+ isClientInitiated: false,
89
+ prompt_id: 'p1',
90
+ schedulerId: ROOT_SCHEDULER_ID,
91
+ };
92
+ const agentReq2 = {
93
+ callId: 'agent-2',
94
+ name: 'agent-tool-2',
95
+ args: { query: 'do thing 2' },
96
+ isClientInitiated: false,
97
+ prompt_id: 'p1',
98
+ schedulerId: ROOT_SCHEDULER_ID,
99
+ };
100
+ const readTool1 = {
101
+ name: 'read-tool-1',
102
+ kind: Kind.Read,
103
+ isReadOnly: true,
104
+ build: vi.fn(),
105
+ };
106
+ const readTool2 = {
107
+ name: 'read-tool-2',
108
+ kind: Kind.Read,
109
+ isReadOnly: true,
110
+ build: vi.fn(),
111
+ };
112
+ const writeTool = {
113
+ name: 'write-tool',
114
+ kind: Kind.Execute,
115
+ isReadOnly: false,
116
+ build: vi.fn(),
117
+ };
118
+ const agentTool1 = {
119
+ name: 'agent-tool-1',
120
+ kind: Kind.Agent,
121
+ isReadOnly: false,
122
+ build: vi.fn(),
123
+ };
124
+ const agentTool2 = {
125
+ name: 'agent-tool-2',
126
+ kind: Kind.Agent,
127
+ isReadOnly: false,
128
+ build: vi.fn(),
129
+ };
130
+ const mockInvocation = {
131
+ shouldConfirmExecute: vi.fn().mockResolvedValue(false),
132
+ };
133
+ beforeEach(() => {
134
+ vi.mocked(randomUUID).mockReturnValue('uuid');
135
+ abortController = new AbortController();
136
+ signal = abortController.signal;
137
+ mockPolicyEngine = {
138
+ check: vi.fn().mockResolvedValue({ decision: PolicyDecision.ALLOW }),
139
+ };
140
+ mockToolRegistry = {
141
+ getTool: vi.fn((name) => {
142
+ if (name === 'read-tool-1')
143
+ return readTool1;
144
+ if (name === 'read-tool-2')
145
+ return readTool2;
146
+ if (name === 'write-tool')
147
+ return writeTool;
148
+ if (name === 'agent-tool-1')
149
+ return agentTool1;
150
+ if (name === 'agent-tool-2')
151
+ return agentTool2;
152
+ return undefined;
153
+ }),
154
+ getAllToolNames: vi
155
+ .fn()
156
+ .mockReturnValue([
157
+ 'read-tool-1',
158
+ 'read-tool-2',
159
+ 'write-tool',
160
+ 'agent-tool-1',
161
+ 'agent-tool-2',
162
+ ]),
163
+ };
164
+ mockConfig = {
165
+ getPolicyEngine: vi.fn().mockReturnValue(mockPolicyEngine),
166
+ toolRegistry: mockToolRegistry,
167
+ isInteractive: vi.fn().mockReturnValue(true),
168
+ getEnableHooks: vi.fn().mockReturnValue(true),
169
+ setApprovalMode: vi.fn(),
170
+ getApprovalMode: vi.fn().mockReturnValue(ApprovalMode.DEFAULT),
171
+ };
172
+ mockConfig.config = mockConfig;
173
+ mockMessageBus = {
174
+ publish: vi.fn(),
175
+ subscribe: vi.fn(),
176
+ };
177
+ getPreferredEditor = vi.fn().mockReturnValue('vim');
178
+ vi.mocked(checkPolicy).mockReset();
179
+ vi.mocked(checkPolicy).mockResolvedValue({
180
+ decision: PolicyDecision.ALLOW,
181
+ rule: undefined,
182
+ });
183
+ vi.mocked(updatePolicy).mockReset();
184
+ const mockActiveCallsMap = new Map();
185
+ const mockQueue = [];
186
+ let capturedTerminalHandler;
187
+ mockStateManager = {
188
+ enqueue: vi.fn((calls) => {
189
+ mockQueue.push(...calls.map((c) => ({ ...c })));
190
+ }),
191
+ dequeue: vi.fn(() => {
192
+ const next = mockQueue.shift();
193
+ if (next)
194
+ mockActiveCallsMap.set(next.request.callId, next);
195
+ return next;
196
+ }),
197
+ peekQueue: vi.fn(() => mockQueue[0]),
198
+ getToolCall: vi.fn((id) => mockActiveCallsMap.get(id)),
199
+ updateStatus: vi.fn((id, status) => {
200
+ const call = mockActiveCallsMap.get(id);
201
+ if (call)
202
+ call.status = status;
203
+ }),
204
+ finalizeCall: vi.fn((id) => {
205
+ const call = mockActiveCallsMap.get(id);
206
+ if (call) {
207
+ mockActiveCallsMap.delete(id);
208
+ capturedTerminalHandler?.(call);
209
+ }
210
+ }),
211
+ updateArgs: vi.fn(),
212
+ setOutcome: vi.fn(),
213
+ cancelAllQueued: vi.fn(() => {
214
+ mockQueue.length = 0;
215
+ }),
216
+ clearBatch: vi.fn(),
217
+ };
218
+ Object.defineProperty(mockStateManager, 'isActive', {
219
+ get: vi.fn(() => mockActiveCallsMap.size > 0),
220
+ configurable: true,
221
+ });
222
+ Object.defineProperty(mockStateManager, 'allActiveCalls', {
223
+ get: vi.fn(() => Array.from(mockActiveCallsMap.values())),
224
+ configurable: true,
225
+ });
226
+ Object.defineProperty(mockStateManager, 'queueLength', {
227
+ get: vi.fn(() => mockQueue.length),
228
+ configurable: true,
229
+ });
230
+ Object.defineProperty(mockStateManager, 'firstActiveCall', {
231
+ get: vi.fn(() => mockActiveCallsMap.values().next().value),
232
+ configurable: true,
233
+ });
234
+ Object.defineProperty(mockStateManager, 'completedBatch', {
235
+ get: vi.fn().mockReturnValue([]),
236
+ configurable: true,
237
+ });
238
+ vi.mocked(SchedulerStateManager).mockImplementation((_bus, _id, onTerminal) => {
239
+ capturedTerminalHandler = onTerminal;
240
+ return mockStateManager;
241
+ });
242
+ mockExecutor = { execute: vi.fn() };
243
+ vi.mocked(ToolExecutor).mockReturnValue(mockExecutor);
244
+ mockModifier = {
245
+ handleModifyWithEditor: vi.fn(),
246
+ applyInlineModify: vi.fn(),
247
+ };
248
+ vi.mocked(ToolModificationHandler).mockReturnValue(mockModifier);
249
+ scheduler = new Scheduler({
250
+ config: mockConfig,
251
+ messageBus: mockMessageBus,
252
+ getPreferredEditor,
253
+ schedulerId: 'root',
254
+ });
255
+ vi.mocked(readTool1.build).mockReturnValue(mockInvocation);
256
+ vi.mocked(readTool2.build).mockReturnValue(mockInvocation);
257
+ vi.mocked(writeTool.build).mockReturnValue(mockInvocation);
258
+ vi.mocked(agentTool1.build).mockReturnValue(mockInvocation);
259
+ vi.mocked(agentTool2.build).mockReturnValue(mockInvocation);
260
+ });
261
+ afterEach(() => {
262
+ vi.clearAllMocks();
263
+ });
264
+ it('should execute contiguous read-only tools in parallel', async () => {
265
+ const executionLog = [];
266
+ mockExecutor.execute.mockImplementation(async ({ call }) => {
267
+ const id = call.request.callId;
268
+ executionLog.push(`start-${id}`);
269
+ await new Promise((resolve) => setTimeout(resolve, 10));
270
+ executionLog.push(`end-${id}`);
271
+ return {
272
+ status: 'success',
273
+ response: { callId: id, responseParts: [] },
274
+ };
275
+ });
276
+ // Schedule 2 read tools and 1 write tool
277
+ await scheduler.schedule([req1, req2, req3], signal);
278
+ // Parallel read tools should start together
279
+ expect(executionLog[0]).toBe('start-call-1');
280
+ expect(executionLog[1]).toBe('start-call-2');
281
+ // They can finish in any order, but both must finish before call-3 starts
282
+ expect(executionLog.indexOf('start-call-3')).toBeGreaterThan(executionLog.indexOf('end-call-1'));
283
+ expect(executionLog.indexOf('start-call-3')).toBeGreaterThan(executionLog.indexOf('end-call-2'));
284
+ expect(executionLog).toContain('end-call-3');
285
+ expect(runInDevTraceSpan).toHaveBeenCalledWith(expect.objectContaining({
286
+ operation: GeminiCliOperation.ScheduleToolCalls,
287
+ }), expect.any(Function));
288
+ const spanArgs = vi.mocked(runInDevTraceSpan).mock.calls[0];
289
+ const fn = spanArgs[1];
290
+ const metadata = { name: '', attributes: {} };
291
+ await fn({ metadata, endSpan: vi.fn() });
292
+ expect(metadata).toMatchObject({
293
+ input: [req1, req2, req3],
294
+ });
295
+ });
296
+ it('should execute non-read-only tools sequentially', async () => {
297
+ const executionLog = [];
298
+ mockExecutor.execute.mockImplementation(async ({ call }) => {
299
+ const id = call.request.callId;
300
+ executionLog.push(`start-${id}`);
301
+ await new Promise((resolve) => setTimeout(resolve, 10));
302
+ executionLog.push(`end-${id}`);
303
+ return {
304
+ status: 'success',
305
+ response: { callId: id, responseParts: [] },
306
+ };
307
+ });
308
+ // req3 is NOT read-only
309
+ await scheduler.schedule([req3, req1], signal);
310
+ // Should be strictly sequential
311
+ expect(executionLog).toEqual([
312
+ 'start-call-3',
313
+ 'end-call-3',
314
+ 'start-call-1',
315
+ 'end-call-1',
316
+ ]);
317
+ });
318
+ it('should execute [WRITE, READ, READ] as [sequential, parallel]', async () => {
319
+ const executionLog = [];
320
+ mockExecutor.execute.mockImplementation(async ({ call }) => {
321
+ const id = call.request.callId;
322
+ executionLog.push(`start-${id}`);
323
+ await new Promise((resolve) => setTimeout(resolve, 10));
324
+ executionLog.push(`end-${id}`);
325
+ return {
326
+ status: 'success',
327
+ response: { callId: id, responseParts: [] },
328
+ };
329
+ });
330
+ // req3 (WRITE), req1 (READ), req2 (READ)
331
+ await scheduler.schedule([req3, req1, req2], signal);
332
+ // Order should be:
333
+ // 1. write starts and ends
334
+ // 2. read1 and read2 start together (parallel)
335
+ expect(executionLog[0]).toBe('start-call-3');
336
+ expect(executionLog[1]).toBe('end-call-3');
337
+ expect(executionLog.slice(2, 4)).toContain('start-call-1');
338
+ expect(executionLog.slice(2, 4)).toContain('start-call-2');
339
+ });
340
+ it('should execute [READ, READ, WRITE, READ, READ] in three waves', async () => {
341
+ const executionLog = [];
342
+ mockExecutor.execute.mockImplementation(async ({ call }) => {
343
+ const id = call.request.callId;
344
+ executionLog.push(`start-${id}`);
345
+ await new Promise((resolve) => setTimeout(resolve, 10));
346
+ executionLog.push(`end-${id}`);
347
+ return {
348
+ status: 'success',
349
+ response: { callId: id, responseParts: [] },
350
+ };
351
+ });
352
+ const req4 = { ...req1, callId: 'call-4' };
353
+ const req5 = { ...req2, callId: 'call-5' };
354
+ await scheduler.schedule([req1, req2, req3, req4, req5], signal);
355
+ // Wave 1: call-1, call-2 (parallel)
356
+ expect(executionLog.slice(0, 2)).toContain('start-call-1');
357
+ expect(executionLog.slice(0, 2)).toContain('start-call-2');
358
+ // Wave 2: call-3 (sequential)
359
+ // Must start after both call-1 and call-2 end
360
+ const start3 = executionLog.indexOf('start-call-3');
361
+ expect(start3).toBeGreaterThan(executionLog.indexOf('end-call-1'));
362
+ expect(start3).toBeGreaterThan(executionLog.indexOf('end-call-2'));
363
+ const end3 = executionLog.indexOf('end-call-3');
364
+ expect(end3).toBeGreaterThan(start3);
365
+ // Wave 3: call-4, call-5 (parallel)
366
+ // Must start after call-3 ends
367
+ expect(executionLog.indexOf('start-call-4')).toBeGreaterThan(end3);
368
+ expect(executionLog.indexOf('start-call-5')).toBeGreaterThan(end3);
369
+ });
370
+ it('should execute [Agent, Agent, Sequential, Parallelizable] in three waves', async () => {
371
+ const executionLog = [];
372
+ mockExecutor.execute.mockImplementation(async ({ call }) => {
373
+ const id = call.request.callId;
374
+ executionLog.push(`start-${id}`);
375
+ await new Promise((resolve) => setTimeout(resolve, 10));
376
+ executionLog.push(`end-${id}`);
377
+ return {
378
+ status: 'success',
379
+ response: { callId: id, responseParts: [] },
380
+ };
381
+ });
382
+ // Schedule: agentReq1 (Parallel), agentReq2 (Parallel), req3 (Sequential/Write), req1 (Parallel/Read)
383
+ await scheduler.schedule([agentReq1, agentReq2, req3, req1], signal);
384
+ // Wave 1: agent-1, agent-2 (parallel)
385
+ expect(executionLog.slice(0, 2)).toContain('start-agent-1');
386
+ expect(executionLog.slice(0, 2)).toContain('start-agent-2');
387
+ // Both agents must end before anything else starts
388
+ const endAgent1 = executionLog.indexOf('end-agent-1');
389
+ const endAgent2 = executionLog.indexOf('end-agent-2');
390
+ const wave1End = Math.max(endAgent1, endAgent2);
391
+ // Wave 2: call-3 (sequential/write)
392
+ const start3 = executionLog.indexOf('start-call-3');
393
+ const end3 = executionLog.indexOf('end-call-3');
394
+ expect(start3).toBeGreaterThan(wave1End);
395
+ expect(end3).toBeGreaterThan(start3);
396
+ // Wave 3: call-1 (parallelizable/read)
397
+ const start1 = executionLog.indexOf('start-call-1');
398
+ expect(start1).toBeGreaterThan(end3);
399
+ });
400
+ });
401
+ //# sourceMappingURL=scheduler_parallel.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler_parallel.test.js","sourceRoot":"","sources":["../../../src/scheduler/scheduler_parallel.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export interface FolderDiscoveryResults {
7
+ commands: string[];
8
+ mcps: string[];
9
+ hooks: string[];
10
+ skills: string[];
11
+ settings: string[];
12
+ securityWarnings: string[];
13
+ discoveryErrors: string[];
14
+ }
15
+ /**
16
+ * A safe, read-only service to discover local configurations in a folder
17
+ * before it is trusted.
18
+ */
19
+ export declare class FolderTrustDiscoveryService {
20
+ /**
21
+ * Discovers configurations in the given workspace directory.
22
+ * @param workspaceDir The directory to scan.
23
+ * @returns A summary of discovered configurations.
24
+ */
25
+ static discover(workspaceDir: string): Promise<FolderDiscoveryResults>;
26
+ private static discoverCommands;
27
+ private static discoverSkills;
28
+ private static discoverSettings;
29
+ private static collectSecurityWarnings;
30
+ private static isRecord;
31
+ private static exists;
32
+ }
@@ -0,0 +1,169 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'node:fs/promises';
7
+ import * as path from 'node:path';
8
+ import stripJsonComments from 'strip-json-comments';
9
+ import { GEMINI_DIR } from '../utils/paths.js';
10
+ import { debugLogger } from '../utils/debugLogger.js';
11
+ import { isNodeError } from '../utils/errors.js';
12
+ /**
13
+ * A safe, read-only service to discover local configurations in a folder
14
+ * before it is trusted.
15
+ */
16
+ export class FolderTrustDiscoveryService {
17
+ /**
18
+ * Discovers configurations in the given workspace directory.
19
+ * @param workspaceDir The directory to scan.
20
+ * @returns A summary of discovered configurations.
21
+ */
22
+ static async discover(workspaceDir) {
23
+ const results = {
24
+ commands: [],
25
+ mcps: [],
26
+ hooks: [],
27
+ skills: [],
28
+ settings: [],
29
+ securityWarnings: [],
30
+ discoveryErrors: [],
31
+ };
32
+ const geminiDir = path.join(workspaceDir, GEMINI_DIR);
33
+ if (!(await this.exists(geminiDir))) {
34
+ return results;
35
+ }
36
+ await Promise.all([
37
+ this.discoverCommands(geminiDir, results),
38
+ this.discoverSkills(geminiDir, results),
39
+ this.discoverSettings(geminiDir, results),
40
+ ]);
41
+ return results;
42
+ }
43
+ static async discoverCommands(geminiDir, results) {
44
+ const commandsDir = path.join(geminiDir, 'commands');
45
+ if (await this.exists(commandsDir)) {
46
+ try {
47
+ const files = await fs.readdir(commandsDir, { recursive: true });
48
+ results.commands = files
49
+ .filter((f) => f.endsWith('.toml'))
50
+ .map((f) => path.basename(f, '.toml'));
51
+ }
52
+ catch (e) {
53
+ results.discoveryErrors.push(`Failed to discover commands: ${e instanceof Error ? e.message : String(e)}`);
54
+ }
55
+ }
56
+ }
57
+ static async discoverSkills(geminiDir, results) {
58
+ const skillsDir = path.join(geminiDir, 'skills');
59
+ if (await this.exists(skillsDir)) {
60
+ try {
61
+ const entries = await fs.readdir(skillsDir, { withFileTypes: true });
62
+ for (const entry of entries) {
63
+ if (entry.isDirectory()) {
64
+ const skillMdPath = path.join(skillsDir, entry.name, 'SKILL.md');
65
+ if (await this.exists(skillMdPath)) {
66
+ results.skills.push(entry.name);
67
+ }
68
+ }
69
+ }
70
+ }
71
+ catch (e) {
72
+ results.discoveryErrors.push(`Failed to discover skills: ${e instanceof Error ? e.message : String(e)}`);
73
+ }
74
+ }
75
+ }
76
+ static async discoverSettings(geminiDir, results) {
77
+ const settingsPath = path.join(geminiDir, 'settings.json');
78
+ if (!(await this.exists(settingsPath)))
79
+ return;
80
+ try {
81
+ const content = await fs.readFile(settingsPath, 'utf-8');
82
+ const settings = JSON.parse(stripJsonComments(content));
83
+ if (!this.isRecord(settings)) {
84
+ debugLogger.debug('Settings must be a JSON object');
85
+ return;
86
+ }
87
+ results.settings = Object.keys(settings).filter((key) => !['mcpServers', 'hooks', '$schema'].includes(key));
88
+ results.securityWarnings = this.collectSecurityWarnings(settings);
89
+ const mcpServers = settings['mcpServers'];
90
+ if (this.isRecord(mcpServers)) {
91
+ results.mcps = Object.keys(mcpServers);
92
+ }
93
+ const hooksConfig = settings['hooks'];
94
+ if (this.isRecord(hooksConfig)) {
95
+ const hooks = new Set();
96
+ for (const event of Object.values(hooksConfig)) {
97
+ if (!Array.isArray(event))
98
+ continue;
99
+ for (const hook of event) {
100
+ if (this.isRecord(hook) &&
101
+ // eslint-disable-next-line no-restricted-syntax
102
+ typeof hook['command'] === 'string') {
103
+ hooks.add(hook['command']);
104
+ }
105
+ }
106
+ }
107
+ results.hooks = Array.from(hooks);
108
+ }
109
+ }
110
+ catch (e) {
111
+ results.discoveryErrors.push(`Failed to discover settings: ${e instanceof Error ? e.message : String(e)}`);
112
+ }
113
+ }
114
+ static collectSecurityWarnings(settings) {
115
+ const warnings = [];
116
+ const tools = this.isRecord(settings['tools'])
117
+ ? settings['tools']
118
+ : undefined;
119
+ const experimental = this.isRecord(settings['experimental'])
120
+ ? settings['experimental']
121
+ : undefined;
122
+ const security = this.isRecord(settings['security'])
123
+ ? settings['security']
124
+ : undefined;
125
+ const folderTrust = security && this.isRecord(security['folderTrust'])
126
+ ? security['folderTrust']
127
+ : undefined;
128
+ const allowedTools = tools?.['allowed'];
129
+ const checks = [
130
+ {
131
+ condition: Array.isArray(allowedTools) && allowedTools.length > 0,
132
+ message: 'This project auto-approves certain tools (tools.allowed).',
133
+ },
134
+ {
135
+ condition: experimental?.['enableAgents'] === true,
136
+ message: 'This project enables autonomous agents (enableAgents).',
137
+ },
138
+ {
139
+ condition: folderTrust?.['enabled'] === false,
140
+ message: 'This project attempts to disable folder trust (security.folderTrust.enabled).',
141
+ },
142
+ {
143
+ condition: tools?.['sandbox'] === false,
144
+ message: 'This project disables the security sandbox (tools.sandbox).',
145
+ },
146
+ ];
147
+ for (const check of checks) {
148
+ if (check.condition)
149
+ warnings.push(check.message);
150
+ }
151
+ return warnings;
152
+ }
153
+ static isRecord(val) {
154
+ return !!val && typeof val === 'object' && !Array.isArray(val);
155
+ }
156
+ static async exists(filePath) {
157
+ try {
158
+ await fs.stat(filePath);
159
+ return true;
160
+ }
161
+ catch (e) {
162
+ if (isNodeError(e) && e.code === 'ENOENT') {
163
+ return false;
164
+ }
165
+ throw e;
166
+ }
167
+ }
168
+ }
169
+ //# sourceMappingURL=FolderTrustDiscoveryService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FolderTrustDiscoveryService.js","sourceRoot":"","sources":["../../../src/services/FolderTrustDiscoveryService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};