@google/gemini-cli-core 0.24.0-nightly.20251231.05049b5ab → 0.24.0-preview.0

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 (327) hide show
  1. package/dist/docs/cli/settings.md +1 -0
  2. package/dist/docs/cli/skills.md +156 -0
  3. package/dist/docs/cli/telemetry.md +3 -3
  4. package/dist/docs/cli/tutorials/skills-getting-started.md +124 -0
  5. package/dist/docs/cli/tutorials.md +4 -0
  6. package/dist/docs/get-started/configuration.md +32 -11
  7. package/dist/docs/hooks/best-practices.md +177 -127
  8. package/dist/docs/hooks/index.md +22 -0
  9. package/dist/docs/sidebar.json +4 -0
  10. package/dist/src/agents/a2a-client-manager.d.ts +5 -0
  11. package/dist/src/agents/a2a-client-manager.js +130 -0
  12. package/dist/src/agents/a2a-client-manager.js.map +1 -1
  13. package/dist/src/agents/a2a-client-manager.test.js +27 -1
  14. package/dist/src/agents/a2a-client-manager.test.js.map +1 -1
  15. package/dist/src/agents/a2aUtils.d.ts +28 -0
  16. package/dist/src/agents/a2aUtils.js +111 -0
  17. package/dist/src/agents/a2aUtils.js.map +1 -0
  18. package/dist/src/agents/a2aUtils.test.js +147 -0
  19. package/dist/src/agents/a2aUtils.test.js.map +1 -0
  20. package/dist/src/agents/delegate-to-agent-tool.d.ts +2 -2
  21. package/dist/src/agents/delegate-to-agent-tool.js +6 -6
  22. package/dist/src/agents/delegate-to-agent-tool.js.map +1 -1
  23. package/dist/src/agents/delegate-to-agent-tool.test.js +37 -7
  24. package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -1
  25. package/dist/src/agents/introspection-agent.js +2 -2
  26. package/dist/src/agents/introspection-agent.js.map +1 -1
  27. package/dist/src/agents/introspection-agent.test.js +2 -2
  28. package/dist/src/agents/introspection-agent.test.js.map +1 -1
  29. package/dist/src/agents/local-executor.js +1 -1
  30. package/dist/src/agents/local-executor.js.map +1 -1
  31. package/dist/src/agents/local-executor.test.js +2 -2
  32. package/dist/src/agents/local-executor.test.js.map +1 -1
  33. package/dist/src/agents/local-invocation.d.ts +2 -2
  34. package/dist/src/agents/local-invocation.js +3 -3
  35. package/dist/src/agents/local-invocation.js.map +1 -1
  36. package/dist/src/agents/local-invocation.test.js +7 -5
  37. package/dist/src/agents/local-invocation.test.js.map +1 -1
  38. package/dist/src/agents/remote-invocation.d.ts +17 -3
  39. package/dist/src/agents/remote-invocation.js +104 -6
  40. package/dist/src/agents/remote-invocation.js.map +1 -1
  41. package/dist/src/agents/remote-invocation.test.js +184 -18
  42. package/dist/src/agents/remote-invocation.test.js.map +1 -1
  43. package/dist/src/agents/subagent-tool-wrapper.d.ts +2 -2
  44. package/dist/src/agents/subagent-tool-wrapper.js +6 -5
  45. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
  46. package/dist/src/agents/subagent-tool-wrapper.test.js +17 -10
  47. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
  48. package/dist/src/agents/types.d.ts +6 -0
  49. package/dist/src/code_assist/oauth2.js +31 -1
  50. package/dist/src/code_assist/oauth2.js.map +1 -1
  51. package/dist/src/code_assist/oauth2.test.js +75 -3
  52. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  53. package/dist/src/code_assist/server.d.ts +5 -0
  54. package/dist/src/code_assist/server.js +19 -4
  55. package/dist/src/code_assist/server.js.map +1 -1
  56. package/dist/src/code_assist/server.test.js +19 -0
  57. package/dist/src/code_assist/server.test.js.map +1 -1
  58. package/dist/src/code_assist/setup.js +6 -4
  59. package/dist/src/code_assist/setup.js.map +1 -1
  60. package/dist/src/code_assist/setup.test.js +63 -0
  61. package/dist/src/code_assist/setup.test.js.map +1 -1
  62. package/dist/src/code_assist/types.d.ts +18 -0
  63. package/dist/src/config/config.d.ts +20 -6
  64. package/dist/src/config/config.js +63 -37
  65. package/dist/src/config/config.js.map +1 -1
  66. package/dist/src/config/config.test.js +81 -4
  67. package/dist/src/config/config.test.js.map +1 -1
  68. package/dist/src/config/flashFallback.test.js +13 -0
  69. package/dist/src/config/flashFallback.test.js.map +1 -1
  70. package/dist/src/config/models.js +6 -4
  71. package/dist/src/config/models.js.map +1 -1
  72. package/dist/src/config/models.test.js +21 -1
  73. package/dist/src/config/models.test.js.map +1 -1
  74. package/dist/src/core/client.js +39 -7
  75. package/dist/src/core/client.js.map +1 -1
  76. package/dist/src/core/client.test.js +93 -1
  77. package/dist/src/core/client.test.js.map +1 -1
  78. package/dist/src/core/contentGenerator.js +1 -1
  79. package/dist/src/core/contentGenerator.js.map +1 -1
  80. package/dist/src/core/contentGenerator.test.js +1 -1
  81. package/dist/src/core/contentGenerator.test.js.map +1 -1
  82. package/dist/src/core/coreToolHookTriggers.test.js +11 -9
  83. package/dist/src/core/coreToolHookTriggers.test.js.map +1 -1
  84. package/dist/src/core/coreToolScheduler.d.ts +1 -0
  85. package/dist/src/core/coreToolScheduler.js +30 -106
  86. package/dist/src/core/coreToolScheduler.js.map +1 -1
  87. package/dist/src/core/coreToolScheduler.test.js +21 -22
  88. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  89. package/dist/src/core/loggingContentGenerator.js +14 -2
  90. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  91. package/dist/src/core/nonInteractiveToolExecutor.test.js +0 -1
  92. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  93. package/dist/src/core/prompts.js +29 -5
  94. package/dist/src/core/prompts.js.map +1 -1
  95. package/dist/src/core/prompts.test.js +40 -1
  96. package/dist/src/core/prompts.test.js.map +1 -1
  97. package/dist/src/core/sessionHookTriggers.d.ts +3 -2
  98. package/dist/src/core/sessionHookTriggers.js +8 -1
  99. package/dist/src/core/sessionHookTriggers.js.map +1 -1
  100. package/dist/src/core/turn.d.ts +16 -2
  101. package/dist/src/core/turn.js +2 -0
  102. package/dist/src/core/turn.js.map +1 -1
  103. package/dist/src/generated/git-commit.d.ts +3 -3
  104. package/dist/src/generated/git-commit.js +3 -3
  105. package/dist/src/generated/git-commit.js.map +1 -1
  106. package/dist/src/hooks/hookEventHandler.d.ts +6 -2
  107. package/dist/src/hooks/hookEventHandler.js +24 -3
  108. package/dist/src/hooks/hookEventHandler.js.map +1 -1
  109. package/dist/src/hooks/hookEventHandler.test.js +31 -8
  110. package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
  111. package/dist/src/hooks/hookRunner.d.ts +2 -2
  112. package/dist/src/hooks/hookRunner.js +12 -4
  113. package/dist/src/hooks/hookRunner.js.map +1 -1
  114. package/dist/src/hooks/hookRunner.test.js +33 -0
  115. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  116. package/dist/src/index.d.ts +3 -1
  117. package/dist/src/index.js +3 -2
  118. package/dist/src/index.js.map +1 -1
  119. package/dist/src/policy/config.js +60 -22
  120. package/dist/src/policy/config.js.map +1 -1
  121. package/dist/src/policy/config.test.js +21 -0
  122. package/dist/src/policy/config.test.js.map +1 -1
  123. package/dist/src/policy/persistence.test.js +1 -1
  124. package/dist/src/policy/persistence.test.js.map +1 -1
  125. package/dist/src/policy/policies/write.toml +5 -0
  126. package/dist/src/policy/policy-engine.d.ts +4 -0
  127. package/dist/src/policy/policy-engine.js +75 -51
  128. package/dist/src/policy/policy-engine.js.map +1 -1
  129. package/dist/src/policy/policy-engine.test.js +272 -1
  130. package/dist/src/policy/policy-engine.test.js.map +1 -1
  131. package/dist/src/policy/policy-updater.test.js +2 -2
  132. package/dist/src/policy/policy-updater.test.js.map +1 -1
  133. package/dist/src/policy/toml-loader.d.ts +0 -8
  134. package/dist/src/policy/toml-loader.js +7 -70
  135. package/dist/src/policy/toml-loader.js.map +1 -1
  136. package/dist/src/policy/toml-loader.test.js +16 -6
  137. package/dist/src/policy/toml-loader.test.js.map +1 -1
  138. package/dist/src/policy/types.d.ts +6 -0
  139. package/dist/src/policy/utils.d.ts +21 -0
  140. package/dist/src/policy/utils.js +42 -0
  141. package/dist/src/policy/utils.js.map +1 -0
  142. package/dist/src/policy/utils.test.js +64 -0
  143. package/dist/src/policy/utils.test.js.map +1 -0
  144. package/dist/src/scheduler/tool-executor.d.ts +22 -0
  145. package/dist/src/scheduler/tool-executor.js +198 -0
  146. package/dist/src/scheduler/tool-executor.js.map +1 -0
  147. package/dist/src/scheduler/tool-executor.test.d.ts +6 -0
  148. package/dist/src/scheduler/tool-executor.test.js +231 -0
  149. package/dist/src/scheduler/tool-executor.test.js.map +1 -0
  150. package/dist/src/skills/skillLoader.d.ts +28 -0
  151. package/dist/src/skills/skillLoader.js +77 -0
  152. package/dist/src/skills/skillLoader.js.map +1 -0
  153. package/dist/src/skills/skillLoader.test.d.ts +6 -0
  154. package/dist/src/skills/skillLoader.test.js +73 -0
  155. package/dist/src/skills/skillLoader.test.js.map +1 -0
  156. package/dist/src/{services → skills}/skillManager.d.ts +10 -20
  157. package/dist/src/skills/skillManager.js +89 -0
  158. package/dist/src/skills/skillManager.js.map +1 -0
  159. package/dist/src/skills/skillManager.test.d.ts +6 -0
  160. package/dist/src/skills/skillManager.test.js +128 -0
  161. package/dist/src/skills/skillManager.test.js.map +1 -0
  162. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +5 -5
  163. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +8 -8
  164. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  165. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +1 -1
  166. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  167. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +2 -2
  168. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +4 -4
  169. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  170. package/dist/src/telemetry/loggers.d.ts +3 -3
  171. package/dist/src/telemetry/loggers.js +4 -4
  172. package/dist/src/telemetry/loggers.js.map +1 -1
  173. package/dist/src/telemetry/loggers.test.js +6 -8
  174. package/dist/src/telemetry/loggers.test.js.map +1 -1
  175. package/dist/src/telemetry/types.d.ts +7 -7
  176. package/dist/src/telemetry/types.js +10 -10
  177. package/dist/src/telemetry/types.js.map +1 -1
  178. package/dist/src/test-utils/mock-message-bus.d.ts +1 -0
  179. package/dist/src/test-utils/mock-message-bus.js +29 -0
  180. package/dist/src/test-utils/mock-message-bus.js.map +1 -1
  181. package/dist/src/test-utils/mock-tool.d.ts +5 -3
  182. package/dist/src/test-utils/mock-tool.js +11 -10
  183. package/dist/src/test-utils/mock-tool.js.map +1 -1
  184. package/dist/src/tools/activate-skill.d.ts +27 -0
  185. package/dist/src/tools/activate-skill.js +120 -0
  186. package/dist/src/tools/activate-skill.js.map +1 -0
  187. package/dist/src/tools/activate-skill.test.d.ts +6 -0
  188. package/dist/src/tools/activate-skill.test.js +95 -0
  189. package/dist/src/tools/activate-skill.test.js.map +1 -0
  190. package/dist/src/tools/confirmation-policy.test.js +2 -12
  191. package/dist/src/tools/confirmation-policy.test.js.map +1 -1
  192. package/dist/src/tools/edit.d.ts +27 -5
  193. package/dist/src/tools/edit.js +444 -137
  194. package/dist/src/tools/edit.js.map +1 -1
  195. package/dist/src/tools/edit.test.js +257 -525
  196. package/dist/src/tools/edit.test.js.map +1 -1
  197. package/dist/src/tools/get-internal-docs.d.ts +2 -2
  198. package/dist/src/tools/get-internal-docs.js +6 -6
  199. package/dist/src/tools/get-internal-docs.js.map +1 -1
  200. package/dist/src/tools/get-internal-docs.test.js +2 -1
  201. package/dist/src/tools/get-internal-docs.test.js.map +1 -1
  202. package/dist/src/tools/glob.d.ts +2 -2
  203. package/dist/src/tools/glob.js +1 -1
  204. package/dist/src/tools/glob.js.map +1 -1
  205. package/dist/src/tools/glob.test.js +2 -1
  206. package/dist/src/tools/glob.test.js.map +1 -1
  207. package/dist/src/tools/grep.d.ts +2 -2
  208. package/dist/src/tools/grep.js +1 -1
  209. package/dist/src/tools/grep.js.map +1 -1
  210. package/dist/src/tools/grep.test.js +5 -4
  211. package/dist/src/tools/grep.test.js.map +1 -1
  212. package/dist/src/tools/ls.d.ts +2 -2
  213. package/dist/src/tools/ls.js +2 -2
  214. package/dist/src/tools/ls.js.map +1 -1
  215. package/dist/src/tools/ls.test.js +2 -1
  216. package/dist/src/tools/ls.test.js.map +1 -1
  217. package/dist/src/tools/mcp-client-manager.js +14 -7
  218. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  219. package/dist/src/tools/mcp-client-manager.test.js +28 -0
  220. package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
  221. package/dist/src/tools/mcp-client.d.ts +2 -2
  222. package/dist/src/tools/mcp-client.js +2 -1
  223. package/dist/src/tools/mcp-client.js.map +1 -1
  224. package/dist/src/tools/mcp-tool.d.ts +2 -2
  225. package/dist/src/tools/mcp-tool.js +7 -7
  226. package/dist/src/tools/mcp-tool.js.map +1 -1
  227. package/dist/src/tools/mcp-tool.test.js +11 -6
  228. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  229. package/dist/src/tools/memoryTool.d.ts +3 -3
  230. package/dist/src/tools/memoryTool.js +2 -2
  231. package/dist/src/tools/memoryTool.js.map +1 -1
  232. package/dist/src/tools/memoryTool.test.js +5 -2
  233. package/dist/src/tools/memoryTool.test.js.map +1 -1
  234. package/dist/src/tools/message-bus-integration.test.js +10 -37
  235. package/dist/src/tools/message-bus-integration.test.js.map +1 -1
  236. package/dist/src/tools/read-file.d.ts +2 -2
  237. package/dist/src/tools/read-file.js +1 -1
  238. package/dist/src/tools/read-file.js.map +1 -1
  239. package/dist/src/tools/read-file.test.js +3 -2
  240. package/dist/src/tools/read-file.test.js.map +1 -1
  241. package/dist/src/tools/read-many-files.d.ts +2 -2
  242. package/dist/src/tools/read-many-files.js +2 -3
  243. package/dist/src/tools/read-many-files.js.map +1 -1
  244. package/dist/src/tools/read-many-files.test.js +3 -2
  245. package/dist/src/tools/read-many-files.test.js.map +1 -1
  246. package/dist/src/tools/ripGrep.d.ts +2 -2
  247. package/dist/src/tools/ripGrep.js +3 -4
  248. package/dist/src/tools/ripGrep.js.map +1 -1
  249. package/dist/src/tools/ripGrep.test.js +7 -6
  250. package/dist/src/tools/ripGrep.test.js.map +1 -1
  251. package/dist/src/tools/shell.d.ts +3 -6
  252. package/dist/src/tools/shell.js +15 -48
  253. package/dist/src/tools/shell.js.map +1 -1
  254. package/dist/src/tools/shell.test.js +35 -59
  255. package/dist/src/tools/shell.test.js.map +1 -1
  256. package/dist/src/tools/tool-names.d.ts +2 -1
  257. package/dist/src/tools/tool-names.js +2 -0
  258. package/dist/src/tools/tool-names.js.map +1 -1
  259. package/dist/src/tools/tool-registry.d.ts +11 -6
  260. package/dist/src/tools/tool-registry.js +13 -8
  261. package/dist/src/tools/tool-registry.js.map +1 -1
  262. package/dist/src/tools/tool-registry.test.js +14 -10
  263. package/dist/src/tools/tool-registry.test.js.map +1 -1
  264. package/dist/src/tools/tools.d.ts +5 -5
  265. package/dist/src/tools/tools.js +15 -17
  266. package/dist/src/tools/tools.js.map +1 -1
  267. package/dist/src/tools/tools.test.js +3 -1
  268. package/dist/src/tools/tools.test.js.map +1 -1
  269. package/dist/src/tools/web-fetch.d.ts +2 -2
  270. package/dist/src/tools/web-fetch.js +4 -4
  271. package/dist/src/tools/web-fetch.js.map +1 -1
  272. package/dist/src/tools/web-fetch.test.js +17 -19
  273. package/dist/src/tools/web-fetch.test.js.map +1 -1
  274. package/dist/src/tools/web-search.d.ts +2 -2
  275. package/dist/src/tools/web-search.js +3 -4
  276. package/dist/src/tools/web-search.js.map +1 -1
  277. package/dist/src/tools/web-search.test.js +2 -1
  278. package/dist/src/tools/web-search.test.js.map +1 -1
  279. package/dist/src/tools/write-file.d.ts +2 -2
  280. package/dist/src/tools/write-file.js +3 -3
  281. package/dist/src/tools/write-file.js.map +1 -1
  282. package/dist/src/tools/write-file.test.js +4 -1
  283. package/dist/src/tools/write-file.test.js.map +1 -1
  284. package/dist/src/tools/write-todos.d.ts +2 -2
  285. package/dist/src/tools/write-todos.js +5 -4
  286. package/dist/src/tools/write-todos.js.map +1 -1
  287. package/dist/src/tools/write-todos.test.js +2 -1
  288. package/dist/src/tools/write-todos.test.js.map +1 -1
  289. package/dist/src/utils/editCorrector.test.js +1 -1
  290. package/dist/src/utils/editCorrector.test.js.map +1 -1
  291. package/dist/src/utils/events.d.ts +46 -1
  292. package/dist/src/utils/events.js +21 -0
  293. package/dist/src/utils/events.js.map +1 -1
  294. package/dist/src/utils/events.test.js +25 -0
  295. package/dist/src/utils/events.test.js.map +1 -1
  296. package/dist/src/utils/getFolderStructure.js +6 -1
  297. package/dist/src/utils/getFolderStructure.js.map +1 -1
  298. package/dist/src/utils/shell-permissions.test.js +27 -0
  299. package/dist/src/utils/shell-permissions.test.js.map +1 -1
  300. package/dist/src/utils/shell-utils.d.ts +6 -0
  301. package/dist/src/utils/shell-utils.js +72 -8
  302. package/dist/src/utils/shell-utils.js.map +1 -1
  303. package/dist/src/utils/shell-utils.test.js +99 -1
  304. package/dist/src/utils/shell-utils.test.js.map +1 -1
  305. package/dist/src/utils/terminal.d.ts +2 -0
  306. package/dist/src/utils/terminal.js +6 -0
  307. package/dist/src/utils/terminal.js.map +1 -1
  308. package/dist/src/utils/tokenCalculation.js +20 -5
  309. package/dist/src/utils/tokenCalculation.js.map +1 -1
  310. package/dist/src/utils/tokenCalculation.test.js +11 -2
  311. package/dist/src/utils/tokenCalculation.test.js.map +1 -1
  312. package/dist/src/utils/tool-utils.test.js +2 -1
  313. package/dist/src/utils/tool-utils.test.js.map +1 -1
  314. package/dist/tsconfig.tsbuildinfo +1 -1
  315. package/package.json +1 -1
  316. package/dist/google-gemini-cli-core-0.24.0-nightly.20251227.37be16243.tgz +0 -0
  317. package/dist/src/services/skillManager.js +0 -157
  318. package/dist/src/services/skillManager.js.map +0 -1
  319. package/dist/src/services/skillManager.test.js +0 -169
  320. package/dist/src/services/skillManager.test.js.map +0 -1
  321. package/dist/src/tools/smart-edit.d.ts +0 -78
  322. package/dist/src/tools/smart-edit.js +0 -722
  323. package/dist/src/tools/smart-edit.js.map +0 -1
  324. package/dist/src/tools/smart-edit.test.js +0 -592
  325. package/dist/src/tools/smart-edit.test.js.map +0 -1
  326. /package/dist/src/{services/skillManager.test.d.ts → agents/a2aUtils.test.d.ts} +0 -0
  327. /package/dist/src/{tools/smart-edit.test.d.ts → policy/utils.test.d.ts} +0 -0
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Escapes a string for use in a regular expression.
8
+ */
9
+ export declare function escapeRegex(text: string): string;
10
+ /**
11
+ * Builds a list of args patterns for policy matching.
12
+ *
13
+ * This function handles the transformation of command prefixes and regexes into
14
+ * the internal argsPattern representation used by the PolicyEngine.
15
+ *
16
+ * @param argsPattern An optional raw regex string for arguments.
17
+ * @param commandPrefix An optional command prefix (or list of prefixes) to allow.
18
+ * @param commandRegex An optional command regex string to allow.
19
+ * @returns An array of string patterns (or undefined) for the PolicyEngine.
20
+ */
21
+ export declare function buildArgsPatterns(argsPattern?: string, commandPrefix?: string | string[], commandRegex?: string): Array<string | undefined>;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Escapes a string for use in a regular expression.
8
+ */
9
+ export function escapeRegex(text) {
10
+ return text.replace(/[-[\]{}()*+?.,\\^$|#\s"]/g, '\\$&');
11
+ }
12
+ /**
13
+ * Builds a list of args patterns for policy matching.
14
+ *
15
+ * This function handles the transformation of command prefixes and regexes into
16
+ * the internal argsPattern representation used by the PolicyEngine.
17
+ *
18
+ * @param argsPattern An optional raw regex string for arguments.
19
+ * @param commandPrefix An optional command prefix (or list of prefixes) to allow.
20
+ * @param commandRegex An optional command regex string to allow.
21
+ * @returns An array of string patterns (or undefined) for the PolicyEngine.
22
+ */
23
+ export function buildArgsPatterns(argsPattern, commandPrefix, commandRegex) {
24
+ if (commandPrefix) {
25
+ const prefixes = Array.isArray(commandPrefix)
26
+ ? commandPrefix
27
+ : [commandPrefix];
28
+ // Expand command prefixes to multiple patterns.
29
+ // We append [\\s"] to ensure we match whole words only (e.g., "git" but not
30
+ // "github"). Since we match against JSON stringified args, the value is
31
+ // always followed by a space or a closing quote.
32
+ return prefixes.map((prefix) => {
33
+ const jsonPrefix = JSON.stringify(prefix).slice(1, -1);
34
+ return `"command":"${escapeRegex(jsonPrefix)}(?:[\\s"]|$)`;
35
+ });
36
+ }
37
+ if (commandRegex) {
38
+ return [`"command":"${commandRegex}`];
39
+ }
40
+ return [argsPattern];
41
+ }
42
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/policy/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,WAAoB,EACpB,aAAiC,EACjC,YAAqB;IAErB,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;YAC3C,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAEpB,gDAAgD;QAChD,4EAA4E;QAC5E,wEAAwE;QACxE,iDAAiD;QACjD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,cAAc,WAAW,CAAC,UAAU,CAAC,cAAc,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,cAAc,YAAY,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,WAAW,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { escapeRegex, buildArgsPatterns } from './utils.js';
8
+ describe('policy/utils', () => {
9
+ describe('escapeRegex', () => {
10
+ it('should escape special regex characters', () => {
11
+ const input = '.-*+?^${}()|[]\\ "';
12
+ const escaped = escapeRegex(input);
13
+ expect(escaped).toBe('\\.\\-\\*\\+\\?\\^\\$\\{\\}\\(\\)\\|\\[\\]\\\\\\ \\"');
14
+ });
15
+ it('should return the same string if no special characters are present', () => {
16
+ const input = 'abcABC123';
17
+ expect(escapeRegex(input)).toBe(input);
18
+ });
19
+ });
20
+ describe('buildArgsPatterns', () => {
21
+ it('should return argsPattern if provided and no commandPrefix/regex', () => {
22
+ const result = buildArgsPatterns('my-pattern', undefined, undefined);
23
+ expect(result).toEqual(['my-pattern']);
24
+ });
25
+ it('should build pattern from a single commandPrefix', () => {
26
+ const result = buildArgsPatterns(undefined, 'ls', undefined);
27
+ expect(result).toEqual(['"command":"ls(?:[\\s"]|$)']);
28
+ });
29
+ it('should build patterns from an array of commandPrefixes', () => {
30
+ const result = buildArgsPatterns(undefined, ['ls', 'cd'], undefined);
31
+ expect(result).toEqual([
32
+ '"command":"ls(?:[\\s"]|$)',
33
+ '"command":"cd(?:[\\s"]|$)',
34
+ ]);
35
+ });
36
+ it('should build pattern from commandRegex', () => {
37
+ const result = buildArgsPatterns(undefined, undefined, 'rm -rf .*');
38
+ expect(result).toEqual(['"command":"rm -rf .*']);
39
+ });
40
+ it('should prioritize commandPrefix over commandRegex and argsPattern', () => {
41
+ const result = buildArgsPatterns('raw', 'prefix', 'regex');
42
+ expect(result).toEqual(['"command":"prefix(?:[\\s"]|$)']);
43
+ });
44
+ it('should prioritize commandRegex over argsPattern if no commandPrefix', () => {
45
+ const result = buildArgsPatterns('raw', undefined, 'regex');
46
+ expect(result).toEqual(['"command":"regex']);
47
+ });
48
+ it('should escape characters in commandPrefix', () => {
49
+ const result = buildArgsPatterns(undefined, 'git checkout -b', undefined);
50
+ expect(result).toEqual(['"command":"git\\ checkout\\ \\-b(?:[\\s"]|$)']);
51
+ });
52
+ it('should correctly escape quotes in commandPrefix', () => {
53
+ const result = buildArgsPatterns(undefined, 'git "fix"', undefined);
54
+ expect(result).toEqual([
55
+ '"command":"git\\ \\\\\\"fix\\\\\\"(?:[\\s"]|$)',
56
+ ]);
57
+ });
58
+ it('should handle undefined correctly when no inputs are provided', () => {
59
+ const result = buildArgsPatterns(undefined, undefined, undefined);
60
+ expect(result).toEqual([undefined]);
61
+ });
62
+ });
63
+ });
64
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../../src/policy/utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { Config, AnsiOutput } from '../index.js';
7
+ import type { CompletedToolCall, ToolCall } from './types.js';
8
+ export interface ToolExecutionContext {
9
+ call: ToolCall;
10
+ signal: AbortSignal;
11
+ outputUpdateHandler?: (callId: string, output: string | AnsiOutput) => void;
12
+ onUpdateToolCall: (updatedCall: ToolCall) => void;
13
+ }
14
+ export declare class ToolExecutor {
15
+ private readonly config;
16
+ constructor(config: Config);
17
+ execute(context: ToolExecutionContext): Promise<CompletedToolCall>;
18
+ private createCancelledResult;
19
+ private createSuccessResult;
20
+ private createErrorResult;
21
+ private createErrorResponse;
22
+ }
@@ -0,0 +1,198 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { ToolErrorType, ToolOutputTruncatedEvent, logToolOutputTruncated, runInDevTraceSpan, } from '../index.js';
7
+ import { SHELL_TOOL_NAME } from '../tools/tool-names.js';
8
+ import { ShellToolInvocation } from '../tools/shell.js';
9
+ import { executeToolWithHooks } from '../core/coreToolHookTriggers.js';
10
+ import { saveTruncatedContent } from '../utils/fileUtils.js';
11
+ import { convertToFunctionResponse } from '../utils/generateContentResponseUtilities.js';
12
+ export class ToolExecutor {
13
+ config;
14
+ constructor(config) {
15
+ this.config = config;
16
+ }
17
+ async execute(context) {
18
+ const { call, signal, outputUpdateHandler, onUpdateToolCall } = context;
19
+ const { request } = call;
20
+ const toolName = request.name;
21
+ const callId = request.callId;
22
+ if (!('tool' in call) || !call.tool || !('invocation' in call)) {
23
+ throw new Error(`Cannot execute tool call ${callId}: Tool or Invocation missing.`);
24
+ }
25
+ const { tool, invocation } = call;
26
+ // Setup live output handling
27
+ const liveOutputCallback = tool.canUpdateOutput && outputUpdateHandler
28
+ ? (outputChunk) => {
29
+ outputUpdateHandler(callId, outputChunk);
30
+ }
31
+ : undefined;
32
+ const shellExecutionConfig = this.config.getShellExecutionConfig();
33
+ const hooksEnabled = this.config.getEnableHooks();
34
+ const messageBus = this.config.getMessageBus();
35
+ return runInDevTraceSpan({
36
+ name: tool.name,
37
+ attributes: { type: 'tool-call' },
38
+ }, async ({ metadata: spanMetadata }) => {
39
+ spanMetadata.input = { request };
40
+ try {
41
+ let promise;
42
+ if (invocation instanceof ShellToolInvocation) {
43
+ const setPidCallback = (pid) => {
44
+ const executingCall = {
45
+ ...call,
46
+ status: 'executing',
47
+ tool,
48
+ invocation,
49
+ pid,
50
+ startTime: 'startTime' in call ? call.startTime : undefined,
51
+ };
52
+ onUpdateToolCall(executingCall);
53
+ };
54
+ promise = executeToolWithHooks(invocation, toolName, signal, messageBus, hooksEnabled, tool, liveOutputCallback, shellExecutionConfig, setPidCallback);
55
+ }
56
+ else {
57
+ promise = executeToolWithHooks(invocation, toolName, signal, messageBus, hooksEnabled, tool, liveOutputCallback, shellExecutionConfig);
58
+ }
59
+ const toolResult = await promise;
60
+ spanMetadata.output = toolResult;
61
+ if (signal.aborted) {
62
+ return this.createCancelledResult(call, 'User cancelled tool execution.');
63
+ }
64
+ else if (toolResult.error === undefined) {
65
+ return await this.createSuccessResult(call, toolResult);
66
+ }
67
+ else {
68
+ return this.createErrorResult(call, new Error(toolResult.error.message), toolResult.error.type);
69
+ }
70
+ }
71
+ catch (executionError) {
72
+ spanMetadata.error = executionError;
73
+ if (signal.aborted) {
74
+ return this.createCancelledResult(call, 'User cancelled tool execution.');
75
+ }
76
+ const error = executionError instanceof Error
77
+ ? executionError
78
+ : new Error(String(executionError));
79
+ return this.createErrorResult(call, error, ToolErrorType.UNHANDLED_EXCEPTION);
80
+ }
81
+ });
82
+ }
83
+ createCancelledResult(call, reason) {
84
+ const errorMessage = `[Operation Cancelled] ${reason}`;
85
+ const startTime = 'startTime' in call ? call.startTime : undefined;
86
+ if (!('tool' in call) || !('invocation' in call)) {
87
+ // This should effectively never happen in execution phase, but we handle
88
+ // it safely
89
+ throw new Error('Cancelled tool call missing tool/invocation references');
90
+ }
91
+ return {
92
+ status: 'cancelled',
93
+ request: call.request,
94
+ response: {
95
+ callId: call.request.callId,
96
+ responseParts: [
97
+ {
98
+ functionResponse: {
99
+ id: call.request.callId,
100
+ name: call.request.name,
101
+ response: { error: errorMessage },
102
+ },
103
+ },
104
+ ],
105
+ resultDisplay: undefined,
106
+ error: undefined,
107
+ errorType: undefined,
108
+ contentLength: errorMessage.length,
109
+ },
110
+ tool: call.tool,
111
+ invocation: call.invocation,
112
+ durationMs: startTime ? Date.now() - startTime : undefined,
113
+ outcome: call.outcome,
114
+ };
115
+ }
116
+ async createSuccessResult(call, toolResult) {
117
+ let content = toolResult.llmContent;
118
+ let outputFile;
119
+ const toolName = call.request.name;
120
+ const callId = call.request.callId;
121
+ if (typeof content === 'string' &&
122
+ toolName === SHELL_TOOL_NAME &&
123
+ this.config.getEnableToolOutputTruncation() &&
124
+ this.config.getTruncateToolOutputThreshold() > 0 &&
125
+ this.config.getTruncateToolOutputLines() > 0) {
126
+ const originalContentLength = content.length;
127
+ const threshold = this.config.getTruncateToolOutputThreshold();
128
+ const lines = this.config.getTruncateToolOutputLines();
129
+ const truncatedResult = await saveTruncatedContent(content, callId, this.config.storage.getProjectTempDir(), threshold, lines);
130
+ content = truncatedResult.content;
131
+ outputFile = truncatedResult.outputFile;
132
+ if (outputFile) {
133
+ logToolOutputTruncated(this.config, new ToolOutputTruncatedEvent(call.request.prompt_id, {
134
+ toolName,
135
+ originalContentLength,
136
+ truncatedContentLength: content.length,
137
+ threshold,
138
+ lines,
139
+ }));
140
+ }
141
+ }
142
+ const response = convertToFunctionResponse(toolName, callId, content, this.config.getActiveModel());
143
+ const successResponse = {
144
+ callId,
145
+ responseParts: response,
146
+ resultDisplay: toolResult.returnDisplay,
147
+ error: undefined,
148
+ errorType: undefined,
149
+ outputFile,
150
+ contentLength: typeof content === 'string' ? content.length : undefined,
151
+ };
152
+ const startTime = 'startTime' in call ? call.startTime : undefined;
153
+ // Ensure we have tool and invocation
154
+ if (!('tool' in call) || !('invocation' in call)) {
155
+ throw new Error('Successful tool call missing tool or invocation');
156
+ }
157
+ return {
158
+ status: 'success',
159
+ request: call.request,
160
+ tool: call.tool,
161
+ response: successResponse,
162
+ invocation: call.invocation,
163
+ durationMs: startTime ? Date.now() - startTime : undefined,
164
+ outcome: call.outcome,
165
+ };
166
+ }
167
+ createErrorResult(call, error, errorType) {
168
+ const response = this.createErrorResponse(call.request, error, errorType);
169
+ const startTime = 'startTime' in call ? call.startTime : undefined;
170
+ return {
171
+ status: 'error',
172
+ request: call.request,
173
+ response,
174
+ tool: call.tool,
175
+ durationMs: startTime ? Date.now() - startTime : undefined,
176
+ outcome: call.outcome,
177
+ };
178
+ }
179
+ createErrorResponse(request, error, errorType) {
180
+ return {
181
+ callId: request.callId,
182
+ error,
183
+ responseParts: [
184
+ {
185
+ functionResponse: {
186
+ id: request.callId,
187
+ name: request.name,
188
+ response: { error: error.message },
189
+ },
190
+ },
191
+ ],
192
+ resultDisplay: error.message,
193
+ errorType,
194
+ contentLength: error.message.length,
195
+ };
196
+ }
197
+ }
198
+ //# sourceMappingURL=tool-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.js","sourceRoot":"","sources":["../../../src/scheduler/tool-executor.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 {};
@@ -0,0 +1,231 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { ToolExecutor } from './tool-executor.js';
8
+ import { makeFakeConfig } from '../test-utils/config.js';
9
+ import { MockTool } from '../test-utils/mock-tool.js';
10
+ import { SHELL_TOOL_NAME } from '../tools/tool-names.js';
11
+ import * as fileUtils from '../utils/fileUtils.js';
12
+ import * as coreToolHookTriggers from '../core/coreToolHookTriggers.js';
13
+ import { ShellToolInvocation } from '../tools/shell.js';
14
+ import { createMockMessageBus } from '../test-utils/mock-message-bus.js';
15
+ // Mock file utils
16
+ vi.mock('../utils/fileUtils.js', () => ({
17
+ saveTruncatedContent: vi.fn(),
18
+ }));
19
+ // Mock executeToolWithHooks
20
+ vi.mock('../core/coreToolHookTriggers.js', () => ({
21
+ executeToolWithHooks: vi.fn(),
22
+ }));
23
+ describe('ToolExecutor', () => {
24
+ let config;
25
+ let executor;
26
+ beforeEach(() => {
27
+ // Use the standard fake config factory
28
+ config = makeFakeConfig();
29
+ executor = new ToolExecutor(config);
30
+ // Reset mocks
31
+ vi.resetAllMocks();
32
+ // Default mock implementation for saveTruncatedContent
33
+ vi.mocked(fileUtils.saveTruncatedContent).mockImplementation(async (_content, _callId, _tempDir, _threshold, _lines) => ({
34
+ content: 'TruncatedContent...',
35
+ outputFile: '/tmp/truncated_output.txt',
36
+ }));
37
+ });
38
+ afterEach(() => {
39
+ vi.restoreAllMocks();
40
+ });
41
+ it('should execute a tool successfully', async () => {
42
+ const mockTool = new MockTool({
43
+ name: 'testTool',
44
+ execute: async () => ({
45
+ llmContent: 'Tool output',
46
+ returnDisplay: 'Tool output',
47
+ }),
48
+ });
49
+ const invocation = mockTool.build({});
50
+ // Mock executeToolWithHooks to return success
51
+ vi.mocked(coreToolHookTriggers.executeToolWithHooks).mockResolvedValue({
52
+ llmContent: 'Tool output',
53
+ returnDisplay: 'Tool output',
54
+ });
55
+ const scheduledCall = {
56
+ status: 'scheduled',
57
+ request: {
58
+ callId: 'call-1',
59
+ name: 'testTool',
60
+ args: {},
61
+ isClientInitiated: false,
62
+ prompt_id: 'prompt-1',
63
+ },
64
+ tool: mockTool,
65
+ invocation: invocation,
66
+ startTime: Date.now(),
67
+ };
68
+ const onUpdateToolCall = vi.fn();
69
+ const result = await executor.execute({
70
+ call: scheduledCall,
71
+ signal: new AbortController().signal,
72
+ onUpdateToolCall,
73
+ });
74
+ expect(result.status).toBe('success');
75
+ if (result.status === 'success') {
76
+ const response = result.response.responseParts[0]?.functionResponse
77
+ ?.response;
78
+ expect(response).toEqual({ output: 'Tool output' });
79
+ }
80
+ });
81
+ it('should handle execution errors', async () => {
82
+ const mockTool = new MockTool({
83
+ name: 'failTool',
84
+ });
85
+ const invocation = mockTool.build({});
86
+ // Mock executeToolWithHooks to throw
87
+ vi.mocked(coreToolHookTriggers.executeToolWithHooks).mockRejectedValue(new Error('Tool Failed'));
88
+ const scheduledCall = {
89
+ status: 'scheduled',
90
+ request: {
91
+ callId: 'call-2',
92
+ name: 'failTool',
93
+ args: {},
94
+ isClientInitiated: false,
95
+ prompt_id: 'prompt-2',
96
+ },
97
+ tool: mockTool,
98
+ invocation: invocation,
99
+ startTime: Date.now(),
100
+ };
101
+ const result = await executor.execute({
102
+ call: scheduledCall,
103
+ signal: new AbortController().signal,
104
+ onUpdateToolCall: vi.fn(),
105
+ });
106
+ expect(result.status).toBe('error');
107
+ if (result.status === 'error') {
108
+ expect(result.response.error?.message).toBe('Tool Failed');
109
+ }
110
+ });
111
+ it('should return cancelled result when signal is aborted', async () => {
112
+ const mockTool = new MockTool({
113
+ name: 'slowTool',
114
+ });
115
+ const invocation = mockTool.build({});
116
+ // Mock executeToolWithHooks to simulate slow execution or cancellation check
117
+ vi.mocked(coreToolHookTriggers.executeToolWithHooks).mockImplementation(async () => {
118
+ await new Promise((r) => setTimeout(r, 100));
119
+ return { llmContent: 'Done', returnDisplay: 'Done' };
120
+ });
121
+ const scheduledCall = {
122
+ status: 'scheduled',
123
+ request: {
124
+ callId: 'call-3',
125
+ name: 'slowTool',
126
+ args: {},
127
+ isClientInitiated: false,
128
+ prompt_id: 'prompt-3',
129
+ },
130
+ tool: mockTool,
131
+ invocation: invocation,
132
+ startTime: Date.now(),
133
+ };
134
+ const controller = new AbortController();
135
+ const promise = executor.execute({
136
+ call: scheduledCall,
137
+ signal: controller.signal,
138
+ onUpdateToolCall: vi.fn(),
139
+ });
140
+ controller.abort();
141
+ const result = await promise;
142
+ expect(result.status).toBe('cancelled');
143
+ });
144
+ it('should truncate large shell output', async () => {
145
+ // 1. Setup Config for Truncation
146
+ vi.spyOn(config, 'getEnableToolOutputTruncation').mockReturnValue(true);
147
+ vi.spyOn(config, 'getTruncateToolOutputThreshold').mockReturnValue(10);
148
+ vi.spyOn(config, 'getTruncateToolOutputLines').mockReturnValue(5);
149
+ const mockTool = new MockTool({ name: SHELL_TOOL_NAME });
150
+ const invocation = mockTool.build({});
151
+ const longOutput = 'This is a very long output that should be truncated.';
152
+ // 2. Mock execution returning long content
153
+ vi.mocked(coreToolHookTriggers.executeToolWithHooks).mockResolvedValue({
154
+ llmContent: longOutput,
155
+ returnDisplay: longOutput,
156
+ });
157
+ const scheduledCall = {
158
+ status: 'scheduled',
159
+ request: {
160
+ callId: 'call-trunc',
161
+ name: SHELL_TOOL_NAME,
162
+ args: { command: 'echo long' },
163
+ isClientInitiated: false,
164
+ prompt_id: 'prompt-trunc',
165
+ },
166
+ tool: mockTool,
167
+ invocation: invocation,
168
+ startTime: Date.now(),
169
+ };
170
+ // 3. Execute
171
+ const result = await executor.execute({
172
+ call: scheduledCall,
173
+ signal: new AbortController().signal,
174
+ onUpdateToolCall: vi.fn(),
175
+ });
176
+ // 4. Verify Truncation Logic
177
+ expect(fileUtils.saveTruncatedContent).toHaveBeenCalledWith(longOutput, 'call-trunc', expect.any(String), // temp dir
178
+ 10, // threshold
179
+ 5);
180
+ expect(result.status).toBe('success');
181
+ if (result.status === 'success') {
182
+ const response = result.response.responseParts[0]?.functionResponse
183
+ ?.response;
184
+ // The content should be the *truncated* version returned by the mock saveTruncatedContent
185
+ expect(response).toEqual({ output: 'TruncatedContent...' });
186
+ expect(result.response.outputFile).toBe('/tmp/truncated_output.txt');
187
+ }
188
+ });
189
+ it('should report PID updates for shell tools', async () => {
190
+ // 1. Setup ShellToolInvocation
191
+ const messageBus = createMockMessageBus();
192
+ const shellInvocation = new ShellToolInvocation(config, { command: 'sleep 10' }, messageBus);
193
+ // We need a dummy tool that matches the invocation just for structure
194
+ const mockTool = new MockTool({ name: SHELL_TOOL_NAME });
195
+ // 2. Mock executeToolWithHooks to trigger the PID callback
196
+ const testPid = 12345;
197
+ vi.mocked(coreToolHookTriggers.executeToolWithHooks).mockImplementation(async (_inv, _name, _sig, _bus, _hooks, _tool, _liveCb, _shellCfg, setPidCallback) => {
198
+ // Simulate the shell tool reporting a PID
199
+ if (setPidCallback) {
200
+ setPidCallback(testPid);
201
+ }
202
+ return { llmContent: 'done', returnDisplay: 'done' };
203
+ });
204
+ const scheduledCall = {
205
+ status: 'scheduled',
206
+ request: {
207
+ callId: 'call-pid',
208
+ name: SHELL_TOOL_NAME,
209
+ args: { command: 'sleep 10' },
210
+ isClientInitiated: false,
211
+ prompt_id: 'prompt-pid',
212
+ },
213
+ tool: mockTool,
214
+ invocation: shellInvocation,
215
+ startTime: Date.now(),
216
+ };
217
+ const onUpdateToolCall = vi.fn();
218
+ // 3. Execute
219
+ await executor.execute({
220
+ call: scheduledCall,
221
+ signal: new AbortController().signal,
222
+ onUpdateToolCall,
223
+ });
224
+ // 4. Verify PID was reported
225
+ expect(onUpdateToolCall).toHaveBeenCalledWith(expect.objectContaining({
226
+ status: 'executing',
227
+ pid: testPid,
228
+ }));
229
+ });
230
+ });
231
+ //# sourceMappingURL=tool-executor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.test.js","sourceRoot":"","sources":["../../../src/scheduler/tool-executor.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Represents the definition of an Agent Skill.
8
+ */
9
+ export interface SkillDefinition {
10
+ /** The unique name of the skill. */
11
+ name: string;
12
+ /** A concise description of what the skill does. */
13
+ description: string;
14
+ /** The absolute path to the skill's source file on disk. */
15
+ location: string;
16
+ /** The core logic/instructions of the skill. */
17
+ body: string;
18
+ /** Whether the skill is currently disabled. */
19
+ disabled?: boolean;
20
+ }
21
+ /**
22
+ * Discovers and loads all skills in the provided directory.
23
+ */
24
+ export declare function loadSkillsFromDir(dir: string): Promise<SkillDefinition[]>;
25
+ /**
26
+ * Loads a single skill from a SKILL.md file.
27
+ */
28
+ export declare function loadSkillFromFile(filePath: string): Promise<SkillDefinition | null>;