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,372 @@
1
+ import { join } from 'node:path';
2
+ import { readdir } from 'node:fs/promises';
3
+ import { findFiles, findRouteFiles, readFileSafe, getSubdirectories, isDirAiIgnored, extractBalancedBlocks, } from './fs-utils.js';
4
+ import { scanEndpointTools } from './endpoint-scanner.js';
5
+ import { scanUiTools, extractActionIds } from './ui-scanner.js';
6
+ import { resolveDefaults } from './types.js';
7
+ import { colors, separator, header, metricLine, sectionHeader } from './format.js';
8
+ /**
9
+ * Check AI tool coverage across the project.
10
+ * Reports on endpoint tools, UI tools, route coverage,
11
+ * component coverage, and sharedWith configurations.
12
+ */
13
+ export async function checkAiCoverage(options) {
14
+ const opts = resolveDefaults(options);
15
+ // Scan tools
16
+ const endpointScan = await scanEndpointTools(options);
17
+ const uiScan = await scanUiTools(options);
18
+ const actionIds = await extractActionIds(options);
19
+ // NestJS controller coverage
20
+ let nestControllerTotal = 0;
21
+ let nestControllerCovered = 0;
22
+ let nestControllerIgnored = 0;
23
+ let nestToolCount = 0;
24
+ const uncoveredNestControllers = [];
25
+ if (opts.nestjsDirs.length > 0) {
26
+ const { scanNestControllers } = await import('./nestjs-scanner.js');
27
+ const nestResult = await scanNestControllers(opts.nestjsDirs, opts.nestjsApiPrefix);
28
+ // Count unique controller files that have tools
29
+ const coveredFiles = new Set(nestResult.tools.map(t => t.controllerFile));
30
+ nestControllerCovered = coveredFiles.size;
31
+ nestToolCount = nestResult.tools.length;
32
+ uncoveredNestControllers.push(...nestResult.uncoveredControllers);
33
+ nestControllerTotal = nestControllerCovered + uncoveredNestControllers.length;
34
+ }
35
+ // Route coverage
36
+ const apiDir = join(opts.rootDir, opts.apiDir);
37
+ const routeFiles = await findRouteFiles(apiDir);
38
+ const toolFiles = new Set((await findFiles(apiDir, opts.endpointToolFileName)).map((f) => f.replace(`/${opts.endpointToolFileName}`, '')));
39
+ let routeCovered = 0;
40
+ let routeIgnored = 0;
41
+ const uncoveredRoutes = [];
42
+ for (const routeFile of routeFiles) {
43
+ const routeDir = routeFile.replace('/route.ts', '');
44
+ const routeContent = await readFileSafe(routeFile);
45
+ if (routeContent.includes('@ai-ignore') || await isDirAiIgnored(routeDir)) {
46
+ routeIgnored++;
47
+ continue;
48
+ }
49
+ if (toolFiles.has(routeDir) || routeContent.includes('withAiTool(')) {
50
+ routeCovered++;
51
+ }
52
+ else {
53
+ uncoveredRoutes.push(routeFile.replace(opts.rootDir + '/', ''));
54
+ }
55
+ }
56
+ const routeTotal = routeFiles.length - routeIgnored;
57
+ // Component coverage
58
+ const componentsDir = join(opts.rootDir, opts.componentsDir);
59
+ const componentDirs = await getSubdirectories(componentsDir);
60
+ const uiToolDirs = new Set((await findFiles(componentsDir, opts.uiToolFileName)).map((f) => f.replace(`/${opts.uiToolFileName}`, '')));
61
+ let componentDirCovered = 0;
62
+ let componentDirIgnored = 0;
63
+ const uncoveredComponents = [];
64
+ for (const dir of componentDirs) {
65
+ if (await isDirAiIgnored(dir)) {
66
+ componentDirIgnored++;
67
+ continue;
68
+ }
69
+ if (uiToolDirs.has(dir)) {
70
+ componentDirCovered++;
71
+ }
72
+ else {
73
+ uncoveredComponents.push(dir.replace(opts.rootDir + '/', ''));
74
+ }
75
+ }
76
+ const componentDirTotal = componentDirs.length - componentDirIgnored;
77
+ // SharedWith analysis
78
+ const sharedWithConfigs = [];
79
+ for (const file of endpointScan.files) {
80
+ const content = await readFileSafe(file.absolutePath);
81
+ const toolBlocksArr = extractBalancedBlocks(content, /define(?:Ai)?EndpointTool\(\s*/);
82
+ for (const block of toolBlocksArr) {
83
+ const sharedMatch = block.match(/sharedWith\s*:\s*\[([^\]]*)\]/);
84
+ if (!sharedMatch)
85
+ continue;
86
+ const toolNameMatch = block.match(/toolName\s*:\s*['"`]([^'"`]+)['"`]/);
87
+ const moduleMatch = block.match(/module\s*:\s*['"`]([^'"`]+)['"`]/);
88
+ if (!toolNameMatch)
89
+ continue;
90
+ const sharedWith = sharedMatch[1]
91
+ .match(/['"`]([^'"`]+)['"`]/g)
92
+ ?.map((s) => s.replace(/['"`]/g, ''));
93
+ if (sharedWith && sharedWith.length > 0) {
94
+ sharedWithConfigs.push({
95
+ toolName: toolNameMatch[1],
96
+ primaryModule: moduleMatch?.[1] ?? 'unknown',
97
+ sharedWith,
98
+ });
99
+ }
100
+ }
101
+ }
102
+ // Handler source-scan: find useAiClientAction() calls in .tsx files
103
+ // In monorepos, scan all configured dirs + default src/
104
+ const handlerScanDirs = [
105
+ join(opts.rootDir, 'src'),
106
+ ...(opts.nestjsDirs ?? []),
107
+ join(opts.rootDir, opts.componentsDir),
108
+ ].filter((d, i, arr) => arr.indexOf(d) === i); // dedupe
109
+ const tsxFiles = [];
110
+ for (const dir of handlerScanDirs) {
111
+ tsxFiles.push(...await findTsxFiles(dir));
112
+ }
113
+ const requiredActionIds = new Set(actionIds.map((a) => a.actionId));
114
+ const foundHandlerIds = new Set();
115
+ const allSourceHandlers = [];
116
+ for (const tsxFile of tsxFiles) {
117
+ const content = await readFileSafe(tsxFile);
118
+ if (content.includes('@ai-ignore'))
119
+ continue;
120
+ // Match useAiClientAction('actionId', ...) calls
121
+ const handlerMatches = content.matchAll(/useAiClientAction\(\s*['"`]([^'"`]+)['"`]/g);
122
+ for (const m of handlerMatches) {
123
+ const actionId = m[1];
124
+ foundHandlerIds.add(actionId);
125
+ allSourceHandlers.push({
126
+ actionId,
127
+ sourceFile: tsxFile.replace(opts.rootDir + '/', ''),
128
+ });
129
+ }
130
+ }
131
+ const handlerCoveredCount = Array.from(requiredActionIds).filter((id) => foundHandlerIds.has(id)).length;
132
+ const handlerTotalCount = requiredActionIds.size;
133
+ // Orphan handlers: registered in source but no matching UI tool actionId
134
+ const orphanHandlers = allSourceHandlers.filter((h) => !requiredActionIds.has(h.actionId));
135
+ // Missing handlers: actionIds defined in UI tools but no useAiClientAction found
136
+ const missingHandlers = actionIds
137
+ .filter((a) => !foundHandlerIds.has(a.actionId))
138
+ .map((a) => ({
139
+ actionId: a.actionId,
140
+ toolName: a.toolName,
141
+ sourceFile: a.sourceFile,
142
+ }));
143
+ return {
144
+ endpointToolCount: endpointScan.toolCount,
145
+ endpointFileCount: endpointScan.files.length,
146
+ uiToolCount: uiScan.toolCount,
147
+ uiFileCount: uiScan.files.length,
148
+ actionIdCount: actionIds.length,
149
+ routeTotal,
150
+ routeCovered,
151
+ routeIgnored,
152
+ routeCoveragePercent: routeTotal > 0 ? Math.round((routeCovered / routeTotal) * 100) : 100,
153
+ componentDirTotal,
154
+ componentDirCovered,
155
+ componentDirIgnored,
156
+ componentCoveragePercent: componentDirTotal > 0
157
+ ? Math.round((componentDirCovered / componentDirTotal) * 100)
158
+ : 100,
159
+ sharedWithConfigs,
160
+ handlerActionIds: Array.from(foundHandlerIds),
161
+ handlerCoveredCount,
162
+ handlerTotalCount,
163
+ handlerCoveragePercent: handlerTotalCount > 0
164
+ ? Math.round((handlerCoveredCount / handlerTotalCount) * 100)
165
+ : 100,
166
+ orphanHandlers,
167
+ uncoveredRoutes,
168
+ uncoveredComponents,
169
+ missingHandlers,
170
+ nestControllerTotal,
171
+ nestControllerCovered,
172
+ nestControllerIgnored,
173
+ nestControllerCoveragePercent: nestControllerTotal > 0
174
+ ? Math.round((nestControllerCovered / nestControllerTotal) * 100)
175
+ : 100,
176
+ nestToolCount,
177
+ uncoveredNestControllers,
178
+ };
179
+ }
180
+ /**
181
+ * Recursively find all .tsx files in a directory.
182
+ */
183
+ async function findTsxFiles(dir) {
184
+ const results = [];
185
+ async function walk(currentDir) {
186
+ let entries;
187
+ try {
188
+ entries = await readdir(currentDir, { withFileTypes: true });
189
+ }
190
+ catch {
191
+ return;
192
+ }
193
+ for (const entry of entries) {
194
+ const fullPath = join(currentDir, entry.name);
195
+ if (entry.isDirectory()) {
196
+ if (entry.name === 'node_modules' || entry.name === '.git')
197
+ continue;
198
+ await walk(fullPath);
199
+ }
200
+ else if (entry.name.endsWith('.tsx')) {
201
+ results.push(fullPath);
202
+ }
203
+ }
204
+ }
205
+ await walk(dir);
206
+ return results.sort();
207
+ }
208
+ /**
209
+ * Format a coverage report as a rich, color-coded human-readable string.
210
+ */
211
+ export function formatCoverageReport(report, options) {
212
+ if (options?.quiet) {
213
+ return formatCoverageReportQuiet(report);
214
+ }
215
+ const lines = [];
216
+ const hasHandlerIssues = report.missingHandlers.length > 0;
217
+ const hasOrphanHandlers = report.orphanHandlers.length > 0;
218
+ const hasRouteIssues = report.uncoveredRoutes.length > 0;
219
+ const hasComponentIssues = report.uncoveredComponents.length > 0;
220
+ const hasNestIssues = report.uncoveredNestControllers.length > 0;
221
+ const hasIssues = hasHandlerIssues || hasOrphanHandlers || hasRouteIssues || hasComponentIssues || hasNestIssues;
222
+ // Detect active frameworks from scan results
223
+ const hasNextRoutes = report.routeTotal > 0 || report.endpointFileCount > 0;
224
+ const hasNest = report.nestControllerTotal > 0 || report.nestToolCount > 0;
225
+ // Header
226
+ lines.push(header('AI Tools Coverage Summary'));
227
+ // Endpoint Tools — framework-adaptive detail
228
+ const totalEndpointTools = report.endpointToolCount + report.nestToolCount;
229
+ const endpointParts = [];
230
+ if (hasNextRoutes || (!hasNest && report.endpointFileCount === 0)) {
231
+ endpointParts.push(`${report.endpointFileCount} route files`);
232
+ }
233
+ if (hasNest) {
234
+ endpointParts.push(`${report.nestControllerCovered} controllers`);
235
+ }
236
+ lines.push(metricLine('\u2713', colors.green, 'Endpoint Tools:', totalEndpointTools, endpointParts.join(' + ')));
237
+ lines.push(metricLine('\u2713', colors.green, 'UI Tools (ai-ui-tool.ts):', report.uiToolCount, `${report.uiFileCount} files`));
238
+ const handlerIcon = hasHandlerIssues ? '\u26A0' : '\u2713';
239
+ const handlerColor = hasHandlerIssues ? colors.yellow : colors.green;
240
+ lines.push(metricLine(handlerIcon, handlerColor, 'Handler Coverage:', `${report.handlerCoveragePercent}%`, `${report.handlerCoveredCount}/${report.handlerTotalCount}`));
241
+ // Route Coverage — only show when Next.js routes exist or are expected
242
+ if (hasNextRoutes) {
243
+ const routeIcon = hasRouteIssues ? '\u26A0' : '\u2713';
244
+ const routeColor = hasRouteIssues ? colors.yellow : colors.green;
245
+ lines.push(metricLine(routeIcon, routeColor, 'Route Coverage:', `${report.routeCoveragePercent}%`, `${report.routeCovered}/${report.routeTotal} routes${report.routeIgnored > 0 ? `, ${report.routeIgnored} ignored` : ''}`));
246
+ }
247
+ const componentIcon = hasComponentIssues ? '\u26A0' : '\u2713';
248
+ const componentColor = hasComponentIssues ? colors.yellow : colors.green;
249
+ lines.push(metricLine(componentIcon, componentColor, 'Component Coverage:', `${report.componentCoveragePercent}%`, `${report.componentDirCovered}/${report.componentDirTotal} dirs${report.componentDirIgnored > 0 ? `, ${report.componentDirIgnored} ignored` : ''}`));
250
+ // NestJS Decorator Coverage — only show when NestJS is detected
251
+ if (hasNest) {
252
+ const nestIcon = report.uncoveredNestControllers.length > 0 ? '\u26A0' : '\u2713';
253
+ const nestColor = report.uncoveredNestControllers.length > 0 ? colors.yellow : colors.green;
254
+ lines.push(metricLine(nestIcon, nestColor, 'Decorator Coverage (@AiTool):', `${report.nestControllerCoveragePercent}%`, `${report.nestControllerCovered}/${report.nestControllerTotal} controllers`));
255
+ }
256
+ const sharedCount = report.sharedWithConfigs.length;
257
+ lines.push(metricLine('\u2713', colors.green, 'Cross-Module Sharing:', sharedCount > 0 ? `${sharedCount} Tools` : 'None'));
258
+ lines.push('');
259
+ lines.push(separator());
260
+ // --- Detail sections (conditional) ---
261
+ // Missing handlers
262
+ if (hasHandlerIssues) {
263
+ lines.push('');
264
+ lines.push(sectionHeader('Missing Handlers', report.missingHandlers.length, colors.red));
265
+ for (const h of report.missingHandlers) {
266
+ lines.push(` ${colors.red}\u2717${colors.reset} ${colors.bold}${h.actionId}${colors.reset}` +
267
+ ` ${colors.dim}\u2190 ${h.toolName}${colors.reset}`);
268
+ lines.push(` ${colors.dim}Defined in: ${h.sourceFile}${colors.reset}`);
269
+ }
270
+ }
271
+ // Orphan handlers
272
+ if (hasOrphanHandlers) {
273
+ lines.push('');
274
+ lines.push(sectionHeader('Orphan Handlers', report.orphanHandlers.length, colors.yellow));
275
+ lines.push(`${colors.dim}These handlers have no corresponding UI tool definition:${colors.reset}`);
276
+ for (const o of report.orphanHandlers) {
277
+ lines.push(` ${colors.yellow}\u26A0${colors.reset} ${colors.bold}${o.actionId}${colors.reset}` +
278
+ ` ${colors.dim}\u2192 ${o.sourceFile}${colors.reset}`);
279
+ }
280
+ }
281
+ // Uncovered routes
282
+ if (hasRouteIssues) {
283
+ lines.push('');
284
+ lines.push(sectionHeader('Routes without ai-tool.ts', report.uncoveredRoutes.length, colors.yellow));
285
+ for (const route of report.uncoveredRoutes) {
286
+ lines.push(` ${colors.yellow}\u26A0${colors.reset} ${route}`);
287
+ lines.push(` ${colors.cyan}\u2192 glirastes scaffold --route "${route}"${colors.reset}`);
288
+ }
289
+ lines.push(`\n${colors.dim}Or add // @ai-ignore to route.ts to exclude${colors.reset}`);
290
+ }
291
+ // Uncovered components
292
+ if (hasComponentIssues) {
293
+ lines.push('');
294
+ lines.push(sectionHeader('Components without ai-ui-tool.ts', report.uncoveredComponents.length, colors.yellow));
295
+ for (const dir of report.uncoveredComponents) {
296
+ lines.push(` ${colors.yellow}\u26A0${colors.reset} ${dir}/`);
297
+ lines.push(` ${colors.cyan}\u2192 Create ${dir}/ai-ui-tool.ts${colors.reset}`);
298
+ }
299
+ lines.push(`\n${colors.dim}Or add // @ai-ignore to any .ts/.tsx file or create .ai-ignore to exclude${colors.reset}`);
300
+ }
301
+ // Uncovered NestJS controllers
302
+ if (report.uncoveredNestControllers.length > 0) {
303
+ lines.push('');
304
+ lines.push(sectionHeader('NestJS controllers without @AiTool', report.uncoveredNestControllers.length, colors.yellow));
305
+ lines.push(`${colors.dim}These controllers have HTTP endpoints but no @AiTool decorators:${colors.reset}`);
306
+ for (const ctrl of report.uncoveredNestControllers) {
307
+ const relPath = ctrl.controllerFile.includes('/src/')
308
+ ? ctrl.controllerFile.slice(ctrl.controllerFile.indexOf('/src/') + 1)
309
+ : ctrl.controllerFile;
310
+ lines.push(` ${colors.yellow}\u26A0${colors.reset} ${colors.bold}${ctrl.controllerName}${colors.reset}` +
311
+ ` ${colors.dim}(${ctrl.httpMethodCount} endpoints)${colors.reset}`);
312
+ lines.push(` ${colors.dim}${relPath}${colors.reset}`);
313
+ lines.push(` ${colors.cyan}\u2192 Add @AiModule + @AiTool decorators, or create .ai-ignore to exclude${colors.reset}`);
314
+ }
315
+ }
316
+ // SharedWith configurations (when no issues — show as positive info)
317
+ if (sharedCount > 0 && !hasIssues) {
318
+ lines.push('');
319
+ lines.push(sectionHeader('Cross-Module Sharing', sharedCount, colors.green));
320
+ for (const config of report.sharedWithConfigs) {
321
+ lines.push(` ${colors.green}\u2713${colors.reset} ${colors.bold}${config.toolName}${colors.reset}` +
322
+ ` ${colors.dim}(${config.primaryModule})${colors.reset}` +
323
+ ` \u2192 ${config.sharedWith.join(', ')}`);
324
+ }
325
+ }
326
+ // Final summary
327
+ lines.push('');
328
+ lines.push(separator());
329
+ lines.push('');
330
+ const totalTools = report.endpointToolCount + report.uiToolCount + report.nestToolCount;
331
+ const summaryIcon = hasIssues ? '\u26A0\uFE0F' : '\u2705';
332
+ const summaryColor = hasIssues ? colors.yellow : colors.green;
333
+ lines.push(`${summaryColor}${summaryIcon} Total: ${colors.bold}${totalTools} AI Tools${colors.reset}`);
334
+ lines.push('');
335
+ // Framework-adaptive summary lines
336
+ if (hasNextRoutes) {
337
+ lines.push(` ${colors.dim}Routes: ${report.routeCovered}/${report.routeTotal} have ai-tool.ts (${report.endpointToolCount} tools)${colors.reset}`);
338
+ }
339
+ if (hasNest) {
340
+ lines.push(` ${colors.dim}Controllers: ${report.nestControllerCovered}/${report.nestControllerTotal} have @AiTool decorators (${report.nestToolCount} tools)${colors.reset}`);
341
+ }
342
+ lines.push(` ${colors.dim}Components: ${report.componentDirCovered}/${report.componentDirTotal} have ai-ui-tool.ts (${report.uiToolCount} tools)${colors.reset}`);
343
+ lines.push(` ${colors.dim}Handlers: ${report.handlerCoveredCount}/${report.handlerTotalCount} actionIds have useAiClientAction${colors.reset}`);
344
+ lines.push('');
345
+ return lines.join('\n');
346
+ }
347
+ /**
348
+ * Minimal quiet output for predev/prebuild hooks.
349
+ */
350
+ function formatCoverageReportQuiet(report) {
351
+ const issues = [];
352
+ if (report.uncoveredRoutes.length > 0) {
353
+ issues.push(`${report.uncoveredRoutes.length} uncovered routes`);
354
+ }
355
+ if (report.uncoveredComponents.length > 0) {
356
+ issues.push(`${report.uncoveredComponents.length} uncovered components`);
357
+ }
358
+ if (report.missingHandlers.length > 0) {
359
+ issues.push(`${report.missingHandlers.length} missing handlers`);
360
+ }
361
+ if (report.orphanHandlers.length > 0) {
362
+ issues.push(`${report.orphanHandlers.length} orphan handlers`);
363
+ }
364
+ if (report.uncoveredNestControllers.length > 0) {
365
+ issues.push(`${report.uncoveredNestControllers.length} uncovered NestJS controllers`);
366
+ }
367
+ if (issues.length === 0) {
368
+ return `${colors.green}\u2713${colors.reset} AI coverage: ${report.endpointToolCount + report.uiToolCount + report.nestToolCount} tools, all OK`;
369
+ }
370
+ return `${colors.yellow}\u26A0${colors.reset} AI coverage: ${issues.join(', ')}`;
371
+ }
372
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/codegen/coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { GenerateOptions, ScanResult } from './types.js';
2
+ /**
3
+ * Scan for endpoint tool files (ai-tool.ts) in the API directory.
4
+ * Also detects route.ts files using withAiTool() from glirastes/server/nextjs.
5
+ */
6
+ export declare function scanEndpointTools(options: GenerateOptions): Promise<ScanResult>;
7
+ /**
8
+ * Generate the endpoint tools registry file.
9
+ *
10
+ * Output: a TypeScript file that imports all discovered endpoint tools and
11
+ * combines them into a single registry via endpointToolsToRegistry().
12
+ */
13
+ export declare function generateEndpointRegistry(options: GenerateOptions): Promise<{
14
+ outputPath: string;
15
+ toolCount: number;
16
+ }>;
@@ -0,0 +1,161 @@
1
+ import { writeFile, mkdir } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ import { findFiles, findRouteFiles, toImportPath, readFileSafe, isDirAiIgnored } from './fs-utils.js';
4
+ import { resolveDefaults } from './types.js';
5
+ /**
6
+ * Scan for endpoint tool files (ai-tool.ts) in the API directory.
7
+ * Also detects route.ts files using withAiTool() from glirastes/server/nextjs.
8
+ */
9
+ export async function scanEndpointTools(options) {
10
+ const opts = resolveDefaults(options);
11
+ const apiDir = join(opts.rootDir, opts.apiDir);
12
+ const files = await findFiles(apiDir, opts.endpointToolFileName);
13
+ const discovered = [];
14
+ const discoveredDirs = new Set();
15
+ // 1. Standard ai-tool.ts files
16
+ for (const absolutePath of files) {
17
+ const content = await readFileSafe(absolutePath);
18
+ if (content.includes('@ai-ignore'))
19
+ continue;
20
+ if (await isDirAiIgnored(dirname(absolutePath)))
21
+ continue;
22
+ const hasArray = /export\s+const\s+aiTools\s*[=:]/m.test(content);
23
+ const hasSingle = /export\s+const\s+aiTool\s*[=:]/m.test(content);
24
+ if (!hasArray && !hasSingle)
25
+ continue;
26
+ discovered.push({
27
+ absolutePath,
28
+ relativePath: absolutePath.replace(opts.rootDir + '/', ''),
29
+ importPath: toImportPath(absolutePath, opts.rootDir),
30
+ exportType: hasArray ? 'array' : 'single',
31
+ });
32
+ discoveredDirs.add(dirname(absolutePath));
33
+ }
34
+ // 2. route.ts files with withAiTool() (inline tool definitions)
35
+ const routeFiles = await findRouteFiles(apiDir);
36
+ for (const routeFile of routeFiles) {
37
+ const routeDir = dirname(routeFile);
38
+ if (discoveredDirs.has(routeDir))
39
+ continue; // Already has ai-tool.ts
40
+ const content = await readFileSafe(routeFile);
41
+ if (content.includes('@ai-ignore'))
42
+ continue;
43
+ if (await isDirAiIgnored(routeDir))
44
+ continue;
45
+ if (!content.includes('withAiTool('))
46
+ continue;
47
+ discovered.push({
48
+ absolutePath: routeFile,
49
+ relativePath: routeFile.replace(opts.rootDir + '/', ''),
50
+ importPath: toImportPath(routeFile, opts.rootDir),
51
+ exportType: 'single', // withAiTool wraps a single handler
52
+ });
53
+ }
54
+ // Count tools (rough estimate: arrays have multiple, singles have 1)
55
+ let toolCount = 0;
56
+ for (const file of discovered) {
57
+ if (file.exportType === 'array') {
58
+ const content = await readFileSafe(file.absolutePath);
59
+ // Count defineEndpointTool or defineAiEndpointTool calls
60
+ const matches = content.match(/define(?:Ai)?EndpointTool\(/g);
61
+ toolCount += matches?.length ?? 1;
62
+ }
63
+ else {
64
+ toolCount += 1;
65
+ }
66
+ }
67
+ return { files: discovered, toolCount };
68
+ }
69
+ /**
70
+ * Generate the endpoint tools registry file.
71
+ *
72
+ * Output: a TypeScript file that imports all discovered endpoint tools and
73
+ * combines them into a single registry via endpointToolsToRegistry().
74
+ */
75
+ export async function generateEndpointRegistry(options) {
76
+ const opts = resolveDefaults(options);
77
+ const scan = await scanEndpointTools(options);
78
+ // NestJS @AiTool decorated controllers
79
+ let nestTools = [];
80
+ if (opts.nestjsDirs.length > 0) {
81
+ const { scanNestControllers } = await import('./nestjs-scanner.js');
82
+ const nestResult = await scanNestControllers(opts.nestjsDirs, opts.nestjsApiPrefix);
83
+ nestTools = nestResult.tools;
84
+ }
85
+ const imports = [];
86
+ const spreadParts = [];
87
+ scan.files.forEach((file, index) => {
88
+ if (file.exportType === 'array') {
89
+ const alias = `endpointTools${index}`;
90
+ imports.push(`import { aiTools as ${alias} } from '${file.importPath}';`);
91
+ spreadParts.push(`...${alias}`);
92
+ }
93
+ else {
94
+ const alias = `endpointTool${index}`;
95
+ imports.push(`import { aiTool as ${alias} } from '${file.importPath}';`);
96
+ spreadParts.push(alias);
97
+ }
98
+ });
99
+ // Generate inline defineEndpointTool() calls for NestJS tools
100
+ const nestInlineDefs = [];
101
+ const nestSpreadParts = [];
102
+ nestTools.forEach((tool, index) => {
103
+ const alias = `nestTool${index}`;
104
+ const desc = tool.description.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
105
+ // Build path param schema fields (e.g. { id: z.string() })
106
+ const paramFields = tool.pathParams.map(p => `${p}: z.string()`).join(', ');
107
+ const inputSchema = paramFields
108
+ ? `z.object({ ${paramFields} }).passthrough()`
109
+ : 'z.object({}).passthrough()';
110
+ const lines = [
111
+ ` id: '${tool.name}'`,
112
+ ` toolName: '${tool.name}'`,
113
+ ` description: '${desc}'`,
114
+ ` path: '${tool.path}'`,
115
+ ` method: '${tool.method}'`,
116
+ ` inputSchema: ${inputSchema}`,
117
+ ];
118
+ if (tool.module)
119
+ lines.push(` module: '${tool.module}'`);
120
+ if (tool.needsApproval !== undefined)
121
+ lines.push(` needsApproval: ${tool.needsApproval}`);
122
+ if (tool.allowedRoles && tool.allowedRoles.length > 0) {
123
+ lines.push(` allowedRoles: ${JSON.stringify(tool.allowedRoles)}`);
124
+ }
125
+ nestInlineDefs.push(`const ${alias} = defineEndpointTool({\n${lines.join(',\n')},\n});`);
126
+ nestSpreadParts.push(alias);
127
+ });
128
+ const allSpreadParts = [...spreadParts, ...nestSpreadParts];
129
+ const totalToolCount = scan.toolCount + nestTools.length;
130
+ const contractsImport = nestTools.length > 0
131
+ ? `import { z } from 'zod';\nimport { defineEndpointTool } from 'glirastes';\n`
132
+ : '';
133
+ const nestInlineBlock = nestInlineDefs.length > 0
134
+ ? `\n// From NestJS @AiTool decorators\n${nestInlineDefs.join('\n\n')}\n`
135
+ : '';
136
+ const code = `/* eslint-disable */
137
+ /**
138
+ * AUTO-GENERATED FILE — do not edit manually.
139
+ * Generated by glirastes
140
+ *
141
+ * Sources: ${scan.files.length} ai-tool.ts files, ${nestTools.length} NestJS @AiTool decorators
142
+ * Tools: ${totalToolCount}
143
+ */
144
+
145
+ ${imports.join('\n')}
146
+ import { endpointToolsToRegistry } from 'glirastes/server';
147
+ ${contractsImport}${nestInlineBlock}
148
+ const endpointTools = [${allSpreadParts.join(', ')}] as const;
149
+
150
+ export { endpointTools };
151
+ export const endpointToolRegistry = endpointToolsToRegistry(endpointTools);
152
+ `;
153
+ const outputPath = join(opts.rootDir, opts.outputDir, 'endpoint.generated.ts');
154
+ await mkdir(dirname(outputPath), { recursive: true });
155
+ await writeFile(outputPath, code, 'utf-8');
156
+ if (!opts.quiet) {
157
+ console.log(`✓ Generated ${outputPath} (${totalToolCount} endpoint tools from ${scan.files.length} files + ${nestTools.length} NestJS controllers)`);
158
+ }
159
+ return { outputPath, toolCount: totalToolCount };
160
+ }
161
+ //# sourceMappingURL=endpoint-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-scanner.js","sourceRoot":"","sources":["../../src/codegen/endpoint-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shared ANSI color codes and formatting utilities for CLI output.
3
+ */
4
+ export declare const colors: {
5
+ reset: string;
6
+ bold: string;
7
+ dim: string;
8
+ red: string;
9
+ green: string;
10
+ yellow: string;
11
+ blue: string;
12
+ cyan: string;
13
+ };
14
+ export declare function separator(width?: number): string;
15
+ export declare function header(title: string): string;
16
+ export declare function sectionHeader(title: string, count: number, color: string): string;
17
+ export declare function metricLine(icon: string, iconColor: string, label: string, value: string | number, detail?: string): string;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Shared ANSI color codes and formatting utilities for CLI output.
3
+ */
4
+ export const colors = {
5
+ reset: '\x1b[0m',
6
+ bold: '\x1b[1m',
7
+ dim: '\x1b[2m',
8
+ red: '\x1b[31m',
9
+ green: '\x1b[32m',
10
+ yellow: '\x1b[33m',
11
+ blue: '\x1b[34m',
12
+ cyan: '\x1b[36m',
13
+ };
14
+ export function separator(width = 50) {
15
+ return `${colors.dim}${'─'.repeat(width)}${colors.reset}`;
16
+ }
17
+ export function header(title) {
18
+ return `\n${colors.blue}${colors.bold}${title}${colors.reset}\n\n${separator()}\n`;
19
+ }
20
+ export function sectionHeader(title, count, color) {
21
+ return `${color}${colors.bold}${title} (${count}):${colors.reset}\n`;
22
+ }
23
+ export function metricLine(icon, iconColor, label, value, detail) {
24
+ const paddedLabel = label.padEnd(35);
25
+ const detailStr = detail ? ` ${colors.dim}(${detail})${colors.reset}` : '';
26
+ return ` ${iconColor}${icon}${colors.reset} ${paddedLabel}${colors.bold}${value}${colors.reset}${detailStr}`;
27
+ }
28
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/codegen/format.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;CACjB,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,KAAK,GAAG,EAAE;IAClC,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,KAAK,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,OAAO,SAAS,EAAE,IAAI,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,KAAa,EAAE,KAAa;IACvE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,KAAK,KAAK,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,SAAiB,EACjB,KAAa,EACb,KAAsB,EACtB,MAAe;IAEf,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,OAAO,KAAK,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,WAAW,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,SAAS,EAAE,CAAC;AAChH,CAAC"}