@zerowidth/workbench-sdk 2.3.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (765) hide show
  1. package/README.md +57 -0
  2. package/nodes/anthropic-claude-3-5-haiku/anthropic-claude-3-5-haiku.config.json +8 -0
  3. package/nodes/anthropic-claude-3-haiku/anthropic-claude-3-haiku.config.json +8 -0
  4. package/nodes/anthropic-claude-fable-5/anthropic-claude-fable-5.config.json +172 -0
  5. package/nodes/anthropic-claude-fable-5/anthropic-claude-fable-5.process.js +138 -0
  6. package/nodes/anthropic-claude-fable-5-1/anthropic-claude-fable-5-1.config.json +172 -0
  7. package/nodes/anthropic-claude-fable-5-1/anthropic-claude-fable-5-1.process.js +138 -0
  8. package/nodes/anthropic-claude-haiku-4-5/anthropic-claude-haiku-4-5.config.json +1 -0
  9. package/nodes/anthropic-claude-opus-4/anthropic-claude-opus-4.config.json +8 -0
  10. package/nodes/anthropic-claude-opus-4-1/anthropic-claude-opus-4-1.config.json +0 -9
  11. package/nodes/anthropic-claude-opus-4-1/anthropic-claude-opus-4-1.process.js +1 -1
  12. package/nodes/anthropic-claude-opus-4-5/anthropic-claude-opus-4-5.config.json +1 -0
  13. package/nodes/anthropic-claude-opus-4-6/anthropic-claude-opus-4-6.config.json +1 -0
  14. package/nodes/anthropic-claude-opus-4-6-fast/anthropic-claude-opus-4-6-fast.config.json +8 -0
  15. package/nodes/anthropic-claude-opus-4-7/anthropic-claude-opus-4-7.config.json +2 -0
  16. package/nodes/anthropic-claude-opus-4-7-fast/anthropic-claude-opus-4-7-fast.config.json +8 -0
  17. package/nodes/anthropic-claude-opus-4-8/anthropic-claude-opus-4-8.config.json +10 -0
  18. package/nodes/anthropic-claude-opus-4-8/anthropic-claude-opus-4-8.process.js +1 -1
  19. package/nodes/anthropic-claude-opus-4-8-fast/anthropic-claude-opus-4-8-fast.config.json +8 -0
  20. package/nodes/anthropic-claude-opus-5/anthropic-claude-opus-5.config.json +180 -0
  21. package/nodes/anthropic-claude-opus-5/anthropic-claude-opus-5.process.js +138 -0
  22. package/nodes/anthropic-claude-opus-5-5/anthropic-claude-opus-5-5.config.json +180 -0
  23. package/nodes/anthropic-claude-opus-5-5/anthropic-claude-opus-5-5.process.js +138 -0
  24. package/nodes/anthropic-claude-sonnet-4/anthropic-claude-sonnet-4.config.json +1 -1
  25. package/nodes/anthropic-claude-sonnet-4-5/anthropic-claude-sonnet-4-5.config.json +1 -0
  26. package/nodes/anthropic-claude-sonnet-4-6/anthropic-claude-sonnet-4-6.config.json +1 -0
  27. package/nodes/anthropic-claude-sonnet-5/anthropic-claude-sonnet-5.config.json +172 -0
  28. package/nodes/anthropic-claude-sonnet-5/anthropic-claude-sonnet-5.process.js +138 -0
  29. package/nodes/anthropic-claude-sonnet-5-5/anthropic-claude-sonnet-5-5.config.json +180 -0
  30. package/nodes/anthropic-claude-sonnet-5-5/anthropic-claude-sonnet-5-5.process.js +138 -0
  31. package/nodes/baai-bge-base-en-v1-5/baai-bge-base-en-v1-5.config.json +1 -1
  32. package/nodes/baai-bge-large-en-v1-5/baai-bge-large-en-v1-5.config.json +1 -1
  33. package/nodes/baai-bge-m3/baai-bge-m3.config.json +1 -1
  34. package/nodes/deepseek-deepseek-chat/deepseek-deepseek-chat.config.json +3 -3
  35. package/nodes/deepseek-deepseek-chat-v3-0324/deepseek-deepseek-chat-v3-0324.config.json +24 -2
  36. package/nodes/deepseek-deepseek-chat-v3-0324/deepseek-deepseek-chat-v3-0324.process.js +2 -1
  37. package/nodes/deepseek-deepseek-chat-v3-1/deepseek-deepseek-chat-v3-1.config.json +24 -2
  38. package/nodes/deepseek-deepseek-chat-v3-1/deepseek-deepseek-chat-v3-1.process.js +2 -1
  39. package/nodes/deepseek-deepseek-r1/deepseek-deepseek-r1.config.json +1 -3
  40. package/nodes/deepseek-deepseek-r1-0528/deepseek-deepseek-r1-0528.config.json +22 -0
  41. package/nodes/deepseek-deepseek-r1-0528/deepseek-deepseek-r1-0528.process.js +2 -1
  42. package/nodes/deepseek-deepseek-r1-distill-llama-70b/deepseek-deepseek-r1-distill-llama-70b.config.json +8 -0
  43. package/nodes/deepseek-deepseek-r1-distill-qwen-32b/deepseek-deepseek-r1-distill-qwen-32b.config.json +8 -0
  44. package/nodes/deepseek-deepseek-v3-1-terminus/deepseek-deepseek-v3-1-terminus.config.json +1 -1
  45. package/nodes/deepseek-deepseek-v3-2/deepseek-deepseek-v3-2.config.json +25 -3
  46. package/nodes/deepseek-deepseek-v3-2/deepseek-deepseek-v3-2.process.js +2 -1
  47. package/nodes/deepseek-deepseek-v3-2-exp/deepseek-deepseek-v3-2-exp.config.json +24 -2
  48. package/nodes/deepseek-deepseek-v3-2-exp/deepseek-deepseek-v3-2-exp.process.js +2 -1
  49. package/nodes/deepseek-deepseek-v4-1-flash/deepseek-deepseek-v4-1-flash.config.json +236 -0
  50. package/nodes/deepseek-deepseek-v4-1-flash/deepseek-deepseek-v4-1-flash.process.js +139 -0
  51. package/nodes/deepseek-deepseek-v4-flash/deepseek-deepseek-v4-flash.config.json +6 -3
  52. package/nodes/deepseek-deepseek-v4-flash/deepseek-deepseek-v4-flash.process.js +1 -1
  53. package/nodes/deepseek-deepseek-v4-flash-0731/deepseek-deepseek-v4-flash-0731.config.json +238 -0
  54. package/nodes/deepseek-deepseek-v4-flash-0731/deepseek-deepseek-v4-flash-0731.process.js +139 -0
  55. package/nodes/deepseek-deepseek-v4-flash-vision-exp/deepseek-deepseek-v4-flash-vision-exp.config.json +236 -0
  56. package/nodes/deepseek-deepseek-v4-flash-vision-exp/deepseek-deepseek-v4-flash-vision-exp.process.js +139 -0
  57. package/nodes/deepseek-deepseek-v4-pro/deepseek-deepseek-v4-pro.config.json +5 -3
  58. package/nodes/deepseek-deepseek-v4-pro/deepseek-deepseek-v4-pro.process.js +1 -1
  59. package/nodes/deepseek-deepseek-v4-pro-0813/deepseek-deepseek-v4-pro-0813.config.json +236 -0
  60. package/nodes/deepseek-deepseek-v4-pro-0813/deepseek-deepseek-v4-pro-0813.process.js +139 -0
  61. package/nodes/google-gemini-2-5-flash/google-gemini-2-5-flash.config.json +8 -0
  62. package/nodes/google-gemini-2-5-flash-lite/google-gemini-2-5-flash-lite.config.json +8 -0
  63. package/nodes/google-gemini-2-5-flash-lite-preview-09-2025/google-gemini-2-5-flash-lite-preview-09-2025.config.json +8 -0
  64. package/nodes/google-gemini-2-5-pro/google-gemini-2-5-pro.config.json +8 -0
  65. package/nodes/google-gemini-2-5-pro-preview-05-06/google-gemini-2-5-pro-preview-05-06.config.json +8 -0
  66. package/nodes/google-gemini-3-1-flash-image/google-gemini-3-1-flash-image.config.json +151 -0
  67. package/nodes/google-gemini-3-1-flash-image/google-gemini-3-1-flash-image.process.js +57 -0
  68. package/nodes/google-gemini-3-1-flash-image-preview/google-gemini-3-1-flash-image-preview.config.json +2 -2
  69. package/nodes/google-gemini-3-1-flash-lite/google-gemini-3-1-flash-lite.config.json +1 -0
  70. package/nodes/google-gemini-3-1-flash-lite-image/google-gemini-3-1-flash-lite-image.config.json +150 -0
  71. package/nodes/google-gemini-3-1-flash-lite-image/google-gemini-3-1-flash-lite-image.process.js +57 -0
  72. package/nodes/google-gemini-3-1-flash-lite-preview/google-gemini-3-1-flash-lite-preview.config.json +1 -8
  73. package/nodes/google-gemini-3-1-flash-lite-preview/google-gemini-3-1-flash-lite-preview.process.js +1 -1
  74. package/nodes/google-gemini-3-1-pro-preview/google-gemini-3-1-pro-preview.config.json +1 -0
  75. package/nodes/google-gemini-3-1-pro-preview-customtools/google-gemini-3-1-pro-preview-customtools.config.json +2 -9
  76. package/nodes/google-gemini-3-1-pro-preview-customtools/google-gemini-3-1-pro-preview-customtools.process.js +1 -1
  77. package/nodes/google-gemini-3-5-flash/google-gemini-3-5-flash.config.json +1 -0
  78. package/nodes/google-gemini-3-5-flash-lite/google-gemini-3-5-flash-lite.config.json +194 -0
  79. package/nodes/google-gemini-3-5-flash-lite/google-gemini-3-5-flash-lite.process.js +138 -0
  80. package/nodes/google-gemini-3-6-flash/google-gemini-3-6-flash.config.json +194 -0
  81. package/nodes/google-gemini-3-6-flash/google-gemini-3-6-flash.process.js +138 -0
  82. package/nodes/google-gemini-3-7-flash/google-gemini-3-7-flash.config.json +194 -0
  83. package/nodes/google-gemini-3-7-flash/google-gemini-3-7-flash.process.js +138 -0
  84. package/nodes/google-gemini-3-8-flash/google-gemini-3-8-flash.config.json +194 -0
  85. package/nodes/google-gemini-3-8-flash/google-gemini-3-8-flash.process.js +138 -0
  86. package/nodes/google-gemini-3-flash-preview/google-gemini-3-flash-preview.config.json +1 -0
  87. package/nodes/google-gemini-3-pro-image/google-gemini-3-pro-image.config.json +202 -0
  88. package/nodes/google-gemini-3-pro-image/google-gemini-3-pro-image.process.js +142 -0
  89. package/nodes/google-gemma-3-12b-it/google-gemma-3-12b-it.config.json +2 -2
  90. package/nodes/google-gemma-3-27b-it/google-gemma-3-27b-it.config.json +23 -1
  91. package/nodes/google-gemma-3-27b-it/google-gemma-3-27b-it.process.js +2 -1
  92. package/nodes/google-gemma-3-4b-it/google-gemma-3-4b-it.config.json +2 -2
  93. package/nodes/google-gemma-3n-e4b-it/google-gemma-3n-e4b-it.config.json +8 -0
  94. package/nodes/google-gemma-4-26b-a4b-it/google-gemma-4-26b-a4b-it.config.json +2 -2
  95. package/nodes/google-gemma-4-31b-it/google-gemma-4-31b-it.config.json +2 -2
  96. package/nodes/google-gemma-4-31b-it-free/google-gemma-4-31b-it-free.config.json +0 -8
  97. package/nodes/google-gemma-4-31b-it-free/google-gemma-4-31b-it-free.process.js +1 -1
  98. package/nodes/intfloat-e5-base-v2/intfloat-e5-base-v2.config.json +1 -1
  99. package/nodes/intfloat-e5-large-v2/intfloat-e5-large-v2.config.json +1 -1
  100. package/nodes/intfloat-multilingual-e5-large/intfloat-multilingual-e5-large.config.json +1 -1
  101. package/nodes/jaredpalmer-kev-4b/jaredpalmer-kev-4b.config.json +85 -0
  102. package/nodes/jaredpalmer-kev-4b/jaredpalmer-kev-4b.process.js +33 -0
  103. package/nodes/liquid-lfm-2-24b-a2b/liquid-lfm-2-24b-a2b.config.json +8 -0
  104. package/nodes/liquid-lfm-2-5-1-2b-instruct-free/liquid-lfm-2-5-1-2b-instruct-free.config.json +8 -0
  105. package/nodes/liquid-lfm-2-5-1-2b-thinking-free/liquid-lfm-2-5-1-2b-thinking-free.config.json +8 -0
  106. package/nodes/liquid-lfm-2-5-2-6b-free/liquid-lfm-2-5-2-6b-free.config.json +235 -0
  107. package/nodes/liquid-lfm-2-5-2-6b-free/liquid-lfm-2-5-2-6b-free.process.js +139 -0
  108. package/nodes/liquid-lfm-2-5-embedding-350m-free/liquid-lfm-2-5-embedding-350m-free.config.json +90 -0
  109. package/nodes/liquid-lfm-2-5-embedding-350m-free/liquid-lfm-2-5-embedding-350m-free.process.js +36 -0
  110. package/nodes/memory/memory.config.json +57 -0
  111. package/nodes/memory/memory.process.js +87 -0
  112. package/nodes/memory-delete/memory-delete.config.json +36 -0
  113. package/nodes/memory-delete/memory-delete.process.js +7 -0
  114. package/nodes/memory-edit/memory-edit.config.json +50 -0
  115. package/nodes/memory-edit/memory-edit.process.js +17 -0
  116. package/nodes/memory-list/memory-list.config.json +22 -0
  117. package/nodes/memory-list/memory-list.process.js +6 -0
  118. package/nodes/memory-read/memory-read.config.json +36 -0
  119. package/nodes/memory-read/memory-read.process.js +8 -0
  120. package/nodes/memory-write/memory-write.config.json +43 -0
  121. package/nodes/memory-write/memory-write.process.js +7 -0
  122. package/nodes/mistralai-codestral-2508/mistralai-codestral-2508.config.json +1 -0
  123. package/nodes/mistralai-ministral-14b-2512/mistralai-ministral-14b-2512.config.json +0 -23
  124. package/nodes/mistralai-ministral-14b-2512/mistralai-ministral-14b-2512.process.js +1 -2
  125. package/nodes/mistralai-ministral-3b-2512/mistralai-ministral-3b-2512.config.json +0 -23
  126. package/nodes/mistralai-ministral-3b-2512/mistralai-ministral-3b-2512.process.js +1 -2
  127. package/nodes/mistralai-ministral-8b-2512/mistralai-ministral-8b-2512.config.json +0 -23
  128. package/nodes/mistralai-ministral-8b-2512/mistralai-ministral-8b-2512.process.js +1 -2
  129. package/nodes/mistralai-mistral-medium-3-5/mistralai-mistral-medium-3-5.config.json +1 -0
  130. package/nodes/mistralai-mistral-nemo/mistralai-mistral-nemo.config.json +23 -1
  131. package/nodes/mistralai-mistral-nemo/mistralai-mistral-nemo.process.js +2 -1
  132. package/nodes/mistralai-mistral-small-2603/mistralai-mistral-small-2603.config.json +1 -1
  133. package/nodes/mistralai-mistral-small-3-1-24b-instruct/mistralai-mistral-small-3-1-24b-instruct.config.json +79 -6
  134. package/nodes/mistralai-mistral-small-3-1-24b-instruct/mistralai-mistral-small-3-1-24b-instruct.process.js +90 -4
  135. package/nodes/mistralai-mistral-small-3-2-24b-instruct/mistralai-mistral-small-3-2-24b-instruct.config.json +25 -3
  136. package/nodes/mistralai-mistral-small-3-2-24b-instruct/mistralai-mistral-small-3-2-24b-instruct.process.js +2 -1
  137. package/nodes/mistralai-voxtral-small-24b-2507/mistralai-voxtral-small-24b-2507.config.json +1 -1
  138. package/nodes/nvidia-nemotron-3-embed-1b-free/nvidia-nemotron-3-embed-1b-free.config.json +90 -0
  139. package/nodes/nvidia-nemotron-3-embed-1b-free/nvidia-nemotron-3-embed-1b-free.process.js +36 -0
  140. package/nodes/openai-gpt-4-1106-preview/openai-gpt-4-1106-preview.config.json +8 -0
  141. package/nodes/openai-gpt-4-turbo-preview/openai-gpt-4-turbo-preview.config.json +8 -0
  142. package/nodes/openai-gpt-4o/openai-gpt-4o.config.json +1 -0
  143. package/nodes/openai-gpt-4o-2024-05-13/openai-gpt-4o-2024-05-13.config.json +1 -0
  144. package/nodes/openai-gpt-4o-2024-08-06/openai-gpt-4o-2024-08-06.config.json +1 -0
  145. package/nodes/openai-gpt-4o-2024-11-20/openai-gpt-4o-2024-11-20.config.json +1 -0
  146. package/nodes/openai-gpt-4o-mini/openai-gpt-4o-mini.config.json +1 -0
  147. package/nodes/openai-gpt-4o-mini-2024-07-18/openai-gpt-4o-mini-2024-07-18.config.json +1 -0
  148. package/nodes/openai-gpt-4o-mini-search-preview/openai-gpt-4o-mini-search-preview.config.json +8 -0
  149. package/nodes/openai-gpt-4o-search-preview/openai-gpt-4o-search-preview.config.json +8 -0
  150. package/nodes/openai-gpt-5/openai-gpt-5.config.json +1 -0
  151. package/nodes/openai-gpt-5-1/openai-gpt-5-1.config.json +1 -0
  152. package/nodes/openai-gpt-5-1-chat/openai-gpt-5-1-chat.config.json +8 -0
  153. package/nodes/openai-gpt-5-1-codex/openai-gpt-5-1-codex.config.json +1 -8
  154. package/nodes/openai-gpt-5-1-codex/openai-gpt-5-1-codex.process.js +1 -1
  155. package/nodes/openai-gpt-5-1-codex-max/openai-gpt-5-1-codex-max.config.json +1 -8
  156. package/nodes/openai-gpt-5-1-codex-max/openai-gpt-5-1-codex-max.process.js +1 -1
  157. package/nodes/openai-gpt-5-1-codex-mini/openai-gpt-5-1-codex-mini.config.json +1 -8
  158. package/nodes/openai-gpt-5-1-codex-mini/openai-gpt-5-1-codex-mini.process.js +1 -1
  159. package/nodes/openai-gpt-5-2/openai-gpt-5-2.config.json +1 -0
  160. package/nodes/openai-gpt-5-2-chat/openai-gpt-5-2-chat.config.json +0 -8
  161. package/nodes/openai-gpt-5-2-chat/openai-gpt-5-2-chat.process.js +1 -1
  162. package/nodes/openai-gpt-5-2-codex/openai-gpt-5-2-codex.config.json +1 -8
  163. package/nodes/openai-gpt-5-2-codex/openai-gpt-5-2-codex.process.js +1 -1
  164. package/nodes/openai-gpt-5-2-pro/openai-gpt-5-2-pro.config.json +1 -0
  165. package/nodes/openai-gpt-5-3-chat/openai-gpt-5-3-chat.config.json +8 -0
  166. package/nodes/openai-gpt-5-3-codex/openai-gpt-5-3-codex.config.json +1 -0
  167. package/nodes/openai-gpt-5-4/openai-gpt-5-4.config.json +1 -0
  168. package/nodes/openai-gpt-5-4-image-2/openai-gpt-5-4-image-2.config.json +1 -0
  169. package/nodes/openai-gpt-5-4-mini/openai-gpt-5-4-mini.config.json +1 -0
  170. package/nodes/openai-gpt-5-4-nano/openai-gpt-5-4-nano.config.json +1 -0
  171. package/nodes/openai-gpt-5-4-pro/openai-gpt-5-4-pro.config.json +1 -0
  172. package/nodes/openai-gpt-5-5/openai-gpt-5-5.config.json +1 -0
  173. package/nodes/openai-gpt-5-5-pro/openai-gpt-5-5-pro.config.json +1 -0
  174. package/nodes/openai-gpt-5-6-luna/openai-gpt-5-6-luna.config.json +171 -0
  175. package/nodes/openai-gpt-5-6-luna/openai-gpt-5-6-luna.process.js +138 -0
  176. package/nodes/openai-gpt-5-6-luna-pro/openai-gpt-5-6-luna-pro.config.json +171 -0
  177. package/nodes/openai-gpt-5-6-luna-pro/openai-gpt-5-6-luna-pro.process.js +138 -0
  178. package/nodes/openai-gpt-5-6-sol/openai-gpt-5-6-sol.config.json +171 -0
  179. package/nodes/openai-gpt-5-6-sol/openai-gpt-5-6-sol.process.js +138 -0
  180. package/nodes/openai-gpt-5-6-sol-pro/openai-gpt-5-6-sol-pro.config.json +171 -0
  181. package/nodes/openai-gpt-5-6-sol-pro/openai-gpt-5-6-sol-pro.process.js +138 -0
  182. package/nodes/openai-gpt-5-6-terra/openai-gpt-5-6-terra.config.json +171 -0
  183. package/nodes/openai-gpt-5-6-terra/openai-gpt-5-6-terra.process.js +138 -0
  184. package/nodes/openai-gpt-5-6-terra-pro/openai-gpt-5-6-terra-pro.config.json +171 -0
  185. package/nodes/openai-gpt-5-6-terra-pro/openai-gpt-5-6-terra-pro.process.js +138 -0
  186. package/nodes/openai-gpt-5-chat/openai-gpt-5-chat.config.json +8 -0
  187. package/nodes/openai-gpt-5-codex/openai-gpt-5-codex.config.json +8 -0
  188. package/nodes/openai-gpt-5-mini/openai-gpt-5-mini.config.json +1 -0
  189. package/nodes/openai-gpt-5-nano/openai-gpt-5-nano.config.json +1 -0
  190. package/nodes/openai-gpt-5-pro/openai-gpt-5-pro.config.json +1 -0
  191. package/nodes/openai-gpt-6-astra/openai-gpt-6-astra.config.json +171 -0
  192. package/nodes/openai-gpt-6-astra/openai-gpt-6-astra.process.js +138 -0
  193. package/nodes/openai-gpt-6-astra-pro/openai-gpt-6-astra-pro.config.json +171 -0
  194. package/nodes/openai-gpt-6-astra-pro/openai-gpt-6-astra-pro.process.js +138 -0
  195. package/nodes/openai-gpt-6-luna/openai-gpt-6-luna.config.json +171 -0
  196. package/nodes/openai-gpt-6-luna/openai-gpt-6-luna.process.js +138 -0
  197. package/nodes/openai-gpt-6-luna-pro/openai-gpt-6-luna-pro.config.json +171 -0
  198. package/nodes/openai-gpt-6-luna-pro/openai-gpt-6-luna-pro.process.js +138 -0
  199. package/nodes/openai-gpt-6-sol/openai-gpt-6-sol.config.json +171 -0
  200. package/nodes/openai-gpt-6-sol/openai-gpt-6-sol.process.js +138 -0
  201. package/nodes/openai-gpt-6-sol-pro/openai-gpt-6-sol-pro.config.json +171 -0
  202. package/nodes/openai-gpt-6-sol-pro/openai-gpt-6-sol-pro.process.js +138 -0
  203. package/nodes/openai-gpt-chat-latest/openai-gpt-chat-latest.config.json +1 -48
  204. package/nodes/openai-gpt-chat-latest/openai-gpt-chat-latest.process.js +1 -2
  205. package/nodes/openai-gpt-oss-120b/openai-gpt-oss-120b.config.json +4 -2
  206. package/nodes/openai-gpt-oss-120b-free/openai-gpt-oss-120b-free.config.json +8 -0
  207. package/nodes/openai-gpt-oss-20b/openai-gpt-oss-20b.config.json +3 -2
  208. package/nodes/openai-gpt-oss-20b-free/openai-gpt-oss-20b-free.config.json +8 -0
  209. package/nodes/openai-gpt-oss-safeguard-20b/openai-gpt-oss-safeguard-20b.config.json +1 -0
  210. package/nodes/openai-o3-deep-research/openai-o3-deep-research.config.json +8 -0
  211. package/nodes/openai-o3-mini-high/openai-o3-mini-high.config.json +1 -0
  212. package/nodes/openai-o4-mini-deep-research/openai-o4-mini-deep-research.config.json +8 -0
  213. package/nodes/openai-o4-mini-high/openai-o4-mini-high.config.json +1 -0
  214. package/nodes/qwen-qwen-2-5-72b-instruct/qwen-qwen-2-5-72b-instruct.config.json +1 -1
  215. package/nodes/qwen-qwen-2-5-7b-instruct/qwen-qwen-2-5-7b-instruct.config.json +36 -5
  216. package/nodes/qwen-qwen-2-5-7b-instruct/qwen-qwen-2-5-7b-instruct.process.js +1 -1
  217. package/nodes/qwen-qwen-2-5-coder-32b-instruct/qwen-qwen-2-5-coder-32b-instruct.config.json +9 -1
  218. package/nodes/qwen-qwen-2-5-coder-32b-instruct/qwen-qwen-2-5-coder-32b-instruct.process.js +1 -1
  219. package/nodes/qwen-qwen-plus/qwen-qwen-plus.config.json +40 -0
  220. package/nodes/qwen-qwen-plus/qwen-qwen-plus.process.js +2 -1
  221. package/nodes/qwen-qwen-plus-2025-07-28/qwen-qwen-plus-2025-07-28.config.json +47 -0
  222. package/nodes/qwen-qwen-plus-2025-07-28/qwen-qwen-plus-2025-07-28.process.js +2 -1
  223. package/nodes/qwen-qwen-plus-2025-07-28-thinking/qwen-qwen-plus-2025-07-28-thinking.config.json +8 -0
  224. package/nodes/qwen-qwen2-5-vl-72b-instruct/qwen-qwen2-5-vl-72b-instruct.config.json +25 -3
  225. package/nodes/qwen-qwen2-5-vl-72b-instruct/qwen-qwen2-5-vl-72b-instruct.process.js +2 -1
  226. package/nodes/qwen-qwen3-14b/qwen-qwen3-14b.config.json +2 -2
  227. package/nodes/qwen-qwen3-235b-a22b/qwen-qwen3-235b-a22b.config.json +25 -0
  228. package/nodes/qwen-qwen3-235b-a22b/qwen-qwen3-235b-a22b.process.js +1 -1
  229. package/nodes/qwen-qwen3-235b-a22b-2507/qwen-qwen3-235b-a22b-2507.config.json +24 -2
  230. package/nodes/qwen-qwen3-235b-a22b-2507/qwen-qwen3-235b-a22b-2507.process.js +2 -1
  231. package/nodes/qwen-qwen3-235b-a22b-thinking-2507/qwen-qwen3-235b-a22b-thinking-2507.config.json +33 -6
  232. package/nodes/qwen-qwen3-235b-a22b-thinking-2507/qwen-qwen3-235b-a22b-thinking-2507.process.js +2 -1
  233. package/nodes/qwen-qwen3-30b-a3b/qwen-qwen3-30b-a3b.config.json +2 -24
  234. package/nodes/qwen-qwen3-30b-a3b/qwen-qwen3-30b-a3b.process.js +1 -2
  235. package/nodes/qwen-qwen3-30b-a3b-instruct-2507/qwen-qwen3-30b-a3b-instruct-2507.config.json +25 -4
  236. package/nodes/qwen-qwen3-30b-a3b-instruct-2507/qwen-qwen3-30b-a3b-instruct-2507.process.js +2 -1
  237. package/nodes/qwen-qwen3-30b-a3b-thinking-2507/qwen-qwen3-30b-a3b-thinking-2507.config.json +11 -7
  238. package/nodes/qwen-qwen3-5-35b-a3b/qwen-qwen3-5-35b-a3b.config.json +2 -2
  239. package/nodes/qwen-qwen3-5-397b-a17b/qwen-qwen3-5-397b-a17b.config.json +2 -2
  240. package/nodes/qwen-qwen3-5-9b/qwen-qwen3-5-9b.config.json +1 -1
  241. package/nodes/qwen-qwen3-5-flash-02-23/qwen-qwen3-5-flash-02-23.config.json +17 -0
  242. package/nodes/qwen-qwen3-5-flash-02-23/qwen-qwen3-5-flash-02-23.process.js +1 -1
  243. package/nodes/qwen-qwen3-5-plus-02-15/qwen-qwen3-5-plus-02-15.config.json +39 -0
  244. package/nodes/qwen-qwen3-5-plus-02-15/qwen-qwen3-5-plus-02-15.process.js +2 -1
  245. package/nodes/qwen-qwen3-5-plus-20260420/qwen-qwen3-5-plus-20260420.config.json +39 -0
  246. package/nodes/qwen-qwen3-5-plus-20260420/qwen-qwen3-5-plus-20260420.process.js +2 -1
  247. package/nodes/qwen-qwen3-6-27b/qwen-qwen3-6-27b.config.json +1 -1
  248. package/nodes/qwen-qwen3-6-35b-a3b/qwen-qwen3-6-35b-a3b.config.json +1 -1
  249. package/nodes/qwen-qwen3-6-flash/qwen-qwen3-6-flash.config.json +39 -0
  250. package/nodes/qwen-qwen3-6-flash/qwen-qwen3-6-flash.process.js +2 -1
  251. package/nodes/qwen-qwen3-6-max-preview/qwen-qwen3-6-max-preview.config.json +27 -2
  252. package/nodes/qwen-qwen3-6-max-preview/qwen-qwen3-6-max-preview.process.js +1 -1
  253. package/nodes/qwen-qwen3-6-plus/qwen-qwen3-6-plus.config.json +39 -0
  254. package/nodes/qwen-qwen3-6-plus/qwen-qwen3-6-plus.process.js +2 -1
  255. package/nodes/qwen-qwen3-7-flash/qwen-qwen3-7-flash.config.json +214 -0
  256. package/nodes/qwen-qwen3-7-flash/qwen-qwen3-7-flash.process.js +139 -0
  257. package/nodes/qwen-qwen3-7-max/qwen-qwen3-7-max.config.json +19 -2
  258. package/nodes/qwen-qwen3-7-max/qwen-qwen3-7-max.process.js +1 -1
  259. package/nodes/qwen-qwen3-7-plus/qwen-qwen3-7-plus.config.json +19 -2
  260. package/nodes/qwen-qwen3-7-plus/qwen-qwen3-7-plus.process.js +1 -1
  261. package/nodes/qwen-qwen3-8-2-4t-a95b/qwen-qwen3-8-2-4t-a95b.config.json +236 -0
  262. package/nodes/qwen-qwen3-8-2-4t-a95b/qwen-qwen3-8-2-4t-a95b.process.js +139 -0
  263. package/nodes/qwen-qwen3-8-27b/qwen-qwen3-8-27b.config.json +237 -0
  264. package/nodes/qwen-qwen3-8-27b/qwen-qwen3-8-27b.process.js +139 -0
  265. package/nodes/qwen-qwen3-8-27b-free/qwen-qwen3-8-27b-free.config.json +195 -0
  266. package/nodes/qwen-qwen3-8-27b-free/qwen-qwen3-8-27b-free.process.js +138 -0
  267. package/nodes/qwen-qwen3-8-flash/qwen-qwen3-8-flash.config.json +232 -0
  268. package/nodes/qwen-qwen3-8-flash/qwen-qwen3-8-flash.process.js +139 -0
  269. package/nodes/qwen-qwen3-8-max-0902/qwen-qwen3-8-max-0902.config.json +233 -0
  270. package/nodes/qwen-qwen3-8-max-0902/qwen-qwen3-8-max-0902.process.js +139 -0
  271. package/nodes/qwen-qwen3-8-max-prime/qwen-qwen3-8-max-prime.config.json +233 -0
  272. package/nodes/qwen-qwen3-8-max-prime/qwen-qwen3-8-max-prime.process.js +139 -0
  273. package/nodes/qwen-qwen3-8-omni-flash/qwen-qwen3-8-omni-flash.config.json +232 -0
  274. package/nodes/qwen-qwen3-8-omni-flash/qwen-qwen3-8-omni-flash.process.js +139 -0
  275. package/nodes/qwen-qwen3-8b/qwen-qwen3-8b.config.json +10 -6
  276. package/nodes/qwen-qwen3-coder/qwen-qwen3-coder.config.json +25 -3
  277. package/nodes/qwen-qwen3-coder/qwen-qwen3-coder.process.js +2 -1
  278. package/nodes/qwen-qwen3-coder-30b-a3b-instruct/qwen-qwen3-coder-30b-a3b-instruct.config.json +24 -2
  279. package/nodes/qwen-qwen3-coder-30b-a3b-instruct/qwen-qwen3-coder-30b-a3b-instruct.process.js +2 -1
  280. package/nodes/qwen-qwen3-coder-flash/qwen-qwen3-coder-flash.config.json +39 -0
  281. package/nodes/qwen-qwen3-coder-flash/qwen-qwen3-coder-flash.process.js +2 -1
  282. package/nodes/qwen-qwen3-coder-free/qwen-qwen3-coder-free.config.json +8 -0
  283. package/nodes/qwen-qwen3-coder-next/qwen-qwen3-coder-next.config.json +23 -2
  284. package/nodes/qwen-qwen3-coder-next/qwen-qwen3-coder-next.process.js +2 -1
  285. package/nodes/qwen-qwen3-coder-plus/qwen-qwen3-coder-plus.config.json +47 -0
  286. package/nodes/qwen-qwen3-coder-plus/qwen-qwen3-coder-plus.process.js +2 -1
  287. package/nodes/qwen-qwen3-embedding-8b/qwen-qwen3-embedding-8b.config.json +1 -1
  288. package/nodes/qwen-qwen3-max/qwen-qwen3-max.config.json +48 -0
  289. package/nodes/qwen-qwen3-max/qwen-qwen3-max.process.js +2 -1
  290. package/nodes/qwen-qwen3-max-thinking/qwen-qwen3-max-thinking.config.json +47 -0
  291. package/nodes/qwen-qwen3-max-thinking/qwen-qwen3-max-thinking.process.js +2 -1
  292. package/nodes/qwen-qwen3-next-80b-a3b-instruct/qwen-qwen3-next-80b-a3b-instruct.config.json +23 -1
  293. package/nodes/qwen-qwen3-next-80b-a3b-instruct/qwen-qwen3-next-80b-a3b-instruct.process.js +2 -1
  294. package/nodes/qwen-qwen3-next-80b-a3b-instruct-free/qwen-qwen3-next-80b-a3b-instruct-free.config.json +8 -0
  295. package/nodes/qwen-qwen3-next-80b-a3b-thinking/qwen-qwen3-next-80b-a3b-thinking.config.json +24 -4
  296. package/nodes/qwen-qwen3-next-80b-a3b-thinking/qwen-qwen3-next-80b-a3b-thinking.process.js +2 -1
  297. package/nodes/qwen-qwen3-reranker-8b/qwen-qwen3-reranker-8b.config.json +95 -0
  298. package/nodes/qwen-qwen3-reranker-8b/qwen-qwen3-reranker-8b.process.js +60 -0
  299. package/nodes/qwen-qwen3-vl-235b-a22b-instruct/qwen-qwen3-vl-235b-a22b-instruct.config.json +24 -2
  300. package/nodes/qwen-qwen3-vl-235b-a22b-instruct/qwen-qwen3-vl-235b-a22b-instruct.process.js +2 -1
  301. package/nodes/qwen-qwen3-vl-235b-a22b-thinking/qwen-qwen3-vl-235b-a22b-thinking.config.json +33 -2
  302. package/nodes/qwen-qwen3-vl-235b-a22b-thinking/qwen-qwen3-vl-235b-a22b-thinking.process.js +2 -1
  303. package/nodes/qwen-qwen3-vl-30b-a3b-instruct/qwen-qwen3-vl-30b-a3b-instruct.config.json +24 -2
  304. package/nodes/qwen-qwen3-vl-30b-a3b-instruct/qwen-qwen3-vl-30b-a3b-instruct.process.js +2 -1
  305. package/nodes/qwen-qwen3-vl-30b-a3b-thinking/qwen-qwen3-vl-30b-a3b-thinking.config.json +33 -4
  306. package/nodes/qwen-qwen3-vl-30b-a3b-thinking/qwen-qwen3-vl-30b-a3b-thinking.process.js +2 -1
  307. package/nodes/qwen-qwen3-vl-32b-instruct/qwen-qwen3-vl-32b-instruct.config.json +49 -1
  308. package/nodes/qwen-qwen3-vl-32b-instruct/qwen-qwen3-vl-32b-instruct.process.js +2 -1
  309. package/nodes/qwen-qwen3-vl-8b-instruct/qwen-qwen3-vl-8b-instruct.config.json +33 -4
  310. package/nodes/qwen-qwen3-vl-8b-instruct/qwen-qwen3-vl-8b-instruct.process.js +2 -1
  311. package/nodes/qwen-qwen3-vl-8b-thinking/qwen-qwen3-vl-8b-thinking.config.json +50 -3
  312. package/nodes/qwen-qwen3-vl-8b-thinking/qwen-qwen3-vl-8b-thinking.process.js +2 -1
  313. package/nodes/respan-span-01/respan-span-01.config.json +83 -0
  314. package/nodes/respan-span-01/respan-span-01.process.js +71 -0
  315. package/nodes/respan-span-01-lite/respan-span-01-lite.config.json +83 -0
  316. package/nodes/respan-span-01-lite/respan-span-01-lite.process.js +71 -0
  317. package/nodes/respan-span-01-lite-free/respan-span-01-lite-free.config.json +83 -0
  318. package/nodes/respan-span-01-lite-free/respan-span-01-lite-free.process.js +71 -0
  319. package/nodes/sentence-transformers-all-minilm-l12-v2/sentence-transformers-all-minilm-l12-v2.config.json +1 -1
  320. package/nodes/sentence-transformers-all-minilm-l6-v2/sentence-transformers-all-minilm-l6-v2.config.json +1 -1
  321. package/nodes/sentence-transformers-all-mpnet-base-v2/sentence-transformers-all-mpnet-base-v2.config.json +1 -1
  322. package/nodes/sentence-transformers-multi-qa-mpnet-base-dot-v1/sentence-transformers-multi-qa-mpnet-base-dot-v1.config.json +1 -1
  323. package/nodes/sentence-transformers-paraphrase-minilm-l6-v2/sentence-transformers-paraphrase-minilm-l6-v2.config.json +1 -1
  324. package/nodes/thenlper-gte-base/thenlper-gte-base.config.json +1 -1
  325. package/nodes/thenlper-gte-large/thenlper-gte-large.config.json +1 -1
  326. package/nodes/typesafe-jev-1-13/typesafe-jev-1-13.config.json +85 -0
  327. package/nodes/typesafe-jev-1-13/typesafe-jev-1-13.process.js +33 -0
  328. package/nodes/typesafe-jev-latest/typesafe-jev-latest.config.json +86 -0
  329. package/nodes/typesafe-jev-latest/typesafe-jev-latest.process.js +33 -0
  330. package/nodes/typesafe-jev-router/typesafe-jev-router.config.json +154 -0
  331. package/nodes/typesafe-jev-router/typesafe-jev-router.process.js +138 -0
  332. package/nodes/upstage-solar-decide/upstage-solar-decide.config.json +85 -0
  333. package/nodes/upstage-solar-decide/upstage-solar-decide.process.js +33 -0
  334. package/nodes/voyageai-rerank-2-5/voyageai-rerank-2-5.config.json +95 -0
  335. package/nodes/voyageai-rerank-2-5/voyageai-rerank-2-5.process.js +60 -0
  336. package/nodes/voyageai-rerank-2-5-lite/voyageai-rerank-2-5-lite.config.json +95 -0
  337. package/nodes/voyageai-rerank-2-5-lite/voyageai-rerank-2-5-lite.process.js +60 -0
  338. package/nodes/voyageai-voyage-4/voyageai-voyage-4.config.json +90 -0
  339. package/nodes/voyageai-voyage-4/voyageai-voyage-4.process.js +36 -0
  340. package/nodes/voyageai-voyage-4-large/voyageai-voyage-4-large.config.json +90 -0
  341. package/nodes/voyageai-voyage-4-large/voyageai-voyage-4-large.process.js +36 -0
  342. package/nodes/voyageai-voyage-4-lite/voyageai-voyage-4-lite.config.json +90 -0
  343. package/nodes/voyageai-voyage-4-lite/voyageai-voyage-4-lite.process.js +36 -0
  344. package/nodes/voyageai-voyage-code-4/voyageai-voyage-code-4.config.json +90 -0
  345. package/nodes/voyageai-voyage-code-4/voyageai-voyage-code-4.process.js +36 -0
  346. package/nodes/voyageai-voyage-multimodal-3-5/voyageai-voyage-multimodal-3-5.config.json +91 -0
  347. package/nodes/voyageai-voyage-multimodal-3-5/voyageai-voyage-multimodal-3-5.process.js +36 -0
  348. package/nodes/x-ai-grok-4-20/x-ai-grok-4-20.config.json +2 -2
  349. package/nodes/x-ai-grok-4-20/x-ai-grok-4-20.process.js +1 -1
  350. package/nodes/x-ai-grok-4-20-multi-agent/x-ai-grok-4-20-multi-agent.config.json +5 -4
  351. package/nodes/x-ai-grok-4-20-multi-agent/x-ai-grok-4-20-multi-agent.process.js +1 -1
  352. package/nodes/x-ai-grok-4-3/x-ai-grok-4-3.config.json +3 -26
  353. package/nodes/x-ai-grok-4-3/x-ai-grok-4-3.process.js +2 -2
  354. package/nodes/x-ai-grok-4-5/x-ai-grok-4-5.config.json +208 -0
  355. package/nodes/x-ai-grok-4-5/x-ai-grok-4-5.process.js +139 -0
  356. package/nodes/x-ai-grok-4-6/x-ai-grok-4-6.config.json +217 -0
  357. package/nodes/x-ai-grok-4-6/x-ai-grok-4-6.process.js +139 -0
  358. package/nodes/x-ai-grok-4-7/x-ai-grok-4-7.config.json +208 -0
  359. package/nodes/x-ai-grok-4-7/x-ai-grok-4-7.process.js +139 -0
  360. package/nodes/x-ai-grok-build-0-1/x-ai-grok-build-0-1.config.json +2 -26
  361. package/nodes/x-ai-grok-build-0-1/x-ai-grok-build-0-1.process.js +2 -2
  362. package/package.json +11 -3
  363. package/src/index.js +10 -0
  364. package/src/integrations/memory-store.js +294 -0
  365. package/src/integrations/openrouter.js +114 -1
  366. package/src/utilities/loaders.js +8 -0
  367. package/src/utilities/typers.js +17 -0
  368. package/nodes/absolute/absolute.tests.json +0 -38
  369. package/nodes/absolute-value/absolute-value.tests.json +0 -17
  370. package/nodes/add/add.tests.json +0 -41
  371. package/nodes/airtable-create-record/airtable-create-record.tests.json +0 -50
  372. package/nodes/airtable-delete-record/airtable-delete-record.tests.json +0 -23
  373. package/nodes/airtable-get-record/airtable-get-record.tests.json +0 -25
  374. package/nodes/airtable-list-records/airtable-list-records.tests.json +0 -46
  375. package/nodes/airtable-update-record/airtable-update-record.tests.json +0 -44
  376. package/nodes/and-gate/and-gate.tests.json +0 -22
  377. package/nodes/anthropic-claude-3-5-haiku/anthropic-claude-3-5-haiku.tests.json +0 -80
  378. package/nodes/anthropic-claude-3-haiku/anthropic-claude-3-haiku.tests.json +0 -80
  379. package/nodes/anthropic-claude-haiku-4-5/anthropic-claude-haiku-4-5.tests.json +0 -80
  380. package/nodes/anthropic-claude-opus-4/anthropic-claude-opus-4.tests.json +0 -80
  381. package/nodes/anthropic-claude-opus-4-1/anthropic-claude-opus-4-1.tests.json +0 -80
  382. package/nodes/anthropic-claude-opus-4-5/anthropic-claude-opus-4-5.tests.json +0 -80
  383. package/nodes/anthropic-claude-opus-4-6/anthropic-claude-opus-4-6.tests.json +0 -80
  384. package/nodes/anthropic-claude-opus-4-6-fast/anthropic-claude-opus-4-6-fast.tests.json +0 -80
  385. package/nodes/anthropic-claude-opus-4-7/anthropic-claude-opus-4-7.tests.json +0 -57
  386. package/nodes/anthropic-claude-opus-4-7-fast/anthropic-claude-opus-4-7-fast.tests.json +0 -57
  387. package/nodes/anthropic-claude-opus-4-8/anthropic-claude-opus-4-8.tests.json +0 -57
  388. package/nodes/anthropic-claude-opus-4-8-fast/anthropic-claude-opus-4-8-fast.tests.json +0 -57
  389. package/nodes/anthropic-claude-sonnet-4/anthropic-claude-sonnet-4.tests.json +0 -80
  390. package/nodes/anthropic-claude-sonnet-4-5/anthropic-claude-sonnet-4-5.tests.json +0 -80
  391. package/nodes/anthropic-claude-sonnet-4-6/anthropic-claude-sonnet-4-6.tests.json +0 -80
  392. package/nodes/array-builder/array-builder.tests.json +0 -20
  393. package/nodes/array-filter/array-filter.tests.json +0 -67
  394. package/nodes/array-find/array-find.tests.json +0 -83
  395. package/nodes/array-flatten/array-flatten.tests.json +0 -79
  396. package/nodes/array-index-selector/array-index-selector.tests.json +0 -37
  397. package/nodes/array-join/array-join.tests.json +0 -41
  398. package/nodes/array-length/array-length.tests.json +0 -32
  399. package/nodes/array-map/array-map.tests.json +0 -44
  400. package/nodes/array-reverse/array-reverse.tests.json +0 -60
  401. package/nodes/array-shuffle/array-shuffle.tests.json +0 -82
  402. package/nodes/array-slice/array-slice.tests.json +0 -43
  403. package/nodes/array-sort/array-sort.tests.json +0 -95
  404. package/nodes/array-split/array-split.tests.json +0 -77
  405. package/nodes/array-unique/array-unique.tests.json +0 -96
  406. package/nodes/baai-bge-base-en-v1-5/baai-bge-base-en-v1-5.tests.json +0 -48
  407. package/nodes/baai-bge-large-en-v1-5/baai-bge-large-en-v1-5.tests.json +0 -48
  408. package/nodes/baai-bge-m3/baai-bge-m3.tests.json +0 -48
  409. package/nodes/base64-decode/base64-decode.tests.json +0 -46
  410. package/nodes/base64-encode/base64-encode.tests.json +0 -38
  411. package/nodes/boolean/boolean.tests.json +0 -47
  412. package/nodes/boolean-inverter/boolean-inverter.tests.json +0 -22
  413. package/nodes/ceil/ceil.tests.json +0 -38
  414. package/nodes/cohere-rerank-4-fast/cohere-rerank-4-fast.tests.json +0 -47
  415. package/nodes/cohere-rerank-4-pro/cohere-rerank-4-pro.tests.json +0 -47
  416. package/nodes/cohere-rerank-v3-5/cohere-rerank-v3-5.tests.json +0 -47
  417. package/nodes/combine-document-chunks/combine-document-chunks.tests.json +0 -51
  418. package/nodes/condition-check/condition-check.tests.json +0 -112
  419. package/nodes/confluence-get-page/confluence-get-page.tests.json +0 -12
  420. package/nodes/confluence-search/confluence-search.tests.json +0 -14
  421. package/nodes/conversation-to-text/conversation-to-text.tests.json +0 -134
  422. package/nodes/csv-parser/csv-parser.tests.json +0 -93
  423. package/nodes/csv-stringifier/csv-stringifier.tests.json +0 -63
  424. package/nodes/date-formatter/date-formatter.tests.json +0 -50
  425. package/nodes/dedupe-messages/dedupe-messages.tests.json +0 -149
  426. package/nodes/deepseek-deepseek-chat/deepseek-deepseek-chat.tests.json +0 -80
  427. package/nodes/deepseek-deepseek-chat-v3-0324/deepseek-deepseek-chat-v3-0324.tests.json +0 -80
  428. package/nodes/deepseek-deepseek-chat-v3-1/deepseek-deepseek-chat-v3-1.tests.json +0 -80
  429. package/nodes/deepseek-deepseek-r1/deepseek-deepseek-r1.tests.json +0 -80
  430. package/nodes/deepseek-deepseek-r1-0528/deepseek-deepseek-r1-0528.tests.json +0 -80
  431. package/nodes/deepseek-deepseek-r1-distill-llama-70b/deepseek-deepseek-r1-distill-llama-70b.tests.json +0 -80
  432. package/nodes/deepseek-deepseek-r1-distill-qwen-32b/deepseek-deepseek-r1-distill-qwen-32b.tests.json +0 -80
  433. package/nodes/deepseek-deepseek-v3-1-terminus/deepseek-deepseek-v3-1-terminus.tests.json +0 -80
  434. package/nodes/deepseek-deepseek-v3-2/deepseek-deepseek-v3-2.tests.json +0 -80
  435. package/nodes/deepseek-deepseek-v3-2-exp/deepseek-deepseek-v3-2-exp.tests.json +0 -80
  436. package/nodes/deepseek-deepseek-v4-flash/deepseek-deepseek-v4-flash.tests.json +0 -80
  437. package/nodes/deepseek-deepseek-v4-pro/deepseek-deepseek-v4-pro.tests.json +0 -80
  438. package/nodes/delay/delay.tests.json +0 -59
  439. package/nodes/delete-object-property/delete-object-property.tests.json +0 -173
  440. package/nodes/divide/divide.tests.json +0 -42
  441. package/nodes/duration-calculator/duration-calculator.tests.json +0 -124
  442. package/nodes/embedding/embedding.tests.json +0 -26
  443. package/nodes/equals/equals.tests.json +0 -111
  444. package/nodes/extract-code/extract-code.tests.json +0 -162
  445. package/nodes/extract-json/extract-json.tests.json +0 -146
  446. package/nodes/extract-text-content/extract-text-content.tests.json +0 -144
  447. package/nodes/filter-messages/filter-messages.tests.json +0 -125
  448. package/nodes/filter-tools/filter-tools.tests.json +0 -89
  449. package/nodes/firecrawl-scrape/firecrawl-scrape.tests.json +0 -57
  450. package/nodes/firecrawl-search/firecrawl-search.tests.json +0 -9
  451. package/nodes/floor/floor.tests.json +0 -38
  452. package/nodes/generate-uuid/generate-uuid.tests.json +0 -7
  453. package/nodes/get-chunk-by-index/get-chunk-by-index.tests.json +0 -51
  454. package/nodes/get-first-n-messages/get-first-n-messages.tests.json +0 -66
  455. package/nodes/get-last-n-messages/get-last-n-messages.tests.json +0 -66
  456. package/nodes/get-messages-by-role/get-messages-by-role.tests.json +0 -87
  457. package/nodes/get-messages-range/get-messages-range.tests.json +0 -104
  458. package/nodes/get-object-property/get-object-property.tests.json +0 -101
  459. package/nodes/github-create-issue/github-create-issue.tests.json +0 -15
  460. package/nodes/google-custom-search/google-custom-search.tests.json +0 -69
  461. package/nodes/google-gemini-2-5-flash/google-gemini-2-5-flash.tests.json +0 -80
  462. package/nodes/google-gemini-2-5-flash-image/google-gemini-2-5-flash-image.tests.json +0 -44
  463. package/nodes/google-gemini-2-5-flash-lite/google-gemini-2-5-flash-lite.tests.json +0 -80
  464. package/nodes/google-gemini-2-5-flash-lite-preview-09-2025/google-gemini-2-5-flash-lite-preview-09-2025.tests.json +0 -80
  465. package/nodes/google-gemini-2-5-pro/google-gemini-2-5-pro.tests.json +0 -80
  466. package/nodes/google-gemini-2-5-pro-preview/google-gemini-2-5-pro-preview.tests.json +0 -80
  467. package/nodes/google-gemini-2-5-pro-preview-05-06/google-gemini-2-5-pro-preview-05-06.tests.json +0 -80
  468. package/nodes/google-gemini-3-1-flash-image-preview/google-gemini-3-1-flash-image-preview.tests.json +0 -44
  469. package/nodes/google-gemini-3-1-flash-lite/google-gemini-3-1-flash-lite.tests.json +0 -80
  470. package/nodes/google-gemini-3-1-flash-lite-preview/google-gemini-3-1-flash-lite-preview.tests.json +0 -80
  471. package/nodes/google-gemini-3-1-pro-preview/google-gemini-3-1-pro-preview.tests.json +0 -80
  472. package/nodes/google-gemini-3-1-pro-preview-customtools/google-gemini-3-1-pro-preview-customtools.tests.json +0 -80
  473. package/nodes/google-gemini-3-5-flash/google-gemini-3-5-flash.tests.json +0 -80
  474. package/nodes/google-gemini-3-flash-preview/google-gemini-3-flash-preview.tests.json +0 -80
  475. package/nodes/google-gemini-3-pro-image-preview/google-gemini-3-pro-image-preview.tests.json +0 -44
  476. package/nodes/google-gemini-embedding-001/google-gemini-embedding-001.tests.json +0 -48
  477. package/nodes/google-gemini-embedding-2/google-gemini-embedding-2.tests.json +0 -48
  478. package/nodes/google-gemini-embedding-2-preview/google-gemini-embedding-2-preview.tests.json +0 -48
  479. package/nodes/google-gemma-2-27b-it/google-gemma-2-27b-it.tests.json +0 -80
  480. package/nodes/google-gemma-3-12b-it/google-gemma-3-12b-it.tests.json +0 -80
  481. package/nodes/google-gemma-3-27b-it/google-gemma-3-27b-it.tests.json +0 -80
  482. package/nodes/google-gemma-3-4b-it/google-gemma-3-4b-it.tests.json +0 -80
  483. package/nodes/google-gemma-3n-e4b-it/google-gemma-3n-e4b-it.tests.json +0 -44
  484. package/nodes/google-gemma-4-26b-a4b-it/google-gemma-4-26b-a4b-it.tests.json +0 -80
  485. package/nodes/google-gemma-4-26b-a4b-it-free/google-gemma-4-26b-a4b-it-free.tests.json +0 -80
  486. package/nodes/google-gemma-4-31b-it/google-gemma-4-31b-it.tests.json +0 -80
  487. package/nodes/google-gemma-4-31b-it-free/google-gemma-4-31b-it-free.tests.json +0 -80
  488. package/nodes/google-lyria-3-clip-preview/google-lyria-3-clip-preview.tests.json +0 -44
  489. package/nodes/google-lyria-3-pro-preview/google-lyria-3-pro-preview.tests.json +0 -44
  490. package/nodes/greater-than/greater-than.tests.json +0 -47
  491. package/nodes/greater-than-equal/greater-than-equal.tests.json +0 -52
  492. package/nodes/has-object-property/has-object-property.tests.json +0 -148
  493. package/nodes/hash-content/hash-content.tests.json +0 -51
  494. package/nodes/histogram/histogram.tests.json +0 -57
  495. package/nodes/histogram-fixed/histogram-fixed.tests.json +0 -62
  496. package/nodes/http-request/http-request.tests.json +0 -115
  497. package/nodes/if-else/if-else.tests.json +0 -94
  498. package/nodes/input-data/input-data.tests.json +0 -53
  499. package/nodes/intfloat-e5-base-v2/intfloat-e5-base-v2.tests.json +0 -48
  500. package/nodes/intfloat-e5-large-v2/intfloat-e5-large-v2.tests.json +0 -48
  501. package/nodes/intfloat-multilingual-e5-large/intfloat-multilingual-e5-large.tests.json +0 -48
  502. package/nodes/jira-create-issue/jira-create-issue.tests.json +0 -14
  503. package/nodes/jira-list-issues/jira-list-issues.tests.json +0 -14
  504. package/nodes/jira-update-issue/jira-update-issue.tests.json +0 -12
  505. package/nodes/json-parser/json-parser.tests.json +0 -57
  506. package/nodes/json-stringifier/json-stringifier.tests.json +0 -58
  507. package/nodes/json-to-xml/json-to-xml.tests.json +0 -103
  508. package/nodes/json-to-yaml/json-to-yaml.tests.json +0 -110
  509. package/nodes/keep-bookends/keep-bookends.tests.json +0 -185
  510. package/nodes/less-than/less-than.tests.json +0 -47
  511. package/nodes/less-than-equal/less-than-equal.tests.json +0 -52
  512. package/nodes/linear-create-issue/linear-create-issue.tests.json +0 -14
  513. package/nodes/linear-list-issues/linear-list-issues.tests.json +0 -13
  514. package/nodes/linear-update-issue/linear-update-issue.tests.json +0 -13
  515. package/nodes/liquid-lfm-2-24b-a2b/liquid-lfm-2-24b-a2b.tests.json +0 -44
  516. package/nodes/liquid-lfm-2-5-1-2b-instruct-free/liquid-lfm-2-5-1-2b-instruct-free.tests.json +0 -44
  517. package/nodes/liquid-lfm-2-5-1-2b-thinking-free/liquid-lfm-2-5-1-2b-thinking-free.tests.json +0 -44
  518. package/nodes/loop-end/loop-end.tests.json +0 -139
  519. package/nodes/loop-start/loop-start.tests.json +0 -65
  520. package/nodes/mean/mean.tests.json +0 -45
  521. package/nodes/median/median.tests.json +0 -54
  522. package/nodes/merge-consecutive-roles/merge-consecutive-roles.tests.json +0 -199
  523. package/nodes/merge-messages/merge-messages.tests.json +0 -174
  524. package/nodes/message/message.tests.json +0 -85
  525. package/nodes/message-bus/message-bus.tests.json +0 -150
  526. package/nodes/message-role-swap/message-role-swap.tests.json +0 -197
  527. package/nodes/mistralai-codestral-2508/mistralai-codestral-2508.tests.json +0 -80
  528. package/nodes/mistralai-codestral-embed-2505/mistralai-codestral-embed-2505.tests.json +0 -48
  529. package/nodes/mistralai-devstral-2512/mistralai-devstral-2512.tests.json +0 -80
  530. package/nodes/mistralai-ministral-14b-2512/mistralai-ministral-14b-2512.tests.json +0 -80
  531. package/nodes/mistralai-ministral-3b-2512/mistralai-ministral-3b-2512.tests.json +0 -80
  532. package/nodes/mistralai-ministral-8b-2512/mistralai-ministral-8b-2512.tests.json +0 -80
  533. package/nodes/mistralai-mistral-embed-2312/mistralai-mistral-embed-2312.tests.json +0 -48
  534. package/nodes/mistralai-mistral-large/mistralai-mistral-large.tests.json +0 -80
  535. package/nodes/mistralai-mistral-large-2407/mistralai-mistral-large-2407.tests.json +0 -80
  536. package/nodes/mistralai-mistral-large-2512/mistralai-mistral-large-2512.tests.json +0 -80
  537. package/nodes/mistralai-mistral-medium-3/mistralai-mistral-medium-3.tests.json +0 -80
  538. package/nodes/mistralai-mistral-medium-3-1/mistralai-mistral-medium-3-1.tests.json +0 -80
  539. package/nodes/mistralai-mistral-medium-3-5/mistralai-mistral-medium-3-5.tests.json +0 -80
  540. package/nodes/mistralai-mistral-nemo/mistralai-mistral-nemo.tests.json +0 -80
  541. package/nodes/mistralai-mistral-saba/mistralai-mistral-saba.tests.json +0 -80
  542. package/nodes/mistralai-mistral-small-24b-instruct-2501/mistralai-mistral-small-24b-instruct-2501.tests.json +0 -44
  543. package/nodes/mistralai-mistral-small-2603/mistralai-mistral-small-2603.tests.json +0 -80
  544. package/nodes/mistralai-mistral-small-3-1-24b-instruct/mistralai-mistral-small-3-1-24b-instruct.tests.json +0 -44
  545. package/nodes/mistralai-mistral-small-3-2-24b-instruct/mistralai-mistral-small-3-2-24b-instruct.tests.json +0 -80
  546. package/nodes/mistralai-mixtral-8x22b-instruct/mistralai-mixtral-8x22b-instruct.tests.json +0 -80
  547. package/nodes/mistralai-voxtral-small-24b-2507/mistralai-voxtral-small-24b-2507.tests.json +0 -80
  548. package/nodes/mode/mode.tests.json +0 -53
  549. package/nodes/modulo/modulo.tests.json +0 -66
  550. package/nodes/multiply/multiply.tests.json +0 -42
  551. package/nodes/nand-gate/nand-gate.tests.json +0 -22
  552. package/nodes/newsdata-io-archive/newsdata-io-archive.tests.json +0 -68
  553. package/nodes/newsdata-io-latest/newsdata-io-latest.tests.json +0 -74
  554. package/nodes/newsdata-io-sources/newsdata-io-sources.tests.json +0 -53
  555. package/nodes/nor-gate/nor-gate.tests.json +0 -22
  556. package/nodes/normalize-whitespace/normalize-whitespace.tests.json +0 -76
  557. package/nodes/not-equals/not-equals.tests.json +0 -77
  558. package/nodes/notion-append-blocks/notion-append-blocks.tests.json +0 -80
  559. package/nodes/notion-archive-page/notion-archive-page.tests.json +0 -26
  560. package/nodes/notion-create-page/notion-create-page.tests.json +0 -92
  561. package/nodes/notion-get-blocks/notion-get-blocks.tests.json +0 -22
  562. package/nodes/notion-get-page/notion-get-page.tests.json +0 -14
  563. package/nodes/notion-query-database/notion-query-database.tests.json +0 -52
  564. package/nodes/notion-search/notion-search.tests.json +0 -46
  565. package/nodes/notion-update-page/notion-update-page.tests.json +0 -44
  566. package/nodes/null-bomb/null-bomb.tests.json +0 -83
  567. package/nodes/number/number.tests.json +0 -46
  568. package/nodes/nvidia-llama-nemotron-embed-vl-1b-v2-free/nvidia-llama-nemotron-embed-vl-1b-v2-free.tests.json +0 -48
  569. package/nodes/nvidia-llama-nemotron-rerank-vl-1b-v2-free/nvidia-llama-nemotron-rerank-vl-1b-v2-free.tests.json +0 -47
  570. package/nodes/object-merge/object-merge.tests.json +0 -158
  571. package/nodes/openai-gpt-3-5-turbo/openai-gpt-3-5-turbo.tests.json +0 -80
  572. package/nodes/openai-gpt-3-5-turbo-0613/openai-gpt-3-5-turbo-0613.tests.json +0 -80
  573. package/nodes/openai-gpt-3-5-turbo-16k/openai-gpt-3-5-turbo-16k.tests.json +0 -80
  574. package/nodes/openai-gpt-3-5-turbo-instruct/openai-gpt-3-5-turbo-instruct.tests.json +0 -80
  575. package/nodes/openai-gpt-4/openai-gpt-4.tests.json +0 -80
  576. package/nodes/openai-gpt-4-1/openai-gpt-4-1.tests.json +0 -80
  577. package/nodes/openai-gpt-4-1-mini/openai-gpt-4-1-mini.tests.json +0 -80
  578. package/nodes/openai-gpt-4-1-nano/openai-gpt-4-1-nano.tests.json +0 -80
  579. package/nodes/openai-gpt-4-1106-preview/openai-gpt-4-1106-preview.tests.json +0 -80
  580. package/nodes/openai-gpt-4-turbo/openai-gpt-4-turbo.tests.json +0 -80
  581. package/nodes/openai-gpt-4-turbo-preview/openai-gpt-4-turbo-preview.tests.json +0 -80
  582. package/nodes/openai-gpt-4o/openai-gpt-4o.tests.json +0 -80
  583. package/nodes/openai-gpt-4o-2024-05-13/openai-gpt-4o-2024-05-13.tests.json +0 -80
  584. package/nodes/openai-gpt-4o-2024-08-06/openai-gpt-4o-2024-08-06.tests.json +0 -80
  585. package/nodes/openai-gpt-4o-2024-11-20/openai-gpt-4o-2024-11-20.tests.json +0 -80
  586. package/nodes/openai-gpt-4o-mini/openai-gpt-4o-mini.tests.json +0 -80
  587. package/nodes/openai-gpt-4o-mini-2024-07-18/openai-gpt-4o-mini-2024-07-18.tests.json +0 -80
  588. package/nodes/openai-gpt-4o-mini-search-preview/openai-gpt-4o-mini-search-preview.tests.json +0 -26
  589. package/nodes/openai-gpt-4o-search-preview/openai-gpt-4o-search-preview.tests.json +0 -26
  590. package/nodes/openai-gpt-5/openai-gpt-5.tests.json +0 -57
  591. package/nodes/openai-gpt-5-1/openai-gpt-5-1.tests.json +0 -57
  592. package/nodes/openai-gpt-5-1-chat/openai-gpt-5-1-chat.tests.json +0 -57
  593. package/nodes/openai-gpt-5-1-codex/openai-gpt-5-1-codex.tests.json +0 -57
  594. package/nodes/openai-gpt-5-1-codex-max/openai-gpt-5-1-codex-max.tests.json +0 -57
  595. package/nodes/openai-gpt-5-1-codex-mini/openai-gpt-5-1-codex-mini.tests.json +0 -57
  596. package/nodes/openai-gpt-5-2/openai-gpt-5-2.tests.json +0 -57
  597. package/nodes/openai-gpt-5-2-chat/openai-gpt-5-2-chat.tests.json +0 -57
  598. package/nodes/openai-gpt-5-2-codex/openai-gpt-5-2-codex.tests.json +0 -57
  599. package/nodes/openai-gpt-5-2-pro/openai-gpt-5-2-pro.tests.json +0 -57
  600. package/nodes/openai-gpt-5-3-chat/openai-gpt-5-3-chat.tests.json +0 -57
  601. package/nodes/openai-gpt-5-3-codex/openai-gpt-5-3-codex.tests.json +0 -57
  602. package/nodes/openai-gpt-5-4/openai-gpt-5-4.tests.json +0 -57
  603. package/nodes/openai-gpt-5-4-image-2/openai-gpt-5-4-image-2.tests.json +0 -26
  604. package/nodes/openai-gpt-5-4-mini/openai-gpt-5-4-mini.tests.json +0 -57
  605. package/nodes/openai-gpt-5-4-nano/openai-gpt-5-4-nano.tests.json +0 -57
  606. package/nodes/openai-gpt-5-4-pro/openai-gpt-5-4-pro.tests.json +0 -57
  607. package/nodes/openai-gpt-5-5/openai-gpt-5-5.tests.json +0 -57
  608. package/nodes/openai-gpt-5-5-pro/openai-gpt-5-5-pro.tests.json +0 -57
  609. package/nodes/openai-gpt-5-chat/openai-gpt-5-chat.tests.json +0 -26
  610. package/nodes/openai-gpt-5-codex/openai-gpt-5-codex.tests.json +0 -57
  611. package/nodes/openai-gpt-5-image/openai-gpt-5-image.tests.json +0 -44
  612. package/nodes/openai-gpt-5-image-mini/openai-gpt-5-image-mini.tests.json +0 -44
  613. package/nodes/openai-gpt-5-mini/openai-gpt-5-mini.tests.json +0 -57
  614. package/nodes/openai-gpt-5-nano/openai-gpt-5-nano.tests.json +0 -57
  615. package/nodes/openai-gpt-5-pro/openai-gpt-5-pro.tests.json +0 -57
  616. package/nodes/openai-gpt-audio/openai-gpt-audio.tests.json +0 -80
  617. package/nodes/openai-gpt-audio-mini/openai-gpt-audio-mini.tests.json +0 -80
  618. package/nodes/openai-gpt-chat-latest/openai-gpt-chat-latest.tests.json +0 -57
  619. package/nodes/openai-gpt-oss-120b/openai-gpt-oss-120b.tests.json +0 -80
  620. package/nodes/openai-gpt-oss-120b-free/openai-gpt-oss-120b-free.tests.json +0 -80
  621. package/nodes/openai-gpt-oss-20b/openai-gpt-oss-20b.tests.json +0 -80
  622. package/nodes/openai-gpt-oss-20b-free/openai-gpt-oss-20b-free.tests.json +0 -80
  623. package/nodes/openai-gpt-oss-safeguard-20b/openai-gpt-oss-safeguard-20b.tests.json +0 -80
  624. package/nodes/openai-o1/openai-o1.tests.json +0 -57
  625. package/nodes/openai-o1-pro/openai-o1-pro.tests.json +0 -26
  626. package/nodes/openai-o3/openai-o3.tests.json +0 -57
  627. package/nodes/openai-o3-deep-research/openai-o3-deep-research.tests.json +0 -80
  628. package/nodes/openai-o3-mini/openai-o3-mini.tests.json +0 -57
  629. package/nodes/openai-o3-mini-high/openai-o3-mini-high.tests.json +0 -57
  630. package/nodes/openai-o3-pro/openai-o3-pro.tests.json +0 -57
  631. package/nodes/openai-o4-mini/openai-o4-mini.tests.json +0 -57
  632. package/nodes/openai-o4-mini-deep-research/openai-o4-mini-deep-research.tests.json +0 -80
  633. package/nodes/openai-o4-mini-high/openai-o4-mini-high.tests.json +0 -57
  634. package/nodes/openai-omni-moderation-latest/openai-omni-moderation-latest.tests.json +0 -103
  635. package/nodes/openai-text-embedding-3-large/openai-text-embedding-3-large.tests.json +0 -48
  636. package/nodes/openai-text-embedding-3-small/openai-text-embedding-3-small.tests.json +0 -48
  637. package/nodes/openai-text-embedding-ada-002/openai-text-embedding-ada-002.tests.json +0 -48
  638. package/nodes/or-gate/or-gate.tests.json +0 -22
  639. package/nodes/parse-url/parse-url.tests.json +0 -121
  640. package/nodes/perplexity-pplx-embed-v1-0-6b/perplexity-pplx-embed-v1-0-6b.tests.json +0 -48
  641. package/nodes/perplexity-pplx-embed-v1-4b/perplexity-pplx-embed-v1-4b.tests.json +0 -48
  642. package/nodes/perplexity-sonar/perplexity-sonar.tests.json +0 -44
  643. package/nodes/perplexity-sonar-deep-research/perplexity-sonar-deep-research.tests.json +0 -80
  644. package/nodes/perplexity-sonar-pro/perplexity-sonar-pro.tests.json +0 -44
  645. package/nodes/perplexity-sonar-pro-search/perplexity-sonar-pro-search.tests.json +0 -44
  646. package/nodes/perplexity-sonar-reasoning-pro/perplexity-sonar-reasoning-pro.tests.json +0 -80
  647. package/nodes/pinecone-query/pinecone-query.tests.json +0 -12
  648. package/nodes/pinecone-upsert/pinecone-upsert.tests.json +0 -13
  649. package/nodes/power/power.tests.json +0 -42
  650. package/nodes/prompt-injection-guard/prompt-injection-guard.tests.json +0 -205
  651. package/nodes/quartiles/quartiles.tests.json +0 -69
  652. package/nodes/qwen-qwen-2-5-72b-instruct/qwen-qwen-2-5-72b-instruct.tests.json +0 -80
  653. package/nodes/qwen-qwen-2-5-7b-instruct/qwen-qwen-2-5-7b-instruct.tests.json +0 -80
  654. package/nodes/qwen-qwen-2-5-coder-32b-instruct/qwen-qwen-2-5-coder-32b-instruct.tests.json +0 -80
  655. package/nodes/qwen-qwen-plus/qwen-qwen-plus.tests.json +0 -80
  656. package/nodes/qwen-qwen-plus-2025-07-28/qwen-qwen-plus-2025-07-28.tests.json +0 -80
  657. package/nodes/qwen-qwen-plus-2025-07-28-thinking/qwen-qwen-plus-2025-07-28-thinking.tests.json +0 -80
  658. package/nodes/qwen-qwen2-5-vl-72b-instruct/qwen-qwen2-5-vl-72b-instruct.tests.json +0 -44
  659. package/nodes/qwen-qwen3-14b/qwen-qwen3-14b.tests.json +0 -80
  660. package/nodes/qwen-qwen3-235b-a22b/qwen-qwen3-235b-a22b.tests.json +0 -80
  661. package/nodes/qwen-qwen3-235b-a22b-2507/qwen-qwen3-235b-a22b-2507.tests.json +0 -80
  662. package/nodes/qwen-qwen3-235b-a22b-thinking-2507/qwen-qwen3-235b-a22b-thinking-2507.tests.json +0 -80
  663. package/nodes/qwen-qwen3-30b-a3b/qwen-qwen3-30b-a3b.tests.json +0 -80
  664. package/nodes/qwen-qwen3-30b-a3b-instruct-2507/qwen-qwen3-30b-a3b-instruct-2507.tests.json +0 -80
  665. package/nodes/qwen-qwen3-30b-a3b-thinking-2507/qwen-qwen3-30b-a3b-thinking-2507.tests.json +0 -80
  666. package/nodes/qwen-qwen3-32b/qwen-qwen3-32b.tests.json +0 -80
  667. package/nodes/qwen-qwen3-5-122b-a10b/qwen-qwen3-5-122b-a10b.tests.json +0 -80
  668. package/nodes/qwen-qwen3-5-27b/qwen-qwen3-5-27b.tests.json +0 -80
  669. package/nodes/qwen-qwen3-5-35b-a3b/qwen-qwen3-5-35b-a3b.tests.json +0 -80
  670. package/nodes/qwen-qwen3-5-397b-a17b/qwen-qwen3-5-397b-a17b.tests.json +0 -80
  671. package/nodes/qwen-qwen3-5-9b/qwen-qwen3-5-9b.tests.json +0 -80
  672. package/nodes/qwen-qwen3-5-flash-02-23/qwen-qwen3-5-flash-02-23.tests.json +0 -80
  673. package/nodes/qwen-qwen3-5-plus-02-15/qwen-qwen3-5-plus-02-15.tests.json +0 -80
  674. package/nodes/qwen-qwen3-5-plus-20260420/qwen-qwen3-5-plus-20260420.tests.json +0 -80
  675. package/nodes/qwen-qwen3-6-27b/qwen-qwen3-6-27b.tests.json +0 -80
  676. package/nodes/qwen-qwen3-6-35b-a3b/qwen-qwen3-6-35b-a3b.tests.json +0 -80
  677. package/nodes/qwen-qwen3-6-flash/qwen-qwen3-6-flash.tests.json +0 -80
  678. package/nodes/qwen-qwen3-6-max-preview/qwen-qwen3-6-max-preview.tests.json +0 -80
  679. package/nodes/qwen-qwen3-6-plus/qwen-qwen3-6-plus.tests.json +0 -80
  680. package/nodes/qwen-qwen3-7-max/qwen-qwen3-7-max.tests.json +0 -80
  681. package/nodes/qwen-qwen3-7-plus/qwen-qwen3-7-plus.tests.json +0 -80
  682. package/nodes/qwen-qwen3-8b/qwen-qwen3-8b.tests.json +0 -80
  683. package/nodes/qwen-qwen3-coder/qwen-qwen3-coder.tests.json +0 -80
  684. package/nodes/qwen-qwen3-coder-30b-a3b-instruct/qwen-qwen3-coder-30b-a3b-instruct.tests.json +0 -80
  685. package/nodes/qwen-qwen3-coder-flash/qwen-qwen3-coder-flash.tests.json +0 -80
  686. package/nodes/qwen-qwen3-coder-free/qwen-qwen3-coder-free.tests.json +0 -80
  687. package/nodes/qwen-qwen3-coder-next/qwen-qwen3-coder-next.tests.json +0 -80
  688. package/nodes/qwen-qwen3-coder-plus/qwen-qwen3-coder-plus.tests.json +0 -80
  689. package/nodes/qwen-qwen3-embedding-4b/qwen-qwen3-embedding-4b.tests.json +0 -48
  690. package/nodes/qwen-qwen3-embedding-8b/qwen-qwen3-embedding-8b.tests.json +0 -48
  691. package/nodes/qwen-qwen3-max/qwen-qwen3-max.tests.json +0 -80
  692. package/nodes/qwen-qwen3-max-thinking/qwen-qwen3-max-thinking.tests.json +0 -80
  693. package/nodes/qwen-qwen3-next-80b-a3b-instruct/qwen-qwen3-next-80b-a3b-instruct.tests.json +0 -80
  694. package/nodes/qwen-qwen3-next-80b-a3b-instruct-free/qwen-qwen3-next-80b-a3b-instruct-free.tests.json +0 -80
  695. package/nodes/qwen-qwen3-next-80b-a3b-thinking/qwen-qwen3-next-80b-a3b-thinking.tests.json +0 -80
  696. package/nodes/qwen-qwen3-vl-235b-a22b-instruct/qwen-qwen3-vl-235b-a22b-instruct.tests.json +0 -80
  697. package/nodes/qwen-qwen3-vl-235b-a22b-thinking/qwen-qwen3-vl-235b-a22b-thinking.tests.json +0 -80
  698. package/nodes/qwen-qwen3-vl-30b-a3b-instruct/qwen-qwen3-vl-30b-a3b-instruct.tests.json +0 -80
  699. package/nodes/qwen-qwen3-vl-30b-a3b-thinking/qwen-qwen3-vl-30b-a3b-thinking.tests.json +0 -80
  700. package/nodes/qwen-qwen3-vl-32b-instruct/qwen-qwen3-vl-32b-instruct.tests.json +0 -80
  701. package/nodes/qwen-qwen3-vl-8b-instruct/qwen-qwen3-vl-8b-instruct.tests.json +0 -80
  702. package/nodes/qwen-qwen3-vl-8b-thinking/qwen-qwen3-vl-8b-thinking.tests.json +0 -80
  703. package/nodes/random-error/random-error.tests.json +0 -38
  704. package/nodes/random-number/random-number.tests.json +0 -59
  705. package/nodes/range/range.tests.json +0 -68
  706. package/nodes/resend-send-email/resend-send-email.tests.json +0 -14
  707. package/nodes/response-format/response-format.tests.json +0 -233
  708. package/nodes/round/round.tests.json +0 -38
  709. package/nodes/route/route.tests.json +0 -90
  710. package/nodes/self-healing-error/self-healing-error.tests.json +0 -34
  711. package/nodes/sendgrid-send-email/sendgrid-send-email.tests.json +0 -41
  712. package/nodes/sentence-transformers-all-minilm-l12-v2/sentence-transformers-all-minilm-l12-v2.tests.json +0 -48
  713. package/nodes/sentence-transformers-all-minilm-l6-v2/sentence-transformers-all-minilm-l6-v2.tests.json +0 -48
  714. package/nodes/sentence-transformers-all-mpnet-base-v2/sentence-transformers-all-mpnet-base-v2.tests.json +0 -48
  715. package/nodes/sentence-transformers-multi-qa-mpnet-base-dot-v1/sentence-transformers-multi-qa-mpnet-base-dot-v1.tests.json +0 -48
  716. package/nodes/sentence-transformers-paraphrase-minilm-l6-v2/sentence-transformers-paraphrase-minilm-l6-v2.tests.json +0 -48
  717. package/nodes/set-object-property/set-object-property.tests.json +0 -173
  718. package/nodes/simple-agent/simple-agent.tests.json +0 -28
  719. package/nodes/slack-send-message/slack-send-message.tests.json +0 -13
  720. package/nodes/split-into-chunks/split-into-chunks.tests.json +0 -74
  721. package/nodes/standard-deviation/standard-deviation.tests.json +0 -49
  722. package/nodes/string/string.tests.json +0 -56
  723. package/nodes/string-case/string-case.tests.json +0 -44
  724. package/nodes/string-concat/string-concat.tests.json +0 -12
  725. package/nodes/string-contains/string-contains.tests.json +0 -58
  726. package/nodes/string-length/string-length.tests.json +0 -22
  727. package/nodes/string-match/string-match.tests.json +0 -82
  728. package/nodes/string-replace/string-replace.tests.json +0 -62
  729. package/nodes/string-split/string-split.tests.json +0 -26
  730. package/nodes/string-substring/string-substring.tests.json +0 -44
  731. package/nodes/string-template/string-template.tests.json +0 -115
  732. package/nodes/string-trim/string-trim.tests.json +0 -38
  733. package/nodes/strip-html/strip-html.tests.json +0 -94
  734. package/nodes/stripe-list-customers/stripe-list-customers.tests.json +0 -24
  735. package/nodes/subtract/subtract.tests.json +0 -41
  736. package/nodes/supabase-query/supabase-query.tests.json +0 -14
  737. package/nodes/switch/switch.tests.json +0 -85
  738. package/nodes/system-prompt/system-prompt.tests.json +0 -113
  739. package/nodes/temperature/temperature.tests.json +0 -47
  740. package/nodes/text-scratch-pad/text-scratch-pad.tests.json +0 -131
  741. package/nodes/text-to-conversation/text-to-conversation.tests.json +0 -132
  742. package/nodes/thenlper-gte-base/thenlper-gte-base.tests.json +0 -48
  743. package/nodes/thenlper-gte-large/thenlper-gte-large.tests.json +0 -48
  744. package/nodes/throw-error/throw-error.tests.json +0 -44
  745. package/nodes/time-adder/time-adder.tests.json +0 -158
  746. package/nodes/timestamp/timestamp.tests.json +0 -90
  747. package/nodes/token-count/token-count.tests.json +0 -163
  748. package/nodes/tokenizer/tokenizer.tests.json +0 -129
  749. package/nodes/tool-cleanup/tool-cleanup.tests.json +0 -160
  750. package/nodes/truncate-by-tokens/truncate-by-tokens.tests.json +0 -84
  751. package/nodes/truncate-by-tokens-from-start/truncate-by-tokens-from-start.tests.json +0 -84
  752. package/nodes/truncate-by-tokens-preserve-system/truncate-by-tokens-preserve-system.tests.json +0 -144
  753. package/nodes/truncate-old-tool-responses/truncate-old-tool-responses.tests.json +0 -207
  754. package/nodes/truncate-text/truncate-text.tests.json +0 -115
  755. package/nodes/twilio-send-sms/twilio-send-sms.tests.json +0 -14
  756. package/nodes/untokenizer/untokenizer.tests.json +0 -83
  757. package/nodes/word-count/word-count.tests.json +0 -100
  758. package/nodes/x-ai-grok-4-20/x-ai-grok-4-20.tests.json +0 -80
  759. package/nodes/x-ai-grok-4-20-multi-agent/x-ai-grok-4-20-multi-agent.tests.json +0 -44
  760. package/nodes/x-ai-grok-4-3/x-ai-grok-4-3.tests.json +0 -80
  761. package/nodes/x-ai-grok-build-0-1/x-ai-grok-build-0-1.tests.json +0 -80
  762. package/nodes/xml-to-json/xml-to-json.tests.json +0 -113
  763. package/nodes/xnor-gate/xnor-gate.tests.json +0 -22
  764. package/nodes/xor-gate/xor-gate.tests.json +0 -22
  765. package/nodes/yaml-to-json/yaml-to-json.tests.json +0 -112
@@ -0,0 +1,139 @@
1
+ export default async ({inputs, settings, config, nodeConfig}) => {
2
+ try {
3
+ // Get OpenRouter integration from engine
4
+ const openrouter = config.integrations?.openrouter;
5
+ if (!openrouter) {
6
+ throw new Error("OpenRouter integration not found");
7
+ }
8
+
9
+ let messages = inputs.messages;
10
+
11
+ if(typeof messages === 'string') {
12
+ messages = [{ role: 'user', content: messages }];
13
+ }
14
+
15
+ if(typeof messages === 'object' && !Array.isArray(messages)) {
16
+ messages = [messages];
17
+ }
18
+
19
+ if(inputs.system_prompt) {
20
+ let systemPrompt = inputs.system_prompt;
21
+ if(typeof systemPrompt === 'string') {
22
+ systemPrompt = { role: 'system', content: systemPrompt };
23
+ }
24
+ messages = [systemPrompt, ...messages];
25
+ }
26
+
27
+ // Build parameters object from config inputs
28
+ const params = {};
29
+ const configInputs = [{"name":"messages","display_name":"Conversation","type":"conversation or message or string","description":"Array of chat messages that make up the conversation","required":true},{"name":"system_prompt","display_name":"System Message","type":"message or string","description":"System prompt to instruct the model","default":null},{"name":"tools","display_name":"Tools","type":"tool or array of tools","description":"Array of tools to use","default":null,"allow_multiple":true},{"name":"tool_choice","display_name":"Tool Choice","type":"string","description":"Tool selection control","default":null},{"name":"reasoning","display_name":"Reasoning","type":"boolean","description":"Enable reasoning mode","default":null},{"name":"response_format","display_name":"Response Format","type":"object","description":"Output format specification","default":null},{"name":"temperature","display_name":"Temperature","type":"number","description":"Controls randomness (0-2)","default":null},{"name":"top_p","display_name":"Top P","type":"number","description":"Controls diversity via nucleus sampling","default":null},{"name":"max_tokens","display_name":"Max Tokens","type":"number","description":"Maximum tokens to generate","default":null},{"name":"seed","display_name":"Seed","type":"number","description":"Deterministic outputs","default":null},{"name":"logprobs","display_name":"Logprobs","type":"boolean","description":"Return log probabilities of the output tokens","default":null},{"name":"top_logprobs","display_name":"Top Logprobs","type":"number","description":"Number of most likely tokens to return at each position (0-20). Requires logprobs to be enabled.","default":null}];
30
+
31
+ for (const input of configInputs) {
32
+
33
+ if(input.name === 'messages') continue;
34
+
35
+ const value = inputs[input.name];
36
+ if (value !== null && value !== undefined) {
37
+ // Flatten tools array to handle both individual tools and arrays of tools
38
+ if (input.name === 'tools' && Array.isArray(value)) {
39
+ params.tools = value.flat();
40
+ } else {
41
+ params[input.name] = value;
42
+ }
43
+ }
44
+ }
45
+
46
+
47
+
48
+ const response = await openrouter.chatCompletion({
49
+ model: "x-ai/grok-4.7",
50
+ messages: messages,
51
+ ...params
52
+ }, nodeConfig, config);
53
+
54
+ // Get the set of internal tool names (tools handled by engine plugins)
55
+ // If internal_tool_names is undefined, we're in backward-compatible mode (include all)
56
+ // If it's an empty array, there are no internal tools (include none from history)
57
+ const hasInternalToolTracking = config.internal_tool_names !== undefined;
58
+ const internalToolNames = new Set(config.internal_tool_names || []);
59
+
60
+ // Build conversation output: only include messages related to internal tools
61
+ let conversationMessages = [];
62
+
63
+ if (Array.isArray(messages) && messages.length > 0) {
64
+ // Work backwards from the end
65
+ for (let i = messages.length - 1; i >= 0; i--) {
66
+ const msg = messages[i];
67
+ if (!msg || typeof msg !== 'object') continue;
68
+
69
+ const isTool = msg.role === 'tool';
70
+ const hasToolCalls = msg.tool_calls && Array.isArray(msg.tool_calls) && msg.tool_calls.length > 0;
71
+
72
+ if (isTool) {
73
+ // Only include tool result if it's for an internal tool
74
+ const toolName = msg.name;
75
+ if (!hasInternalToolTracking || internalToolNames.has(toolName)) {
76
+ conversationMessages.unshift(msg);
77
+ }
78
+ // Skip external tool results
79
+ } else if (hasToolCalls) {
80
+ // Filter to only internal tool calls
81
+ const internalCalls = !hasInternalToolTracking
82
+ ? msg.tool_calls
83
+ : msg.tool_calls.filter(tc => internalToolNames.has(tc.function?.name));
84
+
85
+ if (internalCalls.length > 0) {
86
+ conversationMessages.unshift({
87
+ ...msg,
88
+ tool_calls: internalCalls
89
+ });
90
+ }
91
+ // External tool calls from history are dropped
92
+ } else {
93
+ // Stop when we hit a message that is not tool and has no tool_calls
94
+ break;
95
+ }
96
+ }
97
+ }
98
+
99
+ // Append the final output message — always include all tool_calls on the response
100
+ // The internal/external split only applies to historical messages above, not the fresh response
101
+ const finalMessage = {
102
+ content: response.content,
103
+ role: response.role
104
+ };
105
+
106
+ if (response.tool_calls && Array.isArray(response.tool_calls) && response.tool_calls.length > 0) {
107
+ finalMessage.tool_calls = response.tool_calls;
108
+ }
109
+
110
+ if (response.images) {
111
+ finalMessage.images = response.images;
112
+ }
113
+ conversationMessages.push(finalMessage);
114
+
115
+ const conversation = conversationMessages;
116
+
117
+ return {
118
+ conversation: conversation,
119
+ message: {
120
+ content: response.content,
121
+ role: response.role,
122
+ tool_calls: response.tool_calls
123
+ },
124
+ content: response.content,
125
+ role: response.role,
126
+ tool_calls: response.tool_calls,
127
+ reasoning: response.reasoning,
128
+ refusal: response.refusal,
129
+ logprobs: response.logprobs,
130
+ finish_reason: response.finish_reason,
131
+ usage: response.usage,
132
+ cost_total: response.cost_total,
133
+ cost_itemized: response.cost_itemized
134
+ };
135
+ } catch (error) {
136
+ console.log('error', error);
137
+ throw new Error(`SpaceXAI: Grok 4.7 node error: ${error.message}`);
138
+ }
139
+ };
@@ -1,22 +1,19 @@
1
1
  {
2
- "display_name": "xAI: Grok Build 0.1",
2
+ "display_name": "SpaceXAI: Grok Build 0.1",
3
3
  "tagline": "Generate text",
4
- "description": "Grok Build 0.1 is xAI’s fast coding model trained specifically for agentic software engineering workflows. It supports text and image inputs with text output, and is optimized for interactive coding...",
4
+ "description": "Grok Build 0.1 is SpaceXAI’s fast coding model trained specifically for agentic software engineering workflows. It supports text and image inputs with text output, and is optimized for interactive coding...",
5
5
  "category": "llm",
6
6
  "provider": "x-ai",
7
7
  "accepts_plugins": true,
8
8
  "model_id": "x-ai/grok-build-0.1",
9
9
  "context_length": 256000,
10
10
  "supported_parameters": [
11
- "frequency_penalty",
12
11
  "include_reasoning",
13
12
  "logprobs",
14
13
  "max_tokens",
15
- "presence_penalty",
16
14
  "reasoning",
17
15
  "response_format",
18
16
  "seed",
19
- "stop",
20
17
  "structured_outputs",
21
18
  "temperature",
22
19
  "tool_choice",
@@ -68,13 +65,6 @@
68
65
  "description": "Output format specification",
69
66
  "default": null
70
67
  },
71
- {
72
- "name": "stop",
73
- "display_name": "Stop",
74
- "type": "string or array",
75
- "description": "Custom stop sequences",
76
- "default": null
77
- },
78
68
  {
79
69
  "name": "temperature",
80
70
  "display_name": "Temperature",
@@ -96,20 +86,6 @@
96
86
  "description": "Maximum tokens to generate",
97
87
  "default": null
98
88
  },
99
- {
100
- "name": "frequency_penalty",
101
- "display_name": "Frequency Penalty",
102
- "type": "number",
103
- "description": "Reduces repetition (-2 to 2)",
104
- "default": null
105
- },
106
- {
107
- "name": "presence_penalty",
108
- "display_name": "Presence Penalty",
109
- "type": "number",
110
- "description": "Encourages new topics (-2 to 2)",
111
- "default": null
112
- },
113
89
  {
114
90
  "name": "seed",
115
91
  "display_name": "Seed",
@@ -26,7 +26,7 @@ export default async ({inputs, settings, config, nodeConfig}) => {
26
26
 
27
27
  // Build parameters object from config inputs
28
28
  const params = {};
29
- const configInputs = [{"name":"messages","display_name":"Conversation","type":"conversation or message or string","description":"Array of chat messages that make up the conversation","required":true},{"name":"system_prompt","display_name":"System Message","type":"message or string","description":"System prompt to instruct the model","default":null},{"name":"tools","display_name":"Tools","type":"tool or array of tools","description":"Array of tools to use","default":null,"allow_multiple":true},{"name":"tool_choice","display_name":"Tool Choice","type":"string","description":"Tool selection control","default":null},{"name":"reasoning","display_name":"Reasoning","type":"boolean","description":"Enable reasoning mode","default":null},{"name":"response_format","display_name":"Response Format","type":"object","description":"Output format specification","default":null},{"name":"stop","display_name":"Stop","type":"string or array","description":"Custom stop sequences","default":null},{"name":"temperature","display_name":"Temperature","type":"number","description":"Controls randomness (0-2)","default":null},{"name":"top_p","display_name":"Top P","type":"number","description":"Controls diversity via nucleus sampling","default":null},{"name":"max_tokens","display_name":"Max Tokens","type":"number","description":"Maximum tokens to generate","default":null},{"name":"frequency_penalty","display_name":"Frequency Penalty","type":"number","description":"Reduces repetition (-2 to 2)","default":null},{"name":"presence_penalty","display_name":"Presence Penalty","type":"number","description":"Encourages new topics (-2 to 2)","default":null},{"name":"seed","display_name":"Seed","type":"number","description":"Deterministic outputs","default":null},{"name":"logprobs","display_name":"Logprobs","type":"boolean","description":"Return log probabilities of the output tokens","default":null},{"name":"top_logprobs","display_name":"Top Logprobs","type":"number","description":"Number of most likely tokens to return at each position (0-20). Requires logprobs to be enabled.","default":null}];
29
+ const configInputs = [{"name":"messages","display_name":"Conversation","type":"conversation or message or string","description":"Array of chat messages that make up the conversation","required":true},{"name":"system_prompt","display_name":"System Message","type":"message or string","description":"System prompt to instruct the model","default":null},{"name":"tools","display_name":"Tools","type":"tool or array of tools","description":"Array of tools to use","default":null,"allow_multiple":true},{"name":"tool_choice","display_name":"Tool Choice","type":"string","description":"Tool selection control","default":null},{"name":"reasoning","display_name":"Reasoning","type":"boolean","description":"Enable reasoning mode","default":null},{"name":"response_format","display_name":"Response Format","type":"object","description":"Output format specification","default":null},{"name":"temperature","display_name":"Temperature","type":"number","description":"Controls randomness (0-2)","default":null},{"name":"top_p","display_name":"Top P","type":"number","description":"Controls diversity via nucleus sampling","default":null},{"name":"max_tokens","display_name":"Max Tokens","type":"number","description":"Maximum tokens to generate","default":null},{"name":"seed","display_name":"Seed","type":"number","description":"Deterministic outputs","default":null},{"name":"logprobs","display_name":"Logprobs","type":"boolean","description":"Return log probabilities of the output tokens","default":null},{"name":"top_logprobs","display_name":"Top Logprobs","type":"number","description":"Number of most likely tokens to return at each position (0-20). Requires logprobs to be enabled.","default":null}];
30
30
 
31
31
  for (const input of configInputs) {
32
32
 
@@ -134,6 +134,6 @@ export default async ({inputs, settings, config, nodeConfig}) => {
134
134
  };
135
135
  } catch (error) {
136
136
  console.log('error', error);
137
- throw new Error(`xAI: Grok Build 0.1 node error: ${error.message}`);
137
+ throw new Error(`SpaceXAI: Grok Build 0.1 node error: ${error.message}`);
138
138
  }
139
139
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerowidth/workbench-sdk",
3
- "version": "2.3.0",
3
+ "version": "2.5.0",
4
4
  "dependencies": {
5
5
  "adm-zip": "^0.5.16",
6
6
  "ajv": "^8.17.1",
@@ -16,11 +16,17 @@
16
16
  "url": "https://github.com/zerowidth-ai/workbench-sdk.git",
17
17
  "directory": "sdks/nodejs"
18
18
  },
19
- "description": "Workbench SDK \u2014 execute Workbench-authored flows in production. Successor to the zv1 package; see https://zerowidth.ai for the design surface.",
19
+ "homepage": "https://github.com/zerowidth-ai/workbench-sdk#readme",
20
+ "bugs": "https://github.com/zerowidth-ai/workbench-sdk/issues",
21
+ "description": "Workbench SDK — execute Workbench-authored flows in production. Successor to the zv1 package; see https://zerowidth.ai for the design surface.",
20
22
  "main": "./src/index.js",
23
+ "exports": {
24
+ ".": "./src/index.js"
25
+ },
21
26
  "files": [
22
27
  "src/",
23
28
  "nodes/",
29
+ "!nodes/**/*.tests.json",
24
30
  "types/",
25
31
  "LICENSE",
26
32
  "README.md"
@@ -35,11 +41,13 @@
35
41
  "dotenv": "^17.2.2"
36
42
  },
37
43
  "scripts": {
44
+ "test": "node tests/test.all-nodes.js",
38
45
  "test-nodes": "node tests/test.all-nodes.js",
39
46
  "test-flows": "node tests/test.flows.js",
40
47
  "test-flow": "node tests/test.flows.js",
41
48
  "test-kb": "node tests/test.kb-search.js && node tests/test.kb-graph.js",
42
- "test-custom-inference": "node tests/test.custom-inference.js"
49
+ "test-custom-inference": "node tests/test.custom-inference.js",
50
+ "test-memory": "node tests/test.agent-memory.js"
43
51
  },
44
52
  "author": "Peter Binggeser @ ZeroWidth, LLC",
45
53
  "license": "Apache-2.0",
package/src/index.js CHANGED
@@ -3259,3 +3259,13 @@ export default class Workbench {
3259
3259
  // pass an instance via `config.knowledgeBase.instance` (flow-global)
3260
3260
  // or `config.knowledgeBase.instances[kbUuid]` (per Knowledge Base node).
3261
3261
  export { KnowledgeBaseInterface } from './integrations/knowledge-base-interface.js';
3262
+
3263
+ // Agent memory: implement MemoryStoreInterface over your own store and
3264
+ // pass it as `config.memory.instance`, or pass `config.memory.path` for
3265
+ // a folder of markdown. See integrations/memory-store.js.
3266
+ export {
3267
+ MemoryStoreInterface,
3268
+ FolderMemoryStore,
3269
+ InMemoryMemoryStore,
3270
+ normalizeMemoryPath,
3271
+ } from './integrations/memory-store.js';
@@ -0,0 +1,294 @@
1
+ /**
2
+ * Agent memory: a small folder of markdown an agent reads and writes
3
+ * between conversations.
4
+ *
5
+ * MEMORY.md a short index, read into the prompt every turn
6
+ * memory/<topic>.md detail, read when the agent decides it needs it
7
+ * people/<id>.md optional: one person's private page in a shared
8
+ * memory, read in only when they're talking
9
+ *
10
+ * A memory store is four operations over those paths. The SDK ships a
11
+ * folder store and an in-memory store; a host keeping many agents'
12
+ * memories implements the same four over whatever it has (SQL rows,
13
+ * bucket objects, Redis) and passes it as `config.memory.instance`.
14
+ * Each store instance is one memory: the host decides whose (an
15
+ * agent's own, one end user's) before handing it to the engine.
16
+ *
17
+ * The memory nodes (Memory, memory_list/read/write/edit/delete) only
18
+ * ever talk to `config.integrations.memory`, which is the host's store
19
+ * wrapped in `ScopedMemory` so every store gets the same path rules
20
+ * and size limits.
21
+ */
22
+
23
+ import fs from "node:fs/promises";
24
+ import path from "node:path";
25
+
26
+ export const MEMORY_INDEX = "MEMORY.md";
27
+ export const MAX_FILE_BYTES = 100_000;
28
+ export const MAX_FILES = 200;
29
+
30
+ const SEGMENT = /^[a-z0-9][a-z0-9._-]*$/i;
31
+
32
+ /** The node types that read or write an agent's memory. */
33
+ export const MEMORY_NODE_TYPES = new Set([
34
+ "memory",
35
+ "memory-list",
36
+ "memory-read",
37
+ "memory-write",
38
+ "memory-edit",
39
+ "memory-delete",
40
+ ]);
41
+
42
+ export function flowUsesMemory(flow) {
43
+ return Array.isArray(flow?.nodes) && flow.nodes.some((n) => MEMORY_NODE_TYPES.has(n.type));
44
+ }
45
+
46
+ export class MemoryPathError extends Error {
47
+ constructor(message) {
48
+ super(message);
49
+ this.name = "MemoryPathError";
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Normalize and check a memory path. Accepts `MEMORY.md`,
55
+ * `memory/<name>.md` and `people/<id>.md`, adding `.md` when missing.
56
+ * Nothing nests deeper than one folder.
57
+ */
58
+ export function normalizeMemoryPath(raw) {
59
+ const trimmed = String(raw ?? "").trim().replace(/^\.?\/+/, "");
60
+ const withExt = /\.md$/i.test(trimmed) ? trimmed : `${trimmed}.md`;
61
+ const parts = withExt.split("/");
62
+ const ok =
63
+ (parts.length === 1 && parts[0] === MEMORY_INDEX) ||
64
+ (parts.length === 2 &&
65
+ (parts[0] === "memory" || parts[0] === "people") &&
66
+ SEGMENT.test(parts[1]) &&
67
+ !parts[1].includes(".."));
68
+ if (!ok) {
69
+ throw new MemoryPathError(
70
+ `"${raw}" isn't a memory file. Use MEMORY.md, memory/<topic>.md, or people/<id>.md.`,
71
+ );
72
+ }
73
+ return withExt;
74
+ }
75
+
76
+ /**
77
+ * The contract every memory store implements. Paths arrive already
78
+ * normalized. `origin` says which node made the change, for stores
79
+ * that keep a history.
80
+ *
81
+ * Optional members a host store may add:
82
+ * held true when changes wait for a person to approve them;
83
+ * write/delete then return { status: "held" }.
84
+ * pending() how many changes are waiting, for the prompt.
85
+ */
86
+ export class MemoryStoreInterface {
87
+ /** @returns {Promise<Array<{path: string, size: number, updated_at?: string}>>} */
88
+ async list() {
89
+ throw new Error("list() must be implemented by a memory store");
90
+ }
91
+
92
+ /** @returns {Promise<string|null>} the file's content, or null when it doesn't exist */
93
+ async read(_path) {
94
+ throw new Error("read() must be implemented by a memory store");
95
+ }
96
+
97
+ /** @returns {Promise<{status: "applied"|"held"}>} */
98
+ async write(_path, _content, _origin) {
99
+ throw new Error("write() must be implemented by a memory store");
100
+ }
101
+
102
+ /** @returns {Promise<{status: "applied"|"held"}>} */
103
+ async delete(_path, _origin) {
104
+ throw new Error("delete() must be implemented by a memory store");
105
+ }
106
+ }
107
+
108
+ /** Memory that lasts as long as the process. For tests and trials. */
109
+ export class InMemoryMemoryStore extends MemoryStoreInterface {
110
+ constructor(files = {}) {
111
+ super();
112
+ this.files = new Map(Object.entries(files));
113
+ }
114
+
115
+ async list() {
116
+ return [...this.files.entries()]
117
+ .sort(([a], [b]) => a.localeCompare(b))
118
+ .map(([p, content]) => ({ path: p, size: Buffer.byteLength(content, "utf8") }));
119
+ }
120
+
121
+ async read(p) {
122
+ return this.files.has(p) ? this.files.get(p) : null;
123
+ }
124
+
125
+ async write(p, content) {
126
+ this.files.set(p, content);
127
+ return { status: "applied" };
128
+ }
129
+
130
+ async delete(p) {
131
+ this.files.delete(p);
132
+ return { status: "applied" };
133
+ }
134
+ }
135
+
136
+ /** Memory as real files under a folder: `<root>/MEMORY.md`, … */
137
+ export class FolderMemoryStore extends MemoryStoreInterface {
138
+ constructor(root) {
139
+ super();
140
+ if (!root) throw new Error("FolderMemoryStore needs a folder path.");
141
+ this.root = path.resolve(root);
142
+ }
143
+
144
+ async list() {
145
+ const out = [];
146
+ const visit = async (rel) => {
147
+ let entries;
148
+ try {
149
+ entries = await fs.readdir(path.join(this.root, rel), { withFileTypes: true });
150
+ } catch (err) {
151
+ if (err.code === "ENOENT") return;
152
+ throw err;
153
+ }
154
+ for (const entry of entries) {
155
+ const p = rel ? `${rel}/${entry.name}` : entry.name;
156
+ if (entry.isDirectory() && !rel && (entry.name === "memory" || entry.name === "people")) {
157
+ await visit(p);
158
+ } else if (entry.isFile() && entry.name.endsWith(".md")) {
159
+ try {
160
+ normalizeMemoryPath(p);
161
+ } catch {
162
+ continue;
163
+ }
164
+ const stat = await fs.stat(path.join(this.root, p));
165
+ out.push({ path: p, size: stat.size, updated_at: stat.mtime.toISOString() });
166
+ }
167
+ }
168
+ };
169
+ await visit("");
170
+ return out.sort((a, b) => a.path.localeCompare(b.path));
171
+ }
172
+
173
+ async read(p) {
174
+ try {
175
+ return await fs.readFile(path.join(this.root, p), "utf8");
176
+ } catch (err) {
177
+ if (err.code === "ENOENT") return null;
178
+ throw err;
179
+ }
180
+ }
181
+
182
+ async write(p, content) {
183
+ const full = path.join(this.root, p);
184
+ await fs.mkdir(path.dirname(full), { recursive: true });
185
+ await fs.writeFile(full, content, "utf8");
186
+ return { status: "applied" };
187
+ }
188
+
189
+ async delete(p) {
190
+ await fs.rm(path.join(this.root, p), { force: true });
191
+ return { status: "applied" };
192
+ }
193
+ }
194
+
195
+ /**
196
+ * The store the memory nodes see: path rules and size limits in front
197
+ * of whatever store the host passed, so a custom store can't be handed
198
+ * `../../etc/passwd` and doesn't have to re-implement the limits.
199
+ *
200
+ * People pages (`people: true`, a shared memory with a page per person):
201
+ * the agent sees and changes only the page of whoever is talking
202
+ * (`person`), so one person's notes never reach another conversation.
203
+ * With nobody talking it sees no pages at all. Without `people`, the
204
+ * `people/` folder isn't part of the memory.
205
+ */
206
+ export class ScopedMemory {
207
+ constructor(store, { people = false, person = null } = {}) {
208
+ this.store = store;
209
+ this.people = people === true;
210
+ this.talking = this.people && person?.id ? { id: String(person.id), name: person.name || String(person.id) } : null;
211
+ // The id becomes a file name; an id that can't be one would leave
212
+ // the agent pointed at a page it isn't allowed to write.
213
+ if (this.talking && (!SEGMENT.test(`${this.talking.id}.md`) || this.talking.id.includes(".."))) {
214
+ throw new MemoryPathError(
215
+ `memory.person.id "${this.talking.id}" can't name a page: use letters, digits, ".", "_" and "-" (hash or slug an email first).`,
216
+ );
217
+ }
218
+ }
219
+
220
+ /** Whoever is talking, when this memory keeps a page per person. */
221
+ get person() {
222
+ return this.talking;
223
+ }
224
+
225
+ get held() {
226
+ return this.store.held === true;
227
+ }
228
+
229
+ /** The canonical form of a path the agent may use, or a MemoryPathError. */
230
+ normalize(raw) {
231
+ const p = normalizeMemoryPath(raw);
232
+ if (!p.startsWith("people/")) return p;
233
+ if (!this.people) {
234
+ throw new MemoryPathError(`"${raw}" isn't a memory file. Use MEMORY.md or memory/<topic>.md.`);
235
+ }
236
+ if (!this.talking || p !== `people/${this.talking.id}.md`) {
237
+ throw new MemoryPathError(
238
+ this.talking
239
+ ? `You can only use the page of the person you're talking to: people/${this.talking.id}.md.`
240
+ : "Nobody is named in this conversation, so there's no person's page to use.",
241
+ );
242
+ }
243
+ return p;
244
+ }
245
+
246
+ async pending() {
247
+ return typeof this.store.pending === "function" ? await this.store.pending() : 0;
248
+ }
249
+
250
+ async list() {
251
+ const own = this.talking ? `people/${this.talking.id}.md` : null;
252
+ return (await this.store.list()).filter((f) => !f.path.startsWith("people/") || f.path === own);
253
+ }
254
+
255
+ async read(raw) {
256
+ return this.store.read(this.normalize(raw));
257
+ }
258
+
259
+ async write(raw, content, origin = {}) {
260
+ const p = this.normalize(raw);
261
+ const text = String(content ?? "");
262
+ if (Buffer.byteLength(text, "utf8") > MAX_FILE_BYTES) {
263
+ throw new MemoryPathError(
264
+ `${p} would be over ${MAX_FILE_BYTES / 1000}KB. Keep memory files short; split detail into another topic file.`,
265
+ );
266
+ }
267
+ const existing = await this.store.list();
268
+ if (!existing.some((f) => f.path === p) && existing.length >= MAX_FILES) {
269
+ throw new MemoryPathError(
270
+ `Memory already holds ${MAX_FILES} files. Fold some together or delete ones that no longer matter.`,
271
+ );
272
+ }
273
+ return this.store.write(p, text, origin);
274
+ }
275
+
276
+ async delete(raw, origin = {}) {
277
+ return this.store.delete(this.normalize(raw), origin);
278
+ }
279
+ }
280
+
281
+ /**
282
+ * Pick the memory for a run from `config.memory`:
283
+ * { instance } a host store (wins)
284
+ * { path } a FolderMemoryStore at that folder
285
+ * neither an in-memory store, gone when the process exits
286
+ * plus `people: true` and `person: { id, name }` for a shared memory
287
+ * with a page per person.
288
+ */
289
+ export function createMemory(memoryConfig = {}) {
290
+ const options = { people: memoryConfig.people, person: memoryConfig.person };
291
+ if (memoryConfig.instance) return new ScopedMemory(memoryConfig.instance, options);
292
+ if (memoryConfig.path) return new ScopedMemory(new FolderMemoryStore(memoryConfig.path), options);
293
+ return new ScopedMemory(new InMemoryMemoryStore(), options);
294
+ }