glirastes 0.3.0 → 0.3.2

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 (310) hide show
  1. package/CHANGELOG.md +86 -0
  2. package/README.md +154 -9
  3. package/codegen/package.json +5 -0
  4. package/dist/cjs/codegen/asset-sync.d.ts +20 -0
  5. package/dist/cjs/codegen/asset-sync.js +28 -0
  6. package/dist/cjs/codegen/coverage.d.ts +66 -0
  7. package/dist/cjs/codegen/coverage.js +408 -0
  8. package/dist/cjs/codegen/endpoint-scanner.d.ts +16 -0
  9. package/dist/cjs/codegen/endpoint-scanner.js +197 -0
  10. package/dist/cjs/codegen/format.d.ts +17 -0
  11. package/dist/cjs/codegen/format.js +34 -0
  12. package/dist/cjs/codegen/fs-utils.d.ts +45 -0
  13. package/dist/cjs/codegen/fs-utils.js +165 -0
  14. package/dist/cjs/codegen/index.d.ts +13 -0
  15. package/dist/cjs/codegen/index.js +33 -0
  16. package/dist/cjs/codegen/mcp-generator.d.ts +50 -0
  17. package/dist/cjs/codegen/mcp-generator.js +803 -0
  18. package/dist/cjs/codegen/module-generator.d.ts +11 -0
  19. package/dist/cjs/codegen/module-generator.js +353 -0
  20. package/dist/cjs/codegen/nestjs-scanner.d.ts +43 -0
  21. package/dist/cjs/codegen/nestjs-scanner.js +241 -0
  22. package/dist/cjs/codegen/output-recommender.d.ts +23 -0
  23. package/dist/cjs/codegen/output-recommender.js +33 -0
  24. package/dist/cjs/codegen/scaffolder.d.ts +36 -0
  25. package/dist/cjs/codegen/scaffolder.js +262 -0
  26. package/dist/cjs/codegen/skill-generator.d.ts +49 -0
  27. package/dist/cjs/codegen/skill-generator.js +967 -0
  28. package/dist/cjs/codegen/types.d.ts +52 -0
  29. package/dist/cjs/codegen/types.js +16 -0
  30. package/dist/cjs/codegen/ui-scanner.d.ts +24 -0
  31. package/dist/cjs/codegen/ui-scanner.js +202 -0
  32. package/dist/cjs/codegen/validator.d.ts +35 -0
  33. package/dist/cjs/codegen/validator.js +292 -0
  34. package/dist/cjs/index.d.ts +1 -0
  35. package/dist/cjs/index.js +23 -0
  36. package/dist/cjs/openapi/index.d.ts +78 -0
  37. package/dist/cjs/openapi/index.js +347 -0
  38. package/dist/cjs/package.json +1 -0
  39. package/dist/cjs/react/audio-worklet-processor.d.ts +16 -0
  40. package/dist/cjs/react/audio-worklet-processor.js +27 -0
  41. package/dist/cjs/react/bridges/rest-session-bridge.d.ts +113 -0
  42. package/dist/cjs/react/bridges/rest-session-bridge.js +209 -0
  43. package/dist/cjs/react/components/ai-chat-panel.d.ts +12 -0
  44. package/dist/cjs/react/components/ai-chat-panel.js +67 -0
  45. package/dist/cjs/react/components/ai-trigger-button.d.ts +2 -0
  46. package/dist/cjs/react/components/ai-trigger-button.js +239 -0
  47. package/dist/cjs/react/components/approval-card.d.ts +9 -0
  48. package/dist/cjs/react/components/approval-card.js +24 -0
  49. package/dist/cjs/react/components/bulk-approval-card.d.ts +9 -0
  50. package/dist/cjs/react/components/bulk-approval-card.js +36 -0
  51. package/dist/cjs/react/components/chat-input.d.ts +10 -0
  52. package/dist/cjs/react/components/chat-input.js +60 -0
  53. package/dist/cjs/react/components/chat-window.d.ts +2 -0
  54. package/dist/cjs/react/components/chat-window.js +134 -0
  55. package/dist/cjs/react/components/confirm-dialog.d.ts +32 -0
  56. package/dist/cjs/react/components/confirm-dialog.js +48 -0
  57. package/dist/cjs/react/components/floating-chat-ui.d.ts +90 -0
  58. package/dist/cjs/react/components/floating-chat-ui.js +163 -0
  59. package/dist/cjs/react/components/mention-chip.d.ts +16 -0
  60. package/dist/cjs/react/components/mention-chip.js +42 -0
  61. package/dist/cjs/react/components/mention-input.d.ts +8 -0
  62. package/dist/cjs/react/components/mention-input.js +117 -0
  63. package/dist/cjs/react/components/message-bubble.d.ts +11 -0
  64. package/dist/cjs/react/components/message-bubble.js +171 -0
  65. package/dist/cjs/react/components/message-list.d.ts +8 -0
  66. package/dist/cjs/react/components/message-list.js +52 -0
  67. package/dist/cjs/react/components/pipeline-timeline.d.ts +7 -0
  68. package/dist/cjs/react/components/pipeline-timeline.js +72 -0
  69. package/dist/cjs/react/components/recording-bar.d.ts +2 -0
  70. package/dist/cjs/react/components/recording-bar.js +81 -0
  71. package/dist/cjs/react/components/recording-controls.d.ts +18 -0
  72. package/dist/cjs/react/components/recording-controls.js +38 -0
  73. package/dist/cjs/react/components/rich-mention-input.d.ts +2 -0
  74. package/dist/cjs/react/components/rich-mention-input.js +571 -0
  75. package/dist/cjs/react/components/session-switcher.d.ts +14 -0
  76. package/dist/cjs/react/components/session-switcher.js +133 -0
  77. package/dist/cjs/react/components/suggestion-bar.d.ts +9 -0
  78. package/dist/cjs/react/components/suggestion-bar.js +47 -0
  79. package/dist/cjs/react/components/suggestion-chip.d.ts +9 -0
  80. package/dist/cjs/react/components/suggestion-chip.js +14 -0
  81. package/dist/cjs/react/components/voice-input-addon.d.ts +13 -0
  82. package/dist/cjs/react/components/voice-input-addon.js +31 -0
  83. package/dist/cjs/react/components/voice-input-button.d.ts +2 -0
  84. package/dist/cjs/react/components/voice-input-button.js +55 -0
  85. package/dist/cjs/react/components/wavesurfer-loader.d.ts +5 -0
  86. package/dist/cjs/react/components/wavesurfer-loader.js +36 -0
  87. package/dist/cjs/react/hooks/use-ai-chat.d.ts +22 -0
  88. package/dist/cjs/react/hooks/use-ai-chat.js +51 -0
  89. package/dist/cjs/react/hooks/use-approvals.d.ts +23 -0
  90. package/dist/cjs/react/hooks/use-approvals.js +63 -0
  91. package/dist/cjs/react/hooks/use-deepgram-transcription.d.ts +2 -0
  92. package/dist/cjs/react/hooks/use-deepgram-transcription.js +329 -0
  93. package/dist/cjs/react/hooks/use-drag-resize-panel.d.ts +48 -0
  94. package/dist/cjs/react/hooks/use-drag-resize-panel.js +308 -0
  95. package/dist/cjs/react/hooks/use-draggable-position.d.ts +25 -0
  96. package/dist/cjs/react/hooks/use-draggable-position.js +134 -0
  97. package/dist/cjs/react/hooks/use-keyboard-shortcut.d.ts +20 -0
  98. package/dist/cjs/react/hooks/use-keyboard-shortcut.js +93 -0
  99. package/dist/cjs/react/hooks/use-mentions.d.ts +23 -0
  100. package/dist/cjs/react/hooks/use-mentions.js +42 -0
  101. package/dist/cjs/react/hooks/use-suggestions.d.ts +22 -0
  102. package/dist/cjs/react/hooks/use-suggestions.js +39 -0
  103. package/dist/cjs/react/index.d.ts +43 -0
  104. package/dist/cjs/react/index.js +111 -0
  105. package/dist/cjs/react/provider/ai-chat-provider.d.ts +45 -0
  106. package/dist/cjs/react/provider/ai-chat-provider.js +1024 -0
  107. package/dist/cjs/react/provider/chat-context.d.ts +84 -0
  108. package/dist/cjs/react/provider/chat-context.js +13 -0
  109. package/dist/cjs/react/template.d.ts +84 -0
  110. package/dist/cjs/react/template.js +90 -0
  111. package/dist/cjs/react/themes.d.ts +24 -0
  112. package/dist/cjs/react/themes.js +273 -0
  113. package/dist/cjs/react/transports/langgraph/index.d.ts +2 -0
  114. package/dist/cjs/react/transports/langgraph/index.js +8 -0
  115. package/dist/cjs/react/transports/langgraph/langgraph-ai-chat.d.ts +62 -0
  116. package/dist/cjs/react/transports/langgraph/langgraph-ai-chat.js +94 -0
  117. package/dist/cjs/react/transports/langgraph.d.ts +71 -0
  118. package/dist/cjs/react/transports/langgraph.js +369 -0
  119. package/dist/cjs/react/transports/vercel/index.d.ts +2 -0
  120. package/dist/cjs/react/transports/vercel/index.js +8 -0
  121. package/dist/cjs/react/transports/vercel/vercel-ai-chat.d.ts +49 -0
  122. package/dist/cjs/react/transports/vercel/vercel-ai-chat.js +81 -0
  123. package/dist/cjs/react/transports/vercel.d.ts +30 -0
  124. package/dist/cjs/react/transports/vercel.js +69 -0
  125. package/dist/cjs/react/types.d.ts +760 -0
  126. package/dist/cjs/react/types.js +2 -0
  127. package/dist/cjs/react/ui.d.ts +73 -0
  128. package/dist/cjs/react/ui.js +183 -0
  129. package/dist/cjs/react/utils/create-approval-description.d.ts +53 -0
  130. package/dist/cjs/react/utils/create-approval-description.js +122 -0
  131. package/dist/cjs/react/utils/create-tool-result-handler.d.ts +90 -0
  132. package/dist/cjs/react/utils/create-tool-result-handler.js +168 -0
  133. package/dist/cjs/react/utils/mention-markup.d.ts +13 -0
  134. package/dist/cjs/react/utils/mention-markup.js +117 -0
  135. package/dist/cjs/react/utils/merge-pipeline-steps.d.ts +19 -0
  136. package/dist/cjs/react/utils/merge-pipeline-steps.js +81 -0
  137. package/dist/cjs/react/utils/sanitize-stored-messages.d.ts +23 -0
  138. package/dist/cjs/react/utils/sanitize-stored-messages.js +52 -0
  139. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-auth.guard.d.ts +10 -0
  140. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-auth.guard.js +42 -0
  141. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-module-options.interface.d.ts +32 -0
  142. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-module-options.interface.js +4 -0
  143. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.controller.d.ts +11 -0
  144. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.controller.js +80 -0
  145. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.module.d.ts +9 -0
  146. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.module.js +119 -0
  147. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.service.d.ts +13 -0
  148. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.service.js +131 -0
  149. package/dist/cjs/server/adapters/nestjs/chat/dto/ai-chat-request.dto.d.ts +7 -0
  150. package/dist/cjs/server/adapters/nestjs/chat/dto/ai-chat-request.dto.js +52 -0
  151. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message-part.dto.d.ts +19 -0
  152. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message-part.dto.js +108 -0
  153. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message.dto.d.ts +8 -0
  154. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message.dto.js +59 -0
  155. package/dist/cjs/server/adapters/nestjs/chat/dto/index.d.ts +3 -0
  156. package/dist/cjs/server/adapters/nestjs/chat/dto/index.js +9 -0
  157. package/dist/cjs/server/adapters/nestjs/chat/index.d.ts +3 -0
  158. package/dist/cjs/server/adapters/nestjs/chat/index.js +9 -0
  159. package/dist/cjs/server/adapters/nestjs/chat/speech-stream.gateway.d.ts +4 -0
  160. package/dist/cjs/server/adapters/nestjs/chat/speech-stream.gateway.js +73 -0
  161. package/dist/cjs/server/adapters/nestjs/chat/ws-loader.d.ts +5 -0
  162. package/dist/cjs/server/adapters/nestjs/chat/ws-loader.js +72 -0
  163. package/dist/cjs/server/adapters/nestjs/decorators/ai-module.decorator.d.ts +6 -0
  164. package/dist/cjs/server/adapters/nestjs/decorators/ai-module.decorator.js +13 -0
  165. package/dist/cjs/server/adapters/nestjs/decorators/ai-param.decorator.d.ts +5 -0
  166. package/dist/cjs/server/adapters/nestjs/decorators/ai-param.decorator.js +15 -0
  167. package/dist/cjs/server/adapters/nestjs/decorators/ai-tool.decorator.d.ts +6 -0
  168. package/dist/cjs/server/adapters/nestjs/decorators/ai-tool.decorator.js +22 -0
  169. package/dist/cjs/server/adapters/nestjs/decorators/constants.d.ts +4 -0
  170. package/dist/cjs/server/adapters/nestjs/decorators/constants.js +7 -0
  171. package/dist/cjs/server/adapters/nestjs/index.d.ts +14 -0
  172. package/dist/cjs/server/adapters/nestjs/index.js +42 -0
  173. package/dist/cjs/server/adapters/nestjs/metadata.d.ts +39 -0
  174. package/dist/cjs/server/adapters/nestjs/metadata.js +36 -0
  175. package/dist/cjs/server/adapters/nestjs/module/ai-tools-explorer.service.d.ts +36 -0
  176. package/dist/cjs/server/adapters/nestjs/module/ai-tools-explorer.service.js +159 -0
  177. package/dist/cjs/server/adapters/nestjs/module/ai-tools.module.d.ts +37 -0
  178. package/dist/cjs/server/adapters/nestjs/module/ai-tools.module.js +44 -0
  179. package/dist/cjs/server/adapters/nestjs/module/ai-tools.service.d.ts +28 -0
  180. package/dist/cjs/server/adapters/nestjs/module/ai-tools.service.js +41 -0
  181. package/dist/cjs/server/adapters/nestjs/scanner/nestjs-scanner.d.ts +16 -0
  182. package/dist/cjs/server/adapters/nestjs/scanner/nestjs-scanner.js +117 -0
  183. package/dist/cjs/server/adapters/nestjs/scanner/schema-builder.d.ts +26 -0
  184. package/dist/cjs/server/adapters/nestjs/scanner/schema-builder.js +259 -0
  185. package/dist/cjs/server/adapters/nestjs/swagger.d.ts +7 -0
  186. package/dist/cjs/server/adapters/nestjs/swagger.js +39 -0
  187. package/dist/cjs/server/adapters/nextjs/context-helpers.d.ts +22 -0
  188. package/dist/cjs/server/adapters/nextjs/context-helpers.js +60 -0
  189. package/dist/cjs/server/adapters/nextjs/create-ai-chat-handler.d.ts +94 -0
  190. package/dist/cjs/server/adapters/nextjs/create-ai-chat-handler.js +965 -0
  191. package/dist/cjs/server/adapters/nextjs/filter-fallback-error.d.ts +11 -0
  192. package/dist/cjs/server/adapters/nextjs/filter-fallback-error.js +41 -0
  193. package/dist/cjs/server/adapters/nextjs/index.d.ts +8 -0
  194. package/dist/cjs/server/adapters/nextjs/index.js +22 -0
  195. package/dist/cjs/server/adapters/nextjs/prepare-model-messages.d.ts +58 -0
  196. package/dist/cjs/server/adapters/nextjs/prepare-model-messages.js +114 -0
  197. package/dist/cjs/server/adapters/nextjs/sanitize-model-messages.d.ts +64 -0
  198. package/dist/cjs/server/adapters/nextjs/sanitize-model-messages.js +489 -0
  199. package/dist/cjs/server/adapters/nextjs/server-action-helper.d.ts +7 -0
  200. package/dist/cjs/server/adapters/nextjs/server-action-helper.js +40 -0
  201. package/dist/cjs/server/adapters/nextjs/types.d.ts +246 -0
  202. package/dist/cjs/server/adapters/nextjs/types.js +2 -0
  203. package/dist/cjs/server/adapters/nextjs/with-ai-tool.d.ts +9 -0
  204. package/dist/cjs/server/adapters/nextjs/with-ai-tool.js +12 -0
  205. package/dist/cjs/server/core/followup-tool.d.ts +9 -0
  206. package/dist/cjs/server/core/followup-tool.js +82 -0
  207. package/dist/cjs/server/core/index.d.ts +139 -0
  208. package/dist/cjs/server/core/index.js +818 -0
  209. package/dist/cjs/server/core/intent-classifier.d.ts +94 -0
  210. package/dist/cjs/server/core/intent-classifier.js +324 -0
  211. package/dist/cjs/server/core/model-selector.d.ts +12 -0
  212. package/dist/cjs/server/core/model-selector.js +48 -0
  213. package/dist/cjs/server/core/module-router.d.ts +14 -0
  214. package/dist/cjs/server/core/module-router.js +110 -0
  215. package/dist/cjs/server/core/zod-compact.d.ts +18 -0
  216. package/dist/cjs/server/core/zod-compact.js +129 -0
  217. package/dist/cjs/server/index.d.ts +6 -0
  218. package/dist/cjs/server/index.js +28 -0
  219. package/dist/cjs/server/lancer/cache.d.ts +9 -0
  220. package/dist/cjs/server/lancer/cache.js +33 -0
  221. package/dist/cjs/server/lancer/client.d.ts +2 -0
  222. package/dist/cjs/server/lancer/client.js +279 -0
  223. package/dist/cjs/server/lancer/errors.d.ts +13 -0
  224. package/dist/cjs/server/lancer/errors.js +21 -0
  225. package/dist/cjs/server/lancer/index.d.ts +3 -0
  226. package/dist/cjs/server/lancer/index.js +7 -0
  227. package/dist/cjs/server/lancer/telemetry-buffer.d.ts +15 -0
  228. package/dist/cjs/server/lancer/telemetry-buffer.js +64 -0
  229. package/dist/cjs/server/lancer/types.d.ts +201 -0
  230. package/dist/cjs/server/lancer/types.js +5 -0
  231. package/dist/cjs/server/pii-shield/aegis-detector.d.ts +26 -0
  232. package/dist/cjs/server/pii-shield/aegis-detector.js +26 -0
  233. package/dist/cjs/server/pii-shield/create-pii-shield.d.ts +2 -0
  234. package/dist/cjs/server/pii-shield/create-pii-shield.js +191 -0
  235. package/dist/cjs/server/pii-shield/deep-walk.d.ts +1 -0
  236. package/dist/cjs/server/pii-shield/deep-walk.js +19 -0
  237. package/dist/cjs/server/pii-shield/fake-data.d.ts +5 -0
  238. package/dist/cjs/server/pii-shield/fake-data.js +170 -0
  239. package/dist/cjs/server/pii-shield/index.d.ts +4 -0
  240. package/dist/cjs/server/pii-shield/index.js +9 -0
  241. package/dist/cjs/server/pii-shield/leakage.d.ts +1 -0
  242. package/dist/cjs/server/pii-shield/leakage.js +15 -0
  243. package/dist/cjs/server/pii-shield/session-mapping.d.ts +12 -0
  244. package/dist/cjs/server/pii-shield/session-mapping.js +70 -0
  245. package/dist/cjs/server/pipeline.d.ts +26 -0
  246. package/dist/cjs/server/pipeline.js +127 -0
  247. package/dist/cjs/server/testing/approvals.d.ts +11 -0
  248. package/dist/cjs/server/testing/approvals.js +41 -0
  249. package/dist/cjs/server/testing/combination.d.ts +3 -0
  250. package/dist/cjs/server/testing/combination.js +83 -0
  251. package/dist/cjs/server/testing/create-test-suite.d.ts +29 -0
  252. package/dist/cjs/server/testing/create-test-suite.js +81 -0
  253. package/dist/cjs/server/testing/edge-cases.d.ts +8 -0
  254. package/dist/cjs/server/testing/edge-cases.js +277 -0
  255. package/dist/cjs/server/testing/guardrails.d.ts +14 -0
  256. package/dist/cjs/server/testing/guardrails.js +152 -0
  257. package/dist/cjs/server/testing/helpers.d.ts +14 -0
  258. package/dist/cjs/server/testing/helpers.js +119 -0
  259. package/dist/cjs/server/testing/index.d.ts +12 -0
  260. package/dist/cjs/server/testing/index.js +37 -0
  261. package/dist/cjs/server/testing/mock-executor.d.ts +8 -0
  262. package/dist/cjs/server/testing/mock-executor.js +40 -0
  263. package/dist/cjs/server/testing/regression.d.ts +7 -0
  264. package/dist/cjs/server/testing/regression.js +27 -0
  265. package/dist/cjs/server/testing/routing.d.ts +12 -0
  266. package/dist/cjs/server/testing/routing.js +63 -0
  267. package/dist/cjs/server/testing/schema-consistency.d.ts +6 -0
  268. package/dist/cjs/server/testing/schema-consistency.js +56 -0
  269. package/dist/cjs/server/testing/smoke.d.ts +11 -0
  270. package/dist/cjs/server/testing/smoke.js +64 -0
  271. package/dist/cjs/server/testing/types.d.ts +156 -0
  272. package/dist/cjs/server/testing/types.js +2 -0
  273. package/dist/cjs/types.d.ts +696 -0
  274. package/dist/cjs/types.js +91 -0
  275. package/dist/cli/commands/install-skills.d.ts +17 -0
  276. package/dist/cli/commands/install-skills.js +185 -0
  277. package/dist/cli/commands/install-skills.js.map +1 -0
  278. package/dist/cli/index.js +25 -0
  279. package/dist/cli/index.js.map +1 -1
  280. package/dist/react/components/ai-trigger-button.js +4 -6
  281. package/dist/react/components/ai-trigger-button.js.map +1 -1
  282. package/dist/react/components/recording-bar.js +4 -6
  283. package/dist/react/components/recording-bar.js.map +1 -1
  284. package/dist/react/components/wavesurfer-loader.d.ts +5 -0
  285. package/dist/react/components/wavesurfer-loader.js +34 -0
  286. package/dist/react/components/wavesurfer-loader.js.map +1 -0
  287. package/dist/server/adapters/nestjs/chat/ai-chat.module.d.ts +1 -1
  288. package/dist/server/adapters/nestjs/chat/ai-chat.module.js +3 -2
  289. package/dist/server/adapters/nestjs/chat/ai-chat.module.js.map +1 -1
  290. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.d.ts +1 -1
  291. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.js +10 -8
  292. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.js.map +1 -1
  293. package/dist/server/adapters/nestjs/chat/ws-loader.d.ts +5 -0
  294. package/dist/server/adapters/nestjs/chat/ws-loader.js +37 -0
  295. package/dist/server/adapters/nestjs/chat/ws-loader.js.map +1 -0
  296. package/openapi/package.json +5 -0
  297. package/package.json +59 -16
  298. package/react/langgraph/package.json +5 -0
  299. package/react/package.json +5 -0
  300. package/react/vercel/package.json +5 -0
  301. package/server/nestjs/package.json +5 -0
  302. package/server/nextjs/package.json +5 -0
  303. package/server/package.json +5 -0
  304. package/server/testing/package.json +5 -0
  305. package/skills/README.md +107 -0
  306. package/skills/building-glirastes-chat-ui/SKILL.md +378 -0
  307. package/skills/integrating-glirastes-nestjs/SKILL.md +346 -0
  308. package/skills/integrating-glirastes-nextjs/SKILL.md +312 -0
  309. package/skills/integrating-glirastes-nextjs-with-nestjs-backend/SKILL.md +359 -0
  310. package/skills/maintaining-glirastes-tools/SKILL.md +467 -0
@@ -0,0 +1,16 @@
1
+ import 'reflect-metadata';
2
+ import type { AiEndpointToolDefinition, IntentModule } from '../../../../types.js';
3
+ export interface NestJsScanOptions {
4
+ controllers: Function[];
5
+ apiPrefix?: string;
6
+ }
7
+ export interface NestJsScanResult {
8
+ tools: AiEndpointToolDefinition[];
9
+ modules: IntentModule[];
10
+ toolsByModule: Record<string, string[]>;
11
+ }
12
+ /**
13
+ * Scan decorated NestJS controllers and produce tool/module definitions.
14
+ * Works at build time without a running NestJS app.
15
+ */
16
+ export declare function scanNestJsControllers(options: NestJsScanOptions): NestJsScanResult;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scanNestJsControllers = scanNestJsControllers;
4
+ require("reflect-metadata");
5
+ const zod_1 = require("zod");
6
+ const metadata_js_1 = require("../metadata.js");
7
+ const schema_builder_js_1 = require("./schema-builder.js");
8
+ const HTTP_METHOD_MAP = {
9
+ 0: 'GET',
10
+ 1: 'POST',
11
+ 2: 'PUT',
12
+ 3: 'DELETE',
13
+ 4: 'PATCH',
14
+ };
15
+ /**
16
+ * Scan decorated NestJS controllers and produce tool/module definitions.
17
+ * Works at build time without a running NestJS app.
18
+ */
19
+ function scanNestJsControllers(options) {
20
+ const apiPrefix = options.apiPrefix ?? '/api';
21
+ const allTools = [];
22
+ const moduleMap = new Map();
23
+ for (const controllerClass of options.controllers) {
24
+ const moduleMeta = (0, metadata_js_1.getAiModuleMeta)(controllerClass);
25
+ if (!moduleMeta)
26
+ continue;
27
+ const tools = (0, metadata_js_1.getAllAiTools)(controllerClass);
28
+ const controllerPath = Reflect.getMetadata('path', controllerClass) ?? '';
29
+ for (const tool of tools) {
30
+ const methodPath = Reflect.getMetadata('path', controllerClass.prototype[tool.methodName]) ?? '';
31
+ const fullPath = `${apiPrefix}/${controllerPath}/${methodPath}`
32
+ .replace(/\/+/g, '/')
33
+ .replace(/\/$/, '') || '/';
34
+ // Resolve HTTP method
35
+ const httpMethodNum = Reflect.getMetadata('method', controllerClass.prototype[tool.methodName]);
36
+ const httpMethod = tool.method ??
37
+ HTTP_METHOD_MAP[httpMethodNum ?? 0] ??
38
+ 'GET';
39
+ // Resolve DTO schema
40
+ const paramTypes = Reflect.getMetadata('design:paramtypes', controllerClass.prototype, tool.methodName);
41
+ let inputSchema = zod_1.z.object({});
42
+ if (paramTypes) {
43
+ for (const pt of paramTypes) {
44
+ if (pt && typeof pt === 'function' && (0, schema_builder_js_1.hasAiRelevantMeta)(pt)) {
45
+ inputSchema = (0, schema_builder_js_1.buildZodSchemaFromDto)(pt);
46
+ break;
47
+ }
48
+ }
49
+ }
50
+ // Merge path parameters into input schema
51
+ const pathParams = (0, schema_builder_js_1.extractRouteParams)(controllerClass, tool.methodName);
52
+ if (pathParams.length > 0) {
53
+ const pathShape = {};
54
+ for (const paramName of pathParams) {
55
+ if (!(inputSchema instanceof zod_1.z.ZodObject) || !(paramName in inputSchema.shape)) {
56
+ pathShape[paramName] = zod_1.z.string().uuid().describe(`Path parameter: ${paramName}`);
57
+ }
58
+ }
59
+ if (Object.keys(pathShape).length > 0) {
60
+ inputSchema = inputSchema instanceof zod_1.z.ZodObject
61
+ ? inputSchema.extend(pathShape)
62
+ : zod_1.z.object(pathShape);
63
+ }
64
+ }
65
+ allTools.push({
66
+ id: `${moduleMeta.intent}.${tool.name}`,
67
+ toolName: tool.name,
68
+ module: tool.module ?? moduleMeta.intent,
69
+ sharedWith: tool.sharedWith,
70
+ description: tool.description,
71
+ method: httpMethod,
72
+ path: fullPath,
73
+ inputSchema,
74
+ needsApproval: tool.needsApproval,
75
+ uiActionOnSuccess: tool.uiActionOnSuccess,
76
+ uiPattern: tool.uiPattern,
77
+ });
78
+ }
79
+ // Build IntentModule
80
+ const intent = moduleMeta.intent;
81
+ const toolNames = tools.map((t) => t.name);
82
+ const existing = moduleMap.get(intent);
83
+ if (existing) {
84
+ existing.toolNames.push(...toolNames);
85
+ }
86
+ else {
87
+ const meta = {
88
+ classification: moduleMeta.classification,
89
+ execution: moduleMeta.execution,
90
+ systemPrompt: moduleMeta.systemPrompt,
91
+ };
92
+ moduleMap.set(intent, { type: intent, toolNames, meta });
93
+ }
94
+ }
95
+ // Expand sharedWith
96
+ const toolsByModule = {};
97
+ for (const [intent, mod] of moduleMap) {
98
+ toolsByModule[intent] = [...mod.toolNames];
99
+ }
100
+ for (const tool of allTools) {
101
+ if (!tool.sharedWith)
102
+ continue;
103
+ for (const sharedModule of tool.sharedWith) {
104
+ if (!toolsByModule[sharedModule]) {
105
+ toolsByModule[sharedModule] = [];
106
+ }
107
+ if (!toolsByModule[sharedModule].includes(tool.toolName)) {
108
+ toolsByModule[sharedModule].push(tool.toolName);
109
+ }
110
+ }
111
+ }
112
+ return {
113
+ tools: allTools,
114
+ modules: Array.from(moduleMap.values()),
115
+ toolsByModule,
116
+ };
117
+ }
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ import 'reflect-metadata';
3
+ /**
4
+ * Build a Zod schema from a DTO class.
5
+ *
6
+ * Resolution order per property:
7
+ * 1. @AiParam — explicit AI-specific description (highest priority)
8
+ * 2. @ApiProperty — Swagger metadata as fallback (description, required, constraints)
9
+ * 3. design:type — TypeScript type metadata for base type inference
10
+ *
11
+ * Constraints from @ApiProperty (minLength, maxLength, minimum, maximum, enum)
12
+ * are applied as Zod validations AND appended to the property description so
13
+ * the AI model knows the constraints before generating values.
14
+ */
15
+ export declare function buildZodSchemaFromDto(dtoClass: Function): z.ZodObject<Record<string, z.ZodTypeAny>>;
16
+ /**
17
+ * Check whether a DTO class has any AI-relevant property metadata
18
+ * (either @AiParam or @ApiProperty decorators).
19
+ */
20
+ export declare function hasAiRelevantMeta(dtoClass: Function): boolean;
21
+ /**
22
+ * Extract @Param() parameter names from a controller method's route arguments metadata.
23
+ * NestJS stores route arguments under '__routeArguments__' with keys like "5:0" where
24
+ * 5 = RouteParamtypes.PARAM. The `data` field holds the parameter name (e.g., 'id').
25
+ */
26
+ export declare function extractRouteParams(controllerClass: Function, methodName: string): string[];
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildZodSchemaFromDto = buildZodSchemaFromDto;
4
+ exports.hasAiRelevantMeta = hasAiRelevantMeta;
5
+ exports.extractRouteParams = extractRouteParams;
6
+ const zod_1 = require("zod");
7
+ require("reflect-metadata");
8
+ const metadata_js_1 = require("../metadata.js");
9
+ /**
10
+ * Metadata key used by @nestjs/swagger's @ApiProperty decorator.
11
+ * Properties decorated with @ApiProperty store their options under this key.
12
+ */
13
+ const SWAGGER_API_MODEL_PROPERTIES = 'swagger/apiModelProperties';
14
+ const SWAGGER_API_MODEL_PROPERTIES_ARRAY = 'swagger/apiModelPropertiesArray';
15
+ /**
16
+ * Read @ApiProperty metadata for all properties on a DTO class.
17
+ * Returns an array of property descriptors with description and constraints.
18
+ */
19
+ function getSwaggerPropertyMeta(dtoClass) {
20
+ const propertyNames = Reflect.getMetadata(SWAGGER_API_MODEL_PROPERTIES_ARRAY, dtoClass.prototype);
21
+ if (!propertyNames || propertyNames.length === 0)
22
+ return [];
23
+ const result = [];
24
+ for (const rawKey of propertyNames) {
25
+ // Swagger stores keys with a ':' prefix (e.g., ':name', ':description')
26
+ const propertyKey = rawKey.startsWith(':') ? rawKey.slice(1) : rawKey;
27
+ const meta = Reflect.getMetadata(SWAGGER_API_MODEL_PROPERTIES, dtoClass.prototype, propertyKey);
28
+ if (meta) {
29
+ result.push({ propertyKey, meta });
30
+ }
31
+ }
32
+ return result;
33
+ }
34
+ // ============================================================================
35
+ // Public API
36
+ // ============================================================================
37
+ /**
38
+ * Build a Zod schema from a DTO class.
39
+ *
40
+ * Resolution order per property:
41
+ * 1. @AiParam — explicit AI-specific description (highest priority)
42
+ * 2. @ApiProperty — Swagger metadata as fallback (description, required, constraints)
43
+ * 3. design:type — TypeScript type metadata for base type inference
44
+ *
45
+ * Constraints from @ApiProperty (minLength, maxLength, minimum, maximum, enum)
46
+ * are applied as Zod validations AND appended to the property description so
47
+ * the AI model knows the constraints before generating values.
48
+ */
49
+ function buildZodSchemaFromDto(dtoClass) {
50
+ const aiParams = (0, metadata_js_1.getAiParamMeta)(dtoClass);
51
+ const swaggerProps = getSwaggerPropertyMeta(dtoClass);
52
+ const mergedParams = buildMergedParamList(aiParams, swaggerProps);
53
+ if (mergedParams.length === 0)
54
+ return zod_1.z.object({});
55
+ const shape = {};
56
+ for (const param of mergedParams) {
57
+ const designType = Reflect.getMetadata('design:type', dtoClass.prototype, param.propertyKey);
58
+ let fieldSchema = buildFieldSchema(designType, param.constraints);
59
+ // Build enriched description: base description + constraint hints
60
+ const enrichedDescription = buildEnrichedDescription(param.description, param.constraints);
61
+ if (enrichedDescription) {
62
+ fieldSchema = fieldSchema.describe(enrichedDescription);
63
+ }
64
+ // Apply optional
65
+ if (param.isOptional) {
66
+ fieldSchema = fieldSchema.optional();
67
+ }
68
+ else {
69
+ fieldSchema = detectOptionalByDefault(dtoClass, param.propertyKey, fieldSchema);
70
+ }
71
+ shape[param.propertyKey] = fieldSchema;
72
+ }
73
+ return zod_1.z.object(shape);
74
+ }
75
+ /**
76
+ * Check whether a DTO class has any AI-relevant property metadata
77
+ * (either @AiParam or @ApiProperty decorators).
78
+ */
79
+ function hasAiRelevantMeta(dtoClass) {
80
+ if ((0, metadata_js_1.getAiParamMeta)(dtoClass).length > 0)
81
+ return true;
82
+ if (getSwaggerPropertyMeta(dtoClass).length > 0)
83
+ return true;
84
+ return false;
85
+ }
86
+ // ============================================================================
87
+ // Internal helpers
88
+ // ============================================================================
89
+ function buildMergedParamList(aiParams, swaggerProps) {
90
+ const aiParamMap = new Map(aiParams.map((p) => [p.propertyKey, p]));
91
+ const swaggerMap = new Map(swaggerProps.map((p) => [p.propertyKey, p.meta]));
92
+ // Collect all unique property keys (preserving order)
93
+ const allKeys = new Set();
94
+ for (const p of aiParams)
95
+ allKeys.add(p.propertyKey);
96
+ for (const p of swaggerProps)
97
+ allKeys.add(p.propertyKey);
98
+ const result = [];
99
+ for (const key of allKeys) {
100
+ const aiParam = aiParamMap.get(key);
101
+ const swaggerMeta = swaggerMap.get(key);
102
+ const description = aiParam?.description ?? swaggerMeta?.description ?? '';
103
+ const isOptional = swaggerMeta?.required === false;
104
+ const constraints = {};
105
+ if (swaggerMeta) {
106
+ if (swaggerMeta.minLength !== undefined)
107
+ constraints.minLength = swaggerMeta.minLength;
108
+ if (swaggerMeta.maxLength !== undefined)
109
+ constraints.maxLength = swaggerMeta.maxLength;
110
+ if (swaggerMeta.minimum !== undefined)
111
+ constraints.minimum = swaggerMeta.minimum;
112
+ if (swaggerMeta.maximum !== undefined)
113
+ constraints.maximum = swaggerMeta.maximum;
114
+ if (swaggerMeta.enum !== undefined)
115
+ constraints.enum = swaggerMeta.enum;
116
+ }
117
+ result.push({ propertyKey: key, description, isOptional, constraints });
118
+ }
119
+ return result;
120
+ }
121
+ /**
122
+ * Build a Zod field schema with constraints applied.
123
+ */
124
+ function buildFieldSchema(designType, constraints) {
125
+ const baseSchema = designTypeToZod(designType);
126
+ // Apply constraints based on the Zod type
127
+ if (baseSchema instanceof zod_1.z.ZodString) {
128
+ return applyStringConstraints(baseSchema, constraints);
129
+ }
130
+ if (baseSchema instanceof zod_1.z.ZodNumber) {
131
+ return applyNumberConstraints(baseSchema, constraints);
132
+ }
133
+ if (constraints.enum && constraints.enum.length > 0) {
134
+ return buildEnumSchema(constraints.enum);
135
+ }
136
+ return baseSchema;
137
+ }
138
+ function applyStringConstraints(schema, constraints) {
139
+ let s = schema;
140
+ if (constraints.minLength !== undefined)
141
+ s = s.min(constraints.minLength);
142
+ if (constraints.maxLength !== undefined)
143
+ s = s.max(constraints.maxLength);
144
+ // Enum overrides string type entirely
145
+ if (constraints.enum && constraints.enum.length > 0) {
146
+ return buildEnumSchema(constraints.enum);
147
+ }
148
+ return s;
149
+ }
150
+ function applyNumberConstraints(schema, constraints) {
151
+ let n = schema;
152
+ if (constraints.minimum !== undefined)
153
+ n = n.min(constraints.minimum);
154
+ if (constraints.maximum !== undefined)
155
+ n = n.max(constraints.maximum);
156
+ return n;
157
+ }
158
+ function buildEnumSchema(values) {
159
+ const stringValues = values.filter((v) => typeof v === 'string');
160
+ if (stringValues.length >= 2) {
161
+ return zod_1.z.enum(stringValues);
162
+ }
163
+ if (stringValues.length === 1) {
164
+ return zod_1.z.literal(stringValues[0]);
165
+ }
166
+ return zod_1.z.unknown();
167
+ }
168
+ /**
169
+ * Append constraint hints to the base description so the AI model
170
+ * knows the validation rules before generating values.
171
+ */
172
+ function buildEnrichedDescription(baseDescription, constraints) {
173
+ const hints = [];
174
+ if (constraints.minLength !== undefined && constraints.maxLength !== undefined) {
175
+ hints.push(`${constraints.minLength}-${constraints.maxLength} characters`);
176
+ }
177
+ else if (constraints.minLength !== undefined) {
178
+ hints.push(`min ${constraints.minLength} characters`);
179
+ }
180
+ else if (constraints.maxLength !== undefined) {
181
+ hints.push(`max ${constraints.maxLength} characters`);
182
+ }
183
+ if (constraints.minimum !== undefined && constraints.maximum !== undefined) {
184
+ hints.push(`range ${constraints.minimum}-${constraints.maximum}`);
185
+ }
186
+ else if (constraints.minimum !== undefined) {
187
+ hints.push(`min ${constraints.minimum}`);
188
+ }
189
+ else if (constraints.maximum !== undefined) {
190
+ hints.push(`max ${constraints.maximum}`);
191
+ }
192
+ if (constraints.enum && constraints.enum.length > 0) {
193
+ const values = constraints.enum
194
+ .filter((v) => typeof v === 'string' || typeof v === 'number')
195
+ .map((v) => String(v));
196
+ if (values.length > 0) {
197
+ hints.push(`one of: ${values.join(', ')}`);
198
+ }
199
+ }
200
+ if (hints.length === 0)
201
+ return baseDescription;
202
+ const constraintSuffix = `(${hints.join('; ')})`;
203
+ return baseDescription
204
+ ? `${baseDescription} ${constraintSuffix}`
205
+ : constraintSuffix;
206
+ }
207
+ function designTypeToZod(designType) {
208
+ if (!designType)
209
+ return zod_1.z.unknown();
210
+ switch (designType) {
211
+ case String:
212
+ return zod_1.z.string();
213
+ case Number:
214
+ return zod_1.z.number();
215
+ case Boolean:
216
+ return zod_1.z.boolean();
217
+ case Array:
218
+ return zod_1.z.array(zod_1.z.unknown());
219
+ case Date:
220
+ return zod_1.z.string();
221
+ default:
222
+ return zod_1.z.unknown();
223
+ }
224
+ }
225
+ /**
226
+ * Extract @Param() parameter names from a controller method's route arguments metadata.
227
+ * NestJS stores route arguments under '__routeArguments__' with keys like "5:0" where
228
+ * 5 = RouteParamtypes.PARAM. The `data` field holds the parameter name (e.g., 'id').
229
+ */
230
+ function extractRouteParams(controllerClass, methodName) {
231
+ const ROUTE_ARGS_METADATA = '__routeArguments__';
232
+ const PARAM_TYPE = '5'; // RouteParamtypes.PARAM
233
+ const routeArgs = Reflect.getMetadata(ROUTE_ARGS_METADATA, controllerClass, methodName) ?? {};
234
+ const params = [];
235
+ for (const [key, value] of Object.entries(routeArgs)) {
236
+ if (key.startsWith(`${PARAM_TYPE}:`) && value.data) {
237
+ params.push(value.data);
238
+ }
239
+ }
240
+ return params;
241
+ }
242
+ /**
243
+ * Check if a property has a default value on a constructed instance.
244
+ * If so, mark it as optional.
245
+ */
246
+ function detectOptionalByDefault(dtoClass, propertyKey, fieldSchema) {
247
+ try {
248
+ const constructed = new dtoClass();
249
+ if (constructed &&
250
+ typeof constructed === 'object' &&
251
+ propertyKey in constructed) {
252
+ return fieldSchema.optional();
253
+ }
254
+ }
255
+ catch {
256
+ // Cannot construct, skip optional detection
257
+ }
258
+ return fieldSchema;
259
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Walks an OpenAPI document and merges `@AiTool` decorator metadata
3
+ * into each matching operation as an `x-ai` extension.
4
+ *
5
+ * Mutates `document` in place.
6
+ */
7
+ export declare function applyAiExtensions(document: Record<string, unknown>, controllers: Array<new (...args: unknown[]) => unknown>): void;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyAiExtensions = applyAiExtensions;
4
+ const metadata_js_1 = require("./metadata.js");
5
+ /**
6
+ * Walks an OpenAPI document and merges `@AiTool` decorator metadata
7
+ * into each matching operation as an `x-ai` extension.
8
+ *
9
+ * Mutates `document` in place.
10
+ */
11
+ function applyAiExtensions(document, controllers) {
12
+ const paths = document['paths'];
13
+ if (!paths)
14
+ return;
15
+ for (const controller of controllers) {
16
+ const moduleMeta = (0, metadata_js_1.getAiModuleMeta)(controller);
17
+ const tools = (0, metadata_js_1.getAllAiTools)(controller);
18
+ for (const tool of tools) {
19
+ const toolPath = tool.path;
20
+ const toolMethod = tool.method?.toLowerCase();
21
+ if (!toolPath || !toolMethod)
22
+ continue;
23
+ const pathItem = paths[toolPath];
24
+ if (!pathItem)
25
+ continue;
26
+ const operation = pathItem[toolMethod];
27
+ if (!operation)
28
+ continue;
29
+ const extension = {
30
+ enabled: true,
31
+ toolName: tool.name,
32
+ description: tool.description,
33
+ needsApproval: tool.needsApproval,
34
+ module: moduleMeta?.intent,
35
+ };
36
+ operation['x-ai'] = extension;
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,22 @@
1
+ import type { ToolContext, RuntimeContext } from '../../../types.js';
2
+ import { type InternalApiCaller, type NextInternalApiCallerOptions } from '../../core/index.js';
3
+ /**
4
+ * Extract origin from a Next.js request.
5
+ * Checks x-forwarded-host/host headers, falls back to req.url.
6
+ */
7
+ export declare function extractOrigin(req: Request): string;
8
+ /**
9
+ * Build a RuntimeContext from a Next.js request.
10
+ */
11
+ export declare function buildRuntimeContext(req: Request): RuntimeContext;
12
+ /**
13
+ * Build a complete ToolContext from a Next.js request.
14
+ */
15
+ export declare function buildToolContext(req: Request, options?: {
16
+ locale?: string;
17
+ }): ToolContext;
18
+ /**
19
+ * Create an InternalApiCaller from a Next.js request.
20
+ * Automatically extracts origin and cookies.
21
+ */
22
+ export declare function createInternalApiCallerFromRequest(req: Request, overrides?: Partial<NextInternalApiCallerOptions>): InternalApiCaller;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractOrigin = extractOrigin;
4
+ exports.buildRuntimeContext = buildRuntimeContext;
5
+ exports.buildToolContext = buildToolContext;
6
+ exports.createInternalApiCallerFromRequest = createInternalApiCallerFromRequest;
7
+ const index_js_1 = require("../../core/index.js");
8
+ /**
9
+ * Extract origin from a Next.js request.
10
+ * Checks x-forwarded-host/host headers, falls back to req.url.
11
+ */
12
+ function extractOrigin(req) {
13
+ const forwardedHost = req.headers.get('x-forwarded-host');
14
+ const forwardedProto = req.headers.get('x-forwarded-proto') ?? 'https';
15
+ if (forwardedHost) {
16
+ return `${forwardedProto}://${forwardedHost}`;
17
+ }
18
+ const host = req.headers.get('host');
19
+ if (host) {
20
+ const proto = host.startsWith('localhost') ? 'http' : 'https';
21
+ return `${proto}://${host}`;
22
+ }
23
+ try {
24
+ const url = new URL(req.url);
25
+ return url.origin;
26
+ }
27
+ catch {
28
+ return 'http://localhost:3000';
29
+ }
30
+ }
31
+ /**
32
+ * Build a RuntimeContext from a Next.js request.
33
+ */
34
+ function buildRuntimeContext(req) {
35
+ return {
36
+ origin: extractOrigin(req),
37
+ cookieHeader: req.headers.get('cookie') ?? undefined,
38
+ };
39
+ }
40
+ /**
41
+ * Build a complete ToolContext from a Next.js request.
42
+ */
43
+ function buildToolContext(req, options) {
44
+ return {
45
+ currentDate: new Date(),
46
+ locale: options?.locale ?? 'en-US',
47
+ runtime: buildRuntimeContext(req),
48
+ };
49
+ }
50
+ /**
51
+ * Create an InternalApiCaller from a Next.js request.
52
+ * Automatically extracts origin and cookies.
53
+ */
54
+ function createInternalApiCallerFromRequest(req, overrides) {
55
+ return (0, index_js_1.createNextInternalApiCaller)({
56
+ origin: extractOrigin(req),
57
+ cookieHeader: req.headers.get('cookie') ?? undefined,
58
+ ...overrides,
59
+ });
60
+ }
@@ -0,0 +1,94 @@
1
+ import type { PiiShield } from '../../../types.js';
2
+ import type { AiChatHandlerConfig, IntentRoutingResult, PipelineStepReport, PipelineResult, StepLimitSource } from './types.js';
3
+ /**
4
+ * Callback that the consumer provides to stream the AI response.
5
+ * Receives the prepared context and returns a Response.
6
+ *
7
+ * This decouples the adapter from the `ai` SDK — the consumer
8
+ * calls streamText() themselves with full type safety.
9
+ */
10
+ export interface StreamHandlerContext {
11
+ /** AI tools (output of toolsToAiTools, RBAC-filtered) */
12
+ tools: Record<string, unknown>;
13
+ /** Processed messages (after guardrails, sliced to context window) */
14
+ messages: unknown[];
15
+ /** Resolved system prompt string */
16
+ systemPrompt: string;
17
+ /** Resolved model (static or from model selector) */
18
+ model: unknown;
19
+ /** Max steps (explicit/module/safety-resolved) */
20
+ maxSteps: number;
21
+ /** Source used to resolve maxSteps */
22
+ stepLimitSource: StepLimitSource;
23
+ /** Whether to emit `data-step-report` events */
24
+ emitStepReports: boolean;
25
+ /** Optional per-step callback */
26
+ onStepReport?: (report: PipelineStepReport) => void;
27
+ /** Max output tokens */
28
+ maxOutputTokens: number;
29
+ /** Temperature */
30
+ temperature: number;
31
+ /** Max context messages for model-message preparation */
32
+ maxContextMessages: number;
33
+ /** Model tier from intent routing or pipeline */
34
+ modelTier?: string;
35
+ /** Intent routing result (legacy mode) */
36
+ routing?: IntentRoutingResult;
37
+ /** Pipeline result (pipeline mode) */
38
+ pipelineResult?: PipelineResult;
39
+ /** PII shield context for response de-anonymization */
40
+ piiShield?: {
41
+ shield: PiiShield;
42
+ sessionId: string;
43
+ };
44
+ }
45
+ /**
46
+ * Extended config that adds an optional streamHandler for full AI SDK control.
47
+ *
48
+ * When `streamHandler` is not provided, a built-in default is used that:
49
+ * - Converts UI messages to model messages via `prepareModelMessages()`
50
+ * - Wraps SDK tools via `wrapToolsForVercelAi()`
51
+ * - Calls `streamText()` and returns `createUIMessageStreamResponse()`
52
+ */
53
+ export interface AiChatHandlerFullConfig extends AiChatHandlerConfig {
54
+ /**
55
+ * Custom stream handler. Receives prepared context, returns Response.
56
+ * This is where the consumer calls streamText() / toDataStreamResponse().
57
+ *
58
+ * When omitted, the built-in default handler is used.
59
+ */
60
+ streamHandler?: (ctx: StreamHandlerContext) => Promise<Response>;
61
+ }
62
+ /**
63
+ * Default soft cap on reasoning steps when no module-level or explicit
64
+ * `maxSteps` is configured. Acts as a last-line safety against runaway
65
+ * tool loops; not as a normal-operation cap (modules default to 4 via
66
+ * EXECUTION_DEFAULTS). Override per request via `createAiChatHandler({
67
+ * safetyMaxSteps })`.
68
+ */
69
+ export declare const DEFAULT_SAFETY_MAX_STEPS = 24;
70
+ export declare function resolveStepLimit(options: {
71
+ moduleMaxSteps?: number | null;
72
+ configuredMaxSteps?: number | null;
73
+ safetyMaxSteps?: number;
74
+ }): {
75
+ maxSteps: number;
76
+ stepLimitSource: StepLimitSource;
77
+ };
78
+ /**
79
+ * Creates a complete Next.js App Router POST handler for AI chat.
80
+ *
81
+ * Supports two modes:
82
+ *
83
+ * **Pipeline mode** (Pro): When `pipeline` is provided, uses the server-pro
84
+ * pipeline for guardrails, intent classification, tool selection, and model
85
+ * selection.
86
+ *
87
+ * **Legacy mode**: When no `pipeline` is provided, uses the original
88
+ * `guardrails` + `intentRouter` flow.
89
+ *
90
+ * The SDK does not perform authentication or authorization. Tools forward the
91
+ * caller's cookies to backend APIs via `runtime.cookieHeader`; permission
92
+ * checks happen on the backend.
93
+ */
94
+ export declare function createAiChatHandler(config: AiChatHandlerFullConfig): (req: Request) => Promise<Response>;