turboflux 1.0.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 (490) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +177 -0
  3. package/bin/turboflux.mjs +28 -0
  4. package/dist/cli/brand.d.ts +7 -0
  5. package/dist/cli/brand.js +33 -0
  6. package/dist/cli/brand.js.map +1 -0
  7. package/dist/cli/commands/index.d.ts +4 -0
  8. package/dist/cli/commands/index.js +671 -0
  9. package/dist/cli/commands/index.js.map +1 -0
  10. package/dist/cli/commands/registry.d.ts +24 -0
  11. package/dist/cli/commands/registry.js +124 -0
  12. package/dist/cli/commands/registry.js.map +1 -0
  13. package/dist/cli/commands/types.d.ts +69 -0
  14. package/dist/cli/commands/types.js +2 -0
  15. package/dist/cli/commands/types.js.map +1 -0
  16. package/dist/cli/components/App.d.ts +15 -0
  17. package/dist/cli/components/App.js +1738 -0
  18. package/dist/cli/components/App.js.map +1 -0
  19. package/dist/cli/components/ConversationHistory.d.ts +15 -0
  20. package/dist/cli/components/ConversationHistory.js +92 -0
  21. package/dist/cli/components/ConversationHistory.js.map +1 -0
  22. package/dist/cli/components/TranscriptViewport.d.ts +25 -0
  23. package/dist/cli/components/TranscriptViewport.js +77 -0
  24. package/dist/cli/components/TranscriptViewport.js.map +1 -0
  25. package/dist/cli/components/agentActivityModel.d.ts +24 -0
  26. package/dist/cli/components/agentActivityModel.js +45 -0
  27. package/dist/cli/components/agentActivityModel.js.map +1 -0
  28. package/dist/cli/components/appHelpers.d.ts +34 -0
  29. package/dist/cli/components/appHelpers.js +209 -0
  30. package/dist/cli/components/appHelpers.js.map +1 -0
  31. package/dist/cli/components/design-system/StatusIcon.d.ts +5 -0
  32. package/dist/cli/components/design-system/StatusIcon.js +25 -0
  33. package/dist/cli/components/design-system/StatusIcon.js.map +1 -0
  34. package/dist/cli/components/developerFlowModel.d.ts +36 -0
  35. package/dist/cli/components/developerFlowModel.js +88 -0
  36. package/dist/cli/components/developerFlowModel.js.map +1 -0
  37. package/dist/cli/components/diff/DiffCard.d.ts +16 -0
  38. package/dist/cli/components/diff/DiffCard.js +30 -0
  39. package/dist/cli/components/diff/DiffCard.js.map +1 -0
  40. package/dist/cli/components/diff/DiffHunks.d.ts +11 -0
  41. package/dist/cli/components/diff/DiffHunks.js +58 -0
  42. package/dist/cli/components/diff/DiffHunks.js.map +1 -0
  43. package/dist/cli/components/header/Header.d.ts +13 -0
  44. package/dist/cli/components/header/Header.js +25 -0
  45. package/dist/cli/components/header/Header.js.map +1 -0
  46. package/dist/cli/components/header/Mascot.d.ts +4 -0
  47. package/dist/cli/components/header/Mascot.js +53 -0
  48. package/dist/cli/components/header/Mascot.js.map +1 -0
  49. package/dist/cli/components/header/StatusLine.d.ts +21 -0
  50. package/dist/cli/components/header/StatusLine.js +110 -0
  51. package/dist/cli/components/header/StatusLine.js.map +1 -0
  52. package/dist/cli/components/input/EffortPicker.d.ts +30 -0
  53. package/dist/cli/components/input/EffortPicker.js +126 -0
  54. package/dist/cli/components/input/EffortPicker.js.map +1 -0
  55. package/dist/cli/components/input/ModelPicker.d.ts +15 -0
  56. package/dist/cli/components/input/ModelPicker.js +95 -0
  57. package/dist/cli/components/input/ModelPicker.js.map +1 -0
  58. package/dist/cli/components/input/PromptInput.d.ts +79 -0
  59. package/dist/cli/components/input/PromptInput.js +496 -0
  60. package/dist/cli/components/input/PromptInput.js.map +1 -0
  61. package/dist/cli/components/input/RewindSelector.d.ts +8 -0
  62. package/dist/cli/components/input/RewindSelector.js +45 -0
  63. package/dist/cli/components/input/RewindSelector.js.map +1 -0
  64. package/dist/cli/components/input/pasteState.d.ts +6 -0
  65. package/dist/cli/components/input/pasteState.js +42 -0
  66. package/dist/cli/components/input/pasteState.js.map +1 -0
  67. package/dist/cli/components/input/terminalInputStateMachine.d.ts +29 -0
  68. package/dist/cli/components/input/terminalInputStateMachine.js +67 -0
  69. package/dist/cli/components/input/terminalInputStateMachine.js.map +1 -0
  70. package/dist/cli/components/layout/CockpitRails.d.ts +6 -0
  71. package/dist/cli/components/layout/CockpitRails.js +13 -0
  72. package/dist/cli/components/layout/CockpitRails.js.map +1 -0
  73. package/dist/cli/components/layout/LandingView.d.ts +15 -0
  74. package/dist/cli/components/layout/LandingView.js +12 -0
  75. package/dist/cli/components/layout/LandingView.js.map +1 -0
  76. package/dist/cli/components/layout/SessionSidebar.d.ts +18 -0
  77. package/dist/cli/components/layout/SessionSidebar.js +70 -0
  78. package/dist/cli/components/layout/SessionSidebar.js.map +1 -0
  79. package/dist/cli/components/layout/StartupAnimation.d.ts +14 -0
  80. package/dist/cli/components/layout/StartupAnimation.js +30 -0
  81. package/dist/cli/components/layout/StartupAnimation.js.map +1 -0
  82. package/dist/cli/components/markdown/highlighter.d.ts +1 -0
  83. package/dist/cli/components/markdown/highlighter.js +110 -0
  84. package/dist/cli/components/markdown/highlighter.js.map +1 -0
  85. package/dist/cli/components/markdown/index.d.ts +11 -0
  86. package/dist/cli/components/markdown/index.js +86 -0
  87. package/dist/cli/components/markdown/index.js.map +1 -0
  88. package/dist/cli/components/messages/MessageList.d.ts +16 -0
  89. package/dist/cli/components/messages/MessageList.js +56 -0
  90. package/dist/cli/components/messages/MessageList.js.map +1 -0
  91. package/dist/cli/components/messages/Messages.d.ts +26 -0
  92. package/dist/cli/components/messages/Messages.js +32 -0
  93. package/dist/cli/components/messages/Messages.js.map +1 -0
  94. package/dist/cli/components/messages/ThinkingBlock.d.ts +9 -0
  95. package/dist/cli/components/messages/ThinkingBlock.js +51 -0
  96. package/dist/cli/components/messages/ThinkingBlock.js.map +1 -0
  97. package/dist/cli/components/messages/WindowedMessageList.d.ts +21 -0
  98. package/dist/cli/components/messages/WindowedMessageList.js +44 -0
  99. package/dist/cli/components/messages/WindowedMessageList.js.map +1 -0
  100. package/dist/cli/components/permissions/PermissionDialog.d.ts +23 -0
  101. package/dist/cli/components/permissions/PermissionDialog.js +83 -0
  102. package/dist/cli/components/permissions/PermissionDialog.js.map +1 -0
  103. package/dist/cli/components/spinner/SpinnerGlyph.d.ts +6 -0
  104. package/dist/cli/components/spinner/SpinnerGlyph.js +55 -0
  105. package/dist/cli/components/spinner/SpinnerGlyph.js.map +1 -0
  106. package/dist/cli/components/spinner/constants.d.ts +4 -0
  107. package/dist/cli/components/spinner/constants.js +5 -0
  108. package/dist/cli/components/spinner/constants.js.map +1 -0
  109. package/dist/cli/components/tools/ActiveWorkPanel.d.ts +22 -0
  110. package/dist/cli/components/tools/ActiveWorkPanel.js +70 -0
  111. package/dist/cli/components/tools/ActiveWorkPanel.js.map +1 -0
  112. package/dist/cli/components/tools/AgentActivityLine.d.ts +13 -0
  113. package/dist/cli/components/tools/AgentActivityLine.js +88 -0
  114. package/dist/cli/components/tools/AgentActivityLine.js.map +1 -0
  115. package/dist/cli/components/tools/QueuedPromptList.d.ts +10 -0
  116. package/dist/cli/components/tools/QueuedPromptList.js +26 -0
  117. package/dist/cli/components/tools/QueuedPromptList.js.map +1 -0
  118. package/dist/cli/components/tools/TaskFlowHud.d.ts +15 -0
  119. package/dist/cli/components/tools/TaskFlowHud.js +55 -0
  120. package/dist/cli/components/tools/TaskFlowHud.js.map +1 -0
  121. package/dist/cli/components/tools/TerminalSessionsFooter.d.ts +6 -0
  122. package/dist/cli/components/tools/TerminalSessionsFooter.js +36 -0
  123. package/dist/cli/components/tools/TerminalSessionsFooter.js.map +1 -0
  124. package/dist/cli/components/tools/ToolActivityList.d.ts +11 -0
  125. package/dist/cli/components/tools/ToolActivityList.js +73 -0
  126. package/dist/cli/components/tools/ToolActivityList.js.map +1 -0
  127. package/dist/cli/components/tools/ToolCallTree.d.ts +11 -0
  128. package/dist/cli/components/tools/ToolCallTree.js +14 -0
  129. package/dist/cli/components/tools/ToolCallTree.js.map +1 -0
  130. package/dist/cli/components/tools/toolLifecycleModel.d.ts +16 -0
  131. package/dist/cli/components/tools/toolLifecycleModel.js +30 -0
  132. package/dist/cli/components/tools/toolLifecycleModel.js.map +1 -0
  133. package/dist/cli/components/tools/toolPresentation.d.ts +9 -0
  134. package/dist/cli/components/tools/toolPresentation.js +171 -0
  135. package/dist/cli/components/tools/toolPresentation.js.map +1 -0
  136. package/dist/cli/components/tools/toolTypes.d.ts +16 -0
  137. package/dist/cli/components/tools/toolTypes.js +2 -0
  138. package/dist/cli/components/tools/toolTypes.js.map +1 -0
  139. package/dist/cli/components/transcriptWindowing.d.ts +19 -0
  140. package/dist/cli/components/transcriptWindowing.js +81 -0
  141. package/dist/cli/components/transcriptWindowing.js.map +1 -0
  142. package/dist/cli/config.d.ts +1 -0
  143. package/dist/cli/config.js +2 -0
  144. package/dist/cli/config.js.map +1 -0
  145. package/dist/cli/conversations/journalWriter.d.ts +50 -0
  146. package/dist/cli/conversations/journalWriter.js +191 -0
  147. package/dist/cli/conversations/journalWriter.js.map +1 -0
  148. package/dist/cli/conversations/manager.d.ts +65 -0
  149. package/dist/cli/conversations/manager.js +435 -0
  150. package/dist/cli/conversations/manager.js.map +1 -0
  151. package/dist/cli/conversations/recoveryExport.d.ts +18 -0
  152. package/dist/cli/conversations/recoveryExport.js +39 -0
  153. package/dist/cli/conversations/recoveryExport.js.map +1 -0
  154. package/dist/cli/conversations/recoveryMessages.d.ts +2 -0
  155. package/dist/cli/conversations/recoveryMessages.js +3 -0
  156. package/dist/cli/conversations/recoveryMessages.js.map +1 -0
  157. package/dist/cli/conversations/store.d.ts +14 -0
  158. package/dist/cli/conversations/store.js +603 -0
  159. package/dist/cli/conversations/store.js.map +1 -0
  160. package/dist/cli/conversations/types.d.ts +142 -0
  161. package/dist/cli/conversations/types.js +2 -0
  162. package/dist/cli/conversations/types.js.map +1 -0
  163. package/dist/cli/globalConfiguration.d.ts +13 -0
  164. package/dist/cli/globalConfiguration.js +61 -0
  165. package/dist/cli/globalConfiguration.js.map +1 -0
  166. package/dist/cli/hooks/useMessageCursor.d.ts +16 -0
  167. package/dist/cli/hooks/useMessageCursor.js +75 -0
  168. package/dist/cli/hooks/useMessageCursor.js.map +1 -0
  169. package/dist/cli/hooks/useOverlayStack.d.ts +9 -0
  170. package/dist/cli/hooks/useOverlayStack.js +26 -0
  171. package/dist/cli/hooks/useOverlayStack.js.map +1 -0
  172. package/dist/cli/hooks/useTerminalSize.d.ts +16 -0
  173. package/dist/cli/hooks/useTerminalSize.js +37 -0
  174. package/dist/cli/hooks/useTerminalSize.js.map +1 -0
  175. package/dist/cli/i18n/index.d.ts +15 -0
  176. package/dist/cli/i18n/index.js +32 -0
  177. package/dist/cli/i18n/index.js.map +1 -0
  178. package/dist/cli/i18n/messages.d.ts +1305 -0
  179. package/dist/cli/i18n/messages.js +1305 -0
  180. package/dist/cli/i18n/messages.js.map +1 -0
  181. package/dist/cli/imageAttachments.d.ts +22 -0
  182. package/dist/cli/imageAttachments.js +329 -0
  183. package/dist/cli/imageAttachments.js.map +1 -0
  184. package/dist/cli/index.d.ts +2 -0
  185. package/dist/cli/index.js +146 -0
  186. package/dist/cli/index.js.map +1 -0
  187. package/dist/cli/platform/terminalAttention.d.ts +46 -0
  188. package/dist/cli/platform/terminalAttention.js +152 -0
  189. package/dist/cli/platform/terminalAttention.js.map +1 -0
  190. package/dist/cli/platform/terminalTransparency.d.ts +11 -0
  191. package/dist/cli/platform/terminalTransparency.js +193 -0
  192. package/dist/cli/platform/terminalTransparency.js.map +1 -0
  193. package/dist/cli/repl.d.ts +15 -0
  194. package/dist/cli/repl.js +38 -0
  195. package/dist/cli/repl.js.map +1 -0
  196. package/dist/cli/setup.d.ts +17 -0
  197. package/dist/cli/setup.js +991 -0
  198. package/dist/cli/setup.js.map +1 -0
  199. package/dist/cli/singleShot.d.ts +30 -0
  200. package/dist/cli/singleShot.js +167 -0
  201. package/dist/cli/singleShot.js.map +1 -0
  202. package/dist/cli/state/adaptiveStreamScheduler.d.ts +53 -0
  203. package/dist/cli/state/adaptiveStreamScheduler.js +136 -0
  204. package/dist/cli/state/adaptiveStreamScheduler.js.map +1 -0
  205. package/dist/cli/state/agentFlowController.d.ts +37 -0
  206. package/dist/cli/state/agentFlowController.js +402 -0
  207. package/dist/cli/state/agentFlowController.js.map +1 -0
  208. package/dist/cli/state/approvalPresentationScheduler.d.ts +28 -0
  209. package/dist/cli/state/approvalPresentationScheduler.js +72 -0
  210. package/dist/cli/state/approvalPresentationScheduler.js.map +1 -0
  211. package/dist/cli/state/flowFeatureFlags.d.ts +18 -0
  212. package/dist/cli/state/flowFeatureFlags.js +45 -0
  213. package/dist/cli/state/flowFeatureFlags.js.map +1 -0
  214. package/dist/cli/state/flowReducer.d.ts +120 -0
  215. package/dist/cli/state/flowReducer.js +535 -0
  216. package/dist/cli/state/flowReducer.js.map +1 -0
  217. package/dist/cli/state/flowSelectors.d.ts +45 -0
  218. package/dist/cli/state/flowSelectors.js +144 -0
  219. package/dist/cli/state/flowSelectors.js.map +1 -0
  220. package/dist/cli/state/flowStore.d.ts +19 -0
  221. package/dist/cli/state/flowStore.js +51 -0
  222. package/dist/cli/state/flowStore.js.map +1 -0
  223. package/dist/cli/state/globalCommandActivity.d.ts +25 -0
  224. package/dist/cli/state/globalCommandActivity.js +57 -0
  225. package/dist/cli/state/globalCommandActivity.js.map +1 -0
  226. package/dist/cli/state/goldenTraces.d.ts +2 -0
  227. package/dist/cli/state/goldenTraces.js +15 -0
  228. package/dist/cli/state/goldenTraces.js.map +1 -0
  229. package/dist/cli/state/notificationCoordinator.d.ts +38 -0
  230. package/dist/cli/state/notificationCoordinator.js +101 -0
  231. package/dist/cli/state/notificationCoordinator.js.map +1 -0
  232. package/dist/cli/stateProvider.d.ts +5 -0
  233. package/dist/cli/stateProvider.js +7 -0
  234. package/dist/cli/stateProvider.js.map +1 -0
  235. package/dist/cli/telemetry/localFlowTelemetry.d.ts +42 -0
  236. package/dist/cli/telemetry/localFlowTelemetry.js +131 -0
  237. package/dist/cli/telemetry/localFlowTelemetry.js.map +1 -0
  238. package/dist/cli/telemetry/terminalBaseline.d.ts +93 -0
  239. package/dist/cli/telemetry/terminalBaseline.js +199 -0
  240. package/dist/cli/telemetry/terminalBaseline.js.map +1 -0
  241. package/dist/cli/telemetry/terminalLatencyTracker.d.ts +24 -0
  242. package/dist/cli/telemetry/terminalLatencyTracker.js +59 -0
  243. package/dist/cli/telemetry/terminalLatencyTracker.js.map +1 -0
  244. package/dist/cli/terminalLayout.d.ts +2 -0
  245. package/dist/cli/terminalLayout.js +16 -0
  246. package/dist/cli/terminalLayout.js.map +1 -0
  247. package/dist/cli/terminalMouse.d.ts +10 -0
  248. package/dist/cli/terminalMouse.js +29 -0
  249. package/dist/cli/terminalMouse.js.map +1 -0
  250. package/dist/cli/theme/ThemeProvider.d.ts +9 -0
  251. package/dist/cli/theme/ThemeProvider.js +26 -0
  252. package/dist/cli/theme/ThemeProvider.js.map +1 -0
  253. package/dist/cli/theme/dark.d.ts +2 -0
  254. package/dist/cli/theme/dark.js +27 -0
  255. package/dist/cli/theme/dark.js.map +1 -0
  256. package/dist/cli/theme/index.d.ts +5 -0
  257. package/dist/cli/theme/index.js +5 -0
  258. package/dist/cli/theme/index.js.map +1 -0
  259. package/dist/cli/theme/light.d.ts +2 -0
  260. package/dist/cli/theme/light.js +26 -0
  261. package/dist/cli/theme/light.js.map +1 -0
  262. package/dist/cli/theme/palette.d.ts +7 -0
  263. package/dist/cli/theme/palette.js +8 -0
  264. package/dist/cli/theme/palette.js.map +1 -0
  265. package/dist/cli/theme/resolveColor.d.ts +4 -0
  266. package/dist/cli/theme/resolveColor.js +43 -0
  267. package/dist/cli/theme/resolveColor.js.map +1 -0
  268. package/dist/cli/theme/types.d.ts +27 -0
  269. package/dist/cli/theme/types.js +2 -0
  270. package/dist/cli/theme/types.js.map +1 -0
  271. package/dist/cli/toolExecutor.d.ts +1 -0
  272. package/dist/cli/toolExecutor.js +2 -0
  273. package/dist/cli/toolExecutor.js.map +1 -0
  274. package/dist/core/agentEngine.d.ts +425 -0
  275. package/dist/core/agentEngine.js +5170 -0
  276. package/dist/core/agentEngine.js.map +1 -0
  277. package/dist/core/agents/loader.d.ts +9 -0
  278. package/dist/core/agents/loader.js +144 -0
  279. package/dist/core/agents/loader.js.map +1 -0
  280. package/dist/core/applyPatch.d.ts +24 -0
  281. package/dist/core/applyPatch.js +158 -0
  282. package/dist/core/applyPatch.js.map +1 -0
  283. package/dist/core/cacheMonitor.d.ts +24 -0
  284. package/dist/core/cacheMonitor.js +211 -0
  285. package/dist/core/cacheMonitor.js.map +1 -0
  286. package/dist/core/clientIdentity.d.ts +6 -0
  287. package/dist/core/clientIdentity.js +44 -0
  288. package/dist/core/clientIdentity.js.map +1 -0
  289. package/dist/core/config.d.ts +99 -0
  290. package/dist/core/config.js +715 -0
  291. package/dist/core/config.js.map +1 -0
  292. package/dist/core/contextCompaction.d.ts +20 -0
  293. package/dist/core/contextCompaction.js +158 -0
  294. package/dist/core/contextCompaction.js.map +1 -0
  295. package/dist/core/contextManager.d.ts +44 -0
  296. package/dist/core/contextManager.js +590 -0
  297. package/dist/core/contextManager.js.map +1 -0
  298. package/dist/core/contextPolicy.d.ts +18 -0
  299. package/dist/core/contextPolicy.js +39 -0
  300. package/dist/core/contextPolicy.js.map +1 -0
  301. package/dist/core/credentialStore.d.ts +8 -0
  302. package/dist/core/credentialStore.js +37 -0
  303. package/dist/core/credentialStore.js.map +1 -0
  304. package/dist/core/diffCompute.d.ts +31 -0
  305. package/dist/core/diffCompute.js +116 -0
  306. package/dist/core/diffCompute.js.map +1 -0
  307. package/dist/core/editHelpers.d.ts +8 -0
  308. package/dist/core/editHelpers.js +35 -0
  309. package/dist/core/editHelpers.js.map +1 -0
  310. package/dist/core/fileIO.d.ts +12 -0
  311. package/dist/core/fileIO.js +199 -0
  312. package/dist/core/fileIO.js.map +1 -0
  313. package/dist/core/gitService.d.ts +83 -0
  314. package/dist/core/gitService.js +522 -0
  315. package/dist/core/gitService.js.map +1 -0
  316. package/dist/core/index.d.ts +30 -0
  317. package/dist/core/index.js +19 -0
  318. package/dist/core/index.js.map +1 -0
  319. package/dist/core/mcp/client.d.ts +32 -0
  320. package/dist/core/mcp/client.js +186 -0
  321. package/dist/core/mcp/client.js.map +1 -0
  322. package/dist/core/mcp/settings.d.ts +2 -0
  323. package/dist/core/mcp/settings.js +26 -0
  324. package/dist/core/mcp/settings.js.map +1 -0
  325. package/dist/core/mcp/toolBridge.d.ts +20 -0
  326. package/dist/core/mcp/toolBridge.js +74 -0
  327. package/dist/core/mcp/toolBridge.js.map +1 -0
  328. package/dist/core/mcp/types.d.ts +29 -0
  329. package/dist/core/mcp/types.js +2 -0
  330. package/dist/core/mcp/types.js.map +1 -0
  331. package/dist/core/modelDiscovery.d.ts +14 -0
  332. package/dist/core/modelDiscovery.js +566 -0
  333. package/dist/core/modelDiscovery.js.map +1 -0
  334. package/dist/core/modelProtocol.d.ts +43 -0
  335. package/dist/core/modelProtocol.js +238 -0
  336. package/dist/core/modelProtocol.js.map +1 -0
  337. package/dist/core/modelRegistry.d.ts +56 -0
  338. package/dist/core/modelRegistry.js +308 -0
  339. package/dist/core/modelRegistry.js.map +1 -0
  340. package/dist/core/networkProxy.d.ts +20 -0
  341. package/dist/core/networkProxy.js +145 -0
  342. package/dist/core/networkProxy.js.map +1 -0
  343. package/dist/core/normalizeBaseUrl.d.ts +1 -0
  344. package/dist/core/normalizeBaseUrl.js +9 -0
  345. package/dist/core/normalizeBaseUrl.js.map +1 -0
  346. package/dist/core/pathUtils.d.ts +3 -0
  347. package/dist/core/pathUtils.js +46 -0
  348. package/dist/core/pathUtils.js.map +1 -0
  349. package/dist/core/permissions.d.ts +29 -0
  350. package/dist/core/permissions.js +245 -0
  351. package/dist/core/permissions.js.map +1 -0
  352. package/dist/core/persona/voiceProfile.d.ts +7 -0
  353. package/dist/core/persona/voiceProfile.js +14 -0
  354. package/dist/core/persona/voiceProfile.js.map +1 -0
  355. package/dist/core/profile.d.ts +35 -0
  356. package/dist/core/profile.js +373 -0
  357. package/dist/core/profile.js.map +1 -0
  358. package/dist/core/requestCompatibility.d.ts +13 -0
  359. package/dist/core/requestCompatibility.js +181 -0
  360. package/dist/core/requestCompatibility.js.map +1 -0
  361. package/dist/core/runtime/agentRuntime.d.ts +43 -0
  362. package/dist/core/runtime/agentRuntime.js +137 -0
  363. package/dist/core/runtime/agentRuntime.js.map +1 -0
  364. package/dist/core/runtime/approvalCoordinator.d.ts +36 -0
  365. package/dist/core/runtime/approvalCoordinator.js +113 -0
  366. package/dist/core/runtime/approvalCoordinator.js.map +1 -0
  367. package/dist/core/runtime/capabilityBoundary.d.ts +18 -0
  368. package/dist/core/runtime/capabilityBoundary.js +89 -0
  369. package/dist/core/runtime/capabilityBoundary.js.map +1 -0
  370. package/dist/core/runtime/nodeToolExecutor.d.ts +200 -0
  371. package/dist/core/runtime/nodeToolExecutor.js +2446 -0
  372. package/dist/core/runtime/nodeToolExecutor.js.map +1 -0
  373. package/dist/core/runtime/runtimeLogWriter.d.ts +32 -0
  374. package/dist/core/runtime/runtimeLogWriter.js +129 -0
  375. package/dist/core/runtime/runtimeLogWriter.js.map +1 -0
  376. package/dist/core/runtime/runtimeTaskManager.d.ts +78 -0
  377. package/dist/core/runtime/runtimeTaskManager.js +374 -0
  378. package/dist/core/runtime/runtimeTaskManager.js.map +1 -0
  379. package/dist/core/runtime/sessionRegistry.d.ts +19 -0
  380. package/dist/core/runtime/sessionRegistry.js +41 -0
  381. package/dist/core/runtime/sessionRegistry.js.map +1 -0
  382. package/dist/core/runtime/stateProvider.d.ts +69 -0
  383. package/dist/core/runtime/stateProvider.js +131 -0
  384. package/dist/core/runtime/stateProvider.js.map +1 -0
  385. package/dist/core/runtime/subAgentTaskManager.d.ts +111 -0
  386. package/dist/core/runtime/subAgentTaskManager.js +386 -0
  387. package/dist/core/runtime/subAgentTaskManager.js.map +1 -0
  388. package/dist/core/schemaValidation.d.ts +5 -0
  389. package/dist/core/schemaValidation.js +153 -0
  390. package/dist/core/schemaValidation.js.map +1 -0
  391. package/dist/core/skills/loader.d.ts +7 -0
  392. package/dist/core/skills/loader.js +91 -0
  393. package/dist/core/skills/loader.js.map +1 -0
  394. package/dist/core/skills/runtime.d.ts +19 -0
  395. package/dist/core/skills/runtime.js +61 -0
  396. package/dist/core/skills/runtime.js.map +1 -0
  397. package/dist/core/subAgent.d.ts +50 -0
  398. package/dist/core/subAgent.js +1258 -0
  399. package/dist/core/subAgent.js.map +1 -0
  400. package/dist/core/systemPrompt.d.ts +27 -0
  401. package/dist/core/systemPrompt.js +219 -0
  402. package/dist/core/systemPrompt.js.map +1 -0
  403. package/dist/core/taskManager.d.ts +105 -0
  404. package/dist/core/taskManager.js +617 -0
  405. package/dist/core/taskManager.js.map +1 -0
  406. package/dist/core/tokenCompressor.d.ts +14 -0
  407. package/dist/core/tokenCompressor.js +161 -0
  408. package/dist/core/tokenCompressor.js.map +1 -0
  409. package/dist/core/tokenCounter.d.ts +28 -0
  410. package/dist/core/tokenCounter.js +101 -0
  411. package/dist/core/tokenCounter.js.map +1 -0
  412. package/dist/core/toolDispatcher.d.ts +11 -0
  413. package/dist/core/toolDispatcher.js +38 -0
  414. package/dist/core/toolDispatcher.js.map +1 -0
  415. package/dist/core/toolExecutionLedger.d.ts +9 -0
  416. package/dist/core/toolExecutionLedger.js +84 -0
  417. package/dist/core/toolExecutionLedger.js.map +1 -0
  418. package/dist/core/toolRegistry.d.ts +19 -0
  419. package/dist/core/toolRegistry.js +820 -0
  420. package/dist/core/toolRegistry.js.map +1 -0
  421. package/dist/core/turnStrategy.d.ts +20 -0
  422. package/dist/core/turnStrategy.js +103 -0
  423. package/dist/core/turnStrategy.js.map +1 -0
  424. package/dist/platform/process.d.ts +14 -0
  425. package/dist/platform/process.js +28 -0
  426. package/dist/platform/process.js.map +1 -0
  427. package/dist/platform/runtime.d.ts +8 -0
  428. package/dist/platform/runtime.js +21 -0
  429. package/dist/platform/runtime.js.map +1 -0
  430. package/dist/server/adminPage.d.ts +1 -0
  431. package/dist/server/adminPage.js +755 -0
  432. package/dist/server/adminPage.js.map +1 -0
  433. package/dist/server/index.d.ts +22 -0
  434. package/dist/server/index.js +566 -0
  435. package/dist/server/index.js.map +1 -0
  436. package/dist/shared/agentTypes.d.ts +227 -0
  437. package/dist/shared/agentTypes.js +79 -0
  438. package/dist/shared/agentTypes.js.map +1 -0
  439. package/dist/shared/codeIndexTypes.d.ts +32 -0
  440. package/dist/shared/codeIndexTypes.js +2 -0
  441. package/dist/shared/codeIndexTypes.js.map +1 -0
  442. package/dist/shared/flowEvents.d.ts +192 -0
  443. package/dist/shared/flowEvents.js +37 -0
  444. package/dist/shared/flowEvents.js.map +1 -0
  445. package/dist/shared/memoryTypes.d.ts +100 -0
  446. package/dist/shared/memoryTypes.js +2 -0
  447. package/dist/shared/memoryTypes.js.map +1 -0
  448. package/dist/shared/pluginTypes.d.ts +345 -0
  449. package/dist/shared/pluginTypes.js +2 -0
  450. package/dist/shared/pluginTypes.js.map +1 -0
  451. package/dist/shared/runtimeTaskTypes.d.ts +43 -0
  452. package/dist/shared/runtimeTaskTypes.js +2 -0
  453. package/dist/shared/runtimeTaskTypes.js.map +1 -0
  454. package/dist/shared/skillTypes.d.ts +1 -0
  455. package/dist/shared/skillTypes.js +2 -0
  456. package/dist/shared/skillTypes.js.map +1 -0
  457. package/dist/shared/subAgentTypes.d.ts +99 -0
  458. package/dist/shared/subAgentTypes.js +2 -0
  459. package/dist/shared/subAgentTypes.js.map +1 -0
  460. package/dist/shared/terminalTypes.d.ts +102 -0
  461. package/dist/shared/terminalTypes.js +2 -0
  462. package/dist/shared/terminalTypes.js.map +1 -0
  463. package/dist/shared/toolCallMarkup.d.ts +10 -0
  464. package/dist/shared/toolCallMarkup.js +107 -0
  465. package/dist/shared/toolCallMarkup.js.map +1 -0
  466. package/dist/shared/toolTypes.d.ts +24 -0
  467. package/dist/shared/toolTypes.js +2 -0
  468. package/dist/shared/toolTypes.js.map +1 -0
  469. package/dist/shared/types.d.ts +81 -0
  470. package/dist/shared/types.js +2 -0
  471. package/dist/shared/types.js.map +1 -0
  472. package/dist/state/types.d.ts +69 -0
  473. package/dist/state/types.js +2 -0
  474. package/dist/state/types.js.map +1 -0
  475. package/dist/tools/executor.d.ts +133 -0
  476. package/dist/tools/executor.js +2 -0
  477. package/dist/tools/executor.js.map +1 -0
  478. package/dist/tools/memory/loaders.d.ts +6 -0
  479. package/dist/tools/memory/loaders.js +292 -0
  480. package/dist/tools/memory/loaders.js.map +1 -0
  481. package/dist/tools/memory/sanitizer.d.ts +6 -0
  482. package/dist/tools/memory/sanitizer.js +48 -0
  483. package/dist/tools/memory/sanitizer.js.map +1 -0
  484. package/dist/tools/memory/service.d.ts +24 -0
  485. package/dist/tools/memory/service.js +273 -0
  486. package/dist/tools/memory/service.js.map +1 -0
  487. package/dist/tools/memory/writer.d.ts +17 -0
  488. package/dist/tools/memory/writer.js +192 -0
  489. package/dist/tools/memory/writer.js.map +1 -0
  490. package/package.json +68 -0
@@ -0,0 +1,820 @@
1
+ import { validateSchemaValue } from './schemaValidation';
2
+ const tools = [
3
+ {
4
+ name: 'read_file',
5
+ description: 'Read a bounded file range with line numbers. When offset/limit are omitted, returns up to 2,000 lines within a strict byte budget so normal source files fit in one call without allowing giant or single-line files to consume the context window. Continue from the returned offset or search for a precise range when truncated. Numbered snippets can be pasted directly into edit_file or multi_edit; the editor strips line-number prefixes.',
6
+ category: 'read',
7
+ parameters: [
8
+ { name: 'path', type: 'string', description: 'File path (relative to workspace root)', required: true },
9
+ { name: 'offset', type: 'number', description: 'Starting line number (1-based). Only provide if the file is too large to read at once or a search identified a precise range.', required: false },
10
+ { name: 'limit', type: 'number', description: 'Number of lines to read. Only provide if the file is too large to read at once or a search identified a precise range.', required: false },
11
+ ],
12
+ isReadOnly: true,
13
+ isDestructive: false,
14
+ isConcurrencySafe: true,
15
+ maxResultSizeChars: 64_000,
16
+ },
17
+ {
18
+ name: 'read_file_full',
19
+ description: 'Read a larger bounded preview of a file. Files that exceed the safety budget are truncated with instructions to continue using read_file offset/limit; no file may consume the context window without a hard limit.',
20
+ category: 'read',
21
+ parameters: [
22
+ { name: 'path', type: 'string', description: 'File path (relative to workspace root)', required: true },
23
+ ],
24
+ isReadOnly: true,
25
+ isDestructive: false,
26
+ isConcurrencySafe: true,
27
+ maxResultSizeChars: 96_000,
28
+ },
29
+ {
30
+ name: 'write_file',
31
+ description: 'Create a new file or overwrite a file when creation is intended. For replacing an existing file after reading it, prefer replace_file.',
32
+ category: 'write',
33
+ parameters: [
34
+ { name: 'path', type: 'string', description: 'File path (relative to workspace root)', required: true },
35
+ { name: 'content', type: 'string', description: 'File content', required: true },
36
+ ],
37
+ isReadOnly: false,
38
+ isDestructive: true,
39
+ isConcurrencySafe: false,
40
+ requiredMode: ['vibe', 'plan'],
41
+ },
42
+ {
43
+ name: 'replace_file',
44
+ description: 'Replace an existing file with complete new contents. Use when targeted edit_file matching is fragile, many sections change, or a whole-file rewrite is simpler. Read the file first, preferably with read_file_full.',
45
+ category: 'write',
46
+ parameters: [
47
+ { name: 'path', type: 'string', description: 'Existing file path (relative to workspace root)', required: true },
48
+ { name: 'content', type: 'string', description: 'Complete replacement file content', required: true },
49
+ ],
50
+ isReadOnly: false,
51
+ isDestructive: true,
52
+ isConcurrencySafe: false,
53
+ requiredMode: ['vibe', 'plan'],
54
+ },
55
+ {
56
+ name: 'edit_file',
57
+ description: 'Replace a unique snippet in a file. old_content must match exactly after optional read_file line-number prefixes are stripped. Copy numbered read_file snippets directly; do not reread raw content. Use replace_all for renames and multi_edit for multiple changes to one file.',
58
+ category: 'write',
59
+ parameters: [
60
+ { name: 'path', type: 'string', description: 'File path (relative to workspace root)', required: true },
61
+ { name: 'old_content', type: 'string', description: 'Exact content to replace, optionally copied with read_file line-number prefixes. Whitespace and indentation must otherwise match.', required: true },
62
+ { name: 'new_content', type: 'string', description: 'Replacement content. Must differ from old_content.', required: true },
63
+ { name: 'replace_all', type: 'boolean', description: 'When true, replace every occurrence of old_content. Default false (requires unique match). Use for variable/identifier renames.', required: false, default: false },
64
+ ],
65
+ isReadOnly: false,
66
+ isDestructive: false,
67
+ isConcurrencySafe: false,
68
+ requiredMode: ['vibe', 'plan'],
69
+ },
70
+ {
71
+ name: 'multi_edit',
72
+ description: 'Apply multiple exact-snippet edits to one file atomically. Numbered read_file snippets are accepted directly, so do not reread the file without line numbers. All edits succeed or none are written. If matching is fragile or an old_string fails, switch to replace_file instead of retrying similar snippets.',
73
+ category: 'write',
74
+ parameters: [
75
+ { name: 'path', type: 'string', description: 'File path (relative to workspace root)', required: true },
76
+ { name: 'edits', type: 'array', description: 'Array of edit steps. Each item is {old_string: string, new_string: string, replace_all?: boolean}. Applied in order.', required: true, schema: { type: 'array', items: { type: 'object', properties: { old_string: { type: 'string' }, new_string: { type: 'string' }, replace_all: { type: ['boolean', 'null'] } }, required: ['old_string', 'new_string', 'replace_all'], additionalProperties: false } } },
77
+ ],
78
+ isReadOnly: false,
79
+ isDestructive: false,
80
+ isConcurrencySafe: false,
81
+ requiredMode: ['vibe', 'plan'],
82
+ },
83
+ {
84
+ name: 'apply_patch',
85
+ description: 'Apply a Codex-compatible structured patch containing multiple add, update, move, or delete file operations. Use exact context lines in update hunks; the runtime preflights every hunk and detects concurrent file changes before writing.',
86
+ category: 'write',
87
+ parameters: [
88
+ { name: 'patch', type: 'string', description: "Patch text wrapped in '*** Begin Patch' and '*** End Patch'. Update hunks use '@@', context lines start with a space, removals with '-', and additions with '+'.", required: true },
89
+ ],
90
+ isReadOnly: false,
91
+ isDestructive: true,
92
+ isConcurrencySafe: false,
93
+ requiredMode: ['vibe', 'plan'],
94
+ maxResultSizeChars: 20_000,
95
+ },
96
+ {
97
+ name: 'delete_file',
98
+ description: 'Delete a file at the specified path. This operation is irreversible — use with caution.',
99
+ category: 'write',
100
+ parameters: [
101
+ { name: 'path', type: 'string', description: 'File path to delete (relative to workspace root)', required: true },
102
+ ],
103
+ isReadOnly: false,
104
+ isDestructive: true,
105
+ isConcurrencySafe: false,
106
+ requiredMode: ['vibe', 'plan'],
107
+ },
108
+ {
109
+ name: 'list_directory',
110
+ description: 'List files and subdirectories in the specified directory.',
111
+ category: 'read',
112
+ parameters: [
113
+ { name: 'path', type: 'string', description: 'Directory path (relative to workspace root)', required: true },
114
+ { name: 'recursive', type: 'boolean', description: 'Whether to recursively list subdirectories', required: false, default: false },
115
+ ],
116
+ isReadOnly: true,
117
+ isDestructive: false,
118
+ isConcurrencySafe: true,
119
+ },
120
+ {
121
+ name: 'search_files',
122
+ description: 'Search for candidate files by name using glob patterns across the workspace (e.g. **/*.ts).',
123
+ category: 'read',
124
+ parameters: [
125
+ { name: 'pattern', type: 'string', description: 'Glob search pattern (e.g. **/*.ts)', required: true },
126
+ { name: 'path', type: 'string', description: 'Search starting path', required: false },
127
+ ],
128
+ isReadOnly: true,
129
+ isDestructive: false,
130
+ isConcurrencySafe: true,
131
+ },
132
+ {
133
+ name: 'search_content',
134
+ description: 'Regex search file contents with snippet windows. Default case-insensitive.',
135
+ category: 'read',
136
+ parameters: [
137
+ { name: 'pattern', type: 'string', description: 'Regular expression search pattern', required: true },
138
+ { name: 'path', type: 'string', description: 'Search path', required: false },
139
+ { name: 'file_pattern', type: 'string', description: 'File name filter pattern (e.g. *.ts)', required: false },
140
+ { name: 'case_sensitive', type: 'boolean', description: 'When true, match exact case. Defaults to false (case-insensitive).', required: false, default: false },
141
+ { name: 'offset', type: 'number', description: 'Skip the first N matches for pagination.', required: false, default: 0 },
142
+ { name: 'head_limit', type: 'number', description: 'Maximum matches to return. Default 50, max 500.', required: false, default: 50 },
143
+ { name: 'context_before', type: 'number', description: 'Context lines before each match.', required: false, default: 0 },
144
+ { name: 'context_after', type: 'number', description: 'Context lines after each match.', required: false, default: 0 },
145
+ { name: 'multiline', type: 'boolean', description: 'Enable multiline regex matching.', required: false, default: false },
146
+ { name: 'file_type', type: 'string', description: 'Ripgrep file type filter such as ts, py, rust, or go.', required: false },
147
+ ],
148
+ isReadOnly: true,
149
+ isDestructive: false,
150
+ isConcurrencySafe: true,
151
+ },
152
+ {
153
+ name: 'search_symbols',
154
+ description: 'Search code symbols with a lightweight lexical source scan (functions, classes, interfaces, constants).',
155
+ category: 'read',
156
+ parameters: [
157
+ { name: 'query', type: 'string', description: 'Symbol query or partial name', required: true },
158
+ { name: 'path', type: 'string', description: 'Optional path filter relative to workspace root', required: false },
159
+ { name: 'symbol_kind', type: 'string', description: 'Optional symbol kind filter', required: false, enum: ['class', 'function', 'interface', 'type', 'enum', 'constant'] },
160
+ ],
161
+ isReadOnly: true,
162
+ isDestructive: false,
163
+ isConcurrencySafe: true,
164
+ },
165
+ {
166
+ name: 'get_codemap',
167
+ description: 'Generate a hierarchical project codemap. Cheap first-pass before read_file drilling.',
168
+ category: 'read',
169
+ parameters: [
170
+ { name: 'query', type: 'string', description: 'Question or feature area to map', required: true },
171
+ { name: 'path', type: 'string', description: 'Optional path filter relative to workspace root', required: false },
172
+ ],
173
+ isReadOnly: true,
174
+ isDestructive: false,
175
+ isConcurrencySafe: true,
176
+ },
177
+ {
178
+ name: 'web_search',
179
+ description: 'Search the public web for current or explicitly external information. Returns compact results with title, URL, snippet, provider, and query. Do not use it as a substitute for source code missing from the active workspace when the user asks about this repository or current project; report the workspace mismatch unless the user requested a remote copy.',
180
+ category: 'read',
181
+ parameters: [
182
+ { name: 'query', type: 'string', description: 'Search query. Include specific product/library/version/error terms when possible.', required: true },
183
+ { name: 'limit', type: 'number', description: 'Maximum number of results to return (default 5, max 10).', required: false, default: 5 },
184
+ { name: 'region', type: 'string', description: 'DuckDuckGo region code such as wt-wt, us-en, cn-zh. Defaults to wt-wt.', required: false, default: 'wt-wt' },
185
+ { name: 'freshness', type: 'string', description: 'Optional freshness hint for future providers. Supported values: day, week, month, year.', required: false, enum: ['day', 'week', 'month', 'year'] },
186
+ { name: 'domains', type: 'array', description: 'Optional domain filters such as ["docs.github.com", "nodejs.org"]. Use for official/source-only searches.', required: false, schema: { type: 'array', items: { type: 'string' } } },
187
+ ],
188
+ isReadOnly: true,
189
+ isDestructive: false,
190
+ isConcurrencySafe: true,
191
+ },
192
+ {
193
+ name: 'tool_search',
194
+ description: 'Search deferred MCP tool metadata and load matching tool schemas for the next model turn. Use this before attempting an MCP tool that is not already visible.',
195
+ category: 'read',
196
+ parameters: [
197
+ { name: 'query', type: 'string', description: 'Intent or capability to search for, such as "issue tracker comments" or "browser screenshot".', required: true },
198
+ { name: 'limit', type: 'number', description: 'Maximum matching tools to load (default 8, maximum 20).', required: false, default: 8 },
199
+ ],
200
+ isReadOnly: true,
201
+ isDestructive: false,
202
+ isConcurrencySafe: true,
203
+ requiredMode: ['vibe', 'plan'],
204
+ },
205
+ {
206
+ name: 'list_memories',
207
+ description: 'List workspace long-term memories (rules, strategies, pitfalls).',
208
+ category: 'read',
209
+ parameters: [
210
+ { name: 'query', type: 'string', description: 'Optional search query. Matches memory text, tags, and metadata.', required: false },
211
+ { name: 'kind', type: 'string', description: 'Filter by memory kind.', required: false, enum: ['rule', 'fact', 'preference', 'episode', 'todo', 'verdict', 'strategy', 'pitfall', 'workflow'] },
212
+ { name: 'scope', type: 'string', description: 'Filter by scope.', required: false, enum: ['global', 'workspace_shared', 'workspace_private', 'conversation'] },
213
+ { name: 'limit', type: 'number', description: 'Maximum number of entries to return (default 50, max 200).', required: false, default: 50 },
214
+ ],
215
+ isReadOnly: true,
216
+ isDestructive: false,
217
+ isConcurrencySafe: true,
218
+ },
219
+ {
220
+ name: 'remember',
221
+ description: 'Store a memory (project knowledge, strategy, pitfall, preference). Survives across conversations; deduplicated automatically.',
222
+ category: 'write',
223
+ parameters: [
224
+ { name: 'text', type: 'string', description: 'The memory content to store (≤ 500 chars). Should be atomic, actionable, and generalizable.', required: true },
225
+ { name: 'kind', type: 'string', description: 'Memory type. Use "fact" for project knowledge, "strategy" for learned approaches, "pitfall" for things to avoid, "workflow" for procedural steps, "preference" for user style preferences.', required: false, default: 'fact', enum: ['fact', 'strategy', 'pitfall', 'workflow', 'preference', 'episode'] },
226
+ { name: 'tags', type: 'array', description: 'Tags for retrieval (e.g. ["api", "auth", "debugging"]). Max 8 tags.', required: false, schema: { type: 'array', items: { type: 'string' } } },
227
+ { name: 'confidence', type: 'string', description: 'How confident this memory is. "asserted" = user stated directly, "observed" = inferred from behavior, "inferred" = deduced from context.', required: false, default: 'observed', enum: ['asserted', 'observed', 'inferred'] },
228
+ ],
229
+ isReadOnly: false,
230
+ isDestructive: false,
231
+ isConcurrencySafe: false,
232
+ },
233
+ {
234
+ name: 'forget',
235
+ description: 'Soft-delete a memory by marking it rejected. Excluded from future retrieval.',
236
+ category: 'write',
237
+ parameters: [
238
+ { name: 'id', type: 'string', description: 'The memory id to forget (from list_memories results).', required: true },
239
+ { name: 'reason', type: 'string', description: 'Brief reason for forgetting (stored for audit trail).', required: false },
240
+ ],
241
+ isReadOnly: false,
242
+ isDestructive: false,
243
+ isConcurrencySafe: false,
244
+ },
245
+ {
246
+ name: 'git_status',
247
+ description: 'Read structured repository state: branch, HEAD, upstream divergence, conflicts, staged/unstaged/untracked counts, changed paths, and recent commits.',
248
+ category: 'read',
249
+ parameters: [],
250
+ isReadOnly: true,
251
+ isDestructive: false,
252
+ isConcurrencySafe: true,
253
+ requiredMode: ['vibe', 'plan'],
254
+ maxResultSizeChars: 30_000,
255
+ },
256
+ {
257
+ name: 'git_diff',
258
+ description: 'Read a bounded Git diff without shell quoting. Use working for unstaged changes, staged for the index, or all for both. Untracked file contents are not included.',
259
+ category: 'read',
260
+ parameters: [
261
+ { name: 'scope', type: 'string', description: 'Which changes to compare', required: false, enum: ['working', 'staged', 'all'], default: 'working' },
262
+ { name: 'path', type: 'string', description: 'Optional workspace-relative path filter', required: false },
263
+ { name: 'context_lines', type: 'number', description: 'Diff context lines, from 0 to 50', required: false, default: 3 },
264
+ ],
265
+ isReadOnly: true,
266
+ isDestructive: false,
267
+ isConcurrencySafe: true,
268
+ requiredMode: ['vibe', 'plan'],
269
+ maxResultSizeChars: 60_000,
270
+ },
271
+ {
272
+ name: 'git_log',
273
+ description: 'Read recent commit history, optionally limited to one path. Returns stable tab-separated commit metadata.',
274
+ category: 'read',
275
+ parameters: [
276
+ { name: 'limit', type: 'number', description: 'Commit count from 1 to 100', required: false, default: 10 },
277
+ { name: 'path', type: 'string', description: 'Optional workspace-relative path filter', required: false },
278
+ ],
279
+ isReadOnly: true,
280
+ isDestructive: false,
281
+ isConcurrencySafe: true,
282
+ requiredMode: ['vibe', 'plan'],
283
+ maxResultSizeChars: 30_000,
284
+ },
285
+ {
286
+ name: 'git_show',
287
+ description: 'Inspect one commit or revision with metadata and patch, optionally filtered to one path. Revisions and paths are validated before Git runs.',
288
+ category: 'read',
289
+ parameters: [
290
+ { name: 'revision', type: 'string', description: 'Commit hash or revision such as HEAD, HEAD~2, main, or origin/main', required: true },
291
+ { name: 'path', type: 'string', description: 'Optional workspace-relative path filter', required: false },
292
+ ],
293
+ isReadOnly: true,
294
+ isDestructive: false,
295
+ isConcurrencySafe: true,
296
+ requiredMode: ['vibe', 'plan'],
297
+ maxResultSizeChars: 60_000,
298
+ },
299
+ {
300
+ name: 'git_stage',
301
+ description: 'Stage an explicit set of workspace paths. Never stages the whole repository implicitly.',
302
+ category: 'write',
303
+ parameters: [
304
+ { name: 'paths', type: 'array', description: 'Workspace-relative paths to stage', required: true, schema: { type: 'array', minItems: 1, maxItems: 200, items: { type: 'string', minLength: 1, maxLength: 1024 } } },
305
+ ],
306
+ isReadOnly: false,
307
+ isDestructive: false,
308
+ isConcurrencySafe: false,
309
+ requiredMode: ['vibe'],
310
+ },
311
+ {
312
+ name: 'git_commit',
313
+ description: 'Create a Git commit. When paths are provided, TurboFlux uses an isolated temporary index and refuses paths with pre-existing staged changes. Without paths, commits the current index.',
314
+ category: 'manage',
315
+ parameters: [
316
+ { name: 'message', type: 'string', description: 'Commit message', required: true },
317
+ { name: 'paths', type: 'array', description: 'Optional explicit paths for an isolated commit. Do not stage these paths first; call git_commit(paths) directly.', required: false, schema: { type: 'array', minItems: 1, maxItems: 200, items: { type: 'string', minLength: 1, maxLength: 1024 } } },
318
+ ],
319
+ isReadOnly: false,
320
+ isDestructive: false,
321
+ isConcurrencySafe: false,
322
+ requiredMode: ['vibe'],
323
+ },
324
+ {
325
+ name: 'git_restore',
326
+ description: 'Restore explicit workspace paths from a validated Git revision into the working tree. Refuses paths that already contain staged changes.',
327
+ category: 'write',
328
+ parameters: [
329
+ { name: 'paths', type: 'array', description: 'Workspace-relative paths to restore', required: true, schema: { type: 'array', minItems: 1, maxItems: 200, items: { type: 'string', minLength: 1, maxLength: 1024 } } },
330
+ { name: 'source', type: 'string', description: 'Validated source revision; defaults to HEAD', required: false, default: 'HEAD' },
331
+ ],
332
+ isReadOnly: false,
333
+ isDestructive: true,
334
+ isConcurrencySafe: false,
335
+ requiredMode: ['vibe'],
336
+ },
337
+ {
338
+ name: 'git_revert',
339
+ description: 'Revert one validated Git revision by creating a new commit. Requires a clean tracked working tree and index.',
340
+ category: 'manage',
341
+ parameters: [
342
+ { name: 'revision', type: 'string', description: 'Commit hash or revision to revert', required: true },
343
+ ],
344
+ isReadOnly: false,
345
+ isDestructive: true,
346
+ isConcurrencySafe: false,
347
+ requiredMode: ['vibe'],
348
+ },
349
+ {
350
+ name: 'git_create_branch',
351
+ description: 'Create and switch to a validated branch. Does not force through conflicting working-tree changes.',
352
+ category: 'manage',
353
+ parameters: [
354
+ { name: 'name', type: 'string', description: 'New branch name', required: true },
355
+ { name: 'start_point', type: 'string', description: 'Optional commit or revision to branch from', required: false },
356
+ ],
357
+ isReadOnly: false,
358
+ isDestructive: false,
359
+ isConcurrencySafe: false,
360
+ requiredMode: ['vibe'],
361
+ },
362
+ {
363
+ name: 'git_switch_branch',
364
+ description: 'Switch to an existing validated local branch. Does not use force and Git will refuse changes that would be overwritten.',
365
+ category: 'manage',
366
+ parameters: [
367
+ { name: 'name', type: 'string', description: 'Existing local branch name', required: true },
368
+ ],
369
+ isReadOnly: false,
370
+ isDestructive: false,
371
+ isConcurrencySafe: false,
372
+ requiredMode: ['vibe'],
373
+ },
374
+ {
375
+ name: 'git_stash',
376
+ description: 'List, create, apply, or pop Git stashes through validated arguments. Apply/pop may report normal Git conflicts for the agent to resolve.',
377
+ category: 'manage',
378
+ parameters: [
379
+ { name: 'action', type: 'string', description: 'Stash operation', required: true, enum: ['list', 'push', 'apply', 'pop'] },
380
+ { name: 'message', type: 'string', description: 'Optional message for push', required: false },
381
+ { name: 'include_untracked', type: 'boolean', description: 'Include untracked files when pushing', required: false, default: false },
382
+ { name: 'stash', type: 'string', description: 'Validated reference such as stash@{0} for apply/pop', required: false },
383
+ ],
384
+ isReadOnly: false,
385
+ isDestructive: false,
386
+ isConcurrencySafe: false,
387
+ requiredMode: ['vibe'],
388
+ maxResultSizeChars: 30_000,
389
+ },
390
+ {
391
+ name: 'git_push',
392
+ description: 'Push one branch to a validated remote without force. This external operation always enters the approval flow unless full-access policy is active.',
393
+ category: 'execute',
394
+ parameters: [
395
+ { name: 'remote', type: 'string', description: 'Remote name', required: false, default: 'origin' },
396
+ { name: 'branch', type: 'string', description: 'Optional local branch name; omit to use Git upstream defaults', required: false },
397
+ { name: 'set_upstream', type: 'boolean', description: 'Set upstream tracking for the pushed branch', required: false, default: false },
398
+ ],
399
+ isReadOnly: false,
400
+ isDestructive: false,
401
+ isConcurrencySafe: false,
402
+ requiredMode: ['vibe'],
403
+ maxResultSizeChars: 30_000,
404
+ },
405
+ {
406
+ name: 'run_command',
407
+ description: 'Run a shell command. Background mode starts one dedicated process session with durable output, exact exit status, and immediate session_id return.',
408
+ category: 'execute',
409
+ parameters: [
410
+ { name: 'command', type: 'string', description: 'Shell command to execute', required: true },
411
+ { name: 'cwd', type: 'string', description: 'Working directory', required: false },
412
+ { name: 'timeout', type: 'number', description: 'Timeout in milliseconds (foreground only). Default 30000.', required: false, default: 30000 },
413
+ { name: 'env', type: 'object', description: 'Additional environment variables', required: false, schema: { type: 'object', additionalProperties: { type: 'string' } } },
414
+ { name: 'approved', type: 'boolean', description: 'Legacy field; permission gates are enforced by the runtime.', required: false, default: false },
415
+ { name: 'run_in_background', type: 'boolean', description: 'When true, spawn one dedicated command session and return immediately. Use for dev servers, watch mode, builds, and multi-hour jobs. Default false.', required: false, default: false },
416
+ ],
417
+ isReadOnly: false,
418
+ isDestructive: true,
419
+ isConcurrencySafe: false,
420
+ requiredMode: ['vibe', 'plan'],
421
+ maxResultSizeChars: 30_000,
422
+ isConcurrencySafeFor: (input) => {
423
+ const cmd = (input.command || '').trim();
424
+ const readOnlyPrefixes = ['ls ', 'ls\t', 'dir ', 'dir\t', 'cat ', 'head ', 'tail ', 'echo ', 'pwd', 'which ', 'where ', 'type ', 'git status', 'git log', 'git diff', 'git branch', 'git show', 'node --version', 'npm list', 'Get-ChildItem', 'Get-Content', 'Get-Location'];
425
+ return readOnlyPrefixes.some(p => cmd === p.trimEnd() || cmd.startsWith(p));
426
+ },
427
+ },
428
+ {
429
+ name: 'read_terminal',
430
+ description: 'Read bounded output from a background command session. Use since_seq for incremental polling; omitted bytes remain available in the durable log.',
431
+ category: 'read',
432
+ parameters: [
433
+ { name: 'session_id', type: 'string', description: 'Terminal session id (returned by run_command(run_in_background=true) or list_terminals).', required: true },
434
+ { name: 'tail_lines', type: 'number', description: 'Number of trailing lines to return. Default 200. Set 0 for the entire buffer (or new chunks when since_seq is set).', required: false, default: 200 },
435
+ { name: 'since_seq', type: 'number', description: 'Return only output chunks with seq > since_seq. Use the last_seq value from a previous read_terminal response to poll for new output without re-reading the full buffer.', required: false },
436
+ ],
437
+ isReadOnly: true,
438
+ isDestructive: false,
439
+ isConcurrencySafe: true,
440
+ requiredMode: ['vibe', 'plan'],
441
+ },
442
+ {
443
+ name: 'write_terminal',
444
+ description: 'Write raw stdin to a running background terminal. Include a newline in data when submitting a shell command.',
445
+ category: 'execute',
446
+ parameters: [
447
+ { name: 'session_id', type: 'string', description: 'Terminal session id returned by run_command(run_in_background=true) or list_terminals.', required: true },
448
+ { name: 'data', type: 'string', description: 'Exact text or control sequence to write to stdin. Include \\n to submit a command.', required: true },
449
+ ],
450
+ isReadOnly: false,
451
+ isDestructive: true,
452
+ isConcurrencySafe: false,
453
+ requiredMode: ['vibe'],
454
+ },
455
+ {
456
+ name: 'kill_terminal',
457
+ description: 'Stop a background terminal session. Default: graceful interrupt (Ctrl+C). Use hard=true for immediate kill.',
458
+ category: 'execute',
459
+ parameters: [
460
+ { name: 'session_id', type: 'string', description: 'Terminal session id to stop.', required: true },
461
+ { name: 'hard', type: 'boolean', description: 'When true, kill the shell process directly instead of sending an interrupt. Default false.', required: false, default: false },
462
+ ],
463
+ isReadOnly: false,
464
+ isDestructive: false,
465
+ isConcurrencySafe: false,
466
+ requiredMode: ['vibe', 'plan'],
467
+ },
468
+ {
469
+ name: 'list_terminals',
470
+ description: 'List active background terminal sessions with status, cwd, and last command.',
471
+ category: 'read',
472
+ parameters: [],
473
+ isReadOnly: true,
474
+ isDestructive: false,
475
+ isConcurrencySafe: true,
476
+ requiredMode: ['vibe', 'plan'],
477
+ },
478
+ {
479
+ name: 'create_task',
480
+ description: 'Create a single task. Prefer create_tasks for 2+ tasks.',
481
+ category: 'manage',
482
+ parameters: [
483
+ { name: 'title', type: 'string', description: 'Task title', required: true },
484
+ { name: 'description', type: 'string', description: 'Task description', required: true },
485
+ { name: 'priority', type: 'string', description: 'Task priority level', required: true, enum: ['major', 'medium', 'minor'] },
486
+ { name: 'parent_id', type: 'string', description: 'Parent task ID', required: false },
487
+ { name: 'dependencies', type: 'array', description: 'Task IDs this task depends on (must be completed first)', required: false, schema: { type: 'array', items: { type: 'string' } } },
488
+ { name: 'order', type: 'number', description: 'Execution order within siblings (lower = earlier)', required: false },
489
+ { name: 'metadata', type: 'object', description: 'Optional metadata: estimatedDuration, relatedFiles, relatedIssue', required: false, schema: { type: 'object', properties: { estimatedDuration: { type: ['number', 'null'] }, relatedFiles: { anyOf: [{ type: 'array', items: { type: 'string' } }, { type: 'null' }] }, relatedIssue: { type: ['string', 'null'] } }, required: ['estimatedDuration', 'relatedFiles', 'relatedIssue'], additionalProperties: false } },
490
+ ],
491
+ isReadOnly: false,
492
+ isDestructive: false,
493
+ isConcurrencySafe: false,
494
+ requiredMode: ['vibe', 'plan'],
495
+ },
496
+ {
497
+ name: 'create_tasks',
498
+ description: 'Create multiple tasks in one call. Tasks are created in array order; use ref to cross-reference within the same call.',
499
+ category: 'manage',
500
+ parameters: [
501
+ {
502
+ name: 'tasks',
503
+ type: 'array',
504
+ description: 'Array of task definitions. Each item: { title, description, priority ("major"|"medium"|"minor"), ref? (local label to reference within this call), parent_id? (real task id or a `ref` from earlier in this same array), dependencies? (array of ids or local refs), order?, metadata? }.',
505
+ required: true,
506
+ schema: { type: 'array', items: { type: 'object', properties: { title: { type: 'string' }, description: { type: 'string' }, priority: { type: 'string', enum: ['major', 'medium', 'minor'] }, ref: { type: ['string', 'null'] }, parent_id: { type: ['string', 'null'] }, dependencies: { anyOf: [{ type: 'array', items: { type: 'string' } }, { type: 'null' }] }, order: { type: ['number', 'null'] }, metadata: { type: ['object', 'null'] } }, required: ['title', 'description', 'priority', 'ref', 'parent_id', 'dependencies', 'order', 'metadata'], additionalProperties: false } },
507
+ },
508
+ ],
509
+ isReadOnly: false,
510
+ isDestructive: false,
511
+ isConcurrencySafe: false,
512
+ requiredMode: ['vibe', 'plan'],
513
+ },
514
+ {
515
+ name: 'update_task',
516
+ description: 'Update task status or progress.',
517
+ category: 'manage',
518
+ parameters: [
519
+ { name: 'task_id', type: 'string', description: 'Task ID', required: true },
520
+ { name: 'status', type: 'string', description: 'New status', required: false, enum: ['pending', 'in_progress', 'completed', 'failed'] },
521
+ { name: 'progress', type: 'number', description: 'Progress percentage (0-100)', required: false },
522
+ { name: 'error', type: 'string', description: 'Error message (only for failed status)', required: false },
523
+ ],
524
+ isReadOnly: false,
525
+ isDestructive: false,
526
+ isConcurrencySafe: false,
527
+ requiredMode: ['vibe', 'plan'],
528
+ },
529
+ {
530
+ name: 'add_task_dependency',
531
+ description: 'Add a task dependency. Automatically prevents cycles.',
532
+ category: 'manage',
533
+ parameters: [
534
+ { name: 'task_id', type: 'string', description: 'Task that depends on another', required: true },
535
+ { name: 'dependency_id', type: 'string', description: 'Task that must be completed first', required: true },
536
+ ],
537
+ isReadOnly: false,
538
+ isDestructive: false,
539
+ isConcurrencySafe: false,
540
+ requiredMode: ['vibe', 'plan'],
541
+ },
542
+ {
543
+ name: 'remove_task_dependency',
544
+ description: 'Remove a dependency from a task.',
545
+ category: 'manage',
546
+ parameters: [
547
+ { name: 'task_id', type: 'string', description: 'Task to remove dependency from', required: true },
548
+ { name: 'dependency_id', type: 'string', description: 'Dependency to remove', required: true },
549
+ ],
550
+ isReadOnly: false,
551
+ isDestructive: false,
552
+ isConcurrencySafe: false,
553
+ requiredMode: ['vibe', 'plan'],
554
+ },
555
+ {
556
+ name: 'list_tasks',
557
+ description: 'List all tasks in the current session and their status.',
558
+ category: 'manage',
559
+ parameters: [
560
+ { name: 'parent_id', type: 'string', description: 'Filter by parent task', required: false },
561
+ { name: 'status', type: 'string', description: 'Filter by status', required: false, enum: ['pending', 'in_progress', 'completed', 'failed'] },
562
+ ],
563
+ isReadOnly: true,
564
+ isDestructive: false,
565
+ isConcurrencySafe: true,
566
+ },
567
+ {
568
+ name: 'ask_user',
569
+ description: 'Ask the user a question or request confirmation.',
570
+ category: 'communicate',
571
+ parameters: [
572
+ { name: 'question', type: 'string', description: 'Question to ask the user', required: true },
573
+ { name: 'options', type: 'array', description: 'Optional list of choices', required: false, schema: { type: 'array', items: { type: 'string' } } },
574
+ { name: 'reason', type: 'string', description: 'Reason for asking (e.g. approval gate)', required: false },
575
+ { name: 'command', type: 'string', description: 'When asking to approve a shell command, include the exact command text here so the UI can render an approval card.', required: false },
576
+ ],
577
+ isReadOnly: true,
578
+ isDestructive: false,
579
+ isConcurrencySafe: false,
580
+ },
581
+ {
582
+ name: 'notify_user',
583
+ description: 'Send a non-blocking notification to the user. Used for progress updates, status changes, etc. — does not require a user response.',
584
+ category: 'communicate',
585
+ parameters: [
586
+ { name: 'message', type: 'string', description: 'Notification content', required: true },
587
+ { name: 'type', type: 'string', description: 'Notification type', required: false, enum: ['info', 'success', 'warning', 'error'], default: 'info' },
588
+ ],
589
+ isReadOnly: true,
590
+ isDestructive: false,
591
+ isConcurrencySafe: true,
592
+ },
593
+ {
594
+ name: 'use_skill',
595
+ description: 'Select an enabled project skill for the current turn and record why it applies.',
596
+ category: 'manage',
597
+ parameters: [
598
+ { name: 'skill_id', type: 'string', description: 'Enabled skill identifier.', required: true },
599
+ { name: 'reason', type: 'string', description: 'Optional reason this skill applies.', required: false },
600
+ ],
601
+ isReadOnly: true,
602
+ isDestructive: false,
603
+ isConcurrencySafe: false,
604
+ requiredMode: ['vibe', 'plan'],
605
+ },
606
+ {
607
+ name: 'spawn_agent',
608
+ description: `Launch a specialized subagent to handle a focused task autonomously.
609
+
610
+ Available types:
611
+ - custom agents: Project-specific agents loaded from .turboflux/agents/.
612
+
613
+ When NOT to use spawn_agent:
614
+ - If you know the exact file to read, use read_file directly.
615
+ - For a specific symbol definition, use search_symbols.
616
+ - For a known string pattern in a known area, use search_content.
617
+ - For a tiny known lookup where one targeted search is enough, stay with targeted read/search tools.
618
+
619
+ Each invocation starts in the background and returns an agent ID immediately. Use read_agent to inspect progress/results, list_agents to discover tasks, and cancel_agent to stop one.
620
+ Launch multiple agents concurrently for independent topics and provide a highly specific objective.`,
621
+ category: 'manage',
622
+ parameters: [
623
+ { name: 'agent_type', type: 'string', description: 'Which project-defined agent from .turboflux/agents/ to spawn.', required: true },
624
+ { name: 'objective', type: 'string', description: 'Concrete question or task for the subagent. Be specific — include the area of the codebase, the feature, or the change to review.', required: true },
625
+ { name: 'context', type: 'string', description: 'Optional extra context that helps the subagent (related files, prior findings, constraints).', required: false },
626
+ ],
627
+ isReadOnly: false,
628
+ isDestructive: false,
629
+ isConcurrencySafe: false,
630
+ requiredMode: ['vibe'],
631
+ },
632
+ {
633
+ name: 'list_agents',
634
+ description: 'List current and recovered background subagent tasks with IDs, types, objectives, and statuses.',
635
+ category: 'read',
636
+ parameters: [],
637
+ isReadOnly: true,
638
+ isDestructive: false,
639
+ isConcurrencySafe: true,
640
+ requiredMode: ['vibe', 'plan'],
641
+ },
642
+ {
643
+ name: 'read_agent',
644
+ description: 'Read a background subagent status, final result, and a page of its persisted transcript.',
645
+ category: 'read',
646
+ parameters: [
647
+ { name: 'agent_id', type: 'string', description: 'Agent ID returned by spawn_agent or list_agents.', required: true },
648
+ { name: 'offset', type: 'number', description: 'Optional zero-based transcript record offset. Defaults to the latest records.', required: false },
649
+ { name: 'limit', type: 'number', description: 'Maximum transcript records to return. Default 20, maximum 200.', required: false, default: 20 },
650
+ ],
651
+ isReadOnly: true,
652
+ isDestructive: false,
653
+ isConcurrencySafe: true,
654
+ requiredMode: ['vibe', 'plan'],
655
+ maxResultSizeChars: 30_000,
656
+ },
657
+ {
658
+ name: 'cancel_agent',
659
+ description: 'Cancel a running background subagent. Completed and recovered terminal tasks remain readable.',
660
+ category: 'manage',
661
+ parameters: [
662
+ { name: 'agent_id', type: 'string', description: 'Agent ID returned by spawn_agent or list_agents.', required: true },
663
+ ],
664
+ isReadOnly: false,
665
+ isDestructive: false,
666
+ isConcurrencySafe: false,
667
+ requiredMode: ['vibe'],
668
+ },
669
+ ];
670
+ export function getAllTools() {
671
+ return tools;
672
+ }
673
+ export function getToolsForMode(mode, options) {
674
+ const disabledTools = new Set(options?.disabledTools || []);
675
+ return tools.filter(tool => {
676
+ if (disabledTools.has(tool.name))
677
+ return false;
678
+ if (mode === 'plan' && !tool.isReadOnly)
679
+ return false;
680
+ if (!tool.requiredMode)
681
+ return true;
682
+ return tool.requiredMode.includes(mode);
683
+ });
684
+ }
685
+ export function getToolByName(name) {
686
+ return tools.find(t => t.name === name);
687
+ }
688
+ export function getToolsByCategory(category) {
689
+ return tools.filter(t => t.category === category);
690
+ }
691
+ function selectTools(mode, options) {
692
+ return getToolsForMode(mode, options);
693
+ }
694
+ export function toolsToOpenAIFormat(mode, options) {
695
+ const modeTools = selectTools(mode, options);
696
+ return modeTools.map(tool => ({
697
+ type: 'function',
698
+ function: {
699
+ name: tool.name,
700
+ description: tool.description,
701
+ ...(options?.strict ? { strict: true } : {}),
702
+ parameters: {
703
+ type: 'object',
704
+ properties: Object.fromEntries(tool.parameters.map(p => [
705
+ p.name,
706
+ parameterSchema(p, options?.strict === true),
707
+ ])),
708
+ required: (options?.strict ? tool.parameters : tool.parameters.filter(p => p.required)).map(p => p.name),
709
+ additionalProperties: false,
710
+ },
711
+ },
712
+ }));
713
+ }
714
+ export function toolsToAnthropicFormat(mode, options) {
715
+ const modeTools = selectTools(mode, options);
716
+ return modeTools.map(tool => ({
717
+ name: tool.name,
718
+ description: tool.description,
719
+ input_schema: {
720
+ type: 'object',
721
+ properties: Object.fromEntries(tool.parameters.map(p => [
722
+ p.name,
723
+ parameterSchema(p, false),
724
+ ])),
725
+ required: tool.parameters.filter(p => p.required).map(p => p.name),
726
+ additionalProperties: false,
727
+ },
728
+ }));
729
+ }
730
+ function parameterSchema(parameter, strict) {
731
+ const base = parameter.schema
732
+ ? strict ? { ...parameter.schema } : relaxNullableRequiredFields(parameter.schema)
733
+ : { type: parameter.type };
734
+ if (parameter.enum)
735
+ base.enum = parameter.enum;
736
+ if (parameter.default !== undefined)
737
+ base.default = parameter.default;
738
+ if (strict && !parameter.required) {
739
+ return { anyOf: [base, { type: 'null' }], description: parameter.description };
740
+ }
741
+ return { ...base, description: parameter.description };
742
+ }
743
+ function relaxNullableRequiredFields(schema) {
744
+ const normalized = { ...schema };
745
+ for (const keyword of ['anyOf', 'oneOf', 'allOf']) {
746
+ const candidates = schema[keyword];
747
+ if (Array.isArray(candidates)) {
748
+ normalized[keyword] = candidates.map(candidate => (candidate && typeof candidate === 'object' && !Array.isArray(candidate)
749
+ ? relaxNullableRequiredFields(candidate)
750
+ : candidate));
751
+ }
752
+ }
753
+ if (schema.items && typeof schema.items === 'object' && !Array.isArray(schema.items)) {
754
+ normalized.items = relaxNullableRequiredFields(schema.items);
755
+ }
756
+ if (schema.additionalProperties && typeof schema.additionalProperties === 'object' && !Array.isArray(schema.additionalProperties)) {
757
+ normalized.additionalProperties = relaxNullableRequiredFields(schema.additionalProperties);
758
+ }
759
+ if (schema.properties && typeof schema.properties === 'object' && !Array.isArray(schema.properties)) {
760
+ const properties = schema.properties;
761
+ normalized.properties = Object.fromEntries(Object.entries(properties).map(([name, property]) => [
762
+ name,
763
+ property && typeof property === 'object' && !Array.isArray(property)
764
+ ? relaxNullableRequiredFields(property)
765
+ : property,
766
+ ]));
767
+ if (Array.isArray(schema.required)) {
768
+ normalized.required = schema.required.filter(name => {
769
+ if (typeof name !== 'string')
770
+ return true;
771
+ const property = properties[name];
772
+ return !property || typeof property !== 'object' || Array.isArray(property)
773
+ || !schemaAcceptsNull(property);
774
+ });
775
+ }
776
+ }
777
+ return normalized;
778
+ }
779
+ function schemaAcceptsNull(schema) {
780
+ const declaredTypes = Array.isArray(schema.type) ? schema.type : schema.type ? [schema.type] : [];
781
+ if (declaredTypes.includes('null'))
782
+ return true;
783
+ for (const keyword of ['anyOf', 'oneOf']) {
784
+ const candidates = schema[keyword];
785
+ if (Array.isArray(candidates) && candidates.some(candidate => (candidate && typeof candidate === 'object' && !Array.isArray(candidate)
786
+ && schemaAcceptsNull(candidate)))) {
787
+ return true;
788
+ }
789
+ }
790
+ return false;
791
+ }
792
+ export function validateToolArgs(toolName, args) {
793
+ const tool = getToolByName(toolName);
794
+ if (!tool) {
795
+ return { valid: false, error: `Unknown tool: ${toolName}` };
796
+ }
797
+ const knownParameters = new Set(tool.parameters.map(parameter => parameter.name));
798
+ const unexpected = Object.keys(args).find(name => !knownParameters.has(name));
799
+ if (unexpected)
800
+ return { valid: false, error: `Unexpected parameter: ${unexpected}` };
801
+ for (const param of tool.parameters) {
802
+ const value = args[param.name];
803
+ const provided = value !== undefined && value !== null && value !== '';
804
+ if (param.required && !provided) {
805
+ return { valid: false, error: `Missing required parameter: ${param.name}` };
806
+ }
807
+ if (provided) {
808
+ const schema = param.schema
809
+ ? relaxNullableRequiredFields(param.schema)
810
+ : { type: param.type };
811
+ if (param.enum)
812
+ schema.enum = param.enum;
813
+ const validation = validateSchemaValue(schema, value, param.name);
814
+ if (!validation.valid)
815
+ return validation;
816
+ }
817
+ }
818
+ return { valid: true };
819
+ }
820
+ //# sourceMappingURL=toolRegistry.js.map