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,166 @@
1
+ function isRecord(value) {
2
+ return typeof value === 'object' && value !== null;
3
+ }
4
+ function extractUiAction(result) {
5
+ if (result.uiAction !== undefined)
6
+ return result.uiAction;
7
+ if (isRecord(result.data) && result.data.uiAction !== undefined) {
8
+ return result.data.uiAction;
9
+ }
10
+ return undefined;
11
+ }
12
+ function hasSuccessfulResult(result) {
13
+ if (result.success === true)
14
+ return true;
15
+ return isRecord(result.data) && result.data.success === true;
16
+ }
17
+ function safeStringify(value) {
18
+ try {
19
+ return JSON.stringify(value);
20
+ }
21
+ catch {
22
+ return '[unserializable]';
23
+ }
24
+ }
25
+ /**
26
+ * Create a tool result handler that processes tool outputs for UI-side actions.
27
+ *
28
+ * Extracts `uiAction` from tool results, validates against an optional schema,
29
+ * and routes to the appropriate handler based on action type.
30
+ *
31
+ * Supports convention-based entity actions (`{entity}-created`, `{entity}-updated`,
32
+ * `{entity}-deleted`), `run-client-action`, and custom action handlers.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * import { createToolResultHandler } from '../index.js';
37
+ * import { dispatchAiClientAction } from '../ui/index.js';
38
+ *
39
+ * const handleToolResult = createToolResultHandler({
40
+ * uiActionSchema: mySchema,
41
+ * entityListDestinations: { task: '/tasks', group: '/groups' },
42
+ * onNavigate: (dest) => router.push(dest),
43
+ * onOpenDetail: (entity, id) => openPanel(entity, id),
44
+ * onClientAction: (actionId, payload) => dispatchAiClientAction({ actionId, payload }),
45
+ * onSuccess: () => window.dispatchEvent(new CustomEvent('data-refresh')),
46
+ * actionHandlers: {
47
+ * 'set-filters': (action) => {
48
+ * window.dispatchEvent(new CustomEvent('ai-set-filters', { detail: action.filters }));
49
+ * },
50
+ * },
51
+ * });
52
+ *
53
+ * // Wire into AiChatProvider or use in useEffect:
54
+ * <AiChatProvider onToolResult={handleToolResult} ... />
55
+ * ```
56
+ */
57
+ export function createToolResultHandler(config) {
58
+ const { uiActionSchema, actionHandlers = {}, entityListDestinations = {}, onNavigate, onOpenDetail, onClientAction, onSuccess, toolFallbacks = {}, clientActionDedupe, } = config;
59
+ const dedupeEnabled = clientActionDedupe?.enabled ?? false;
60
+ const dedupeWindowMs = clientActionDedupe?.windowMs ?? 1500;
61
+ const dedupeActionIds = clientActionDedupe?.actionIds ?? ['navigate'];
62
+ const recentClientActions = new Map();
63
+ return (toolName, result) => {
64
+ if (!isRecord(result))
65
+ return;
66
+ let handledByAction = false;
67
+ const uiActionCandidate = extractUiAction(result);
68
+ if (uiActionCandidate !== undefined) {
69
+ // Normalize to array for uniform processing (supports compound actions)
70
+ const candidates = Array.isArray(uiActionCandidate)
71
+ ? uiActionCandidate
72
+ : [uiActionCandidate];
73
+ for (const candidate of candidates) {
74
+ // Validate if schema provided
75
+ let uiAction;
76
+ if (uiActionSchema) {
77
+ const parsed = uiActionSchema.safeParse(candidate);
78
+ if (!parsed.success) {
79
+ console.warn('[AI Chat] Invalid uiAction dropped:', parsed.error.issues);
80
+ continue;
81
+ }
82
+ uiAction = parsed.data;
83
+ }
84
+ else {
85
+ if (!isRecord(candidate))
86
+ continue;
87
+ uiAction = candidate;
88
+ }
89
+ const actionType = typeof uiAction.type === 'string' ? uiAction.type : '';
90
+ // Convention-based entity actions: {entity}-{created|updated|deleted}
91
+ const entityMatch = actionType.match(/^(\w+)-(created|updated|deleted)$/);
92
+ if (entityMatch) {
93
+ const [, entity, action] = entityMatch;
94
+ const idKey = `${entity}Id`;
95
+ const entityId = uiAction[idKey];
96
+ if (action === 'created' && entityListDestinations[entity] && onNavigate) {
97
+ onNavigate(entityListDestinations[entity], entity);
98
+ handledByAction = true;
99
+ }
100
+ if (action === 'updated' && typeof entityId === 'string' && onOpenDetail) {
101
+ onOpenDetail(entity, entityId);
102
+ handledByAction = true;
103
+ }
104
+ if (action === 'deleted' && entityListDestinations[entity] && onNavigate) {
105
+ onNavigate(entityListDestinations[entity], entity);
106
+ handledByAction = true;
107
+ }
108
+ }
109
+ // run-client-action
110
+ if (actionType === 'run-client-action' && onClientAction) {
111
+ const actionId = typeof uiAction.actionId === 'string' ? uiAction.actionId : '';
112
+ const payload = isRecord(uiAction.payload) ? uiAction.payload : undefined;
113
+ if (actionId) {
114
+ if (dedupeEnabled && dedupeActionIds.includes(actionId)) {
115
+ const key = `${actionId}:${safeStringify(payload)}`;
116
+ const now = Date.now();
117
+ const lastSeen = recentClientActions.get(key);
118
+ if (lastSeen && now - lastSeen < dedupeWindowMs) {
119
+ handledByAction = true;
120
+ continue;
121
+ }
122
+ recentClientActions.set(key, now);
123
+ }
124
+ onClientAction(actionId, payload);
125
+ handledByAction = true;
126
+ }
127
+ }
128
+ // Built-in navigate: route through onClientAction so consumers
129
+ // only need useAiClientAction('navigate', ...) — no raw CustomEvent.
130
+ if (actionType === 'navigate' && onClientAction) {
131
+ const path = typeof uiAction.path === 'string' ? uiAction.path : '';
132
+ if (path) {
133
+ if (dedupeEnabled && dedupeActionIds.includes('navigate')) {
134
+ const key = `navigate:${path}`;
135
+ const now = Date.now();
136
+ const lastSeen = recentClientActions.get(key);
137
+ if (lastSeen && now - lastSeen < dedupeWindowMs) {
138
+ handledByAction = true;
139
+ continue;
140
+ }
141
+ recentClientActions.set(key, now);
142
+ }
143
+ onClientAction('navigate', { path });
144
+ handledByAction = true;
145
+ continue; // skip actionHandlers fallback for navigate
146
+ }
147
+ }
148
+ // Custom action handlers
149
+ if (actionHandlers[actionType]) {
150
+ actionHandlers[actionType](uiAction);
151
+ handledByAction = true;
152
+ }
153
+ }
154
+ }
155
+ const successful = hasSuccessfulResult(result);
156
+ // Tool-specific fallback when no action was processed
157
+ if (!handledByAction && successful && toolFallbacks[toolName]) {
158
+ toolFallbacks[toolName](result);
159
+ }
160
+ // Global success callback
161
+ if (successful && onSuccess) {
162
+ onSuccess(toolName, result);
163
+ }
164
+ };
165
+ }
166
+ //# sourceMappingURL=create-tool-result-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-tool-result-handler.js","sourceRoot":"","sources":["../../../src/react/utils/create-tool-result-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Mention, MentionData, MentionSerializationConfig } from '../types.js';
2
+ export declare function stripContextBlocks(text: string): string;
3
+ export declare function inferMentionPrefix(type: string): string;
4
+ export declare function normalizeMentionSlug(value: string): string;
5
+ export type MentionTextSegment = {
6
+ kind: 'text';
7
+ text: string;
8
+ } | {
9
+ kind: 'mention';
10
+ mention: Mention;
11
+ };
12
+ export declare function parseMentionSegments(text: string): MentionTextSegment[];
13
+ export declare function serializeMentionsForSend(text: string, mentions: MentionData[], options?: MentionSerializationConfig): string;
@@ -0,0 +1,111 @@
1
+ const CONTEXT_BLOCK_RE = /<!--\s*context:[\s\S]*?-->\s*/gi;
2
+ const MENTION_MARKER_RE = /\{\{mention:([^:}]+):([^:}]+):([^}]+)\}\}/g;
3
+ function escapeRegex(value) {
4
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
5
+ }
6
+ export function stripContextBlocks(text) {
7
+ return text.replace(CONTEXT_BLOCK_RE, '').trimStart();
8
+ }
9
+ export function inferMentionPrefix(type) {
10
+ return type === 'task' || type === 'command' ? '/' : '@';
11
+ }
12
+ export function normalizeMentionSlug(value) {
13
+ return value
14
+ .toLowerCase()
15
+ .normalize('NFKD')
16
+ .replace(/[^\w\s-]/g, '')
17
+ .trim()
18
+ .replace(/\s+/g, '-');
19
+ }
20
+ export function parseMentionSegments(text) {
21
+ const segments = [];
22
+ let cursor = 0;
23
+ let match;
24
+ MENTION_MARKER_RE.lastIndex = 0;
25
+ while ((match = MENTION_MARKER_RE.exec(text)) !== null) {
26
+ const [raw, type, id, label] = match;
27
+ const start = match.index;
28
+ const end = start + raw.length;
29
+ if (start > cursor) {
30
+ segments.push({ kind: 'text', text: text.slice(cursor, start) });
31
+ }
32
+ segments.push({
33
+ kind: 'mention',
34
+ mention: {
35
+ id,
36
+ type,
37
+ displayName: label,
38
+ prefix: inferMentionPrefix(type),
39
+ },
40
+ });
41
+ cursor = end;
42
+ }
43
+ if (cursor < text.length) {
44
+ segments.push({ kind: 'text', text: text.slice(cursor) });
45
+ }
46
+ return segments;
47
+ }
48
+ function buildContextBlock(mentions, label) {
49
+ if (mentions.length === 0)
50
+ return null;
51
+ const summary = mentions
52
+ .map((m) => {
53
+ const displayName = m.displayName ?? m.label ?? m.id;
54
+ return `${displayName} (ID: ${m.id})`;
55
+ })
56
+ .join(', ');
57
+ return `<!--context:[${label}: ${summary}]--> `;
58
+ }
59
+ export function serializeMentionsForSend(text, mentions, options) {
60
+ const enabled = options?.enabled ?? true;
61
+ if (!enabled || mentions.length === 0) {
62
+ return stripContextBlocks(text);
63
+ }
64
+ const cleaned = stripContextBlocks(text);
65
+ let nextText = cleaned;
66
+ const serializedMentions = [];
67
+ for (const mention of mentions) {
68
+ const id = typeof mention.id === 'string' ? mention.id : '';
69
+ const type = typeof mention.type === 'string' ? mention.type : '';
70
+ if (!id || !type)
71
+ continue;
72
+ const label = typeof mention.label === 'string'
73
+ ? mention.label
74
+ : typeof mention.displayName === 'string'
75
+ ? mention.displayName
76
+ : id;
77
+ const slug = typeof mention.slug === 'string' && mention.slug.trim().length > 0
78
+ ? mention.slug.trim()
79
+ : normalizeMentionSlug(label);
80
+ const prefix = typeof mention.prefix === 'string' && mention.prefix.length > 0
81
+ ? mention.prefix
82
+ : inferMentionPrefix(type);
83
+ const token = `${prefix}${slug}`;
84
+ const marker = `{{mention:${type}:${id}:${label}}}`;
85
+ const tokenPattern = new RegExp(`(^|\\s)${escapeRegex(token)}(?=\\s|$)`, 'g');
86
+ let wasInserted = false;
87
+ nextText = nextText.replace(tokenPattern, (fullMatch, leading) => {
88
+ wasInserted = true;
89
+ return `${leading}${marker}`;
90
+ });
91
+ if (wasInserted) {
92
+ serializedMentions.push({
93
+ id,
94
+ type,
95
+ label,
96
+ displayName: label,
97
+ slug,
98
+ prefix,
99
+ });
100
+ }
101
+ }
102
+ if (options?.includeContextBlock) {
103
+ const contextLabel = options.contextLabel ?? 'Referenced entities';
104
+ const contextBlock = buildContextBlock(serializedMentions, contextLabel);
105
+ if (contextBlock) {
106
+ return `${contextBlock}${nextText}`.trim();
107
+ }
108
+ }
109
+ return nextText;
110
+ }
111
+ //# sourceMappingURL=mention-markup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mention-markup.js","sourceRoot":"","sources":["../../../src/react/utils/mention-markup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { PipelineStepReport } from '../types.js';
2
+ /**
3
+ * Merge incoming pipeline steps with existing stable state.
4
+ *
5
+ * Handles:
6
+ * - Synthetic resume steps (step 0 with stop reason after approval waits)
7
+ * - Timestamp-based conflict resolution for duplicate step numbers
8
+ * - Stable ordering by step number
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * const [stableSteps, setStableSteps] = useState<PipelineStepReport[]>([]);
13
+ *
14
+ * useEffect(() => {
15
+ * setStableSteps((prev) => mergePipelineSteps(prev, pipelineSteps));
16
+ * }, [pipelineSteps]);
17
+ * ```
18
+ */
19
+ export declare function mergePipelineSteps(previous: PipelineStepReport[], incoming: PipelineStepReport[]): PipelineStepReport[];
@@ -0,0 +1,79 @@
1
+ function parseStepTimestamp(value) {
2
+ const ts = Date.parse(value);
3
+ return Number.isFinite(ts) ? ts : null;
4
+ }
5
+ /**
6
+ * Merge incoming pipeline steps with existing stable state.
7
+ *
8
+ * Handles:
9
+ * - Synthetic resume steps (step 0 with stop reason after approval waits)
10
+ * - Timestamp-based conflict resolution for duplicate step numbers
11
+ * - Stable ordering by step number
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const [stableSteps, setStableSteps] = useState<PipelineStepReport[]>([]);
16
+ *
17
+ * useEffect(() => {
18
+ * setStableSteps((prev) => mergePipelineSteps(prev, pipelineSteps));
19
+ * }, [pipelineSteps]);
20
+ * ```
21
+ */
22
+ export function mergePipelineSteps(previous, incoming) {
23
+ if (incoming.length === 0)
24
+ return [];
25
+ const sorted = [...incoming].sort((a, b) => a.stepNumber - b.stepNumber);
26
+ const previousHasWorkflow = previous.some((step) => step.toolCalls.length > 0 || step.requiresApproval);
27
+ const firstIncoming = sorted[0];
28
+ const isSyntheticResumeStep = firstIncoming &&
29
+ firstIncoming.stepNumber === 0 &&
30
+ firstIncoming.finishReason === 'stop' &&
31
+ firstIncoming.toolCalls.length === 0 &&
32
+ firstIncoming.toolResults === 0 &&
33
+ !firstIncoming.requiresApproval;
34
+ // After an approval wait, the server sends a synthetic step 0 with finishReason='stop'.
35
+ // Instead of replacing previous steps, append it as a final step.
36
+ if (isSyntheticResumeStep && previousHasWorkflow) {
37
+ const resolved = previous.map((step) => step.requiresApproval
38
+ ? { ...step, requiresApproval: false, pendingApprovals: 0 }
39
+ : step);
40
+ const alreadyFinalized = resolved.some((step) => step.finishReason === 'stop' && step.toolCalls.length === 0);
41
+ if (alreadyFinalized)
42
+ return resolved;
43
+ return [
44
+ ...resolved,
45
+ { ...firstIncoming, stepNumber: resolved.length },
46
+ ];
47
+ }
48
+ // Also clear approval flags when execution continues with tool calls after approval.
49
+ // This handles cases where followup tools (like suggest_followups) execute after
50
+ // approval is granted, instead of getting a synthetic resume step.
51
+ const previousHadApprovals = previous.some((step) => step.requiresApproval);
52
+ const incomingAllCleared = sorted.every((step) => step.pendingApprovals === 0);
53
+ const shouldClearFlags = previousHadApprovals && incomingAllCleared && sorted.length > 0;
54
+ if (shouldClearFlags) {
55
+ previous = previous.map((step) => step.requiresApproval
56
+ ? { ...step, requiresApproval: false, pendingApprovals: 0 }
57
+ : step);
58
+ }
59
+ // Standard merge: keep newer timestamps when step numbers collide
60
+ const mergedByStep = new Map();
61
+ for (const step of previous)
62
+ mergedByStep.set(step.stepNumber, step);
63
+ for (const step of sorted) {
64
+ const existing = mergedByStep.get(step.stepNumber);
65
+ if (!existing) {
66
+ mergedByStep.set(step.stepNumber, step);
67
+ continue;
68
+ }
69
+ const existingTs = parseStepTimestamp(existing.createdAt) ?? 0;
70
+ const incomingTs = parseStepTimestamp(step.createdAt) ?? 0;
71
+ if (incomingTs >= existingTs) {
72
+ mergedByStep.set(step.stepNumber, step);
73
+ }
74
+ }
75
+ return Array.from(mergedByStep.entries())
76
+ .sort((a, b) => a[0] - b[0])
77
+ .map(([, step]) => step);
78
+ }
79
+ //# sourceMappingURL=merge-pipeline-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-pipeline-steps.js","sourceRoot":"","sources":["../../../src/react/utils/merge-pipeline-steps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Sanitize raw stored messages to remove incomplete tool calls that would
3
+ * cause `AI_MissingToolResultsError` when sent to the API.
4
+ *
5
+ * This handles the case where a user closes the chat or refreshes while
6
+ * a tool approval is pending, leaving orphaned tool calls in the history.
7
+ *
8
+ * Call this when loading messages from storage (sessionStorage, localStorage,
9
+ * or any backend) before passing them to `setMessages()` or the SDK provider.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const sessionAdapter: SessionConfig = {
14
+ * load: () => {
15
+ * const raw = JSON.parse(sessionStorage.getItem('chat') ?? '[]');
16
+ * return sanitizeStoredMessages(raw);
17
+ * },
18
+ * save: (_, msgs) => sessionStorage.setItem('chat', JSON.stringify(msgs)),
19
+ * clear: () => sessionStorage.removeItem('chat'),
20
+ * };
21
+ * ```
22
+ */
23
+ export declare function sanitizeStoredMessages(messages: unknown[]): unknown[];
@@ -0,0 +1,50 @@
1
+ function isRecord(value) {
2
+ return typeof value === 'object' && value !== null;
3
+ }
4
+ /**
5
+ * Sanitize raw stored messages to remove incomplete tool calls that would
6
+ * cause `AI_MissingToolResultsError` when sent to the API.
7
+ *
8
+ * This handles the case where a user closes the chat or refreshes while
9
+ * a tool approval is pending, leaving orphaned tool calls in the history.
10
+ *
11
+ * Call this when loading messages from storage (sessionStorage, localStorage,
12
+ * or any backend) before passing them to `setMessages()` or the SDK provider.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const sessionAdapter: SessionConfig = {
17
+ * load: () => {
18
+ * const raw = JSON.parse(sessionStorage.getItem('chat') ?? '[]');
19
+ * return sanitizeStoredMessages(raw);
20
+ * },
21
+ * save: (_, msgs) => sessionStorage.setItem('chat', JSON.stringify(msgs)),
22
+ * clear: () => sessionStorage.removeItem('chat'),
23
+ * };
24
+ * ```
25
+ */
26
+ export function sanitizeStoredMessages(messages) {
27
+ return messages
28
+ .map((message) => {
29
+ if (!isRecord(message))
30
+ return message;
31
+ const parts = Array.isArray(message.parts) ? message.parts : [];
32
+ const sanitizedParts = parts.filter((part) => {
33
+ if (!isRecord(part))
34
+ return true;
35
+ const partType = typeof part.type === 'string' ? part.type : '';
36
+ // Remove tool parts stuck in approval-requested state
37
+ if (partType.startsWith('tool-') && part.state === 'approval-requested') {
38
+ return false;
39
+ }
40
+ return true;
41
+ });
42
+ // If all parts were removed, mark for filtering
43
+ if (sanitizedParts.length === 0 && parts.length > 0) {
44
+ return null;
45
+ }
46
+ return { ...message, parts: sanitizedParts };
47
+ })
48
+ .filter((message) => message !== null);
49
+ }
50
+ //# sourceMappingURL=sanitize-stored-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize-stored-messages.js","sourceRoot":"","sources":["../../../src/react/utils/sanitize-stored-messages.ts"],"names":[],"mappings":"AAAA,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAmB;IACxD,OAAO,QAAQ;SACZ,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC;QAEvC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAEjC,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAEhE,sDAAsD;YACtD,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,oBAAoB,EAAE,CAAC;gBACxE,OAAO,KAAK,CAAC;YACf,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,gDAAgD;QAChD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAC/C,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ import { ModuleRef } from '@nestjs/core';
3
+ import { type AiChatModuleOptions } from './ai-chat-module-options.interface.js';
4
+ export declare class AiChatAuthGuard implements CanActivate {
5
+ private readonly options;
6
+ private readonly moduleRef;
7
+ private guardInstance;
8
+ constructor(options: AiChatModuleOptions | null, moduleRef: ModuleRef);
9
+ canActivate(context: ExecutionContext): Promise<boolean>;
10
+ }
@@ -0,0 +1,40 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Inject, Injectable, } from '@nestjs/common';
14
+ import { ModuleRef } from '@nestjs/core';
15
+ import { AI_CHAT_MODULE_OPTIONS, } from './ai-chat-module-options.interface.js';
16
+ let AiChatAuthGuard = class AiChatAuthGuard {
17
+ options;
18
+ moduleRef;
19
+ guardInstance = null;
20
+ constructor(options, moduleRef) {
21
+ this.options = options;
22
+ this.moduleRef = moduleRef;
23
+ }
24
+ async canActivate(context) {
25
+ if (!this.options) {
26
+ return false;
27
+ }
28
+ if (!this.guardInstance) {
29
+ this.guardInstance = await this.moduleRef.create(this.options.authGuard);
30
+ }
31
+ return this.guardInstance.canActivate(context);
32
+ }
33
+ };
34
+ AiChatAuthGuard = __decorate([
35
+ Injectable(),
36
+ __param(0, Inject(AI_CHAT_MODULE_OPTIONS)),
37
+ __metadata("design:paramtypes", [Object, ModuleRef])
38
+ ], AiChatAuthGuard);
39
+ export { AiChatAuthGuard };
40
+ //# sourceMappingURL=ai-chat-auth.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-chat-auth.guard.js","sourceRoot":"","sources":["../../../../../src/server/adapters/nestjs/chat/ai-chat-auth.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAGL,MAAM,EACN,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EACL,sBAAsB,GAEvB,MAAM,uCAAuC,CAAC;AAGxC,IAAM,eAAe,GAArB,MAAM,eAAe;IAKP;IACA;IALX,aAAa,GAAuB,IAAI,CAAC;IAEjD,YAEmB,OAAmC,EACnC,SAAoB;QADpB,YAAO,GAAP,OAAO,CAA4B;QACnC,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAqB,CAAC;IACrE,CAAC;CACF,CAAA;AAlBY,eAAe;IAD3B,UAAU,EAAE;IAKR,WAAA,MAAM,CAAC,sBAAsB,CAAC,CAAA;6CAEH,SAAS;GAN5B,eAAe,CAkB3B"}
@@ -0,0 +1,32 @@
1
+ import type { CanActivate, InjectionToken, ModuleMetadata, OptionalFactoryDependency, Type } from '@nestjs/common';
2
+ import type { LanguageModel } from 'ai';
3
+ import type { AuditEmitter } from '../../../../types.js';
4
+ import type { Lancer } from '../../../lancer/index.js';
5
+ export declare const AI_CHAT_MODULE_OPTIONS: unique symbol;
6
+ export interface AiChatModuleFeatures {
7
+ speechToText?: boolean;
8
+ }
9
+ export interface AiChatModuleOptions {
10
+ /** Vercel AI SDK LanguageModel — consumer creates and owns this */
11
+ model: LanguageModel;
12
+ /** Project-specific system prompt, static string or factory */
13
+ systemPrompt: string | ((context: {
14
+ currentDate: string;
15
+ }) => string);
16
+ /** NestJS guard class for HTTP authentication */
17
+ authGuard: Type<CanActivate>;
18
+ /** Optional feature toggles */
19
+ features?: AiChatModuleFeatures;
20
+ /** Max tool-call steps per chat request (default: 4) */
21
+ maxSteps?: number;
22
+ /** Unified audit event callback for compliance logging */
23
+ onAudit?: AuditEmitter;
24
+ /** Lancer client for runtime prompt overrides (Pro feature) */
25
+ lancer?: Lancer;
26
+ }
27
+ export interface AiChatModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
28
+ /** Factory that returns options or null to disable the module */
29
+ useFactory: (...args: any[]) => Promise<AiChatModuleOptions | null> | AiChatModuleOptions | null;
30
+ /** Injection tokens to pass to useFactory */
31
+ inject?: (InjectionToken | OptionalFactoryDependency)[];
32
+ }
@@ -0,0 +1,2 @@
1
+ export const AI_CHAT_MODULE_OPTIONS = Symbol('AI_CHAT_MODULE_OPTIONS');
2
+ //# sourceMappingURL=ai-chat-module-options.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-chat-module-options.interface.js","sourceRoot":"","sources":["../../../../../src/server/adapters/nestjs/chat/ai-chat-module-options.interface.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Request, Response } from 'express';
2
+ import { AiChatService } from './ai-chat.service.js';
3
+ import { AiChatRequestDto } from './dto/index.js';
4
+ import { type AiChatModuleOptions } from './ai-chat-module-options.interface.js';
5
+ export declare class AiChatController {
6
+ private readonly options;
7
+ private readonly aiChatService;
8
+ private readonly logger;
9
+ constructor(options: AiChatModuleOptions | null, aiChatService: AiChatService);
10
+ chat(dto: AiChatRequestDto, req: Request, res: Response): Promise<void>;
11
+ }