glirastes 0.2.1 → 0.3.1

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 (319) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/CODE_OF_CONDUCT.md +85 -0
  3. package/CONTRIBUTING.md +87 -0
  4. package/README.md +268 -23
  5. package/SECURITY.md +46 -0
  6. package/codegen/package.json +5 -0
  7. package/dist/cjs/codegen/asset-sync.d.ts +20 -0
  8. package/dist/cjs/codegen/asset-sync.js +28 -0
  9. package/dist/cjs/codegen/coverage.d.ts +66 -0
  10. package/dist/cjs/codegen/coverage.js +408 -0
  11. package/dist/cjs/codegen/endpoint-scanner.d.ts +16 -0
  12. package/dist/cjs/codegen/endpoint-scanner.js +197 -0
  13. package/dist/cjs/codegen/format.d.ts +17 -0
  14. package/dist/cjs/codegen/format.js +34 -0
  15. package/dist/cjs/codegen/fs-utils.d.ts +45 -0
  16. package/dist/cjs/codegen/fs-utils.js +165 -0
  17. package/dist/cjs/codegen/index.d.ts +13 -0
  18. package/dist/cjs/codegen/index.js +33 -0
  19. package/dist/cjs/codegen/mcp-generator.d.ts +50 -0
  20. package/dist/cjs/codegen/mcp-generator.js +803 -0
  21. package/dist/cjs/codegen/module-generator.d.ts +11 -0
  22. package/dist/cjs/codegen/module-generator.js +353 -0
  23. package/dist/cjs/codegen/nestjs-scanner.d.ts +43 -0
  24. package/dist/cjs/codegen/nestjs-scanner.js +241 -0
  25. package/dist/cjs/codegen/output-recommender.d.ts +23 -0
  26. package/dist/cjs/codegen/output-recommender.js +33 -0
  27. package/dist/cjs/codegen/scaffolder.d.ts +36 -0
  28. package/dist/cjs/codegen/scaffolder.js +262 -0
  29. package/dist/cjs/codegen/skill-generator.d.ts +49 -0
  30. package/dist/cjs/codegen/skill-generator.js +967 -0
  31. package/dist/cjs/codegen/types.d.ts +52 -0
  32. package/dist/cjs/codegen/types.js +16 -0
  33. package/dist/cjs/codegen/ui-scanner.d.ts +24 -0
  34. package/dist/cjs/codegen/ui-scanner.js +202 -0
  35. package/dist/cjs/codegen/validator.d.ts +35 -0
  36. package/dist/cjs/codegen/validator.js +292 -0
  37. package/dist/cjs/index.d.ts +1 -0
  38. package/dist/cjs/index.js +23 -0
  39. package/dist/cjs/openapi/index.d.ts +78 -0
  40. package/dist/cjs/openapi/index.js +347 -0
  41. package/dist/cjs/package.json +1 -0
  42. package/dist/cjs/react/audio-worklet-processor.d.ts +16 -0
  43. package/dist/cjs/react/audio-worklet-processor.js +27 -0
  44. package/dist/cjs/react/bridges/rest-session-bridge.d.ts +113 -0
  45. package/dist/cjs/react/bridges/rest-session-bridge.js +209 -0
  46. package/dist/cjs/react/components/ai-chat-panel.d.ts +12 -0
  47. package/dist/cjs/react/components/ai-chat-panel.js +67 -0
  48. package/dist/cjs/react/components/ai-trigger-button.d.ts +2 -0
  49. package/dist/cjs/react/components/ai-trigger-button.js +239 -0
  50. package/dist/cjs/react/components/approval-card.d.ts +9 -0
  51. package/dist/cjs/react/components/approval-card.js +24 -0
  52. package/dist/cjs/react/components/bulk-approval-card.d.ts +9 -0
  53. package/dist/cjs/react/components/bulk-approval-card.js +36 -0
  54. package/dist/cjs/react/components/chat-input.d.ts +10 -0
  55. package/dist/cjs/react/components/chat-input.js +60 -0
  56. package/dist/cjs/react/components/chat-window.d.ts +2 -0
  57. package/dist/cjs/react/components/chat-window.js +134 -0
  58. package/dist/cjs/react/components/confirm-dialog.d.ts +32 -0
  59. package/dist/cjs/react/components/confirm-dialog.js +48 -0
  60. package/dist/cjs/react/components/floating-chat-ui.d.ts +90 -0
  61. package/dist/cjs/react/components/floating-chat-ui.js +163 -0
  62. package/dist/cjs/react/components/mention-chip.d.ts +16 -0
  63. package/dist/cjs/react/components/mention-chip.js +42 -0
  64. package/dist/cjs/react/components/mention-input.d.ts +8 -0
  65. package/dist/cjs/react/components/mention-input.js +117 -0
  66. package/dist/cjs/react/components/message-bubble.d.ts +11 -0
  67. package/dist/cjs/react/components/message-bubble.js +171 -0
  68. package/dist/cjs/react/components/message-list.d.ts +8 -0
  69. package/dist/cjs/react/components/message-list.js +52 -0
  70. package/dist/cjs/react/components/pipeline-timeline.d.ts +7 -0
  71. package/dist/cjs/react/components/pipeline-timeline.js +72 -0
  72. package/dist/cjs/react/components/recording-bar.d.ts +2 -0
  73. package/dist/cjs/react/components/recording-bar.js +81 -0
  74. package/dist/cjs/react/components/recording-controls.d.ts +18 -0
  75. package/dist/cjs/react/components/recording-controls.js +38 -0
  76. package/dist/cjs/react/components/rich-mention-input.d.ts +2 -0
  77. package/dist/cjs/react/components/rich-mention-input.js +571 -0
  78. package/dist/cjs/react/components/session-switcher.d.ts +14 -0
  79. package/dist/cjs/react/components/session-switcher.js +133 -0
  80. package/dist/cjs/react/components/suggestion-bar.d.ts +9 -0
  81. package/dist/cjs/react/components/suggestion-bar.js +47 -0
  82. package/dist/cjs/react/components/suggestion-chip.d.ts +9 -0
  83. package/dist/cjs/react/components/suggestion-chip.js +14 -0
  84. package/dist/cjs/react/components/voice-input-addon.d.ts +13 -0
  85. package/dist/cjs/react/components/voice-input-addon.js +31 -0
  86. package/dist/cjs/react/components/voice-input-button.d.ts +2 -0
  87. package/dist/cjs/react/components/voice-input-button.js +55 -0
  88. package/dist/cjs/react/components/wavesurfer-loader.d.ts +5 -0
  89. package/dist/cjs/react/components/wavesurfer-loader.js +36 -0
  90. package/dist/cjs/react/hooks/use-ai-chat.d.ts +22 -0
  91. package/dist/cjs/react/hooks/use-ai-chat.js +51 -0
  92. package/dist/cjs/react/hooks/use-approvals.d.ts +23 -0
  93. package/dist/cjs/react/hooks/use-approvals.js +63 -0
  94. package/dist/cjs/react/hooks/use-deepgram-transcription.d.ts +2 -0
  95. package/dist/cjs/react/hooks/use-deepgram-transcription.js +329 -0
  96. package/dist/cjs/react/hooks/use-drag-resize-panel.d.ts +48 -0
  97. package/dist/cjs/react/hooks/use-drag-resize-panel.js +308 -0
  98. package/dist/cjs/react/hooks/use-draggable-position.d.ts +25 -0
  99. package/dist/cjs/react/hooks/use-draggable-position.js +134 -0
  100. package/dist/cjs/react/hooks/use-keyboard-shortcut.d.ts +20 -0
  101. package/dist/cjs/react/hooks/use-keyboard-shortcut.js +93 -0
  102. package/dist/cjs/react/hooks/use-mentions.d.ts +23 -0
  103. package/dist/cjs/react/hooks/use-mentions.js +42 -0
  104. package/dist/cjs/react/hooks/use-suggestions.d.ts +22 -0
  105. package/dist/cjs/react/hooks/use-suggestions.js +39 -0
  106. package/dist/cjs/react/index.d.ts +43 -0
  107. package/dist/cjs/react/index.js +111 -0
  108. package/dist/cjs/react/provider/ai-chat-provider.d.ts +45 -0
  109. package/dist/cjs/react/provider/ai-chat-provider.js +1024 -0
  110. package/dist/cjs/react/provider/chat-context.d.ts +84 -0
  111. package/dist/cjs/react/provider/chat-context.js +13 -0
  112. package/dist/cjs/react/template.d.ts +84 -0
  113. package/dist/cjs/react/template.js +90 -0
  114. package/dist/cjs/react/themes.d.ts +24 -0
  115. package/dist/cjs/react/themes.js +273 -0
  116. package/dist/cjs/react/transports/langgraph/index.d.ts +2 -0
  117. package/dist/cjs/react/transports/langgraph/index.js +8 -0
  118. package/dist/cjs/react/transports/langgraph/langgraph-ai-chat.d.ts +62 -0
  119. package/dist/cjs/react/transports/langgraph/langgraph-ai-chat.js +94 -0
  120. package/dist/cjs/react/transports/langgraph.d.ts +71 -0
  121. package/dist/cjs/react/transports/langgraph.js +369 -0
  122. package/dist/cjs/react/transports/vercel/index.d.ts +2 -0
  123. package/dist/cjs/react/transports/vercel/index.js +8 -0
  124. package/dist/cjs/react/transports/vercel/vercel-ai-chat.d.ts +49 -0
  125. package/dist/cjs/react/transports/vercel/vercel-ai-chat.js +81 -0
  126. package/dist/cjs/react/transports/vercel.d.ts +30 -0
  127. package/dist/cjs/react/transports/vercel.js +69 -0
  128. package/dist/cjs/react/types.d.ts +760 -0
  129. package/dist/cjs/react/types.js +2 -0
  130. package/dist/cjs/react/ui.d.ts +73 -0
  131. package/dist/cjs/react/ui.js +183 -0
  132. package/dist/cjs/react/utils/create-approval-description.d.ts +53 -0
  133. package/dist/cjs/react/utils/create-approval-description.js +122 -0
  134. package/dist/cjs/react/utils/create-tool-result-handler.d.ts +90 -0
  135. package/dist/cjs/react/utils/create-tool-result-handler.js +168 -0
  136. package/dist/cjs/react/utils/mention-markup.d.ts +13 -0
  137. package/dist/cjs/react/utils/mention-markup.js +117 -0
  138. package/dist/cjs/react/utils/merge-pipeline-steps.d.ts +19 -0
  139. package/dist/cjs/react/utils/merge-pipeline-steps.js +81 -0
  140. package/dist/cjs/react/utils/sanitize-stored-messages.d.ts +23 -0
  141. package/dist/cjs/react/utils/sanitize-stored-messages.js +52 -0
  142. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-auth.guard.d.ts +10 -0
  143. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-auth.guard.js +42 -0
  144. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-module-options.interface.d.ts +32 -0
  145. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-module-options.interface.js +4 -0
  146. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.controller.d.ts +11 -0
  147. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.controller.js +80 -0
  148. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.module.d.ts +9 -0
  149. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.module.js +119 -0
  150. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.service.d.ts +13 -0
  151. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.service.js +131 -0
  152. package/dist/cjs/server/adapters/nestjs/chat/dto/ai-chat-request.dto.d.ts +7 -0
  153. package/dist/cjs/server/adapters/nestjs/chat/dto/ai-chat-request.dto.js +52 -0
  154. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message-part.dto.d.ts +19 -0
  155. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message-part.dto.js +108 -0
  156. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message.dto.d.ts +8 -0
  157. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message.dto.js +59 -0
  158. package/dist/cjs/server/adapters/nestjs/chat/dto/index.d.ts +3 -0
  159. package/dist/cjs/server/adapters/nestjs/chat/dto/index.js +9 -0
  160. package/dist/cjs/server/adapters/nestjs/chat/index.d.ts +3 -0
  161. package/dist/cjs/server/adapters/nestjs/chat/index.js +9 -0
  162. package/dist/cjs/server/adapters/nestjs/chat/speech-stream.gateway.d.ts +4 -0
  163. package/dist/cjs/server/adapters/nestjs/chat/speech-stream.gateway.js +73 -0
  164. package/dist/cjs/server/adapters/nestjs/chat/ws-loader.d.ts +5 -0
  165. package/dist/cjs/server/adapters/nestjs/chat/ws-loader.js +72 -0
  166. package/dist/cjs/server/adapters/nestjs/decorators/ai-module.decorator.d.ts +6 -0
  167. package/dist/cjs/server/adapters/nestjs/decorators/ai-module.decorator.js +13 -0
  168. package/dist/cjs/server/adapters/nestjs/decorators/ai-param.decorator.d.ts +5 -0
  169. package/dist/cjs/server/adapters/nestjs/decorators/ai-param.decorator.js +15 -0
  170. package/dist/cjs/server/adapters/nestjs/decorators/ai-tool.decorator.d.ts +6 -0
  171. package/dist/cjs/server/adapters/nestjs/decorators/ai-tool.decorator.js +22 -0
  172. package/dist/cjs/server/adapters/nestjs/decorators/constants.d.ts +4 -0
  173. package/dist/cjs/server/adapters/nestjs/decorators/constants.js +7 -0
  174. package/dist/cjs/server/adapters/nestjs/index.d.ts +14 -0
  175. package/dist/cjs/server/adapters/nestjs/index.js +42 -0
  176. package/dist/cjs/server/adapters/nestjs/metadata.d.ts +39 -0
  177. package/dist/cjs/server/adapters/nestjs/metadata.js +36 -0
  178. package/dist/cjs/server/adapters/nestjs/module/ai-tools-explorer.service.d.ts +36 -0
  179. package/dist/cjs/server/adapters/nestjs/module/ai-tools-explorer.service.js +159 -0
  180. package/dist/cjs/server/adapters/nestjs/module/ai-tools.module.d.ts +37 -0
  181. package/dist/cjs/server/adapters/nestjs/module/ai-tools.module.js +44 -0
  182. package/dist/cjs/server/adapters/nestjs/module/ai-tools.service.d.ts +28 -0
  183. package/dist/cjs/server/adapters/nestjs/module/ai-tools.service.js +41 -0
  184. package/dist/cjs/server/adapters/nestjs/scanner/nestjs-scanner.d.ts +16 -0
  185. package/dist/cjs/server/adapters/nestjs/scanner/nestjs-scanner.js +117 -0
  186. package/dist/cjs/server/adapters/nestjs/scanner/schema-builder.d.ts +26 -0
  187. package/dist/cjs/server/adapters/nestjs/scanner/schema-builder.js +259 -0
  188. package/dist/cjs/server/adapters/nestjs/swagger.d.ts +7 -0
  189. package/dist/cjs/server/adapters/nestjs/swagger.js +39 -0
  190. package/dist/cjs/server/adapters/nextjs/context-helpers.d.ts +22 -0
  191. package/dist/cjs/server/adapters/nextjs/context-helpers.js +60 -0
  192. package/dist/cjs/server/adapters/nextjs/create-ai-chat-handler.d.ts +94 -0
  193. package/dist/cjs/server/adapters/nextjs/create-ai-chat-handler.js +965 -0
  194. package/dist/cjs/server/adapters/nextjs/filter-fallback-error.d.ts +11 -0
  195. package/dist/cjs/server/adapters/nextjs/filter-fallback-error.js +41 -0
  196. package/dist/cjs/server/adapters/nextjs/index.d.ts +8 -0
  197. package/dist/cjs/server/adapters/nextjs/index.js +22 -0
  198. package/dist/cjs/server/adapters/nextjs/prepare-model-messages.d.ts +58 -0
  199. package/dist/cjs/server/adapters/nextjs/prepare-model-messages.js +114 -0
  200. package/dist/cjs/server/adapters/nextjs/sanitize-model-messages.d.ts +64 -0
  201. package/dist/cjs/server/adapters/nextjs/sanitize-model-messages.js +489 -0
  202. package/dist/cjs/server/adapters/nextjs/server-action-helper.d.ts +7 -0
  203. package/dist/cjs/server/adapters/nextjs/server-action-helper.js +40 -0
  204. package/dist/cjs/server/adapters/nextjs/types.d.ts +246 -0
  205. package/dist/cjs/server/adapters/nextjs/types.js +2 -0
  206. package/dist/cjs/server/adapters/nextjs/with-ai-tool.d.ts +9 -0
  207. package/dist/cjs/server/adapters/nextjs/with-ai-tool.js +12 -0
  208. package/dist/cjs/server/core/followup-tool.d.ts +9 -0
  209. package/dist/cjs/server/core/followup-tool.js +82 -0
  210. package/dist/cjs/server/core/index.d.ts +139 -0
  211. package/dist/cjs/server/core/index.js +818 -0
  212. package/dist/cjs/server/core/intent-classifier.d.ts +94 -0
  213. package/dist/cjs/server/core/intent-classifier.js +324 -0
  214. package/dist/cjs/server/core/model-selector.d.ts +12 -0
  215. package/dist/cjs/server/core/model-selector.js +48 -0
  216. package/dist/cjs/server/core/module-router.d.ts +14 -0
  217. package/dist/cjs/server/core/module-router.js +110 -0
  218. package/dist/cjs/server/core/zod-compact.d.ts +18 -0
  219. package/dist/cjs/server/core/zod-compact.js +129 -0
  220. package/dist/cjs/server/index.d.ts +6 -0
  221. package/dist/cjs/server/index.js +28 -0
  222. package/dist/cjs/server/lancer/cache.d.ts +9 -0
  223. package/dist/cjs/server/lancer/cache.js +33 -0
  224. package/dist/cjs/server/lancer/client.d.ts +2 -0
  225. package/dist/cjs/server/lancer/client.js +279 -0
  226. package/dist/cjs/server/lancer/errors.d.ts +13 -0
  227. package/dist/cjs/server/lancer/errors.js +21 -0
  228. package/dist/cjs/server/lancer/index.d.ts +3 -0
  229. package/dist/cjs/server/lancer/index.js +7 -0
  230. package/dist/cjs/server/lancer/telemetry-buffer.d.ts +15 -0
  231. package/dist/cjs/server/lancer/telemetry-buffer.js +64 -0
  232. package/dist/cjs/server/lancer/types.d.ts +201 -0
  233. package/dist/cjs/server/lancer/types.js +5 -0
  234. package/dist/cjs/server/pii-shield/aegis-detector.d.ts +26 -0
  235. package/dist/cjs/server/pii-shield/aegis-detector.js +26 -0
  236. package/dist/cjs/server/pii-shield/create-pii-shield.d.ts +2 -0
  237. package/dist/cjs/server/pii-shield/create-pii-shield.js +191 -0
  238. package/dist/cjs/server/pii-shield/deep-walk.d.ts +1 -0
  239. package/dist/cjs/server/pii-shield/deep-walk.js +19 -0
  240. package/dist/cjs/server/pii-shield/fake-data.d.ts +5 -0
  241. package/dist/cjs/server/pii-shield/fake-data.js +170 -0
  242. package/dist/cjs/server/pii-shield/index.d.ts +4 -0
  243. package/dist/cjs/server/pii-shield/index.js +9 -0
  244. package/dist/cjs/server/pii-shield/leakage.d.ts +1 -0
  245. package/dist/cjs/server/pii-shield/leakage.js +15 -0
  246. package/dist/cjs/server/pii-shield/session-mapping.d.ts +12 -0
  247. package/dist/cjs/server/pii-shield/session-mapping.js +70 -0
  248. package/dist/cjs/server/pipeline.d.ts +26 -0
  249. package/dist/cjs/server/pipeline.js +127 -0
  250. package/dist/cjs/server/testing/approvals.d.ts +11 -0
  251. package/dist/cjs/server/testing/approvals.js +41 -0
  252. package/dist/cjs/server/testing/combination.d.ts +3 -0
  253. package/dist/cjs/server/testing/combination.js +83 -0
  254. package/dist/cjs/server/testing/create-test-suite.d.ts +29 -0
  255. package/dist/cjs/server/testing/create-test-suite.js +81 -0
  256. package/dist/cjs/server/testing/edge-cases.d.ts +8 -0
  257. package/dist/cjs/server/testing/edge-cases.js +277 -0
  258. package/dist/cjs/server/testing/guardrails.d.ts +14 -0
  259. package/dist/cjs/server/testing/guardrails.js +152 -0
  260. package/dist/cjs/server/testing/helpers.d.ts +14 -0
  261. package/dist/cjs/server/testing/helpers.js +119 -0
  262. package/dist/cjs/server/testing/index.d.ts +12 -0
  263. package/dist/cjs/server/testing/index.js +37 -0
  264. package/dist/cjs/server/testing/mock-executor.d.ts +8 -0
  265. package/dist/cjs/server/testing/mock-executor.js +40 -0
  266. package/dist/cjs/server/testing/regression.d.ts +7 -0
  267. package/dist/cjs/server/testing/regression.js +27 -0
  268. package/dist/cjs/server/testing/routing.d.ts +12 -0
  269. package/dist/cjs/server/testing/routing.js +63 -0
  270. package/dist/cjs/server/testing/schema-consistency.d.ts +6 -0
  271. package/dist/cjs/server/testing/schema-consistency.js +56 -0
  272. package/dist/cjs/server/testing/smoke.d.ts +11 -0
  273. package/dist/cjs/server/testing/smoke.js +64 -0
  274. package/dist/cjs/server/testing/types.d.ts +156 -0
  275. package/dist/cjs/server/testing/types.js +2 -0
  276. package/dist/cjs/types.d.ts +696 -0
  277. package/dist/cjs/types.js +91 -0
  278. package/dist/cli/commands/install-skills.d.ts +17 -0
  279. package/dist/cli/commands/install-skills.js +185 -0
  280. package/dist/cli/commands/install-skills.js.map +1 -0
  281. package/dist/cli/index.js +25 -0
  282. package/dist/cli/index.js.map +1 -1
  283. package/dist/react/components/ai-trigger-button.js +4 -6
  284. package/dist/react/components/ai-trigger-button.js.map +1 -1
  285. package/dist/react/components/recording-bar.js +4 -6
  286. package/dist/react/components/recording-bar.js.map +1 -1
  287. package/dist/react/components/wavesurfer-loader.d.ts +5 -0
  288. package/dist/react/components/wavesurfer-loader.js +34 -0
  289. package/dist/react/components/wavesurfer-loader.js.map +1 -0
  290. package/dist/server/adapters/nestjs/chat/ai-chat.module.d.ts +1 -1
  291. package/dist/server/adapters/nestjs/chat/ai-chat.module.js +3 -2
  292. package/dist/server/adapters/nestjs/chat/ai-chat.module.js.map +1 -1
  293. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.d.ts +1 -1
  294. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.js +10 -8
  295. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.js.map +1 -1
  296. package/dist/server/adapters/nestjs/chat/ws-loader.d.ts +5 -0
  297. package/dist/server/adapters/nestjs/chat/ws-loader.js +37 -0
  298. package/dist/server/adapters/nestjs/chat/ws-loader.js.map +1 -0
  299. package/dist/server/adapters/nextjs/create-ai-chat-handler.d.ts +16 -0
  300. package/dist/server/adapters/nextjs/create-ai-chat-handler.js +14 -3
  301. package/dist/server/adapters/nextjs/create-ai-chat-handler.js.map +1 -1
  302. package/dist/server/adapters/nextjs/filter-fallback-error.d.ts +11 -0
  303. package/dist/server/adapters/nextjs/filter-fallback-error.js +38 -0
  304. package/dist/server/adapters/nextjs/filter-fallback-error.js.map +1 -0
  305. package/openapi/package.json +5 -0
  306. package/package.json +66 -21
  307. package/react/langgraph/package.json +5 -0
  308. package/react/package.json +5 -0
  309. package/react/vercel/package.json +5 -0
  310. package/server/nestjs/package.json +5 -0
  311. package/server/nextjs/package.json +5 -0
  312. package/server/package.json +5 -0
  313. package/server/testing/package.json +5 -0
  314. package/skills/README.md +107 -0
  315. package/skills/building-glirastes-chat-ui/SKILL.md +378 -0
  316. package/skills/integrating-glirastes-nestjs/SKILL.md +346 -0
  317. package/skills/integrating-glirastes-nextjs/SKILL.md +306 -0
  318. package/skills/integrating-glirastes-nextjs-with-nestjs-backend/SKILL.md +359 -0
  319. package/skills/maintaining-glirastes-tools/SKILL.md +463 -0
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.LangGraphAiChat = LangGraphAiChat;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const ai_chat_provider_js_1 = require("../../provider/ai-chat-provider.js");
8
+ const floating_chat_ui_js_1 = require("../../components/floating-chat-ui.js");
9
+ const langgraph_js_1 = require("../langgraph.js");
10
+ /**
11
+ * Drop-in LangGraph chat widget. Bundles transport, provider, and a
12
+ * floating (trigger button + draggable window) chat UI into one component.
13
+ * Zero dependency on `@ai-sdk/react` or `ai`.
14
+ *
15
+ * ```tsx
16
+ * 'use client';
17
+ * import { LangGraphAiChat } from 'glirastes/react/langgraph';
18
+ *
19
+ * export default function Layout({ children }) {
20
+ * return (
21
+ * <>
22
+ * {children}
23
+ * <LangGraphAiChat endpoint="/api/chat" />
24
+ * </>
25
+ * );
26
+ * }
27
+ * ```
28
+ *
29
+ * All `AiChatProviderConfig` fields (session, mentions, classNames, etc.)
30
+ * and `FloatingChatUIProps` (title, defaultOpen, width, height, draggable,
31
+ * resizable) are accepted as top-level props.
32
+ */
33
+ function LangGraphAiChat({ endpoint, headers, threadId, bodyExtras, credentials, onCustomEvent, renderUpdate, sessions, title, open, onOpenChange, defaultOpen, draggable, resizable, size, hideTriggerWhenOpen, shortcut, showClearButton, confirmClear, showSessionSwitcher, headerActions, triggerIcon, showMic, welcomeMessage, children, ...providerConfig }) {
34
+ // The widget owns its own copy of the active id so it can feed it to
35
+ // the LangGraph transport as `threadId`. The provider is left in
36
+ // *uncontrolled* mode — we only pass `defaultActiveId` (initial seed)
37
+ // and `onActiveIdChange` (so the provider's auto-select / switchSession
38
+ // calls update our local state). This lets the provider's bootstrap
39
+ // skip ('default' sentinel) work correctly.
40
+ const [activeId, setActiveId] = (0, react_1.useState)(() => {
41
+ if (sessions?.activeId)
42
+ return sessions.activeId;
43
+ if (sessions?.defaultActiveId)
44
+ return sessions.defaultActiveId;
45
+ return threadId ?? 'default';
46
+ });
47
+ // If the caller controls `activeId` externally, mirror it.
48
+ (0, react_1.useEffect)(() => {
49
+ if (sessions?.activeId && sessions.activeId !== activeId) {
50
+ setActiveId(sessions.activeId);
51
+ }
52
+ // eslint-disable-next-line react-hooks/exhaustive-deps
53
+ }, [sessions?.activeId]);
54
+ const effectiveThreadId = sessions ? activeId : threadId;
55
+ // When multi-session mode is active, also surface the active id as
56
+ // `sessionId` in the request body. LangGraph projects vary on the
57
+ // canonical name (`threadId` vs `sessionId`); shipping both is harmless
58
+ // and lets backends like chaingrow's `/chat/stream` handler — which
59
+ // reads `body.sessionId` — pick up the active session without the
60
+ // consumer having to wire `bodyExtras` themselves.
61
+ const effectiveBodyExtras = (0, react_1.useMemo)(() => {
62
+ if (!sessions)
63
+ return bodyExtras;
64
+ return () => {
65
+ const base = typeof bodyExtras === 'function' ? bodyExtras() : bodyExtras ?? {};
66
+ return { ...base, sessionId: activeId };
67
+ };
68
+ }, [sessions, bodyExtras, activeId]);
69
+ const transport = (0, langgraph_js_1.useLangGraphChatTransport)({
70
+ endpoint,
71
+ headers,
72
+ threadId: effectiveThreadId,
73
+ bodyExtras: effectiveBodyExtras,
74
+ credentials,
75
+ onCustomEvent,
76
+ renderUpdate,
77
+ });
78
+ const effectiveSession = (0, react_1.useMemo)(() => {
79
+ if (!sessions)
80
+ return providerConfig.session;
81
+ // Strip any consumer-supplied `activeId` and replace with a seed
82
+ // (`defaultActiveId`) so the provider stays uncontrolled.
83
+ const { activeId: _consumerActiveId, ...rest } = sessions;
84
+ return {
85
+ ...rest,
86
+ defaultActiveId: activeId,
87
+ onActiveIdChange: (id) => {
88
+ setActiveId(id);
89
+ sessions.onActiveIdChange?.(id);
90
+ },
91
+ };
92
+ }, [sessions, activeId, providerConfig.session]);
93
+ return ((0, jsx_runtime_1.jsx)(ai_chat_provider_js_1.AiChatProvider, { transport: transport, ...providerConfig, session: effectiveSession, children: children ?? ((0, jsx_runtime_1.jsx)(floating_chat_ui_js_1.FloatingChatUI, { title: title, open: open, onOpenChange: onOpenChange, defaultOpen: defaultOpen, draggable: draggable, resizable: resizable, size: size, hideTriggerWhenOpen: hideTriggerWhenOpen, shortcut: shortcut, showClearButton: showClearButton, confirmClear: confirmClear, showSessionSwitcher: showSessionSwitcher, headerActions: headerActions, triggerIcon: triggerIcon, showMic: showMic, welcomeMessage: welcomeMessage })) }));
94
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * LangGraph chat transport.
3
+ *
4
+ * A React hook that implements the `ChatTransport` interface against a
5
+ * LangGraph backend that emits Server-Sent Events in the wire format
6
+ * documented below.
7
+ *
8
+ * Unlike the Vercel transport, this transport does NOT import
9
+ * `@langchain/langgraph`, `@langchain/core`, or `ai` at runtime — it is
10
+ * purely a fetch + SSE parser. A consumer's backend is free to use
11
+ * LangGraph JS's native `.stream()` API (or anything else that produces
12
+ * the same event channels) without leaking LangChain types into the
13
+ * frontend bundle.
14
+ */
15
+ import type { ChatTransport, ChatTransportConfig, ChatTransportDataPart } from '../types.js';
16
+ /** `event: updates` — a LangGraph node finished and produced a state delta. */
17
+ export interface LangGraphUpdatesEvent {
18
+ node: string;
19
+ update: Record<string, unknown>;
20
+ }
21
+ /** `event: message` — an LLM token chunk for the assistant bubble. */
22
+ export interface LangGraphMessageEvent {
23
+ content: string;
24
+ node?: string;
25
+ role: 'assistant';
26
+ }
27
+ /** `event: custom` — domain-specific signal emitted via LangGraph `config.writer()`. */
28
+ export interface LangGraphCustomEvent {
29
+ type: string;
30
+ payload: unknown;
31
+ }
32
+ /** `event: tool_call` — a tool invocation began. */
33
+ export interface LangGraphToolCallEvent {
34
+ id: string;
35
+ name: string;
36
+ args: Record<string, unknown>;
37
+ }
38
+ /** `event: tool_result` — a tool invocation produced a result. */
39
+ export interface LangGraphToolResultEvent {
40
+ id: string;
41
+ result: unknown;
42
+ }
43
+ /** `event: error` — stream-level error. */
44
+ export interface LangGraphErrorEvent {
45
+ message: string;
46
+ code?: string;
47
+ }
48
+ /**
49
+ * Outgoing POST body sent to the LangGraph endpoint.
50
+ */
51
+ export interface LangGraphRequestBody {
52
+ messages: Array<{
53
+ role: 'user' | 'assistant' | 'system';
54
+ content: string;
55
+ }>;
56
+ threadId?: string;
57
+ [key: string]: unknown;
58
+ }
59
+ export interface SseEvent {
60
+ event: string;
61
+ data: string;
62
+ }
63
+ export declare function parseSseStream(body: ReadableStream<Uint8Array>): AsyncGenerator<SseEvent, void, unknown>;
64
+ export interface UseLangGraphChatTransportOptions extends ChatTransportConfig {
65
+ threadId?: string;
66
+ bodyExtras?: Record<string, unknown> | (() => Record<string, unknown>);
67
+ credentials?: RequestCredentials;
68
+ onCustomEvent?: (evt: LangGraphCustomEvent) => ChatTransportDataPart | null;
69
+ renderUpdate?: (node: string, update: Record<string, unknown>) => string | null;
70
+ }
71
+ export declare function useLangGraphChatTransport(options: UseLangGraphChatTransportOptions): ChatTransport;
@@ -0,0 +1,369 @@
1
+ "use strict";
2
+ /**
3
+ * LangGraph chat transport.
4
+ *
5
+ * A React hook that implements the `ChatTransport` interface against a
6
+ * LangGraph backend that emits Server-Sent Events in the wire format
7
+ * documented below.
8
+ *
9
+ * Unlike the Vercel transport, this transport does NOT import
10
+ * `@langchain/langgraph`, `@langchain/core`, or `ai` at runtime — it is
11
+ * purely a fetch + SSE parser. A consumer's backend is free to use
12
+ * LangGraph JS's native `.stream()` API (or anything else that produces
13
+ * the same event channels) without leaking LangChain types into the
14
+ * frontend bundle.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.parseSseStream = parseSseStream;
18
+ exports.useLangGraphChatTransport = useLangGraphChatTransport;
19
+ const react_1 = require("react");
20
+ async function* parseSseStream(body) {
21
+ const reader = body.getReader();
22
+ const decoder = new TextDecoder('utf-8');
23
+ let buffer = '';
24
+ let eventName = '';
25
+ let dataLines = [];
26
+ const flush = () => {
27
+ if (dataLines.length === 0) {
28
+ eventName = '';
29
+ return null;
30
+ }
31
+ const evt = {
32
+ event: eventName || 'message',
33
+ data: dataLines.join('\n'),
34
+ };
35
+ eventName = '';
36
+ dataLines = [];
37
+ return evt;
38
+ };
39
+ try {
40
+ while (true) {
41
+ const { value, done } = await reader.read();
42
+ if (done)
43
+ break;
44
+ buffer += decoder.decode(value, { stream: true });
45
+ buffer = buffer.replace(/\r\n?/g, '\n');
46
+ let newlineIdx;
47
+ while ((newlineIdx = buffer.indexOf('\n')) !== -1) {
48
+ const line = buffer.slice(0, newlineIdx);
49
+ buffer = buffer.slice(newlineIdx + 1);
50
+ if (line === '') {
51
+ const evt = flush();
52
+ if (evt)
53
+ yield evt;
54
+ continue;
55
+ }
56
+ if (line.startsWith(':'))
57
+ continue;
58
+ const colonIdx = line.indexOf(':');
59
+ let field;
60
+ let value;
61
+ if (colonIdx === -1) {
62
+ field = line;
63
+ value = '';
64
+ }
65
+ else {
66
+ field = line.slice(0, colonIdx);
67
+ value = line.slice(colonIdx + 1);
68
+ if (value.startsWith(' '))
69
+ value = value.slice(1);
70
+ }
71
+ if (field === 'event') {
72
+ eventName = value;
73
+ }
74
+ else if (field === 'data') {
75
+ dataLines.push(value);
76
+ }
77
+ }
78
+ }
79
+ buffer += decoder.decode();
80
+ if (buffer.length > 0) {
81
+ const tail = buffer;
82
+ buffer = '';
83
+ if (!tail.startsWith(':')) {
84
+ const colonIdx = tail.indexOf(':');
85
+ if (colonIdx !== -1) {
86
+ const field = tail.slice(0, colonIdx);
87
+ let value = tail.slice(colonIdx + 1);
88
+ if (value.startsWith(' '))
89
+ value = value.slice(1);
90
+ if (field === 'event')
91
+ eventName = value;
92
+ else if (field === 'data')
93
+ dataLines.push(value);
94
+ }
95
+ }
96
+ }
97
+ const finalEvt = flush();
98
+ if (finalEvt)
99
+ yield finalEvt;
100
+ }
101
+ finally {
102
+ reader.releaseLock();
103
+ }
104
+ }
105
+ function defaultRenderUpdate(node) {
106
+ return `${node} running…`;
107
+ }
108
+ function emptyAssistantMessage(id) {
109
+ return {
110
+ id,
111
+ role: 'assistant',
112
+ parts: [],
113
+ createdAt: new Date(),
114
+ };
115
+ }
116
+ function appendTextDelta(message, delta) {
117
+ const parts = [...message.parts];
118
+ const last = parts[parts.length - 1];
119
+ if (last && last.type === 'text') {
120
+ const updated = { type: 'text', text: last.text + delta };
121
+ parts[parts.length - 1] = updated;
122
+ }
123
+ else {
124
+ parts.push({ type: 'text', text: delta });
125
+ }
126
+ return { ...message, parts };
127
+ }
128
+ function appendPart(message, part) {
129
+ return { ...message, parts: [...message.parts, part] };
130
+ }
131
+ function upsertToolInvocation(message, evt) {
132
+ const existing = message.parts.findIndex((p) => p.type === 'tool-invocation' && p.toolInvocationId === evt.id);
133
+ const invocation = {
134
+ type: 'tool-invocation',
135
+ toolInvocationId: evt.id,
136
+ toolName: evt.name,
137
+ args: evt.args ?? {},
138
+ state: 'call',
139
+ };
140
+ if (existing === -1)
141
+ return appendPart(message, invocation);
142
+ const parts = [...message.parts];
143
+ parts[existing] = invocation;
144
+ return { ...message, parts };
145
+ }
146
+ function applyToolResult(message, evt) {
147
+ const parts = [...message.parts];
148
+ const idx = parts.findIndex((p) => p.type === 'tool-invocation' && p.toolInvocationId === evt.id);
149
+ if (idx !== -1) {
150
+ const invocation = parts[idx];
151
+ parts[idx] = { ...invocation, state: 'output-available', result: evt.result };
152
+ }
153
+ const result = {
154
+ type: 'tool-result',
155
+ toolInvocationId: evt.id,
156
+ toolName: parts[idx]?.toolName ?? 'unknown',
157
+ result: evt.result,
158
+ };
159
+ parts.push(result);
160
+ return { ...message, parts };
161
+ }
162
+ function toWireMessages(messages) {
163
+ return messages.map((m) => ({
164
+ role: m.role,
165
+ content: m.parts
166
+ .filter((p) => p.type === 'text')
167
+ .map((p) => p.text)
168
+ .join(''),
169
+ }));
170
+ }
171
+ function resolveHeaders(headers) {
172
+ if (!headers)
173
+ return {};
174
+ return typeof headers === 'function' ? headers() : headers;
175
+ }
176
+ function resolveBodyExtras(extras) {
177
+ if (!extras)
178
+ return {};
179
+ return typeof extras === 'function' ? extras() : extras;
180
+ }
181
+ function useLangGraphChatTransport(options) {
182
+ const { endpoint, headers, onData, threadId, bodyExtras, credentials = 'same-origin', onCustomEvent, renderUpdate = defaultRenderUpdate, } = options;
183
+ const [messages, setMessagesState] = (0, react_1.useState)([]);
184
+ const [status, setStatus] = (0, react_1.useState)('ready');
185
+ const [error, setError] = (0, react_1.useState)(null);
186
+ const abortRef = (0, react_1.useRef)(null);
187
+ const statusLabelRef = (0, react_1.useRef)(null);
188
+ // Mirror of the latest messages list. Used by `sendMessage` to compute
189
+ // the wire history *synchronously*, before the React state update
190
+ // has been committed — passing the result through a function updater
191
+ // ran into batching/timing where the closure captured the pre-update
192
+ // value and we shipped `messages: []` to the backend.
193
+ const messagesRef = (0, react_1.useRef)([]);
194
+ messagesRef.current = messages;
195
+ const headersRef = (0, react_1.useRef)(headers);
196
+ headersRef.current = headers;
197
+ const onDataRef = (0, react_1.useRef)(onData);
198
+ onDataRef.current = onData;
199
+ const bodyExtrasRef = (0, react_1.useRef)(bodyExtras);
200
+ bodyExtrasRef.current = bodyExtras;
201
+ // Thread id is stored in a ref so session switches picked up by the
202
+ // provider propagate into the next sendMessage without re-binding it.
203
+ const threadIdRef = (0, react_1.useRef)(threadId);
204
+ threadIdRef.current = threadId;
205
+ const subscribersRef = (0, react_1.useRef)(new Set());
206
+ const subscribeToData = (0, react_1.useCallback)((handler) => {
207
+ subscribersRef.current.add(handler);
208
+ return () => {
209
+ subscribersRef.current.delete(handler);
210
+ };
211
+ }, []);
212
+ const emitData = (0, react_1.useCallback)((part) => {
213
+ onDataRef.current?.(part);
214
+ subscribersRef.current.forEach((fn) => fn(part));
215
+ }, []);
216
+ const onCustomEventRef = (0, react_1.useRef)(onCustomEvent);
217
+ onCustomEventRef.current = onCustomEvent;
218
+ const renderUpdateRef = (0, react_1.useRef)(renderUpdate);
219
+ renderUpdateRef.current = renderUpdate;
220
+ const setMessages = (0, react_1.useCallback)((next) => {
221
+ setMessagesState(next);
222
+ }, []);
223
+ const stop = (0, react_1.useCallback)(() => {
224
+ abortRef.current?.abort();
225
+ abortRef.current = null;
226
+ setStatus((prev) => (prev === 'streaming' || prev === 'submitted' ? 'ready' : prev));
227
+ }, []);
228
+ const sendMessage = (0, react_1.useCallback)(async ({ text }) => {
229
+ const controller = new AbortController();
230
+ abortRef.current = controller;
231
+ setError(null);
232
+ setStatus('submitted');
233
+ statusLabelRef.current = null;
234
+ const userMessage = {
235
+ id: `user-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
236
+ role: 'user',
237
+ parts: [{ type: 'text', text }],
238
+ createdAt: new Date(),
239
+ };
240
+ const assistantId = `assistant-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
241
+ const assistantPlaceholder = emptyAssistantMessage(assistantId);
242
+ // Compute the request payload from the synchronous mirror so we
243
+ // don't depend on React having committed the state update yet.
244
+ const previousMessages = messagesRef.current;
245
+ const historyForRequest = [...previousMessages, userMessage];
246
+ const nextMessages = [
247
+ ...previousMessages,
248
+ userMessage,
249
+ assistantPlaceholder,
250
+ ];
251
+ messagesRef.current = nextMessages;
252
+ setMessagesState(nextMessages);
253
+ const updateAssistant = (updater) => {
254
+ setMessagesState((prev) => {
255
+ const idx = prev.findIndex((m) => m.id === assistantId);
256
+ if (idx === -1)
257
+ return prev;
258
+ const next = [...prev];
259
+ next[idx] = updater(prev[idx]);
260
+ return next;
261
+ });
262
+ };
263
+ try {
264
+ const res = await fetch(endpoint, {
265
+ method: 'POST',
266
+ signal: controller.signal,
267
+ credentials,
268
+ headers: {
269
+ 'Content-Type': 'application/json',
270
+ Accept: 'text/event-stream',
271
+ ...resolveHeaders(headersRef.current),
272
+ },
273
+ body: JSON.stringify({
274
+ messages: toWireMessages(historyForRequest),
275
+ ...(threadIdRef.current ? { threadId: threadIdRef.current } : {}),
276
+ ...resolveBodyExtras(bodyExtrasRef.current),
277
+ }),
278
+ });
279
+ if (!res.ok || !res.body) {
280
+ throw new Error(`LangGraph transport: HTTP ${res.status}${res.statusText ? ` ${res.statusText}` : ''}`);
281
+ }
282
+ setStatus('streaming');
283
+ let sawDone = false;
284
+ for await (const evt of parseSseStream(res.body)) {
285
+ switch (evt.event) {
286
+ case 'message': {
287
+ const data = JSON.parse(evt.data);
288
+ if (typeof data.content === 'string' && data.content.length > 0) {
289
+ updateAssistant((m) => appendTextDelta(m, data.content));
290
+ }
291
+ break;
292
+ }
293
+ case 'updates': {
294
+ const data = JSON.parse(evt.data);
295
+ const label = renderUpdateRef.current?.(data.node, data.update ?? {});
296
+ if (label) {
297
+ statusLabelRef.current = label;
298
+ emitData({
299
+ type: 'data-langgraph-update',
300
+ data: { node: data.node, update: data.update, label },
301
+ });
302
+ }
303
+ break;
304
+ }
305
+ case 'custom': {
306
+ const data = JSON.parse(evt.data);
307
+ const forwarded = onCustomEventRef.current?.(data);
308
+ if (forwarded) {
309
+ emitData(forwarded);
310
+ }
311
+ break;
312
+ }
313
+ case 'tool_call': {
314
+ const data = JSON.parse(evt.data);
315
+ updateAssistant((m) => upsertToolInvocation(m, data));
316
+ break;
317
+ }
318
+ case 'tool_result': {
319
+ const data = JSON.parse(evt.data);
320
+ updateAssistant((m) => applyToolResult(m, data));
321
+ break;
322
+ }
323
+ case 'error': {
324
+ const data = JSON.parse(evt.data);
325
+ throw new Error(data.message || 'LangGraph stream error');
326
+ }
327
+ case 'done': {
328
+ sawDone = true;
329
+ break;
330
+ }
331
+ default:
332
+ break;
333
+ }
334
+ if (sawDone)
335
+ break;
336
+ }
337
+ if (!sawDone) {
338
+ throw new Error('LangGraph transport: stream closed without `done` event');
339
+ }
340
+ setStatus('ready');
341
+ }
342
+ catch (err) {
343
+ if (err.name === 'AbortError') {
344
+ setStatus('ready');
345
+ return;
346
+ }
347
+ setError(err);
348
+ setStatus('error');
349
+ }
350
+ finally {
351
+ if (abortRef.current === controller)
352
+ abortRef.current = null;
353
+ }
354
+ }, [endpoint, credentials, threadId, emitData]);
355
+ const addToolApprovalResponse = (0, react_1.useCallback)(async (_response) => {
356
+ // LangGraph's approval story is consumer-driven: the backend decides
357
+ // how to resume from an interrupted graph. No-op here.
358
+ }, []);
359
+ return (0, react_1.useMemo)(() => ({
360
+ messages,
361
+ status,
362
+ error,
363
+ sendMessage,
364
+ stop,
365
+ setMessages,
366
+ addToolApprovalResponse,
367
+ subscribeToData,
368
+ }), [messages, status, error, sendMessage, stop, setMessages, addToolApprovalResponse, subscribeToData]);
369
+ }
@@ -0,0 +1,2 @@
1
+ export { useVercelAiChatTransport, useVercelAiChatTransport as useVercel, type UseVercelAiChatTransportOptions, } from '../vercel.js';
2
+ export { VercelAiChat, type VercelAiChatProps } from './vercel-ai-chat.js';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VercelAiChat = exports.useVercel = exports.useVercelAiChatTransport = void 0;
4
+ var vercel_js_1 = require("../vercel.js");
5
+ Object.defineProperty(exports, "useVercelAiChatTransport", { enumerable: true, get: function () { return vercel_js_1.useVercelAiChatTransport; } });
6
+ Object.defineProperty(exports, "useVercel", { enumerable: true, get: function () { return vercel_js_1.useVercelAiChatTransport; } });
7
+ var vercel_ai_chat_js_1 = require("./vercel-ai-chat.js");
8
+ Object.defineProperty(exports, "VercelAiChat", { enumerable: true, get: function () { return vercel_ai_chat_js_1.VercelAiChat; } });
@@ -0,0 +1,49 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type FloatingChatUIProps } from '../../components/floating-chat-ui.js';
3
+ import type { AiChatProviderConfig, SessionConfig } from '../../types.js';
4
+ export interface VercelAiChatProps extends AiChatProviderConfig, FloatingChatUIProps {
5
+ /** Chat API endpoint URL (e.g. `/api/chat`). */
6
+ endpoint: string;
7
+ /** Static headers or a function that returns headers per request. */
8
+ headers?: Record<string, string> | (() => Record<string, string>);
9
+ /** Auto-resume generation after all pending approvals are provided. Default: true. */
10
+ autoResumeOnApproval?: boolean;
11
+ /** Extra fields merged into every outgoing request body. */
12
+ bodyExtras?: Record<string, unknown> | (() => Record<string, unknown>);
13
+ /**
14
+ * Multi-session hooks. When provided, the drop-in renders a session
15
+ * switcher in the header and sends the active session id as `sessionId`
16
+ * in the request body (merged with `bodyExtras`). Your backend owns
17
+ * how to interpret it — the Vercel AI SDK itself has no thread concept.
18
+ */
19
+ sessions?: SessionConfig;
20
+ /**
21
+ * Replace the default floating UI with custom children. Useful when you
22
+ * want to compose `<MessageList />`, `<ChatInput />`, etc. yourself or
23
+ * render an inline `<AiChatPanel />` instead of a floating window.
24
+ */
25
+ children?: ReactNode;
26
+ }
27
+ /**
28
+ * Drop-in Vercel AI SDK chat widget. Bundles transport, provider, and a
29
+ * floating (trigger button + draggable window) chat UI into one component.
30
+ *
31
+ * ```tsx
32
+ * 'use client';
33
+ * import { VercelAiChat } from 'glirastes/react/vercel';
34
+ *
35
+ * export default function Layout({ children }) {
36
+ * return (
37
+ * <>
38
+ * {children}
39
+ * <VercelAiChat endpoint="/api/chat" sessions={mySessionBridge} />
40
+ * </>
41
+ * );
42
+ * }
43
+ * ```
44
+ *
45
+ * All `AiChatProviderConfig` fields (session, mentions, classNames, etc.)
46
+ * and `FloatingChatUIProps` (title, defaultOpen, width, height, draggable,
47
+ * resizable, shortcut, showClearButton) are accepted as top-level props.
48
+ */
49
+ export declare function VercelAiChat({ endpoint, headers, autoResumeOnApproval, bodyExtras, sessions, title, defaultOpen, draggable, resizable, size, hideTriggerWhenOpen, shortcut, showClearButton, confirmClear, showSessionSwitcher, headerActions, triggerIcon, showMic, children, ...providerConfig }: VercelAiChatProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.VercelAiChat = VercelAiChat;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const ai_chat_provider_js_1 = require("../../provider/ai-chat-provider.js");
8
+ const floating_chat_ui_js_1 = require("../../components/floating-chat-ui.js");
9
+ const vercel_js_1 = require("../vercel.js");
10
+ /**
11
+ * Drop-in Vercel AI SDK chat widget. Bundles transport, provider, and a
12
+ * floating (trigger button + draggable window) chat UI into one component.
13
+ *
14
+ * ```tsx
15
+ * 'use client';
16
+ * import { VercelAiChat } from 'glirastes/react/vercel';
17
+ *
18
+ * export default function Layout({ children }) {
19
+ * return (
20
+ * <>
21
+ * {children}
22
+ * <VercelAiChat endpoint="/api/chat" sessions={mySessionBridge} />
23
+ * </>
24
+ * );
25
+ * }
26
+ * ```
27
+ *
28
+ * All `AiChatProviderConfig` fields (session, mentions, classNames, etc.)
29
+ * and `FloatingChatUIProps` (title, defaultOpen, width, height, draggable,
30
+ * resizable, shortcut, showClearButton) are accepted as top-level props.
31
+ */
32
+ function VercelAiChat({ endpoint, headers, autoResumeOnApproval, bodyExtras, sessions, title, defaultOpen, draggable, resizable, size, hideTriggerWhenOpen, shortcut, showClearButton, confirmClear, showSessionSwitcher, headerActions, triggerIcon, showMic, children, ...providerConfig }) {
33
+ const [activeId, setActiveId] = (0, react_1.useState)(() => {
34
+ if (sessions?.activeId)
35
+ return sessions.activeId;
36
+ if (sessions?.defaultActiveId)
37
+ return sessions.defaultActiveId;
38
+ return 'default';
39
+ });
40
+ (0, react_1.useEffect)(() => {
41
+ if (sessions?.activeId && sessions.activeId !== activeId) {
42
+ setActiveId(sessions.activeId);
43
+ }
44
+ // eslint-disable-next-line react-hooks/exhaustive-deps
45
+ }, [sessions?.activeId]);
46
+ // When sessions are enabled, merge `sessionId` into the outgoing body
47
+ // on every request — the backend is responsible for routing.
48
+ const mergedBodyExtras = (0, react_1.useMemo)(() => {
49
+ if (!sessions)
50
+ return bodyExtras;
51
+ return () => {
52
+ const base = typeof bodyExtras === 'function'
53
+ ? bodyExtras()
54
+ : bodyExtras ?? {};
55
+ return { ...base, sessionId: activeId };
56
+ };
57
+ }, [sessions, bodyExtras, activeId]);
58
+ const transport = (0, vercel_js_1.useVercelAiChatTransport)({
59
+ endpoint,
60
+ headers,
61
+ autoResumeOnApproval,
62
+ bodyExtras: mergedBodyExtras,
63
+ });
64
+ const effectiveSession = (0, react_1.useMemo)(() => {
65
+ if (!sessions)
66
+ return providerConfig.session;
67
+ // Strip any consumer-supplied `activeId` and use `defaultActiveId`
68
+ // (seed-only) so the provider stays uncontrolled. Auto-select +
69
+ // switchSession both flow back through `onActiveIdChange`.
70
+ const { activeId: _consumerActiveId, ...rest } = sessions;
71
+ return {
72
+ ...rest,
73
+ defaultActiveId: activeId,
74
+ onActiveIdChange: (id) => {
75
+ setActiveId(id);
76
+ sessions.onActiveIdChange?.(id);
77
+ },
78
+ };
79
+ }, [sessions, activeId, providerConfig.session]);
80
+ return ((0, jsx_runtime_1.jsx)(ai_chat_provider_js_1.AiChatProvider, { transport: transport, ...providerConfig, session: effectiveSession, children: children ?? ((0, jsx_runtime_1.jsx)(floating_chat_ui_js_1.FloatingChatUI, { title: title, defaultOpen: defaultOpen, draggable: draggable, resizable: resizable, size: size, hideTriggerWhenOpen: hideTriggerWhenOpen, shortcut: shortcut, showClearButton: showClearButton, confirmClear: confirmClear, showSessionSwitcher: showSessionSwitcher, headerActions: headerActions, triggerIcon: triggerIcon, showMic: showMic })) }));
81
+ }