glirastes 0.3.0 → 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 (310) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +146 -9
  3. package/codegen/package.json +5 -0
  4. package/dist/cjs/codegen/asset-sync.d.ts +20 -0
  5. package/dist/cjs/codegen/asset-sync.js +28 -0
  6. package/dist/cjs/codegen/coverage.d.ts +66 -0
  7. package/dist/cjs/codegen/coverage.js +408 -0
  8. package/dist/cjs/codegen/endpoint-scanner.d.ts +16 -0
  9. package/dist/cjs/codegen/endpoint-scanner.js +197 -0
  10. package/dist/cjs/codegen/format.d.ts +17 -0
  11. package/dist/cjs/codegen/format.js +34 -0
  12. package/dist/cjs/codegen/fs-utils.d.ts +45 -0
  13. package/dist/cjs/codegen/fs-utils.js +165 -0
  14. package/dist/cjs/codegen/index.d.ts +13 -0
  15. package/dist/cjs/codegen/index.js +33 -0
  16. package/dist/cjs/codegen/mcp-generator.d.ts +50 -0
  17. package/dist/cjs/codegen/mcp-generator.js +803 -0
  18. package/dist/cjs/codegen/module-generator.d.ts +11 -0
  19. package/dist/cjs/codegen/module-generator.js +353 -0
  20. package/dist/cjs/codegen/nestjs-scanner.d.ts +43 -0
  21. package/dist/cjs/codegen/nestjs-scanner.js +241 -0
  22. package/dist/cjs/codegen/output-recommender.d.ts +23 -0
  23. package/dist/cjs/codegen/output-recommender.js +33 -0
  24. package/dist/cjs/codegen/scaffolder.d.ts +36 -0
  25. package/dist/cjs/codegen/scaffolder.js +262 -0
  26. package/dist/cjs/codegen/skill-generator.d.ts +49 -0
  27. package/dist/cjs/codegen/skill-generator.js +967 -0
  28. package/dist/cjs/codegen/types.d.ts +52 -0
  29. package/dist/cjs/codegen/types.js +16 -0
  30. package/dist/cjs/codegen/ui-scanner.d.ts +24 -0
  31. package/dist/cjs/codegen/ui-scanner.js +202 -0
  32. package/dist/cjs/codegen/validator.d.ts +35 -0
  33. package/dist/cjs/codegen/validator.js +292 -0
  34. package/dist/cjs/index.d.ts +1 -0
  35. package/dist/cjs/index.js +23 -0
  36. package/dist/cjs/openapi/index.d.ts +78 -0
  37. package/dist/cjs/openapi/index.js +347 -0
  38. package/dist/cjs/package.json +1 -0
  39. package/dist/cjs/react/audio-worklet-processor.d.ts +16 -0
  40. package/dist/cjs/react/audio-worklet-processor.js +27 -0
  41. package/dist/cjs/react/bridges/rest-session-bridge.d.ts +113 -0
  42. package/dist/cjs/react/bridges/rest-session-bridge.js +209 -0
  43. package/dist/cjs/react/components/ai-chat-panel.d.ts +12 -0
  44. package/dist/cjs/react/components/ai-chat-panel.js +67 -0
  45. package/dist/cjs/react/components/ai-trigger-button.d.ts +2 -0
  46. package/dist/cjs/react/components/ai-trigger-button.js +239 -0
  47. package/dist/cjs/react/components/approval-card.d.ts +9 -0
  48. package/dist/cjs/react/components/approval-card.js +24 -0
  49. package/dist/cjs/react/components/bulk-approval-card.d.ts +9 -0
  50. package/dist/cjs/react/components/bulk-approval-card.js +36 -0
  51. package/dist/cjs/react/components/chat-input.d.ts +10 -0
  52. package/dist/cjs/react/components/chat-input.js +60 -0
  53. package/dist/cjs/react/components/chat-window.d.ts +2 -0
  54. package/dist/cjs/react/components/chat-window.js +134 -0
  55. package/dist/cjs/react/components/confirm-dialog.d.ts +32 -0
  56. package/dist/cjs/react/components/confirm-dialog.js +48 -0
  57. package/dist/cjs/react/components/floating-chat-ui.d.ts +90 -0
  58. package/dist/cjs/react/components/floating-chat-ui.js +163 -0
  59. package/dist/cjs/react/components/mention-chip.d.ts +16 -0
  60. package/dist/cjs/react/components/mention-chip.js +42 -0
  61. package/dist/cjs/react/components/mention-input.d.ts +8 -0
  62. package/dist/cjs/react/components/mention-input.js +117 -0
  63. package/dist/cjs/react/components/message-bubble.d.ts +11 -0
  64. package/dist/cjs/react/components/message-bubble.js +171 -0
  65. package/dist/cjs/react/components/message-list.d.ts +8 -0
  66. package/dist/cjs/react/components/message-list.js +52 -0
  67. package/dist/cjs/react/components/pipeline-timeline.d.ts +7 -0
  68. package/dist/cjs/react/components/pipeline-timeline.js +72 -0
  69. package/dist/cjs/react/components/recording-bar.d.ts +2 -0
  70. package/dist/cjs/react/components/recording-bar.js +81 -0
  71. package/dist/cjs/react/components/recording-controls.d.ts +18 -0
  72. package/dist/cjs/react/components/recording-controls.js +38 -0
  73. package/dist/cjs/react/components/rich-mention-input.d.ts +2 -0
  74. package/dist/cjs/react/components/rich-mention-input.js +571 -0
  75. package/dist/cjs/react/components/session-switcher.d.ts +14 -0
  76. package/dist/cjs/react/components/session-switcher.js +133 -0
  77. package/dist/cjs/react/components/suggestion-bar.d.ts +9 -0
  78. package/dist/cjs/react/components/suggestion-bar.js +47 -0
  79. package/dist/cjs/react/components/suggestion-chip.d.ts +9 -0
  80. package/dist/cjs/react/components/suggestion-chip.js +14 -0
  81. package/dist/cjs/react/components/voice-input-addon.d.ts +13 -0
  82. package/dist/cjs/react/components/voice-input-addon.js +31 -0
  83. package/dist/cjs/react/components/voice-input-button.d.ts +2 -0
  84. package/dist/cjs/react/components/voice-input-button.js +55 -0
  85. package/dist/cjs/react/components/wavesurfer-loader.d.ts +5 -0
  86. package/dist/cjs/react/components/wavesurfer-loader.js +36 -0
  87. package/dist/cjs/react/hooks/use-ai-chat.d.ts +22 -0
  88. package/dist/cjs/react/hooks/use-ai-chat.js +51 -0
  89. package/dist/cjs/react/hooks/use-approvals.d.ts +23 -0
  90. package/dist/cjs/react/hooks/use-approvals.js +63 -0
  91. package/dist/cjs/react/hooks/use-deepgram-transcription.d.ts +2 -0
  92. package/dist/cjs/react/hooks/use-deepgram-transcription.js +329 -0
  93. package/dist/cjs/react/hooks/use-drag-resize-panel.d.ts +48 -0
  94. package/dist/cjs/react/hooks/use-drag-resize-panel.js +308 -0
  95. package/dist/cjs/react/hooks/use-draggable-position.d.ts +25 -0
  96. package/dist/cjs/react/hooks/use-draggable-position.js +134 -0
  97. package/dist/cjs/react/hooks/use-keyboard-shortcut.d.ts +20 -0
  98. package/dist/cjs/react/hooks/use-keyboard-shortcut.js +93 -0
  99. package/dist/cjs/react/hooks/use-mentions.d.ts +23 -0
  100. package/dist/cjs/react/hooks/use-mentions.js +42 -0
  101. package/dist/cjs/react/hooks/use-suggestions.d.ts +22 -0
  102. package/dist/cjs/react/hooks/use-suggestions.js +39 -0
  103. package/dist/cjs/react/index.d.ts +43 -0
  104. package/dist/cjs/react/index.js +111 -0
  105. package/dist/cjs/react/provider/ai-chat-provider.d.ts +45 -0
  106. package/dist/cjs/react/provider/ai-chat-provider.js +1024 -0
  107. package/dist/cjs/react/provider/chat-context.d.ts +84 -0
  108. package/dist/cjs/react/provider/chat-context.js +13 -0
  109. package/dist/cjs/react/template.d.ts +84 -0
  110. package/dist/cjs/react/template.js +90 -0
  111. package/dist/cjs/react/themes.d.ts +24 -0
  112. package/dist/cjs/react/themes.js +273 -0
  113. package/dist/cjs/react/transports/langgraph/index.d.ts +2 -0
  114. package/dist/cjs/react/transports/langgraph/index.js +8 -0
  115. package/dist/cjs/react/transports/langgraph/langgraph-ai-chat.d.ts +62 -0
  116. package/dist/cjs/react/transports/langgraph/langgraph-ai-chat.js +94 -0
  117. package/dist/cjs/react/transports/langgraph.d.ts +71 -0
  118. package/dist/cjs/react/transports/langgraph.js +369 -0
  119. package/dist/cjs/react/transports/vercel/index.d.ts +2 -0
  120. package/dist/cjs/react/transports/vercel/index.js +8 -0
  121. package/dist/cjs/react/transports/vercel/vercel-ai-chat.d.ts +49 -0
  122. package/dist/cjs/react/transports/vercel/vercel-ai-chat.js +81 -0
  123. package/dist/cjs/react/transports/vercel.d.ts +30 -0
  124. package/dist/cjs/react/transports/vercel.js +69 -0
  125. package/dist/cjs/react/types.d.ts +760 -0
  126. package/dist/cjs/react/types.js +2 -0
  127. package/dist/cjs/react/ui.d.ts +73 -0
  128. package/dist/cjs/react/ui.js +183 -0
  129. package/dist/cjs/react/utils/create-approval-description.d.ts +53 -0
  130. package/dist/cjs/react/utils/create-approval-description.js +122 -0
  131. package/dist/cjs/react/utils/create-tool-result-handler.d.ts +90 -0
  132. package/dist/cjs/react/utils/create-tool-result-handler.js +168 -0
  133. package/dist/cjs/react/utils/mention-markup.d.ts +13 -0
  134. package/dist/cjs/react/utils/mention-markup.js +117 -0
  135. package/dist/cjs/react/utils/merge-pipeline-steps.d.ts +19 -0
  136. package/dist/cjs/react/utils/merge-pipeline-steps.js +81 -0
  137. package/dist/cjs/react/utils/sanitize-stored-messages.d.ts +23 -0
  138. package/dist/cjs/react/utils/sanitize-stored-messages.js +52 -0
  139. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-auth.guard.d.ts +10 -0
  140. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-auth.guard.js +42 -0
  141. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-module-options.interface.d.ts +32 -0
  142. package/dist/cjs/server/adapters/nestjs/chat/ai-chat-module-options.interface.js +4 -0
  143. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.controller.d.ts +11 -0
  144. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.controller.js +80 -0
  145. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.module.d.ts +9 -0
  146. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.module.js +119 -0
  147. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.service.d.ts +13 -0
  148. package/dist/cjs/server/adapters/nestjs/chat/ai-chat.service.js +131 -0
  149. package/dist/cjs/server/adapters/nestjs/chat/dto/ai-chat-request.dto.d.ts +7 -0
  150. package/dist/cjs/server/adapters/nestjs/chat/dto/ai-chat-request.dto.js +52 -0
  151. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message-part.dto.d.ts +19 -0
  152. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message-part.dto.js +108 -0
  153. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message.dto.d.ts +8 -0
  154. package/dist/cjs/server/adapters/nestjs/chat/dto/chat-message.dto.js +59 -0
  155. package/dist/cjs/server/adapters/nestjs/chat/dto/index.d.ts +3 -0
  156. package/dist/cjs/server/adapters/nestjs/chat/dto/index.js +9 -0
  157. package/dist/cjs/server/adapters/nestjs/chat/index.d.ts +3 -0
  158. package/dist/cjs/server/adapters/nestjs/chat/index.js +9 -0
  159. package/dist/cjs/server/adapters/nestjs/chat/speech-stream.gateway.d.ts +4 -0
  160. package/dist/cjs/server/adapters/nestjs/chat/speech-stream.gateway.js +73 -0
  161. package/dist/cjs/server/adapters/nestjs/chat/ws-loader.d.ts +5 -0
  162. package/dist/cjs/server/adapters/nestjs/chat/ws-loader.js +72 -0
  163. package/dist/cjs/server/adapters/nestjs/decorators/ai-module.decorator.d.ts +6 -0
  164. package/dist/cjs/server/adapters/nestjs/decorators/ai-module.decorator.js +13 -0
  165. package/dist/cjs/server/adapters/nestjs/decorators/ai-param.decorator.d.ts +5 -0
  166. package/dist/cjs/server/adapters/nestjs/decorators/ai-param.decorator.js +15 -0
  167. package/dist/cjs/server/adapters/nestjs/decorators/ai-tool.decorator.d.ts +6 -0
  168. package/dist/cjs/server/adapters/nestjs/decorators/ai-tool.decorator.js +22 -0
  169. package/dist/cjs/server/adapters/nestjs/decorators/constants.d.ts +4 -0
  170. package/dist/cjs/server/adapters/nestjs/decorators/constants.js +7 -0
  171. package/dist/cjs/server/adapters/nestjs/index.d.ts +14 -0
  172. package/dist/cjs/server/adapters/nestjs/index.js +42 -0
  173. package/dist/cjs/server/adapters/nestjs/metadata.d.ts +39 -0
  174. package/dist/cjs/server/adapters/nestjs/metadata.js +36 -0
  175. package/dist/cjs/server/adapters/nestjs/module/ai-tools-explorer.service.d.ts +36 -0
  176. package/dist/cjs/server/adapters/nestjs/module/ai-tools-explorer.service.js +159 -0
  177. package/dist/cjs/server/adapters/nestjs/module/ai-tools.module.d.ts +37 -0
  178. package/dist/cjs/server/adapters/nestjs/module/ai-tools.module.js +44 -0
  179. package/dist/cjs/server/adapters/nestjs/module/ai-tools.service.d.ts +28 -0
  180. package/dist/cjs/server/adapters/nestjs/module/ai-tools.service.js +41 -0
  181. package/dist/cjs/server/adapters/nestjs/scanner/nestjs-scanner.d.ts +16 -0
  182. package/dist/cjs/server/adapters/nestjs/scanner/nestjs-scanner.js +117 -0
  183. package/dist/cjs/server/adapters/nestjs/scanner/schema-builder.d.ts +26 -0
  184. package/dist/cjs/server/adapters/nestjs/scanner/schema-builder.js +259 -0
  185. package/dist/cjs/server/adapters/nestjs/swagger.d.ts +7 -0
  186. package/dist/cjs/server/adapters/nestjs/swagger.js +39 -0
  187. package/dist/cjs/server/adapters/nextjs/context-helpers.d.ts +22 -0
  188. package/dist/cjs/server/adapters/nextjs/context-helpers.js +60 -0
  189. package/dist/cjs/server/adapters/nextjs/create-ai-chat-handler.d.ts +94 -0
  190. package/dist/cjs/server/adapters/nextjs/create-ai-chat-handler.js +965 -0
  191. package/dist/cjs/server/adapters/nextjs/filter-fallback-error.d.ts +11 -0
  192. package/dist/cjs/server/adapters/nextjs/filter-fallback-error.js +41 -0
  193. package/dist/cjs/server/adapters/nextjs/index.d.ts +8 -0
  194. package/dist/cjs/server/adapters/nextjs/index.js +22 -0
  195. package/dist/cjs/server/adapters/nextjs/prepare-model-messages.d.ts +58 -0
  196. package/dist/cjs/server/adapters/nextjs/prepare-model-messages.js +114 -0
  197. package/dist/cjs/server/adapters/nextjs/sanitize-model-messages.d.ts +64 -0
  198. package/dist/cjs/server/adapters/nextjs/sanitize-model-messages.js +489 -0
  199. package/dist/cjs/server/adapters/nextjs/server-action-helper.d.ts +7 -0
  200. package/dist/cjs/server/adapters/nextjs/server-action-helper.js +40 -0
  201. package/dist/cjs/server/adapters/nextjs/types.d.ts +246 -0
  202. package/dist/cjs/server/adapters/nextjs/types.js +2 -0
  203. package/dist/cjs/server/adapters/nextjs/with-ai-tool.d.ts +9 -0
  204. package/dist/cjs/server/adapters/nextjs/with-ai-tool.js +12 -0
  205. package/dist/cjs/server/core/followup-tool.d.ts +9 -0
  206. package/dist/cjs/server/core/followup-tool.js +82 -0
  207. package/dist/cjs/server/core/index.d.ts +139 -0
  208. package/dist/cjs/server/core/index.js +818 -0
  209. package/dist/cjs/server/core/intent-classifier.d.ts +94 -0
  210. package/dist/cjs/server/core/intent-classifier.js +324 -0
  211. package/dist/cjs/server/core/model-selector.d.ts +12 -0
  212. package/dist/cjs/server/core/model-selector.js +48 -0
  213. package/dist/cjs/server/core/module-router.d.ts +14 -0
  214. package/dist/cjs/server/core/module-router.js +110 -0
  215. package/dist/cjs/server/core/zod-compact.d.ts +18 -0
  216. package/dist/cjs/server/core/zod-compact.js +129 -0
  217. package/dist/cjs/server/index.d.ts +6 -0
  218. package/dist/cjs/server/index.js +28 -0
  219. package/dist/cjs/server/lancer/cache.d.ts +9 -0
  220. package/dist/cjs/server/lancer/cache.js +33 -0
  221. package/dist/cjs/server/lancer/client.d.ts +2 -0
  222. package/dist/cjs/server/lancer/client.js +279 -0
  223. package/dist/cjs/server/lancer/errors.d.ts +13 -0
  224. package/dist/cjs/server/lancer/errors.js +21 -0
  225. package/dist/cjs/server/lancer/index.d.ts +3 -0
  226. package/dist/cjs/server/lancer/index.js +7 -0
  227. package/dist/cjs/server/lancer/telemetry-buffer.d.ts +15 -0
  228. package/dist/cjs/server/lancer/telemetry-buffer.js +64 -0
  229. package/dist/cjs/server/lancer/types.d.ts +201 -0
  230. package/dist/cjs/server/lancer/types.js +5 -0
  231. package/dist/cjs/server/pii-shield/aegis-detector.d.ts +26 -0
  232. package/dist/cjs/server/pii-shield/aegis-detector.js +26 -0
  233. package/dist/cjs/server/pii-shield/create-pii-shield.d.ts +2 -0
  234. package/dist/cjs/server/pii-shield/create-pii-shield.js +191 -0
  235. package/dist/cjs/server/pii-shield/deep-walk.d.ts +1 -0
  236. package/dist/cjs/server/pii-shield/deep-walk.js +19 -0
  237. package/dist/cjs/server/pii-shield/fake-data.d.ts +5 -0
  238. package/dist/cjs/server/pii-shield/fake-data.js +170 -0
  239. package/dist/cjs/server/pii-shield/index.d.ts +4 -0
  240. package/dist/cjs/server/pii-shield/index.js +9 -0
  241. package/dist/cjs/server/pii-shield/leakage.d.ts +1 -0
  242. package/dist/cjs/server/pii-shield/leakage.js +15 -0
  243. package/dist/cjs/server/pii-shield/session-mapping.d.ts +12 -0
  244. package/dist/cjs/server/pii-shield/session-mapping.js +70 -0
  245. package/dist/cjs/server/pipeline.d.ts +26 -0
  246. package/dist/cjs/server/pipeline.js +127 -0
  247. package/dist/cjs/server/testing/approvals.d.ts +11 -0
  248. package/dist/cjs/server/testing/approvals.js +41 -0
  249. package/dist/cjs/server/testing/combination.d.ts +3 -0
  250. package/dist/cjs/server/testing/combination.js +83 -0
  251. package/dist/cjs/server/testing/create-test-suite.d.ts +29 -0
  252. package/dist/cjs/server/testing/create-test-suite.js +81 -0
  253. package/dist/cjs/server/testing/edge-cases.d.ts +8 -0
  254. package/dist/cjs/server/testing/edge-cases.js +277 -0
  255. package/dist/cjs/server/testing/guardrails.d.ts +14 -0
  256. package/dist/cjs/server/testing/guardrails.js +152 -0
  257. package/dist/cjs/server/testing/helpers.d.ts +14 -0
  258. package/dist/cjs/server/testing/helpers.js +119 -0
  259. package/dist/cjs/server/testing/index.d.ts +12 -0
  260. package/dist/cjs/server/testing/index.js +37 -0
  261. package/dist/cjs/server/testing/mock-executor.d.ts +8 -0
  262. package/dist/cjs/server/testing/mock-executor.js +40 -0
  263. package/dist/cjs/server/testing/regression.d.ts +7 -0
  264. package/dist/cjs/server/testing/regression.js +27 -0
  265. package/dist/cjs/server/testing/routing.d.ts +12 -0
  266. package/dist/cjs/server/testing/routing.js +63 -0
  267. package/dist/cjs/server/testing/schema-consistency.d.ts +6 -0
  268. package/dist/cjs/server/testing/schema-consistency.js +56 -0
  269. package/dist/cjs/server/testing/smoke.d.ts +11 -0
  270. package/dist/cjs/server/testing/smoke.js +64 -0
  271. package/dist/cjs/server/testing/types.d.ts +156 -0
  272. package/dist/cjs/server/testing/types.js +2 -0
  273. package/dist/cjs/types.d.ts +696 -0
  274. package/dist/cjs/types.js +91 -0
  275. package/dist/cli/commands/install-skills.d.ts +17 -0
  276. package/dist/cli/commands/install-skills.js +185 -0
  277. package/dist/cli/commands/install-skills.js.map +1 -0
  278. package/dist/cli/index.js +25 -0
  279. package/dist/cli/index.js.map +1 -1
  280. package/dist/react/components/ai-trigger-button.js +4 -6
  281. package/dist/react/components/ai-trigger-button.js.map +1 -1
  282. package/dist/react/components/recording-bar.js +4 -6
  283. package/dist/react/components/recording-bar.js.map +1 -1
  284. package/dist/react/components/wavesurfer-loader.d.ts +5 -0
  285. package/dist/react/components/wavesurfer-loader.js +34 -0
  286. package/dist/react/components/wavesurfer-loader.js.map +1 -0
  287. package/dist/server/adapters/nestjs/chat/ai-chat.module.d.ts +1 -1
  288. package/dist/server/adapters/nestjs/chat/ai-chat.module.js +3 -2
  289. package/dist/server/adapters/nestjs/chat/ai-chat.module.js.map +1 -1
  290. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.d.ts +1 -1
  291. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.js +10 -8
  292. package/dist/server/adapters/nestjs/chat/speech-stream.gateway.js.map +1 -1
  293. package/dist/server/adapters/nestjs/chat/ws-loader.d.ts +5 -0
  294. package/dist/server/adapters/nestjs/chat/ws-loader.js +37 -0
  295. package/dist/server/adapters/nestjs/chat/ws-loader.js.map +1 -0
  296. package/openapi/package.json +5 -0
  297. package/package.json +59 -16
  298. package/react/langgraph/package.json +5 -0
  299. package/react/package.json +5 -0
  300. package/react/vercel/package.json +5 -0
  301. package/server/nestjs/package.json +5 -0
  302. package/server/nextjs/package.json +5 -0
  303. package/server/package.json +5 -0
  304. package/server/testing/package.json +5 -0
  305. package/skills/README.md +107 -0
  306. package/skills/building-glirastes-chat-ui/SKILL.md +378 -0
  307. package/skills/integrating-glirastes-nestjs/SKILL.md +346 -0
  308. package/skills/integrating-glirastes-nextjs/SKILL.md +306 -0
  309. package/skills/integrating-glirastes-nextjs-with-nestjs-backend/SKILL.md +359 -0
  310. package/skills/maintaining-glirastes-tools/SKILL.md +463 -0
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MentionInput = MentionInput;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const mention_chip_js_1 = require("./mention-chip.js");
7
+ const rich_mention_input_js_1 = require("./rich-mention-input.js");
8
+ const voice_input_addon_js_1 = require("./voice-input-addon.js");
9
+ const chat_context_js_1 = require("../provider/chat-context.js");
10
+ const mention_markup_js_1 = require("../utils/mention-markup.js");
11
+ /**
12
+ * Chat input with mention autocomplete support.
13
+ *
14
+ * Uses `RichMentionInput` for editing, provides autocomplete for `@` and `/`,
15
+ * and keeps selected mentions in provider state for serialization on send.
16
+ */
17
+ function MentionInput({ className, onSubmit }) {
18
+ const { send, stop, isLoading, classNames, locale, components, mentionResults, setMentionSearch, clearMentionSearch, isMentionSearching, hasMentions, mentionConfig, addActiveMention, removeActiveMention, clearActiveMentions, activeMentions, voice, } = (0, chat_context_js_1.useChatContext)();
19
+ const [value, setValue] = (0, react_1.useState)('');
20
+ const inputRef = (0, react_1.useRef)(null);
21
+ const InputExtra = components.InputExtra;
22
+ const detectMentionQuery = (0, react_1.useCallback)((text) => {
23
+ const match = text.match(/(?:^|\s)([@/])([a-zA-Z0-9._-]{1,80})$/);
24
+ if (!match)
25
+ return null;
26
+ return {
27
+ trigger: match[1],
28
+ query: match[2] ?? '',
29
+ };
30
+ }, []);
31
+ const updateValue = (0, react_1.useCallback)((nextValue) => {
32
+ setValue(nextValue);
33
+ if (!hasMentions)
34
+ return;
35
+ const mentionState = detectMentionQuery(nextValue);
36
+ if (mentionState && mentionState.query.length > 0) {
37
+ setMentionSearch(mentionState.query, mentionState.trigger);
38
+ return;
39
+ }
40
+ clearMentionSearch();
41
+ }, [clearMentionSearch, detectMentionQuery, hasMentions, setMentionSearch]);
42
+ const handleSubmit = (0, react_1.useCallback)((message) => {
43
+ const trimmed = message.trim();
44
+ if (!trimmed || isLoading)
45
+ return;
46
+ if (onSubmit) {
47
+ onSubmit(trimmed);
48
+ }
49
+ else {
50
+ send(trimmed);
51
+ }
52
+ setValue('');
53
+ clearMentionSearch();
54
+ clearActiveMentions();
55
+ }, [clearActiveMentions, clearMentionSearch, isLoading, onSubmit, send]);
56
+ const selectedMentionIds = (0, react_1.useMemo)(() => new Set(activeMentions.map((mention) => String(mention.id))), [activeMentions]);
57
+ const applyMention = (0, react_1.useCallback)(async (result) => {
58
+ const mentionState = detectMentionQuery(value);
59
+ const prefix = mentionState?.trigger ?? (0, mention_markup_js_1.inferMentionPrefix)(result.type);
60
+ const explicitSlug = result.slug;
61
+ const slug = typeof explicitSlug === 'string' && explicitSlug.trim().length > 0
62
+ ? explicitSlug.trim()
63
+ : (0, mention_markup_js_1.normalizeMentionSlug)(result.label);
64
+ const token = `${prefix}${slug}`;
65
+ const replaced = value.replace(/(^|\s)([@/])[a-zA-Z0-9._-]*$/, `$1${token} `);
66
+ const nextValue = replaced === value
67
+ ? `${value.trimEnd()} ${token} `.trimStart()
68
+ : replaced;
69
+ let resolved = {};
70
+ if (mentionConfig?.resolve) {
71
+ try {
72
+ resolved = await mentionConfig.resolve(result.id, result.type);
73
+ }
74
+ catch {
75
+ resolved = {};
76
+ }
77
+ }
78
+ addActiveMention({
79
+ ...resolved,
80
+ id: result.id,
81
+ type: result.type,
82
+ label: result.label,
83
+ displayName: typeof resolved.displayName === 'string' ? resolved.displayName : result.label,
84
+ slug,
85
+ prefix,
86
+ });
87
+ updateValue(nextValue);
88
+ clearMentionSearch();
89
+ inputRef.current?.focus();
90
+ }, [
91
+ addActiveMention,
92
+ clearMentionSearch,
93
+ detectMentionQuery,
94
+ mentionConfig,
95
+ updateValue,
96
+ value,
97
+ ]);
98
+ return ((0, jsx_runtime_1.jsxs)("div", { "data-component": "mention-input", children: [(0, jsx_runtime_1.jsxs)("form", { onSubmit: (event) => {
99
+ event.preventDefault();
100
+ handleSubmit(value);
101
+ }, className: className ?? classNames.input, children: [(0, jsx_runtime_1.jsx)(mention_chip_js_1.MentionChipList, { mentions: activeMentions.map((mention) => ({
102
+ id: String(mention.id),
103
+ type: String(mention.type),
104
+ displayName: typeof mention.displayName === 'string'
105
+ ? mention.displayName
106
+ : typeof mention.label === 'string'
107
+ ? mention.label
108
+ : String(mention.id),
109
+ slug: typeof mention.slug === 'string' ? mention.slug : undefined,
110
+ prefix: typeof mention.prefix === 'string' ? mention.prefix : undefined,
111
+ })), onRemove: removeActiveMention }), (0, jsx_runtime_1.jsx)(rich_mention_input_js_1.RichMentionInput, { ref: inputRef, value: value, onChange: updateValue, onSubmit: handleSubmit, placeholder: locale.placeholder, disabled: isLoading }), voice.enabled && ((0, jsx_runtime_1.jsx)(voice_input_addon_js_1.VoiceInputAddon, { disabled: isLoading, language: voice.language ?? 'de', baseUrl: voice.baseUrl, getToken: voice.getToken, onTranscript: (text) => {
112
+ const nextValue = value.length > 0 ? `${value} ${text}` : text;
113
+ updateValue(nextValue);
114
+ }, onError: voice.onError, showRecordingBar: voice.recordingBar?.enabled ?? true, recordingBarVariant: voice.recordingBar?.variant ?? 'inline' })), InputExtra && (0, jsx_runtime_1.jsx)(InputExtra, {}), isLoading ? ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: stop, "data-action": "stop", children: locale.stopButton })) : ((0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: !value.trim(), "data-action": "send", children: locale.sendButton }))] }), hasMentions && mentionResults.length > 0 && ((0, jsx_runtime_1.jsx)("div", { "data-component": "mention-dropdown", "data-state": isMentionSearching ? 'searching' : 'idle', children: mentionResults.map((result) => ((0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: () => {
115
+ void applyMention(result);
116
+ }, "data-mention-type": result.type, "data-selected": selectedMentionIds.has(result.id) ? 'true' : 'false', children: [result.label, result.description && ((0, jsx_runtime_1.jsx)("span", { "data-element": "description", children: result.description }))] }, result.id))) }))] }));
117
+ }
@@ -0,0 +1,11 @@
1
+ import type { MessageBubbleProps } from '../types.js';
2
+ /**
3
+ * Single message bubble.
4
+ *
5
+ * Renders text parts via Markdown component, mention markers as chips,
6
+ * tool results via ToolResultBlock, and handles AI SDK 5.x/6.x tool part
7
+ * format (`type: 'tool-{name}'`).
8
+ *
9
+ * Uses `data-role` attribute for styling (user/assistant/system).
10
+ */
11
+ export declare function MessageBubble({ message, className }: MessageBubbleProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MessageBubble = MessageBubble;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const react_1 = require("react");
39
+ const mention_chip_js_1 = require("./mention-chip.js");
40
+ const chat_context_js_1 = require("../provider/chat-context.js");
41
+ const mention_markup_js_1 = require("../utils/mention-markup.js");
42
+ const ReactMarkdown = (0, react_1.lazy)(async () => {
43
+ try {
44
+ const mod = await Promise.resolve().then(() => __importStar(require('react-markdown')));
45
+ return { default: mod.default };
46
+ }
47
+ catch {
48
+ if (typeof console !== 'undefined') {
49
+ console.warn('[MessageBubble] react-markdown is not installed — falling back to plain text. Install it with: npm install react-markdown');
50
+ }
51
+ const Fallback = (({ children }) => ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: typeof children === 'string' ? children : '' })));
52
+ return { default: Fallback };
53
+ }
54
+ });
55
+ function isRecord(value) {
56
+ return typeof value === 'object' && value !== null;
57
+ }
58
+ function shouldRenderToolResult(toolName, mode, allowlist) {
59
+ if (mode === 'hidden')
60
+ return false;
61
+ if (mode === 'allowlist')
62
+ return allowlist.includes(toolName);
63
+ return true;
64
+ }
65
+ function isTextPart(part) {
66
+ return isRecord(part) && part.type === 'text' && typeof part.text === 'string';
67
+ }
68
+ /**
69
+ * Single message bubble.
70
+ *
71
+ * Renders text parts via Markdown component, mention markers as chips,
72
+ * tool results via ToolResultBlock, and handles AI SDK 5.x/6.x tool part
73
+ * format (`type: 'tool-{name}'`).
74
+ *
75
+ * Uses `data-role` attribute for styling (user/assistant/system).
76
+ */
77
+ function MessageBubble({ message, className }) {
78
+ const { classNames, components, toolResults } = (0, chat_context_js_1.useChatContext)();
79
+ const MarkdownComponent = components.Markdown ?? DefaultMarkdown;
80
+ const ToolResultComponent = components.ToolResultBlock ?? DefaultToolResult;
81
+ const MentionChipComponent = components.MentionChip ?? mention_chip_js_1.MentionChip;
82
+ const mode = toolResults.mode ?? 'default';
83
+ const allowlist = toolResults.allowlist ?? [];
84
+ // Extract tool result summaries as fallback text when no text parts exist
85
+ const cleanTextParts = message.parts
86
+ .filter(isTextPart)
87
+ .filter((p) => p.text.trim())
88
+ .map((p) => (0, mention_markup_js_1.stripContextBlocks)(p.text));
89
+ const hasTextContent = cleanTextParts.some((text) => text.trim().length > 0);
90
+ // Build fallback summary from tool outputs
91
+ let fallbackSummary = '';
92
+ if (!hasTextContent && message.role === 'assistant') {
93
+ const summaries = [];
94
+ for (const part of message.parts) {
95
+ if (!isRecord(part))
96
+ continue;
97
+ const partType = typeof part.type === 'string' ? part.type : '';
98
+ // Handle tool-{name} parts (AI SDK 5.x/6.x format)
99
+ if (partType.startsWith('tool-') && part.state === 'output-available' && isRecord(part.output)) {
100
+ if (typeof part.output.message === 'string') {
101
+ summaries.push(part.output.message);
102
+ }
103
+ }
104
+ // Handle tool-result parts
105
+ if (partType === 'tool-result' && isRecord(part.result)) {
106
+ if (typeof part.result.message === 'string') {
107
+ summaries.push(part.result.message);
108
+ }
109
+ }
110
+ }
111
+ fallbackSummary = summaries[0] ?? '';
112
+ }
113
+ // Skip truly empty assistant messages
114
+ if (message.role === 'assistant' && !hasTextContent && !fallbackSummary) {
115
+ const hasToolOutput = message.parts.some(p => {
116
+ if (!isRecord(p))
117
+ return false;
118
+ const t = typeof p.type === 'string' ? p.type : '';
119
+ return (t.startsWith('tool-') && p.state === 'output-available') || t === 'tool-result';
120
+ });
121
+ if (!hasToolOutput)
122
+ return null;
123
+ }
124
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className ?? classNames.messageBubble, "data-component": "message-bubble", "data-role": message.role, children: [cleanTextParts.map((text, i) => {
125
+ const segments = (0, mention_markup_js_1.parseMentionSegments)(text);
126
+ const hasMention = segments.some((segment) => segment.kind === 'mention');
127
+ if (!hasMention) {
128
+ if (!text.trim())
129
+ return null;
130
+ return ((0, jsx_runtime_1.jsx)(MarkdownComponent, { content: text }, `text-${i}`));
131
+ }
132
+ return ((0, jsx_runtime_1.jsx)("div", { "data-component": "message-rich-text", children: segments.map((segment, index) => {
133
+ if (segment.kind === 'text') {
134
+ if (!segment.text)
135
+ return null;
136
+ return ((0, jsx_runtime_1.jsx)("span", { "data-component": "message-rich-text-part", children: segment.text }, `segment-text-${index}`));
137
+ }
138
+ return ((0, jsx_runtime_1.jsx)(MentionChipComponent, { mention: segment.mention, inline: true }, `segment-mention-${index}`));
139
+ }) }, `mention-text-${i}`));
140
+ }), !hasTextContent && fallbackSummary && ((0, jsx_runtime_1.jsx)(MarkdownComponent, { content: fallbackSummary })), message.parts.map((part, i) => {
141
+ // Standard ToolResultPart
142
+ if ('toolName' in part && 'result' in part && part.result !== undefined) {
143
+ if (!shouldRenderToolResult(part.toolName, mode, allowlist))
144
+ return null;
145
+ return ((0, jsx_runtime_1.jsx)(ToolResultComponent, { toolName: part.toolName, result: part.result }, `tool-${i}`));
146
+ }
147
+ // AI SDK 5.x/6.x tool-{name} parts with output
148
+ if (isRecord(part)) {
149
+ const partType = typeof part.type === 'string' ? part.type : '';
150
+ if (partType.startsWith('tool-') && part.state === 'output-available' && part.output !== undefined) {
151
+ const toolName = partType.replace('tool-', '');
152
+ // Skip suggest_followups — handled by suggestion system
153
+ if (toolName === 'suggest_followups')
154
+ return null;
155
+ if (!shouldRenderToolResult(toolName, mode, allowlist))
156
+ return null;
157
+ return ((0, jsx_runtime_1.jsx)(ToolResultComponent, { toolName: toolName, result: part.output }, `tool-${i}`));
158
+ }
159
+ }
160
+ return null;
161
+ })] }));
162
+ }
163
+ function DefaultMarkdown({ content, className }) {
164
+ return ((0, jsx_runtime_1.jsx)("div", { className: className, "data-component": "markdown", children: (0, jsx_runtime_1.jsx)(react_1.Suspense, { fallback: (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: content }), children: (0, jsx_runtime_1.jsx)(ReactMarkdown, { children: content }) }) }));
165
+ }
166
+ function DefaultToolResult({ toolName, result, className, }) {
167
+ if (isRecord(result) && typeof result.message === 'string' && result.message.trim().length > 0) {
168
+ return ((0, jsx_runtime_1.jsx)("div", { className: className, "data-component": "tool-result", "data-tool": toolName, children: result.message }));
169
+ }
170
+ return ((0, jsx_runtime_1.jsxs)("details", { className: className, "data-component": "tool-result", "data-tool": toolName, children: [(0, jsx_runtime_1.jsx)("summary", { children: toolName }), (0, jsx_runtime_1.jsx)("pre", { children: JSON.stringify(result, null, 2) })] }));
171
+ }
@@ -0,0 +1,8 @@
1
+ import type { MessageListProps } from '../types.js';
2
+ /**
3
+ * Scrollable message list with auto-scroll and pagination.
4
+ *
5
+ * Uses the `MessageBubble` component from provider config or the default.
6
+ * Supports `loadMore` for infinite scroll upwards.
7
+ */
8
+ export declare function MessageList({ className }: MessageListProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessageList = MessageList;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const chat_context_js_1 = require("../provider/chat-context.js");
7
+ const message_bubble_js_1 = require("./message-bubble.js");
8
+ /**
9
+ * Scrollable message list with auto-scroll and pagination.
10
+ *
11
+ * Uses the `MessageBubble` component from provider config or the default.
12
+ * Supports `loadMore` for infinite scroll upwards.
13
+ */
14
+ function MessageList({ className }) {
15
+ const { messages, isLoading, hasMore, loadMore, classNames, components, locale } = (0, chat_context_js_1.useChatContext)();
16
+ const endRef = (0, react_1.useRef)(null);
17
+ const containerRef = (0, react_1.useRef)(null);
18
+ const userScrolledRef = (0, react_1.useRef)(false);
19
+ const BubbleComponent = components.MessageBubble ?? message_bubble_js_1.MessageBubble;
20
+ // New message: reset user-scroll and force scroll to bottom.
21
+ (0, react_1.useEffect)(() => {
22
+ userScrolledRef.current = false;
23
+ const el = containerRef.current;
24
+ if (!el)
25
+ return;
26
+ const id = requestAnimationFrame(() => { el.scrollTop = el.scrollHeight; });
27
+ return () => cancelAnimationFrame(id);
28
+ }, [messages.length]);
29
+ // Streaming chunks & loading-state changes: keep at bottom unless user scrolled up.
30
+ (0, react_1.useEffect)(() => {
31
+ if (userScrolledRef.current)
32
+ return;
33
+ const el = containerRef.current;
34
+ if (!el)
35
+ return;
36
+ const id = requestAnimationFrame(() => { el.scrollTop = el.scrollHeight; });
37
+ return () => cancelAnimationFrame(id);
38
+ }, [messages, isLoading]);
39
+ // Detect user scroll: programmatic scroll lands at scrollHeight (dist ≈ 0),
40
+ // user scroll-up moves away from bottom (dist > 80).
41
+ const handleScroll = (0, react_1.useCallback)(() => {
42
+ const el = containerRef.current;
43
+ if (!el)
44
+ return;
45
+ const dist = el.scrollHeight - el.scrollTop - el.clientHeight;
46
+ if (dist <= 2)
47
+ userScrolledRef.current = false;
48
+ else if (dist > 80)
49
+ userScrolledRef.current = true;
50
+ }, []);
51
+ return ((0, jsx_runtime_1.jsxs)("div", { ref: containerRef, onScroll: handleScroll, className: className ?? classNames.messageList, "data-component": "message-list", children: [hasMore && ((0, jsx_runtime_1.jsx)("button", { onClick: loadMore, "data-action": "load-more", children: locale.loadMoreButton ?? 'Load more' })), messages.map((message) => ((0, jsx_runtime_1.jsx)(BubbleComponent, { message: message }, message.id))), (0, jsx_runtime_1.jsx)("div", { ref: endRef })] }));
52
+ }
@@ -0,0 +1,7 @@
1
+ import type { PipelineTimelineProps } from '../types.js';
2
+ /**
3
+ * Vertical step timeline for the streamed pipeline report.
4
+ *
5
+ * Keeps styling neutral via `data-*` attributes.
6
+ */
7
+ export declare function PipelineTimeline({ steps, pipelineState, isLoading, onStop, className, }: PipelineTimelineProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PipelineTimeline = PipelineTimeline;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const chat_context_js_1 = require("../provider/chat-context.js");
7
+ function statusLabel(status, labels) {
8
+ switch (status) {
9
+ case 'running':
10
+ return labels.running;
11
+ case 'completed':
12
+ return labels.completed;
13
+ case 'safety-stop':
14
+ return labels.safetyStop;
15
+ case 'aborted':
16
+ return labels.aborted;
17
+ case 'error':
18
+ return labels.error;
19
+ default:
20
+ return labels.running;
21
+ }
22
+ }
23
+ /**
24
+ * Vertical step timeline for the streamed pipeline report.
25
+ *
26
+ * Keeps styling neutral via `data-*` attributes.
27
+ */
28
+ function PipelineTimeline({ steps, pipelineState, isLoading, onStop, className, }) {
29
+ const { classNames, locale, toolLabels, pipelineMessageTranslator, stepSummaryFormatter } = (0, chat_context_js_1.useChatContext)();
30
+ /** Translate a raw tool name via toolLabels (singular/plural). */
31
+ const translateToolCalls = (toolCalls) => {
32
+ const labelMap = toolLabels.labels;
33
+ if (!labelMap)
34
+ return toolCalls.join(', ');
35
+ return toolCalls
36
+ .map((name) => {
37
+ const entry = labelMap[name];
38
+ return entry ? entry.singular : name;
39
+ })
40
+ .join(', ');
41
+ };
42
+ const currentStatus = pipelineState?.status ?? (isLoading ? 'running' : null);
43
+ const labels = (0, react_1.useMemo)(() => ({
44
+ running: locale.pipelineRunningLabel ?? 'Running',
45
+ completed: locale.pipelineCompletedLabel ?? 'Completed',
46
+ safetyStop: locale.pipelineSafetyStopLabel ?? 'Safety stop',
47
+ aborted: locale.pipelineAbortedLabel ?? 'Stopped',
48
+ error: locale.pipelineErrorLabel ?? 'Error',
49
+ step: locale.pipelineStepLabel ?? 'Step',
50
+ approvalPending: locale.pipelineApprovalPendingLabel ?? 'Approval pending',
51
+ }), [locale]);
52
+ const [collapsed, setCollapsed] = (0, react_1.useState)(true);
53
+ const scrollRef = (0, react_1.useRef)(null);
54
+ // Auto-scroll to bottom when new steps arrive
55
+ (0, react_1.useEffect)(() => {
56
+ if (!collapsed && scrollRef.current) {
57
+ scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
58
+ }
59
+ }, [steps.length, collapsed]);
60
+ const hasContent = steps.length > 0 || currentStatus !== null;
61
+ if (!hasContent)
62
+ return null;
63
+ return ((0, jsx_runtime_1.jsxs)("section", { className: className ?? classNames.pipelineTimeline, "data-component": "pipeline-timeline", "data-state": currentStatus ?? 'idle', "data-collapsed": collapsed ? 'true' : 'false', children: [(0, jsx_runtime_1.jsxs)("div", { "data-element": "header", onClick: () => setCollapsed(c => !c), role: "button", tabIndex: 0, onKeyDown: (e) => { if (e.key === 'Enter' || e.key === ' ') {
64
+ e.preventDefault();
65
+ setCollapsed(c => !c);
66
+ } }, children: [(0, jsx_runtime_1.jsxs)("div", { "data-element": "header-left", children: [(0, jsx_runtime_1.jsx)("span", { "data-element": "chevron", "aria-hidden": "true" }), (0, jsx_runtime_1.jsx)("strong", { children: locale.pipelineTitle ?? 'Pipeline' }), collapsed && steps.length > 0 && ((0, jsx_runtime_1.jsx)("span", { "data-element": "step-count", children: steps.length }))] }), (0, jsx_runtime_1.jsxs)("div", { "data-element": "header-right", children: [currentStatus && ((0, jsx_runtime_1.jsx)("span", { "data-element": "status", children: statusLabel(currentStatus, labels) })), isLoading && ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: (e) => { e.stopPropagation(); onStop?.(); }, "data-action": "stop-pipeline", children: locale.stopButton }))] })] }), !collapsed && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("ol", { "data-element": "steps", ref: scrollRef, children: steps.map((step) => {
67
+ const summary = stepSummaryFormatter ? stepSummaryFormatter(step) : step.summary;
68
+ return ((0, jsx_runtime_1.jsxs)("li", { "data-element": "step", "data-status": step.requiresApproval ? 'approval-pending' : 'completed', title: summary, children: [(0, jsx_runtime_1.jsx)("span", { "data-element": "title", children: step.stepNumber + 1 }), step.toolCalls.length > 0 ? ((0, jsx_runtime_1.jsx)("span", { "data-element": "tools", children: translateToolCalls(step.toolCalls) })) : ((0, jsx_runtime_1.jsx)("span", { "data-element": "summary", children: summary })), step.requiresApproval && ((0, jsx_runtime_1.jsx)("span", { "data-element": "approval", children: labels.approvalPending }))] }, `step-${step.stepNumber}`));
69
+ }) }), pipelineState?.message && ((0, jsx_runtime_1.jsx)("p", { "data-element": "message", children: pipelineMessageTranslator
70
+ ? pipelineMessageTranslator(pipelineState.message)
71
+ : pipelineState.message }))] }))] }));
72
+ }
@@ -0,0 +1,2 @@
1
+ import type { RecordingBarProps } from '../types.js';
2
+ export declare function RecordingBar(props: RecordingBarProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecordingBar = RecordingBar;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const react_dom_1 = require("react-dom");
7
+ const recording_controls_js_1 = require("./recording-controls.js");
8
+ const wavesurfer_loader_js_1 = require("./wavesurfer-loader.js");
9
+ function joinClassNames(...values) {
10
+ return values.filter(Boolean).join(' ');
11
+ }
12
+ function LiveWave({ className }) {
13
+ const containerRef = (0, react_1.useRef)(null);
14
+ const [loadFailed, setLoadFailed] = (0, react_1.useState)(false);
15
+ (0, react_1.useEffect)(() => {
16
+ const container = containerRef.current;
17
+ if (!container)
18
+ return;
19
+ let disposed = false;
20
+ const cleanupRef = { current: () => { } };
21
+ // Lazy-load the optional wavesurfer.js peer dep at runtime — see wavesurfer-loader.ts.
22
+ (0, wavesurfer_loader_js_1.loadWaveSurfer)()
23
+ .then(({ WaveSurfer, RecordPlugin }) => {
24
+ if (disposed)
25
+ return;
26
+ const ws = WaveSurfer.create({
27
+ container,
28
+ waveColor: '#000000',
29
+ height: 28,
30
+ barWidth: 2,
31
+ barGap: 1,
32
+ barRadius: 2,
33
+ cursorWidth: 0,
34
+ interact: false,
35
+ normalize: true,
36
+ });
37
+ const record = ws.registerPlugin(RecordPlugin.create({
38
+ scrollingWaveform: true,
39
+ scrollingWaveformWindow: 5,
40
+ renderRecordedAudio: false,
41
+ }));
42
+ void record.startMic().catch(() => {
43
+ // Ignore: mic permissions may be handled by the transcription hook.
44
+ });
45
+ cleanupRef.current = () => {
46
+ record.stopMic();
47
+ record.destroy();
48
+ ws.destroy();
49
+ };
50
+ })
51
+ .catch((err) => {
52
+ console.warn('[RecordingBar] wavesurfer.js is not installed — waveform visualization disabled. Install it with: npm install wavesurfer.js', err);
53
+ if (!disposed)
54
+ setLoadFailed(true);
55
+ });
56
+ return () => {
57
+ disposed = true;
58
+ cleanupRef.current();
59
+ };
60
+ }, []);
61
+ if (loadFailed) {
62
+ return (0, jsx_runtime_1.jsx)(LoadingDots, {});
63
+ }
64
+ return (0, jsx_runtime_1.jsx)("div", { ref: containerRef, className: joinClassNames('glirastes-recording-wave', className) });
65
+ }
66
+ function LoadingDots() {
67
+ return ((0, jsx_runtime_1.jsxs)("div", { "data-part": "loading-dots", style: { display: 'flex', gap: '4px', alignItems: 'center', justifyContent: 'center' }, children: [(0, jsx_runtime_1.jsx)("span", { "data-dot": "1", style: { width: '6px', height: '6px', borderRadius: '50%', background: 'currentColor', animation: 'dot-pulse 1.4s ease-in-out infinite' } }), (0, jsx_runtime_1.jsx)("span", { "data-dot": "2", style: { width: '6px', height: '6px', borderRadius: '50%', background: 'currentColor', animation: 'dot-pulse 1.4s ease-in-out 0.2s infinite' } }), (0, jsx_runtime_1.jsx)("span", { "data-dot": "3", style: { width: '6px', height: '6px', borderRadius: '50%', background: 'currentColor', animation: 'dot-pulse 1.4s ease-in-out 0.4s infinite' } })] }));
68
+ }
69
+ function RecordingBarInner({ isConnecting, onCancel, onStop, variant, className, }) {
70
+ const handleCancel = (0, react_1.useCallback)(() => onCancel(), [onCancel]);
71
+ const handleStop = (0, react_1.useCallback)(() => onStop(), [onStop]);
72
+ return ((0, jsx_runtime_1.jsxs)("div", { className: joinClassNames('glirastes-recording-bar', variant === 'trigger' ? 'glirastes-recording-bar-trigger' : 'glirastes-recording-bar-inline', className), "data-component": "recording-bar", "data-variant": variant, style: { display: 'flex', alignItems: 'center', gap: '8px', ...(variant === 'inline' ? { height: '36px' } : {}) }, children: [(0, jsx_runtime_1.jsx)(recording_controls_js_1.CancelButton, { onClick: handleCancel, ariaLabel: "Aufnahme abbrechen", title: "Aufnahme abbrechen" }), (0, jsx_runtime_1.jsx)("div", { "data-part": "wave-container", style: { flex: 1, minWidth: 0, display: 'flex', alignItems: 'center' }, children: isConnecting ? (0, jsx_runtime_1.jsx)(LoadingDots, {}) : (0, jsx_runtime_1.jsx)(LiveWave, {}) }), (0, jsx_runtime_1.jsx)(recording_controls_js_1.StopButton, { onClick: handleStop, ariaLabel: "Aufnahme stoppen", title: "Aufnahme stoppen" })] }));
73
+ }
74
+ function RecordingBar(props) {
75
+ if (props.variant === 'trigger') {
76
+ if (typeof document === 'undefined')
77
+ return null;
78
+ return (0, react_dom_1.createPortal)((0, jsx_runtime_1.jsx)("div", { "data-component": "recording-bar-portal", children: (0, jsx_runtime_1.jsx)(RecordingBarInner, { ...props }) }), document.body);
79
+ }
80
+ return (0, jsx_runtime_1.jsx)(RecordingBarInner, { ...props });
81
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Shared cancel / stop buttons used by both AiTriggerButton and RecordingBar.
3
+ * All styling is done via inline styles so the buttons render identically
4
+ * regardless of the host CSS context (portal, chat panel, etc.).
5
+ */
6
+ interface CancelButtonProps {
7
+ onClick: () => void;
8
+ ariaLabel?: string;
9
+ title?: string;
10
+ }
11
+ export declare function CancelButton({ onClick, ariaLabel, title }: CancelButtonProps): import("react/jsx-runtime").JSX.Element;
12
+ interface StopButtonProps {
13
+ onClick: () => void;
14
+ ariaLabel?: string;
15
+ title?: string;
16
+ }
17
+ export declare function StopButton({ onClick, ariaLabel, title }: StopButtonProps): import("react/jsx-runtime").JSX.Element;
18
+ export {};
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CancelButton = CancelButton;
4
+ exports.StopButton = StopButton;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ function CancelButton({ onClick, ariaLabel = 'Cancel recording', title }) {
7
+ return ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: onClick, "aria-label": ariaLabel, title: title, "data-element": "cancel-button", style: {
8
+ display: 'flex',
9
+ alignItems: 'center',
10
+ justifyContent: 'center',
11
+ width: '28px',
12
+ height: '28px',
13
+ borderRadius: '9999px',
14
+ flexShrink: 0,
15
+ border: 'none',
16
+ background: 'transparent',
17
+ color: 'inherit',
18
+ cursor: 'pointer',
19
+ position: 'relative',
20
+ zIndex: 10,
21
+ padding: 0,
22
+ }, children: (0, jsx_runtime_1.jsxs)("svg", { xmlns: "http://www.w3.org/2000/svg", width: "14", height: "14", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: [(0, jsx_runtime_1.jsx)("path", { d: "M18 6 6 18" }), (0, jsx_runtime_1.jsx)("path", { d: "m6 6 12 12" })] }) }));
23
+ }
24
+ function StopButton({ onClick, ariaLabel = 'Stop recording', title }) {
25
+ return ((0, jsx_runtime_1.jsx)("button", { type: "button", onClick: onClick, "aria-label": ariaLabel, title: title, "data-element": "stop-button", style: {
26
+ display: 'flex',
27
+ alignItems: 'center',
28
+ justifyContent: 'center',
29
+ width: '28px',
30
+ height: '28px',
31
+ borderRadius: '9999px',
32
+ flexShrink: 0,
33
+ border: 'none',
34
+ backgroundColor: 'hsl(0 84% 60%)',
35
+ cursor: 'pointer',
36
+ padding: 0,
37
+ }, children: (0, jsx_runtime_1.jsx)("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "white", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)("rect", { x: "0", y: "0", width: "10", height: "10", rx: "2" }) }) }));
38
+ }
@@ -0,0 +1,2 @@
1
+ import type { RichMentionInputHandle, RichMentionInputProps } from '../types.js';
2
+ export declare const RichMentionInput: import("react").ForwardRefExoticComponent<RichMentionInputProps & import("react").RefAttributes<RichMentionInputHandle>>;