glirastes 0.1.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 (424) hide show
  1. package/CHANGELOG.md +468 -0
  2. package/README.md +651 -0
  3. package/dist/cli/bin.d.ts +2 -0
  4. package/dist/cli/bin.js +34 -0
  5. package/dist/cli/bin.js.map +1 -0
  6. package/dist/cli/commands/check-upgrade.d.ts +15 -0
  7. package/dist/cli/commands/check-upgrade.js +138 -0
  8. package/dist/cli/commands/check-upgrade.js.map +1 -0
  9. package/dist/cli/commands/test.d.ts +8 -0
  10. package/dist/cli/commands/test.js +76 -0
  11. package/dist/cli/commands/test.js.map +1 -0
  12. package/dist/cli/index.d.ts +1 -0
  13. package/dist/cli/index.js +609 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/utils/changelog-parser.d.ts +13 -0
  16. package/dist/cli/utils/changelog-parser.js +89 -0
  17. package/dist/cli/utils/changelog-parser.js.map +1 -0
  18. package/dist/cli/utils/commit-parser.d.ts +8 -0
  19. package/dist/cli/utils/commit-parser.js +23 -0
  20. package/dist/cli/utils/commit-parser.js.map +1 -0
  21. package/dist/cli/utils/gap-detector.d.ts +14 -0
  22. package/dist/cli/utils/gap-detector.js +65 -0
  23. package/dist/cli/utils/gap-detector.js.map +1 -0
  24. package/dist/cli/utils/get-cli-version.d.ts +2 -0
  25. package/dist/cli/utils/get-cli-version.js +10 -0
  26. package/dist/cli/utils/get-cli-version.js.map +1 -0
  27. package/dist/codegen/asset-sync.d.ts +20 -0
  28. package/dist/codegen/asset-sync.js +26 -0
  29. package/dist/codegen/asset-sync.js.map +1 -0
  30. package/dist/codegen/coverage.d.ts +66 -0
  31. package/dist/codegen/coverage.js +372 -0
  32. package/dist/codegen/coverage.js.map +1 -0
  33. package/dist/codegen/endpoint-scanner.d.ts +16 -0
  34. package/dist/codegen/endpoint-scanner.js +161 -0
  35. package/dist/codegen/endpoint-scanner.js.map +1 -0
  36. package/dist/codegen/format.d.ts +17 -0
  37. package/dist/codegen/format.js +28 -0
  38. package/dist/codegen/format.js.map +1 -0
  39. package/dist/codegen/fs-utils.d.ts +45 -0
  40. package/dist/codegen/fs-utils.js +155 -0
  41. package/dist/codegen/fs-utils.js.map +1 -0
  42. package/dist/codegen/index.d.ts +13 -0
  43. package/dist/codegen/index.js +13 -0
  44. package/dist/codegen/index.js.map +1 -0
  45. package/dist/codegen/mcp-generator.d.ts +50 -0
  46. package/dist/codegen/mcp-generator.js +801 -0
  47. package/dist/codegen/mcp-generator.js.map +1 -0
  48. package/dist/codegen/module-generator.d.ts +11 -0
  49. package/dist/codegen/module-generator.js +351 -0
  50. package/dist/codegen/module-generator.js.map +1 -0
  51. package/dist/codegen/nestjs-scanner.d.ts +43 -0
  52. package/dist/codegen/nestjs-scanner.js +239 -0
  53. package/dist/codegen/nestjs-scanner.js.map +1 -0
  54. package/dist/codegen/output-recommender.d.ts +23 -0
  55. package/dist/codegen/output-recommender.js +31 -0
  56. package/dist/codegen/output-recommender.js.map +1 -0
  57. package/dist/codegen/scaffolder.d.ts +36 -0
  58. package/dist/codegen/scaffolder.js +259 -0
  59. package/dist/codegen/scaffolder.js.map +1 -0
  60. package/dist/codegen/skill-generator.d.ts +49 -0
  61. package/dist/codegen/skill-generator.js +965 -0
  62. package/dist/codegen/skill-generator.js.map +1 -0
  63. package/dist/codegen/types.d.ts +52 -0
  64. package/dist/codegen/types.js +14 -0
  65. package/dist/codegen/types.js.map +1 -0
  66. package/dist/codegen/ui-scanner.d.ts +24 -0
  67. package/dist/codegen/ui-scanner.js +197 -0
  68. package/dist/codegen/ui-scanner.js.map +1 -0
  69. package/dist/codegen/validator.d.ts +35 -0
  70. package/dist/codegen/validator.js +256 -0
  71. package/dist/codegen/validator.js.map +1 -0
  72. package/dist/openapi/demo-generate.d.ts +1 -0
  73. package/dist/openapi/demo-generate.js +15 -0
  74. package/dist/openapi/demo-generate.js.map +1 -0
  75. package/dist/openapi/index.d.ts +78 -0
  76. package/dist/openapi/index.js +341 -0
  77. package/dist/openapi/index.js.map +1 -0
  78. package/dist/react/audio-worklet-processor.d.ts +9 -0
  79. package/dist/react/audio-worklet-processor.js +28 -0
  80. package/dist/react/audio-worklet-processor.js.map +1 -0
  81. package/dist/react/bridges/rest-session-bridge.d.ts +113 -0
  82. package/dist/react/bridges/rest-session-bridge.js +207 -0
  83. package/dist/react/bridges/rest-session-bridge.js.map +1 -0
  84. package/dist/react/components/ai-chat-panel.d.ts +12 -0
  85. package/dist/react/components/ai-chat-panel.js +65 -0
  86. package/dist/react/components/ai-chat-panel.js.map +1 -0
  87. package/dist/react/components/ai-trigger-button.d.ts +2 -0
  88. package/dist/react/components/ai-trigger-button.js +239 -0
  89. package/dist/react/components/ai-trigger-button.js.map +1 -0
  90. package/dist/react/components/approval-card.d.ts +9 -0
  91. package/dist/react/components/approval-card.js +22 -0
  92. package/dist/react/components/approval-card.js.map +1 -0
  93. package/dist/react/components/bulk-approval-card.d.ts +9 -0
  94. package/dist/react/components/bulk-approval-card.js +34 -0
  95. package/dist/react/components/bulk-approval-card.js.map +1 -0
  96. package/dist/react/components/chat-input.d.ts +10 -0
  97. package/dist/react/components/chat-input.js +58 -0
  98. package/dist/react/components/chat-input.js.map +1 -0
  99. package/dist/react/components/chat-window.d.ts +2 -0
  100. package/dist/react/components/chat-window.js +132 -0
  101. package/dist/react/components/chat-window.js.map +1 -0
  102. package/dist/react/components/confirm-dialog.d.ts +32 -0
  103. package/dist/react/components/confirm-dialog.js +46 -0
  104. package/dist/react/components/confirm-dialog.js.map +1 -0
  105. package/dist/react/components/floating-chat-ui.d.ts +84 -0
  106. package/dist/react/components/floating-chat-ui.js +161 -0
  107. package/dist/react/components/floating-chat-ui.js.map +1 -0
  108. package/dist/react/components/mention-chip.d.ts +16 -0
  109. package/dist/react/components/mention-chip.js +39 -0
  110. package/dist/react/components/mention-chip.js.map +1 -0
  111. package/dist/react/components/mention-input.d.ts +8 -0
  112. package/dist/react/components/mention-input.js +115 -0
  113. package/dist/react/components/mention-input.js.map +1 -0
  114. package/dist/react/components/message-bubble.d.ts +11 -0
  115. package/dist/react/components/message-bubble.js +123 -0
  116. package/dist/react/components/message-bubble.js.map +1 -0
  117. package/dist/react/components/message-list.d.ts +8 -0
  118. package/dist/react/components/message-list.js +50 -0
  119. package/dist/react/components/message-list.js.map +1 -0
  120. package/dist/react/components/pipeline-timeline.d.ts +7 -0
  121. package/dist/react/components/pipeline-timeline.js +70 -0
  122. package/dist/react/components/pipeline-timeline.js.map +1 -0
  123. package/dist/react/components/recording-bar.d.ts +2 -0
  124. package/dist/react/components/recording-bar.js +81 -0
  125. package/dist/react/components/recording-bar.js.map +1 -0
  126. package/dist/react/components/recording-controls.d.ts +18 -0
  127. package/dist/react/components/recording-controls.js +35 -0
  128. package/dist/react/components/recording-controls.js.map +1 -0
  129. package/dist/react/components/rich-mention-input.d.ts +2 -0
  130. package/dist/react/components/rich-mention-input.js +569 -0
  131. package/dist/react/components/rich-mention-input.js.map +1 -0
  132. package/dist/react/components/session-switcher.d.ts +14 -0
  133. package/dist/react/components/session-switcher.js +131 -0
  134. package/dist/react/components/session-switcher.js.map +1 -0
  135. package/dist/react/components/suggestion-bar.d.ts +9 -0
  136. package/dist/react/components/suggestion-bar.js +45 -0
  137. package/dist/react/components/suggestion-bar.js.map +1 -0
  138. package/dist/react/components/suggestion-chip.d.ts +9 -0
  139. package/dist/react/components/suggestion-chip.js +12 -0
  140. package/dist/react/components/suggestion-chip.js.map +1 -0
  141. package/dist/react/components/voice-input-addon.d.ts +13 -0
  142. package/dist/react/components/voice-input-addon.js +29 -0
  143. package/dist/react/components/voice-input-addon.js.map +1 -0
  144. package/dist/react/components/voice-input-button.d.ts +2 -0
  145. package/dist/react/components/voice-input-button.js +53 -0
  146. package/dist/react/components/voice-input-button.js.map +1 -0
  147. package/dist/react/hooks/use-ai-chat.d.ts +22 -0
  148. package/dist/react/hooks/use-ai-chat.js +49 -0
  149. package/dist/react/hooks/use-ai-chat.js.map +1 -0
  150. package/dist/react/hooks/use-approvals.d.ts +23 -0
  151. package/dist/react/hooks/use-approvals.js +61 -0
  152. package/dist/react/hooks/use-approvals.js.map +1 -0
  153. package/dist/react/hooks/use-deepgram-transcription.d.ts +2 -0
  154. package/dist/react/hooks/use-deepgram-transcription.js +327 -0
  155. package/dist/react/hooks/use-deepgram-transcription.js.map +1 -0
  156. package/dist/react/hooks/use-drag-resize-panel.d.ts +48 -0
  157. package/dist/react/hooks/use-drag-resize-panel.js +306 -0
  158. package/dist/react/hooks/use-drag-resize-panel.js.map +1 -0
  159. package/dist/react/hooks/use-draggable-position.d.ts +25 -0
  160. package/dist/react/hooks/use-draggable-position.js +132 -0
  161. package/dist/react/hooks/use-draggable-position.js.map +1 -0
  162. package/dist/react/hooks/use-keyboard-shortcut.d.ts +20 -0
  163. package/dist/react/hooks/use-keyboard-shortcut.js +91 -0
  164. package/dist/react/hooks/use-keyboard-shortcut.js.map +1 -0
  165. package/dist/react/hooks/use-mentions.d.ts +23 -0
  166. package/dist/react/hooks/use-mentions.js +40 -0
  167. package/dist/react/hooks/use-mentions.js.map +1 -0
  168. package/dist/react/hooks/use-suggestions.d.ts +22 -0
  169. package/dist/react/hooks/use-suggestions.js +37 -0
  170. package/dist/react/hooks/use-suggestions.js.map +1 -0
  171. package/dist/react/index.d.ts +43 -0
  172. package/dist/react/index.js +53 -0
  173. package/dist/react/index.js.map +1 -0
  174. package/dist/react/provider/ai-chat-provider.d.ts +45 -0
  175. package/dist/react/provider/ai-chat-provider.js +1021 -0
  176. package/dist/react/provider/ai-chat-provider.js.map +1 -0
  177. package/dist/react/provider/chat-context.d.ts +84 -0
  178. package/dist/react/provider/chat-context.js +10 -0
  179. package/dist/react/provider/chat-context.js.map +1 -0
  180. package/dist/react/styles.css +897 -0
  181. package/dist/react/template.d.ts +84 -0
  182. package/dist/react/template.js +83 -0
  183. package/dist/react/template.js.map +1 -0
  184. package/dist/react/themes.d.ts +24 -0
  185. package/dist/react/themes.js +269 -0
  186. package/dist/react/themes.js.map +1 -0
  187. package/dist/react/transports/langgraph/index.d.ts +2 -0
  188. package/dist/react/transports/langgraph/index.js +3 -0
  189. package/dist/react/transports/langgraph/index.js.map +1 -0
  190. package/dist/react/transports/langgraph/langgraph-ai-chat.d.ts +62 -0
  191. package/dist/react/transports/langgraph/langgraph-ai-chat.js +92 -0
  192. package/dist/react/transports/langgraph/langgraph-ai-chat.js.map +1 -0
  193. package/dist/react/transports/langgraph.d.ts +71 -0
  194. package/dist/react/transports/langgraph.js +366 -0
  195. package/dist/react/transports/langgraph.js.map +1 -0
  196. package/dist/react/transports/vercel/index.d.ts +2 -0
  197. package/dist/react/transports/vercel/index.js +3 -0
  198. package/dist/react/transports/vercel/index.js.map +1 -0
  199. package/dist/react/transports/vercel/vercel-ai-chat.d.ts +49 -0
  200. package/dist/react/transports/vercel/vercel-ai-chat.js +79 -0
  201. package/dist/react/transports/vercel/vercel-ai-chat.js.map +1 -0
  202. package/dist/react/transports/vercel.d.ts +30 -0
  203. package/dist/react/transports/vercel.js +67 -0
  204. package/dist/react/transports/vercel.js.map +1 -0
  205. package/dist/react/types.d.ts +750 -0
  206. package/dist/react/types.js +2 -0
  207. package/dist/react/types.js.map +1 -0
  208. package/dist/react/ui.d.ts +73 -0
  209. package/dist/react/ui.js +170 -0
  210. package/dist/react/ui.js.map +1 -0
  211. package/dist/react/utils/create-approval-description.d.ts +53 -0
  212. package/dist/react/utils/create-approval-description.js +120 -0
  213. package/dist/react/utils/create-approval-description.js.map +1 -0
  214. package/dist/react/utils/create-tool-result-handler.d.ts +90 -0
  215. package/dist/react/utils/create-tool-result-handler.js +166 -0
  216. package/dist/react/utils/create-tool-result-handler.js.map +1 -0
  217. package/dist/react/utils/mention-markup.d.ts +13 -0
  218. package/dist/react/utils/mention-markup.js +111 -0
  219. package/dist/react/utils/mention-markup.js.map +1 -0
  220. package/dist/react/utils/merge-pipeline-steps.d.ts +19 -0
  221. package/dist/react/utils/merge-pipeline-steps.js +79 -0
  222. package/dist/react/utils/merge-pipeline-steps.js.map +1 -0
  223. package/dist/react/utils/sanitize-stored-messages.d.ts +23 -0
  224. package/dist/react/utils/sanitize-stored-messages.js +50 -0
  225. package/dist/react/utils/sanitize-stored-messages.js.map +1 -0
  226. package/dist/server/adapters/nestjs/chat/ai-chat-auth.guard.d.ts +10 -0
  227. package/dist/server/adapters/nestjs/chat/ai-chat-auth.guard.js +40 -0
  228. package/dist/server/adapters/nestjs/chat/ai-chat-auth.guard.js.map +1 -0
  229. package/dist/server/adapters/nestjs/chat/ai-chat-module-options.interface.d.ts +32 -0
  230. package/dist/server/adapters/nestjs/chat/ai-chat-module-options.interface.js +2 -0
  231. package/dist/server/adapters/nestjs/chat/ai-chat-module-options.interface.js.map +1 -0
  232. package/dist/server/adapters/nestjs/chat/ai-chat.controller.d.ts +11 -0
  233. package/dist/server/adapters/nestjs/chat/ai-chat.controller.js +78 -0
  234. package/dist/server/adapters/nestjs/chat/ai-chat.controller.js.map +1 -0
  235. package/dist/server/adapters/nestjs/chat/ai-chat.module.d.ts +9 -0
  236. package/dist/server/adapters/nestjs/chat/ai-chat.module.js +116 -0
  237. package/dist/server/adapters/nestjs/chat/ai-chat.module.js.map +1 -0
  238. package/dist/server/adapters/nestjs/chat/ai-chat.service.d.ts +13 -0
  239. package/dist/server/adapters/nestjs/chat/ai-chat.service.js +129 -0
  240. package/dist/server/adapters/nestjs/chat/ai-chat.service.js.map +1 -0
  241. package/dist/server/adapters/nestjs/chat/dto/ai-chat-request.dto.d.ts +7 -0
  242. package/dist/server/adapters/nestjs/chat/dto/ai-chat-request.dto.js +49 -0
  243. package/dist/server/adapters/nestjs/chat/dto/ai-chat-request.dto.js.map +1 -0
  244. package/dist/server/adapters/nestjs/chat/dto/chat-message-part.dto.d.ts +19 -0
  245. package/dist/server/adapters/nestjs/chat/dto/chat-message-part.dto.js +105 -0
  246. package/dist/server/adapters/nestjs/chat/dto/chat-message-part.dto.js.map +1 -0
  247. package/dist/server/adapters/nestjs/chat/dto/chat-message.dto.d.ts +8 -0
  248. package/dist/server/adapters/nestjs/chat/dto/chat-message.dto.js +56 -0
  249. package/dist/server/adapters/nestjs/chat/dto/chat-message.dto.js.map +1 -0
  250. package/dist/server/adapters/nestjs/chat/dto/index.d.ts +3 -0
  251. package/dist/server/adapters/nestjs/chat/dto/index.js +4 -0
  252. package/dist/server/adapters/nestjs/chat/dto/index.js.map +1 -0
  253. package/dist/server/adapters/nestjs/chat/index.d.ts +3 -0
  254. package/dist/server/adapters/nestjs/chat/index.js +3 -0
  255. package/dist/server/adapters/nestjs/chat/index.js.map +1 -0
  256. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.d.ts +4 -0
  257. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.js +69 -0
  258. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.js.map +1 -0
  259. package/dist/server/adapters/nestjs/decorators/ai-module.decorator.d.ts +6 -0
  260. package/dist/server/adapters/nestjs/decorators/ai-module.decorator.js +11 -0
  261. package/dist/server/adapters/nestjs/decorators/ai-module.decorator.js.map +1 -0
  262. package/dist/server/adapters/nestjs/decorators/ai-param.decorator.d.ts +5 -0
  263. package/dist/server/adapters/nestjs/decorators/ai-param.decorator.js +13 -0
  264. package/dist/server/adapters/nestjs/decorators/ai-param.decorator.js.map +1 -0
  265. package/dist/server/adapters/nestjs/decorators/ai-tool.decorator.d.ts +6 -0
  266. package/dist/server/adapters/nestjs/decorators/ai-tool.decorator.js +20 -0
  267. package/dist/server/adapters/nestjs/decorators/ai-tool.decorator.js.map +1 -0
  268. package/dist/server/adapters/nestjs/decorators/constants.d.ts +4 -0
  269. package/dist/server/adapters/nestjs/decorators/constants.js +5 -0
  270. package/dist/server/adapters/nestjs/decorators/constants.js.map +1 -0
  271. package/dist/server/adapters/nestjs/index.d.ts +14 -0
  272. package/dist/server/adapters/nestjs/index.js +20 -0
  273. package/dist/server/adapters/nestjs/index.js.map +1 -0
  274. package/dist/server/adapters/nestjs/metadata.d.ts +39 -0
  275. package/dist/server/adapters/nestjs/metadata.js +30 -0
  276. package/dist/server/adapters/nestjs/metadata.js.map +1 -0
  277. package/dist/server/adapters/nestjs/module/ai-tools-explorer.service.d.ts +36 -0
  278. package/dist/server/adapters/nestjs/module/ai-tools-explorer.service.js +156 -0
  279. package/dist/server/adapters/nestjs/module/ai-tools-explorer.service.js.map +1 -0
  280. package/dist/server/adapters/nestjs/module/ai-tools.module.d.ts +37 -0
  281. package/dist/server/adapters/nestjs/module/ai-tools.module.js +42 -0
  282. package/dist/server/adapters/nestjs/module/ai-tools.module.js.map +1 -0
  283. package/dist/server/adapters/nestjs/module/ai-tools.service.d.ts +28 -0
  284. package/dist/server/adapters/nestjs/module/ai-tools.service.js +38 -0
  285. package/dist/server/adapters/nestjs/module/ai-tools.service.js.map +1 -0
  286. package/dist/server/adapters/nestjs/scanner/nestjs-scanner.d.ts +16 -0
  287. package/dist/server/adapters/nestjs/scanner/nestjs-scanner.js +115 -0
  288. package/dist/server/adapters/nestjs/scanner/nestjs-scanner.js.map +1 -0
  289. package/dist/server/adapters/nestjs/scanner/schema-builder.d.ts +26 -0
  290. package/dist/server/adapters/nestjs/scanner/schema-builder.js +255 -0
  291. package/dist/server/adapters/nestjs/scanner/schema-builder.js.map +1 -0
  292. package/dist/server/adapters/nestjs/swagger.d.ts +7 -0
  293. package/dist/server/adapters/nestjs/swagger.js +37 -0
  294. package/dist/server/adapters/nestjs/swagger.js.map +1 -0
  295. package/dist/server/adapters/nextjs/context-helpers.d.ts +22 -0
  296. package/dist/server/adapters/nextjs/context-helpers.js +55 -0
  297. package/dist/server/adapters/nextjs/context-helpers.js.map +1 -0
  298. package/dist/server/adapters/nextjs/create-ai-chat-handler.d.ts +78 -0
  299. package/dist/server/adapters/nextjs/create-ai-chat-handler.js +950 -0
  300. package/dist/server/adapters/nextjs/create-ai-chat-handler.js.map +1 -0
  301. package/dist/server/adapters/nextjs/index.d.ts +8 -0
  302. package/dist/server/adapters/nextjs/index.js +9 -0
  303. package/dist/server/adapters/nextjs/index.js.map +1 -0
  304. package/dist/server/adapters/nextjs/prepare-model-messages.d.ts +58 -0
  305. package/dist/server/adapters/nextjs/prepare-model-messages.js +111 -0
  306. package/dist/server/adapters/nextjs/prepare-model-messages.js.map +1 -0
  307. package/dist/server/adapters/nextjs/sanitize-model-messages.d.ts +64 -0
  308. package/dist/server/adapters/nextjs/sanitize-model-messages.js +487 -0
  309. package/dist/server/adapters/nextjs/sanitize-model-messages.js.map +1 -0
  310. package/dist/server/adapters/nextjs/server-action-helper.d.ts +7 -0
  311. package/dist/server/adapters/nextjs/server-action-helper.js +38 -0
  312. package/dist/server/adapters/nextjs/server-action-helper.js.map +1 -0
  313. package/dist/server/adapters/nextjs/types.d.ts +246 -0
  314. package/dist/server/adapters/nextjs/types.js +2 -0
  315. package/dist/server/adapters/nextjs/types.js.map +1 -0
  316. package/dist/server/adapters/nextjs/with-ai-tool.d.ts +9 -0
  317. package/dist/server/adapters/nextjs/with-ai-tool.js +10 -0
  318. package/dist/server/adapters/nextjs/with-ai-tool.js.map +1 -0
  319. package/dist/server/core/followup-tool.d.ts +9 -0
  320. package/dist/server/core/followup-tool.js +80 -0
  321. package/dist/server/core/followup-tool.js.map +1 -0
  322. package/dist/server/core/index.d.ts +139 -0
  323. package/dist/server/core/index.js +787 -0
  324. package/dist/server/core/index.js.map +1 -0
  325. package/dist/server/core/intent-classifier.d.ts +94 -0
  326. package/dist/server/core/intent-classifier.js +314 -0
  327. package/dist/server/core/intent-classifier.js.map +1 -0
  328. package/dist/server/core/model-selector.d.ts +12 -0
  329. package/dist/server/core/model-selector.js +45 -0
  330. package/dist/server/core/model-selector.js.map +1 -0
  331. package/dist/server/core/module-router.d.ts +14 -0
  332. package/dist/server/core/module-router.js +107 -0
  333. package/dist/server/core/module-router.js.map +1 -0
  334. package/dist/server/core/zod-compact.d.ts +18 -0
  335. package/dist/server/core/zod-compact.js +127 -0
  336. package/dist/server/core/zod-compact.js.map +1 -0
  337. package/dist/server/index.d.ts +5 -0
  338. package/dist/server/index.js +8 -0
  339. package/dist/server/index.js.map +1 -0
  340. package/dist/server/lancer/cache.d.ts +9 -0
  341. package/dist/server/lancer/cache.js +30 -0
  342. package/dist/server/lancer/cache.js.map +1 -0
  343. package/dist/server/lancer/client.d.ts +2 -0
  344. package/dist/server/lancer/client.js +277 -0
  345. package/dist/server/lancer/client.js.map +1 -0
  346. package/dist/server/lancer/errors.d.ts +13 -0
  347. package/dist/server/lancer/errors.js +18 -0
  348. package/dist/server/lancer/errors.js.map +1 -0
  349. package/dist/server/lancer/index.d.ts +3 -0
  350. package/dist/server/lancer/index.js +3 -0
  351. package/dist/server/lancer/index.js.map +1 -0
  352. package/dist/server/lancer/telemetry-buffer.d.ts +15 -0
  353. package/dist/server/lancer/telemetry-buffer.js +61 -0
  354. package/dist/server/lancer/telemetry-buffer.js.map +1 -0
  355. package/dist/server/lancer/types.d.ts +201 -0
  356. package/dist/server/lancer/types.js +5 -0
  357. package/dist/server/lancer/types.js.map +1 -0
  358. package/dist/server/pii-shield/aegis-detector.d.ts +26 -0
  359. package/dist/server/pii-shield/aegis-detector.js +24 -0
  360. package/dist/server/pii-shield/aegis-detector.js.map +1 -0
  361. package/dist/server/pii-shield/create-pii-shield.d.ts +2 -0
  362. package/dist/server/pii-shield/create-pii-shield.js +189 -0
  363. package/dist/server/pii-shield/create-pii-shield.js.map +1 -0
  364. package/dist/server/pii-shield/deep-walk.d.ts +1 -0
  365. package/dist/server/pii-shield/deep-walk.js +17 -0
  366. package/dist/server/pii-shield/deep-walk.js.map +1 -0
  367. package/dist/server/pii-shield/fake-data.d.ts +5 -0
  368. package/dist/server/pii-shield/fake-data.js +168 -0
  369. package/dist/server/pii-shield/fake-data.js.map +1 -0
  370. package/dist/server/pii-shield/index.d.ts +4 -0
  371. package/dist/server/pii-shield/index.js +5 -0
  372. package/dist/server/pii-shield/index.js.map +1 -0
  373. package/dist/server/pii-shield/leakage.d.ts +1 -0
  374. package/dist/server/pii-shield/leakage.js +13 -0
  375. package/dist/server/pii-shield/leakage.js.map +1 -0
  376. package/dist/server/pii-shield/session-mapping.d.ts +12 -0
  377. package/dist/server/pii-shield/session-mapping.js +68 -0
  378. package/dist/server/pii-shield/session-mapping.js.map +1 -0
  379. package/dist/server/pipeline.d.ts +26 -0
  380. package/dist/server/pipeline.js +125 -0
  381. package/dist/server/pipeline.js.map +1 -0
  382. package/dist/server/testing/approvals.d.ts +11 -0
  383. package/dist/server/testing/approvals.js +39 -0
  384. package/dist/server/testing/approvals.js.map +1 -0
  385. package/dist/server/testing/combination.d.ts +3 -0
  386. package/dist/server/testing/combination.js +81 -0
  387. package/dist/server/testing/combination.js.map +1 -0
  388. package/dist/server/testing/create-test-suite.d.ts +29 -0
  389. package/dist/server/testing/create-test-suite.js +79 -0
  390. package/dist/server/testing/create-test-suite.js.map +1 -0
  391. package/dist/server/testing/edge-cases.d.ts +8 -0
  392. package/dist/server/testing/edge-cases.js +275 -0
  393. package/dist/server/testing/edge-cases.js.map +1 -0
  394. package/dist/server/testing/guardrails.d.ts +14 -0
  395. package/dist/server/testing/guardrails.js +150 -0
  396. package/dist/server/testing/guardrails.js.map +1 -0
  397. package/dist/server/testing/helpers.d.ts +14 -0
  398. package/dist/server/testing/helpers.js +114 -0
  399. package/dist/server/testing/helpers.js.map +1 -0
  400. package/dist/server/testing/index.d.ts +12 -0
  401. package/dist/server/testing/index.js +21 -0
  402. package/dist/server/testing/index.js.map +1 -0
  403. package/dist/server/testing/mock-executor.d.ts +8 -0
  404. package/dist/server/testing/mock-executor.js +38 -0
  405. package/dist/server/testing/mock-executor.js.map +1 -0
  406. package/dist/server/testing/regression.d.ts +7 -0
  407. package/dist/server/testing/regression.js +25 -0
  408. package/dist/server/testing/regression.js.map +1 -0
  409. package/dist/server/testing/routing.d.ts +12 -0
  410. package/dist/server/testing/routing.js +61 -0
  411. package/dist/server/testing/routing.js.map +1 -0
  412. package/dist/server/testing/schema-consistency.d.ts +6 -0
  413. package/dist/server/testing/schema-consistency.js +54 -0
  414. package/dist/server/testing/schema-consistency.js.map +1 -0
  415. package/dist/server/testing/smoke.d.ts +11 -0
  416. package/dist/server/testing/smoke.js +62 -0
  417. package/dist/server/testing/smoke.js.map +1 -0
  418. package/dist/server/testing/types.d.ts +156 -0
  419. package/dist/server/testing/types.js +2 -0
  420. package/dist/server/testing/types.js.map +1 -0
  421. package/dist/types.d.ts +696 -0
  422. package/dist/types.js +84 -0
  423. package/dist/types.js.map +1 -0
  424. package/package.json +187 -0
@@ -0,0 +1,787 @@
1
+ import { defineTool } from '../../types.js';
2
+ import { zodToCompactDescription } from './zod-compact.js';
3
+ // ============================================================================
4
+ // Helpers (internal)
5
+ // ============================================================================
6
+ function isRecord(value) {
7
+ return typeof value === 'object' && value !== null;
8
+ }
9
+ /**
10
+ * Default max characters for a serialized tool result (~4000 tokens).
11
+ * Arrays exceeding this are truncated with a `_truncated` marker.
12
+ */
13
+ const DEFAULT_MAX_RESULT_CHARS = 16_000;
14
+ /**
15
+ * Truncate large tool results to prevent LLM context overflow.
16
+ *
17
+ * Strategy: find the largest array in the top-level result and
18
+ * progressively remove items from the end until the serialized
19
+ * size is under the limit. A `_truncated` object is appended so the
20
+ * LLM knows the data was cut.
21
+ */
22
+ export function truncateToolResult(result, maxChars = DEFAULT_MAX_RESULT_CHARS) {
23
+ if (!isRecord(result))
24
+ return result;
25
+ const serialized = JSON.stringify(result);
26
+ if (serialized.length <= maxChars)
27
+ return result;
28
+ // Find the largest array at the top level
29
+ let largestKey = null;
30
+ let largestLen = 0;
31
+ const rec = result;
32
+ for (const [key, value] of Object.entries(rec)) {
33
+ if (Array.isArray(value) && value.length > largestLen) {
34
+ largestKey = key;
35
+ largestLen = value.length;
36
+ }
37
+ }
38
+ if (!largestKey || largestLen === 0)
39
+ return result;
40
+ // Binary-search for the right array length
41
+ const arr = rec[largestKey];
42
+ let lo = 1;
43
+ let hi = arr.length;
44
+ while (lo < hi) {
45
+ const mid = Math.floor((lo + hi) / 2);
46
+ const candidate = {
47
+ ...rec,
48
+ [largestKey]: arr.slice(0, mid),
49
+ _truncated: { field: largestKey, showing: mid, total: arr.length },
50
+ };
51
+ if (JSON.stringify(candidate).length <= maxChars) {
52
+ lo = mid + 1;
53
+ }
54
+ else {
55
+ hi = mid;
56
+ }
57
+ }
58
+ const finalCount = Math.max(lo - 1, 1);
59
+ return {
60
+ ...rec,
61
+ [largestKey]: arr.slice(0, finalCount),
62
+ _truncated: { field: largestKey, showing: finalCount, total: arr.length },
63
+ };
64
+ }
65
+ export function buildPath(pathTemplate, payload) {
66
+ return pathTemplate.replace(/:([A-Za-z0-9_]+)/g, (_full, paramName) => {
67
+ const value = payload[paramName];
68
+ if (value === undefined || value === null || value === '') {
69
+ throw new Error(`Missing required path parameter: "${paramName}" for ${pathTemplate}`);
70
+ }
71
+ delete payload[paramName];
72
+ return encodeURIComponent(String(value));
73
+ });
74
+ }
75
+ export function stripPathParams(pathTemplate, payload) {
76
+ const pathParamNames = new Set();
77
+ for (const match of pathTemplate.matchAll(/:([A-Za-z0-9_]+)/g)) {
78
+ pathParamNames.add(match[1]);
79
+ }
80
+ const remaining = {};
81
+ for (const [key, value] of Object.entries(payload)) {
82
+ if (!pathParamNames.has(key)) {
83
+ remaining[key] = value;
84
+ }
85
+ }
86
+ return remaining;
87
+ }
88
+ export function buildQueryString(payload) {
89
+ const params = new URLSearchParams();
90
+ for (const [key, value] of Object.entries(payload)) {
91
+ if (value === undefined || value === null || value === '')
92
+ continue;
93
+ if (Array.isArray(value)) {
94
+ for (const item of value) {
95
+ if (item === undefined || item === null || item === '')
96
+ continue;
97
+ params.append(key, String(item));
98
+ }
99
+ continue;
100
+ }
101
+ params.append(key, String(value));
102
+ }
103
+ const query = params.toString();
104
+ return query ? `?${query}` : '';
105
+ }
106
+ // ============================================================================
107
+ // Template Interpolation
108
+ // ============================================================================
109
+ export function applyTemplateValue(value, input, responseData) {
110
+ if (typeof value === 'string' && value.startsWith('$')) {
111
+ const key = value.slice(1);
112
+ if (key in responseData)
113
+ return responseData[key];
114
+ if (key in input)
115
+ return input[key];
116
+ return null;
117
+ }
118
+ if (Array.isArray(value)) {
119
+ return value.map((item) => applyTemplateValue(item, input, responseData));
120
+ }
121
+ if (isRecord(value)) {
122
+ const output = {};
123
+ for (const [key, nested] of Object.entries(value)) {
124
+ output[key] = applyTemplateValue(nested, input, responseData);
125
+ }
126
+ return output;
127
+ }
128
+ return value;
129
+ }
130
+ function buildSuccessUiAction(template, input, responseData) {
131
+ if (!template)
132
+ return undefined;
133
+ return applyTemplateValue(template, input, responseData);
134
+ }
135
+ // ============================================================================
136
+ // UI Pattern Builders
137
+ // ============================================================================
138
+ function getNestedValue(obj, path) {
139
+ const parts = path.split('.');
140
+ let current = obj;
141
+ for (const part of parts) {
142
+ if (current === null || current === undefined)
143
+ return undefined;
144
+ if (typeof current !== 'object')
145
+ return undefined;
146
+ current = current[part];
147
+ }
148
+ return current;
149
+ }
150
+ function buildFilterAndNavigateAction(pattern, input, response) {
151
+ if (pattern.condition) {
152
+ const conditionValue = getNestedValue(response, pattern.condition) ??
153
+ getNestedValue(input, pattern.condition);
154
+ if (!conditionValue)
155
+ return undefined;
156
+ }
157
+ const filters = {};
158
+ const mapping = pattern.filterMapping ?? {};
159
+ const arrayFields = new Set(pattern.arrayFields ?? ['status', 'priority', 'assignee']);
160
+ for (const [filterKey, responseField] of Object.entries(mapping)) {
161
+ const value = getNestedValue(response, responseField) ??
162
+ getNestedValue(input, responseField);
163
+ if (value === undefined || value === null)
164
+ continue;
165
+ if (arrayFields.has(filterKey)) {
166
+ filters[filterKey] = Array.isArray(value) ? value : [value];
167
+ }
168
+ else if (typeof value === 'string') {
169
+ filters[filterKey] = value;
170
+ }
171
+ }
172
+ const hasFilters = Object.keys(filters).length > 0;
173
+ if (!hasFilters && !pattern.condition) {
174
+ return { type: 'navigate-and-filter', destination: pattern.target };
175
+ }
176
+ if (!hasFilters)
177
+ return undefined;
178
+ return {
179
+ type: 'navigate-and-filter',
180
+ destination: pattern.target,
181
+ filters,
182
+ };
183
+ }
184
+ function buildOpenDetailAction(pattern, response) {
185
+ const id = getNestedValue(response, pattern.idField);
186
+ if (!id || typeof id !== 'string')
187
+ return undefined;
188
+ return {
189
+ type: 'run-client-action',
190
+ actionId: `${pattern.entity}-details.open`,
191
+ payload: { [`${pattern.entity}Id`]: id },
192
+ };
193
+ }
194
+ function buildOpenDialogAction(pattern, response) {
195
+ const payload = {};
196
+ if (pattern.idField) {
197
+ const id = getNestedValue(response, pattern.idField);
198
+ if (id && typeof id === 'string') {
199
+ payload.entityId = id;
200
+ }
201
+ }
202
+ return {
203
+ type: 'run-client-action',
204
+ actionId: `${pattern.dialog}-dialog.open`,
205
+ payload: Object.keys(payload).length > 0 ? payload : undefined,
206
+ };
207
+ }
208
+ function buildRefreshAction(pattern) {
209
+ return {
210
+ type: 'run-client-action',
211
+ actionId: `${pattern.target}.refresh`,
212
+ };
213
+ }
214
+ function buildToastAction(pattern, response) {
215
+ let message = pattern.message;
216
+ if (message.startsWith('$')) {
217
+ const fieldValue = getNestedValue(response, message.slice(1));
218
+ message = typeof fieldValue === 'string' ? fieldValue : pattern.message;
219
+ }
220
+ return {
221
+ type: 'run-client-action',
222
+ actionId: 'toast.show',
223
+ payload: { message, variant: pattern.variant ?? 'default' },
224
+ };
225
+ }
226
+ /**
227
+ * Build a uiAction from a UiPattern definition + runtime data.
228
+ */
229
+ export function buildUiActionFromPattern(pattern, input, response) {
230
+ switch (pattern.type) {
231
+ case 'filter-and-navigate':
232
+ return buildFilterAndNavigateAction(pattern, input, response);
233
+ case 'open-detail':
234
+ return buildOpenDetailAction(pattern, response);
235
+ case 'open-dialog':
236
+ return buildOpenDialogAction(pattern, response);
237
+ case 'refresh':
238
+ return buildRefreshAction(pattern);
239
+ case 'toast':
240
+ return buildToastAction(pattern, response);
241
+ default:
242
+ return undefined;
243
+ }
244
+ }
245
+ /**
246
+ * Build uiActions from an array of UiPattern definitions.
247
+ * Filters out undefined results (patterns whose conditions were not met).
248
+ */
249
+ function buildUiActionsFromPatterns(patterns, input, response) {
250
+ const results = [];
251
+ for (const pattern of patterns) {
252
+ const action = buildUiActionFromPattern(pattern, input, response);
253
+ if (action !== undefined) {
254
+ results.push(action);
255
+ }
256
+ }
257
+ return results;
258
+ }
259
+ // ============================================================================
260
+ // UI Action Validation
261
+ // ============================================================================
262
+ /**
263
+ * Validates and normalizes optional uiAction inside tool results.
264
+ * Invalid actions are dropped so frontend event handling stays deterministic.
265
+ *
266
+ * @param result - Tool execution result (may contain uiAction)
267
+ * @param uiActionSchema - Zod schema to validate against (from createUiActionSchema)
268
+ */
269
+ export function normalizeResultUiAction(result, uiActionSchema) {
270
+ if (!isRecord(result) || !('uiAction' in result))
271
+ return result;
272
+ if (!uiActionSchema)
273
+ return result; // No schema provided, pass through
274
+ const candidate = result.uiAction;
275
+ // Array of uiActions: validate each element, keep valid ones
276
+ if (Array.isArray(candidate)) {
277
+ const validActions = [];
278
+ for (const item of candidate) {
279
+ const parsed = uiActionSchema.safeParse(item);
280
+ if (parsed.success) {
281
+ validActions.push(parsed.data);
282
+ }
283
+ }
284
+ if (validActions.length > 0) {
285
+ return { ...result, uiAction: validActions };
286
+ }
287
+ const { uiAction: _invalid, ...rest } = result;
288
+ return { ...rest, warning: 'All UI actions in array were invalid and dropped.' };
289
+ }
290
+ // Single uiAction: existing logic
291
+ const parsed = uiActionSchema.safeParse(candidate);
292
+ if (parsed.success) {
293
+ return { ...result, uiAction: parsed.data };
294
+ }
295
+ const { uiAction: _invalid, ...rest } = result;
296
+ return { ...rest, warning: 'Invalid UI action dropped.' };
297
+ }
298
+ // ============================================================================
299
+ // Endpoint Tool Definition → Tool Conversion
300
+ // ============================================================================
301
+ /**
302
+ * Convert an endpoint tool definition into a Tool.
303
+ * Uses callEndpoint from the ToolContext to execute HTTP requests.
304
+ */
305
+ export function endpointToolToTool(endpointTool) {
306
+ let description = endpointTool.description;
307
+ if (endpointTool.outputSchema) {
308
+ description += `\n\nReturns: ${zodToCompactDescription(endpointTool.outputSchema)}`;
309
+ }
310
+ return defineTool({
311
+ id: endpointTool.id,
312
+ description,
313
+ inputSchema: endpointTool.inputSchema,
314
+ outputSchema: endpointTool.outputSchema,
315
+ method: endpointTool.method,
316
+ needsApproval: endpointTool.needsApproval ??
317
+ (endpointTool.method === 'GET' ? false : true),
318
+ execute: async (rawInput, context) => {
319
+ const endpointContext = context;
320
+ if (!endpointContext.callEndpoint) {
321
+ throw new Error('EndpointToolContext with callEndpoint is required for endpoint tools.');
322
+ }
323
+ const inputPayload = isRecord(rawInput) ? { ...rawInput } : {};
324
+ const endpointPath = buildPath(endpointTool.path, inputPayload);
325
+ const requestPayload = stripPathParams(endpointTool.path, inputPayload);
326
+ const requestPath = endpointTool.method === 'GET' || endpointTool.method === 'DELETE'
327
+ ? `${endpointPath}${buildQueryString(requestPayload)}`
328
+ : endpointPath;
329
+ const requestBody = endpointTool.method === 'GET' || endpointTool.method === 'DELETE'
330
+ ? undefined
331
+ : Object.keys(requestPayload).length > 0
332
+ ? requestPayload
333
+ : undefined;
334
+ const response = await endpointContext.callEndpoint({
335
+ method: endpointTool.method,
336
+ path: requestPath,
337
+ body: requestBody,
338
+ });
339
+ if (!response.ok) {
340
+ return {
341
+ success: false,
342
+ error: response.error ?? `Endpoint failed (${response.status})`,
343
+ };
344
+ }
345
+ const responseData = isRecord(response.data)
346
+ ? response.data
347
+ : { data: response.data };
348
+ // Priority: 1) Response uiAction, 2) uiPattern, 3) uiActionOnSuccess template
349
+ let uiAction;
350
+ if ('uiAction' in responseData && responseData.uiAction !== undefined) {
351
+ // Response-provided uiAction: pass through as-is (single or array)
352
+ if (Array.isArray(responseData.uiAction)) {
353
+ const filtered = responseData.uiAction.filter(isRecord);
354
+ uiAction = filtered.length > 0 ? filtered : undefined;
355
+ }
356
+ else if (isRecord(responseData.uiAction)) {
357
+ uiAction = responseData.uiAction;
358
+ }
359
+ }
360
+ else if (endpointTool.uiPattern) {
361
+ if (Array.isArray(endpointTool.uiPattern)) {
362
+ const actions = buildUiActionsFromPatterns(endpointTool.uiPattern, inputPayload, responseData);
363
+ uiAction = actions.length > 0 ? actions : undefined;
364
+ }
365
+ else {
366
+ uiAction = buildUiActionFromPattern(endpointTool.uiPattern, inputPayload, responseData);
367
+ }
368
+ }
369
+ else if (endpointTool.uiActionOnSuccess) {
370
+ if (Array.isArray(endpointTool.uiActionOnSuccess)) {
371
+ const actions = [];
372
+ for (const template of endpointTool.uiActionOnSuccess) {
373
+ const action = buildSuccessUiAction(template, inputPayload, responseData);
374
+ if (action)
375
+ actions.push(action);
376
+ }
377
+ uiAction = actions.length > 0 ? actions : undefined;
378
+ }
379
+ else {
380
+ uiAction = buildSuccessUiAction(endpointTool.uiActionOnSuccess, inputPayload, responseData);
381
+ }
382
+ }
383
+ return {
384
+ success: true,
385
+ ...responseData,
386
+ ...(uiAction ? { uiAction } : {}),
387
+ };
388
+ },
389
+ });
390
+ }
391
+ /**
392
+ * Convert an array of endpoint tools into a ToolRegistry.
393
+ */
394
+ export function endpointToolsToRegistry(endpointTools) {
395
+ const registry = {};
396
+ for (const endpointTool of endpointTools) {
397
+ if (registry[endpointTool.toolName]) {
398
+ throw new Error(`Duplicate endpoint toolName: ${endpointTool.toolName}`);
399
+ }
400
+ registry[endpointTool.toolName] = endpointToolToTool(endpointTool);
401
+ }
402
+ return registry;
403
+ }
404
+ // ============================================================================
405
+ // UI Tool Definition → Tool Conversion
406
+ // ============================================================================
407
+ function applyUiTemplateValue(value, input) {
408
+ if (typeof value === 'string' && value.startsWith('$')) {
409
+ const key = value.slice(1);
410
+ return key in input ? input[key] : null;
411
+ }
412
+ if (Array.isArray(value)) {
413
+ return value.map((item) => applyUiTemplateValue(item, input));
414
+ }
415
+ if (isRecord(value)) {
416
+ const output = {};
417
+ for (const [key, nested] of Object.entries(value)) {
418
+ output[key] = applyUiTemplateValue(nested, input);
419
+ }
420
+ return output;
421
+ }
422
+ return value;
423
+ }
424
+ /**
425
+ * Convert a UI tool definition into a Tool.
426
+ * UI tools never call external services — they only produce uiActions.
427
+ */
428
+ export function uiToolToTool(uiTool) {
429
+ let description = uiTool.description;
430
+ if (uiTool.outputSchema) {
431
+ description += `\n\nReturns: ${zodToCompactDescription(uiTool.outputSchema)}`;
432
+ }
433
+ return defineTool({
434
+ id: uiTool.id,
435
+ description,
436
+ inputSchema: uiTool.inputSchema,
437
+ outputSchema: uiTool.outputSchema,
438
+ needsApproval: uiTool.needsApproval ?? false,
439
+ execute: async (rawInput) => {
440
+ const inputPayload = isRecord(rawInput) ? { ...rawInput } : {};
441
+ // Priority: 1) uiPattern (dynamic), 2) uiAction (static template)
442
+ let uiAction;
443
+ if (uiTool.uiPattern) {
444
+ if (Array.isArray(uiTool.uiPattern)) {
445
+ const actions = buildUiActionsFromPatterns(uiTool.uiPattern, inputPayload, {});
446
+ uiAction = actions.length > 0 ? actions : undefined;
447
+ }
448
+ else {
449
+ uiAction = buildUiActionFromPattern(uiTool.uiPattern, inputPayload, {});
450
+ }
451
+ }
452
+ else if (uiTool.uiAction) {
453
+ if (Array.isArray(uiTool.uiAction)) {
454
+ const actions = [];
455
+ for (const template of uiTool.uiAction) {
456
+ const resolved = applyUiTemplateValue(template, inputPayload);
457
+ if (resolved)
458
+ actions.push(resolved);
459
+ }
460
+ uiAction = actions.length > 0 ? actions : undefined;
461
+ }
462
+ else {
463
+ uiAction = applyUiTemplateValue(uiTool.uiAction, inputPayload);
464
+ }
465
+ }
466
+ const message = uiTool.successMessage
467
+ ? applyUiTemplateValue(uiTool.successMessage, inputPayload) || 'Action executed.'
468
+ : 'Action executed.';
469
+ return {
470
+ success: true,
471
+ message,
472
+ ...(uiAction ? { uiAction } : {}),
473
+ };
474
+ },
475
+ });
476
+ }
477
+ /**
478
+ * Convert an array of UI tools into a ToolRegistry.
479
+ */
480
+ export function uiToolsToRegistry(uiTools) {
481
+ const registry = {};
482
+ for (const uiTool of uiTools) {
483
+ if (registry[uiTool.toolName]) {
484
+ throw new Error(`Duplicate UI toolName: ${uiTool.toolName}`);
485
+ }
486
+ registry[uiTool.toolName] = uiToolToTool(uiTool);
487
+ }
488
+ return registry;
489
+ }
490
+ /**
491
+ * Convert a Tool to an AI SDK-compatible tool object.
492
+ *
493
+ * Returns a plain object with `description`, `parameters`, `execute` that
494
+ * can be passed to any AI SDK that follows the Vercel AI SDK convention.
495
+ *
496
+ * @param tool - The tool to convert
497
+ * @param context - Runtime context (currentDate, locale, runtime)
498
+ * @param toolName - Override tool name (defaults to tool.id)
499
+ * @param options - Additional options
500
+ */
501
+ export function toolToAiTool(tool, context, toolName, options) {
502
+ const name = toolName ?? tool.id;
503
+ const needsApproval = tool.needsApproval;
504
+ const requiresApproval = !!needsApproval;
505
+ return {
506
+ _toolId: tool.id,
507
+ description: tool.description,
508
+ parameters: tool.inputSchema,
509
+ needsApproval: requiresApproval
510
+ ? async (input) => {
511
+ const needed = typeof needsApproval === 'boolean'
512
+ ? needsApproval
513
+ : await needsApproval(input, context);
514
+ if (needed) {
515
+ options?.onAudit?.({
516
+ type: 'approval.requested',
517
+ timestamp: new Date().toISOString(),
518
+ sessionId: options.sessionId ?? '',
519
+ source: 'server-core',
520
+ details: {
521
+ toolId: tool.id,
522
+ toolName: name,
523
+ },
524
+ });
525
+ }
526
+ return needed;
527
+ }
528
+ : undefined,
529
+ execute: async (input) => {
530
+ const startTime = Date.now();
531
+ try {
532
+ const result = await tool.execute(input, context);
533
+ // Audit: tool executed successfully
534
+ options?.onAudit?.({
535
+ type: 'tool.executed',
536
+ timestamp: new Date().toISOString(),
537
+ sessionId: options.sessionId ?? '',
538
+ source: 'server-core',
539
+ details: {
540
+ toolId: tool.id,
541
+ toolName: name,
542
+ method: tool.method,
543
+ latencyMs: Date.now() - startTime,
544
+ success: true,
545
+ approvalRequired: !!requiresApproval,
546
+ },
547
+ });
548
+ // Output schema: parse to strip extra fields, re-attach uiAction for client
549
+ let cleanResult = result;
550
+ if (tool.outputSchema &&
551
+ isRecord(result) &&
552
+ result.success !== false) {
553
+ const parsed = tool.outputSchema.safeParse(result);
554
+ if (parsed.success) {
555
+ // Use parsed data (extra fields stripped by Zod)
556
+ const rec = result;
557
+ cleanResult = {
558
+ ...parsed.data,
559
+ // Preserve success flag
560
+ ...(rec.success !== undefined ? { success: rec.success } : {}),
561
+ // Re-attach uiAction for client stream (stripped by schema parse)
562
+ ...(rec.uiAction ? { uiAction: rec.uiAction } : {}),
563
+ };
564
+ }
565
+ else {
566
+ // Schema mismatch — warn but pass through unmodified
567
+ console.warn(`[glirastes] Output schema mismatch for tool "${name}":`, parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`));
568
+ }
569
+ }
570
+ // Truncate large arrays to prevent context overflow
571
+ cleanResult = truncateToolResult(cleanResult);
572
+ return options?.uiActionSchema
573
+ ? normalizeResultUiAction(cleanResult, options.uiActionSchema)
574
+ : cleanResult;
575
+ }
576
+ catch (error) {
577
+ // Audit: tool execution failed
578
+ options?.onAudit?.({
579
+ type: 'tool.failed',
580
+ timestamp: new Date().toISOString(),
581
+ sessionId: options.sessionId ?? '',
582
+ source: 'server-core',
583
+ details: {
584
+ toolId: tool.id,
585
+ toolName: name,
586
+ error: error instanceof Error ? error.message : String(error),
587
+ latencyMs: Date.now() - startTime,
588
+ },
589
+ });
590
+ options?.onError?.(tool.id, error);
591
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
592
+ return normalizeResultUiAction({
593
+ error: `Error in ${tool.id}: ${errorMessage}`,
594
+ hint: 'Check the parameters and try again.',
595
+ }, options?.uiActionSchema);
596
+ }
597
+ },
598
+ };
599
+ }
600
+ /**
601
+ * Forward an audit event to the remote telemetry sink (fire-and-forget).
602
+ */
603
+ function forwardToTelemetry(telemetry, event, traceId) {
604
+ try {
605
+ telemetry.emit({
606
+ eventType: event.type,
607
+ traceId: traceId ?? event.sessionId,
608
+ toolId: (event.details?.toolId ?? event.details?.toolName),
609
+ latencyMs: event.details?.latencyMs,
610
+ timestamp: event.timestamp,
611
+ payload: event.details,
612
+ actor: { sessionId: event.sessionId },
613
+ });
614
+ }
615
+ catch {
616
+ // Telemetry is fire-and-forget, never block tool execution
617
+ }
618
+ }
619
+ /**
620
+ * Wrap options to auto-forward audit events to remote telemetry.
621
+ * Returns options with an augmented `onAudit` that calls both
622
+ * the original callback and the telemetry sink.
623
+ */
624
+ function withTelemetryForwarding(options) {
625
+ if (!options?.telemetry)
626
+ return options;
627
+ const { telemetry, onAudit: originalOnAudit } = options;
628
+ return {
629
+ ...options,
630
+ onAudit: (event) => {
631
+ originalOnAudit?.(event);
632
+ forwardToTelemetry(telemetry, event, options.traceId);
633
+ },
634
+ };
635
+ }
636
+ /**
637
+ * Convert a registry of tools to AI SDK tools.
638
+ * The SDK does not perform authorization — the backend API that each tool
639
+ * calls is responsible for permission enforcement.
640
+ */
641
+ export function toolsToAiTools(registry, context, options) {
642
+ const resolvedOptions = withTelemetryForwarding(options);
643
+ const tools = {};
644
+ for (const [name, tool] of Object.entries(registry)) {
645
+ tools[name] = toolToAiTool(tool, context, name, resolvedOptions);
646
+ }
647
+ return tools;
648
+ }
649
+ // ============================================================================
650
+ // Transport Adapters
651
+ // ============================================================================
652
+ function toErrorMessage(data, fallback) {
653
+ if (typeof data === 'string' && data.trim())
654
+ return data;
655
+ if (isRecord(data)) {
656
+ // NestJS ValidationPipe returns: { statusCode, message: string[], error: "Bad Request" }
657
+ // Prefer the detailed message(s) over the generic error string.
658
+ const message = data.message;
659
+ if (Array.isArray(message) && message.length > 0) {
660
+ const details = message
661
+ .filter((m) => typeof m === 'string' && m.trim().length > 0)
662
+ .join('; ');
663
+ if (details) {
664
+ const prefix = typeof data.error === 'string' && data.error.trim()
665
+ ? `${data.error}: `
666
+ : '';
667
+ return `${prefix}${details}`;
668
+ }
669
+ }
670
+ if (typeof message === 'string' && message.trim())
671
+ return message;
672
+ if (typeof data.error === 'string' && data.error.trim())
673
+ return data.error;
674
+ }
675
+ return fallback;
676
+ }
677
+ async function parseResponseBody(response) {
678
+ const contentType = response.headers.get('content-type') || '';
679
+ if (contentType.includes('application/json')) {
680
+ try {
681
+ return await response.json();
682
+ }
683
+ catch {
684
+ return undefined;
685
+ }
686
+ }
687
+ const text = await response.text();
688
+ return text.length > 0 ? text : undefined;
689
+ }
690
+ export function normalizeNodeHeaders(headers, allowedHeaderNames) {
691
+ const allowlist = allowedHeaderNames
692
+ ? new Set(allowedHeaderNames.map((n) => n.toLowerCase()))
693
+ : undefined;
694
+ const normalized = {};
695
+ for (const [rawName, rawValue] of Object.entries(headers)) {
696
+ const name = rawName.toLowerCase();
697
+ if (allowlist && !allowlist.has(name))
698
+ continue;
699
+ if (rawValue === undefined)
700
+ continue;
701
+ if (Array.isArray(rawValue)) {
702
+ normalized[name] = rawValue.join(name === 'cookie' ? '; ' : ', ');
703
+ continue;
704
+ }
705
+ normalized[name] = rawValue;
706
+ }
707
+ return normalized;
708
+ }
709
+ export function createFetchInternalApiCaller(options) {
710
+ const fetchImpl = options.fetchImpl ?? fetch;
711
+ return async (request) => {
712
+ const url = new URL(request.path, options.baseUrl).toString();
713
+ const methodAllowsBody = request.method !== 'GET' && request.method !== 'DELETE';
714
+ const headers = {
715
+ ...(options.defaultHeaders ?? {}),
716
+ };
717
+ const init = { method: request.method, headers };
718
+ if (methodAllowsBody && request.body !== undefined) {
719
+ if (!headers['content-type']) {
720
+ headers['content-type'] = 'application/json';
721
+ }
722
+ init.body = JSON.stringify(request.body);
723
+ }
724
+ const response = await fetchImpl(url, init);
725
+ const data = await parseResponseBody(response);
726
+ if (!response.ok) {
727
+ return {
728
+ ok: false,
729
+ status: response.status,
730
+ data,
731
+ error: toErrorMessage(data, `Endpoint failed (${response.status})`),
732
+ };
733
+ }
734
+ return { ok: true, status: response.status, data };
735
+ };
736
+ }
737
+ export function createNextInternalApiCaller(options) {
738
+ const headers = {
739
+ ...(options.defaultHeaders ?? {}),
740
+ };
741
+ if (options.cookieHeader)
742
+ headers.cookie = options.cookieHeader;
743
+ return createFetchInternalApiCaller({
744
+ baseUrl: options.origin,
745
+ fetchImpl: options.fetchImpl,
746
+ defaultHeaders: headers,
747
+ });
748
+ }
749
+ export function createExpressInternalApiCaller(options) {
750
+ const forwardHeaderNames = options.forwardHeaderNames ?? [
751
+ 'cookie',
752
+ 'authorization',
753
+ 'x-request-id',
754
+ ];
755
+ const forwardedHeaders = options.reqHeaders
756
+ ? normalizeNodeHeaders(options.reqHeaders, forwardHeaderNames)
757
+ : {};
758
+ return createFetchInternalApiCaller({
759
+ baseUrl: options.baseUrl,
760
+ fetchImpl: options.fetchImpl,
761
+ defaultHeaders: {
762
+ ...forwardedHeaders,
763
+ ...(options.defaultHeaders ?? {}),
764
+ },
765
+ });
766
+ }
767
+ // ============================================================================
768
+ // Re-exports
769
+ // ============================================================================
770
+ export { zodToCompactDescription } from './zod-compact.js';
771
+ // ============================================================================
772
+ // Followup Tool
773
+ // ============================================================================
774
+ export { createFollowupTool } from './followup-tool.js';
775
+ // ============================================================================
776
+ // Module Routing
777
+ // ============================================================================
778
+ export { defineModule, createAiRouter } from './module-router.js';
779
+ // ============================================================================
780
+ // Model Selection
781
+ // ============================================================================
782
+ export { createModelSelector, createModelSelectorFromMap } from './model-selector.js';
783
+ // ============================================================================
784
+ // Intent Classification
785
+ // ============================================================================
786
+ export { createIntentClassifier, tokenize, jaccardSimilarity, classifyWithHeuristics, buildClassificationPrompt, parseJsonResponse, } from './intent-classifier.js';
787
+ //# sourceMappingURL=index.js.map