zilmate 1.8.0 → 1.8.5

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 (315) hide show
  1. package/.agents/skills/copywriting/SKILL.md +252 -0
  2. package/.agents/skills/copywriting/evals/evals.json +111 -0
  3. package/.agents/skills/copywriting/references/copy-frameworks.md +344 -0
  4. package/.agents/skills/copywriting/references/natural-transitions.md +272 -0
  5. package/.agents/skills/firecrawl-deep-research/SKILL.md +108 -0
  6. package/.agents/skills/shadcn/SKILL.md +267 -0
  7. package/.agents/skills/shadcn/agents/openai.yml +5 -0
  8. package/.agents/skills/shadcn/assets/shadcn-small.png +0 -0
  9. package/.agents/skills/shadcn/assets/shadcn.png +0 -0
  10. package/.agents/skills/shadcn/cli.md +290 -0
  11. package/.agents/skills/shadcn/customization.md +209 -0
  12. package/.agents/skills/shadcn/evals/evals.json +47 -0
  13. package/.agents/skills/shadcn/mcp.md +105 -0
  14. package/.agents/skills/shadcn/registry.md +277 -0
  15. package/.agents/skills/shadcn/rules/base-vs-radix.md +306 -0
  16. package/.agents/skills/shadcn/rules/composition.md +195 -0
  17. package/.agents/skills/shadcn/rules/forms.md +192 -0
  18. package/.agents/skills/shadcn/rules/icons.md +101 -0
  19. package/.agents/skills/shadcn/rules/styling.md +162 -0
  20. package/.agents/skills/tavily-research/SKILL.md +100 -0
  21. package/.agents/skills/upstash/SKILL.md +48 -0
  22. package/.agents/skills/upstash/upstash-box-js/overview.md +243 -0
  23. package/.agents/skills/upstash/upstash-box-py/overview.md +275 -0
  24. package/.agents/skills/upstash/upstash-cli/overview.md +138 -0
  25. package/.agents/skills/upstash/upstash-qstash-js/advanced/callbacks.md +147 -0
  26. package/.agents/skills/upstash/upstash-qstash-js/advanced/deduplication.md +86 -0
  27. package/.agents/skills/upstash/upstash-qstash-js/advanced/dlq.md +164 -0
  28. package/.agents/skills/upstash/upstash-qstash-js/advanced/multi-region/summary.md +388 -0
  29. package/.agents/skills/upstash/upstash-qstash-js/advanced/multi-region/verify-multi-region-setup.ts +388 -0
  30. package/.agents/skills/upstash/upstash-qstash-js/fundamentals/local-development.md +106 -0
  31. package/.agents/skills/upstash/upstash-qstash-js/fundamentals/publishing-messages.md +144 -0
  32. package/.agents/skills/upstash/upstash-qstash-js/fundamentals/queues-and-flow-control.md +148 -0
  33. package/.agents/skills/upstash/upstash-qstash-js/fundamentals/schedules.md +177 -0
  34. package/.agents/skills/upstash/upstash-qstash-js/fundamentals/url-groups.md +127 -0
  35. package/.agents/skills/upstash/upstash-qstash-js/overview.md +81 -0
  36. package/.agents/skills/upstash/upstash-qstash-js/verification/platform-specific/nextjs.md +171 -0
  37. package/.agents/skills/upstash/upstash-qstash-js/verification/receiver.md +213 -0
  38. package/.agents/skills/upstash/upstash-ratelimit-js/algorithms.md +84 -0
  39. package/.agents/skills/upstash/upstash-ratelimit-js/features.md +117 -0
  40. package/.agents/skills/upstash/upstash-ratelimit-js/methods-getting-started.md +77 -0
  41. package/.agents/skills/upstash/upstash-ratelimit-js/overview.md +26 -0
  42. package/.agents/skills/upstash/upstash-ratelimit-js/pricing-cost.md +146 -0
  43. package/.agents/skills/upstash/upstash-ratelimit-js/traffic-protection.md +77 -0
  44. package/.agents/skills/upstash/upstash-redis-js/advanced-features/auto-pipeline.md +49 -0
  45. package/.agents/skills/upstash/upstash-redis-js/advanced-features/pipeline-and-transactions.md +42 -0
  46. package/.agents/skills/upstash/upstash-redis-js/advanced-features/scripting.md +124 -0
  47. package/.agents/skills/upstash/upstash-redis-js/data-structures/hashes.md +71 -0
  48. package/.agents/skills/upstash/upstash-redis-js/data-structures/json.md +133 -0
  49. package/.agents/skills/upstash/upstash-redis-js/data-structures/lists.md +72 -0
  50. package/.agents/skills/upstash/upstash-redis-js/data-structures/sets.md +90 -0
  51. package/.agents/skills/upstash/upstash-redis-js/data-structures/sorted-sets.md +126 -0
  52. package/.agents/skills/upstash/upstash-redis-js/data-structures/streams.md +196 -0
  53. package/.agents/skills/upstash/upstash-redis-js/data-structures/strings.md +73 -0
  54. package/.agents/skills/upstash/upstash-redis-js/migrations/from-ioredis.md +163 -0
  55. package/.agents/skills/upstash/upstash-redis-js/migrations/from-redis-node.md +205 -0
  56. package/.agents/skills/upstash/upstash-redis-js/overview.md +183 -0
  57. package/.agents/skills/upstash/upstash-redis-js/patterns/caching.md +58 -0
  58. package/.agents/skills/upstash/upstash-redis-js/patterns/distributed-locks.md +130 -0
  59. package/.agents/skills/upstash/upstash-redis-js/patterns/leaderboard.md +134 -0
  60. package/.agents/skills/upstash/upstash-redis-js/patterns/rate-limiting.md +187 -0
  61. package/.agents/skills/upstash/upstash-redis-js/patterns/session-management.md +217 -0
  62. package/.agents/skills/upstash/upstash-redis-js/performance/batching-operations.md +76 -0
  63. package/.agents/skills/upstash/upstash-redis-js/performance/data-serialization.md +134 -0
  64. package/.agents/skills/upstash/upstash-redis-js/performance/error-handling.md +118 -0
  65. package/.agents/skills/upstash/upstash-redis-js/performance/pipeline-optimization.md +105 -0
  66. package/.agents/skills/upstash/upstash-redis-js/performance/redis-replicas.md +14 -0
  67. package/.agents/skills/upstash/upstash-redis-js/performance/ttl-expiration.md +32 -0
  68. package/.agents/skills/upstash/upstash-redis-js/search/adapters.md +99 -0
  69. package/.agents/skills/upstash/upstash-redis-js/search/commands/aggregating.md +234 -0
  70. package/.agents/skills/upstash/upstash-redis-js/search/commands/aliases.md +76 -0
  71. package/.agents/skills/upstash/upstash-redis-js/search/commands/index-management.md +124 -0
  72. package/.agents/skills/upstash/upstash-redis-js/search/commands/querying.md +315 -0
  73. package/.agents/skills/upstash/upstash-redis-js/search/overview.md +155 -0
  74. package/.agents/skills/upstash/upstash-redis-start/overview.md +71 -0
  75. package/.agents/skills/upstash/upstash-search-js/overview.md +48 -0
  76. package/.agents/skills/upstash/upstash-search-js/quick-start.md +158 -0
  77. package/.agents/skills/upstash/upstash-search-js/sdk-overview.md +158 -0
  78. package/.agents/skills/upstash/upstash-vector-js/features/filtering-and-metadata.md +82 -0
  79. package/.agents/skills/upstash/upstash-vector-js/features/index-structure.md +193 -0
  80. package/.agents/skills/upstash/upstash-vector-js/features/namespaces.md +32 -0
  81. package/.agents/skills/upstash/upstash-vector-js/overview.md +44 -0
  82. package/.agents/skills/upstash/upstash-vector-js/sdk-methods.md +210 -0
  83. package/.agents/skills/upstash/upstash-workflow-js/agents.md +248 -0
  84. package/.agents/skills/upstash/upstash-workflow-js/basics/client.md +180 -0
  85. package/.agents/skills/upstash/upstash-workflow-js/basics/context.md +230 -0
  86. package/.agents/skills/upstash/upstash-workflow-js/basics/serve.md +70 -0
  87. package/.agents/skills/upstash/upstash-workflow-js/features/flow-control.md +145 -0
  88. package/.agents/skills/upstash/upstash-workflow-js/features/invoke.md +97 -0
  89. package/.agents/skills/upstash/upstash-workflow-js/features/retries-failures-reliability.md +239 -0
  90. package/.agents/skills/upstash/upstash-workflow-js/features/wait-for-event.md +97 -0
  91. package/.agents/skills/upstash/upstash-workflow-js/features/webhooks.md +79 -0
  92. package/.agents/skills/upstash/upstash-workflow-js/how-to/local-dev.md +177 -0
  93. package/.agents/skills/upstash/upstash-workflow-js/how-to/middleware.md +166 -0
  94. package/.agents/skills/upstash/upstash-workflow-js/how-to/migrations.md +201 -0
  95. package/.agents/skills/upstash/upstash-workflow-js/how-to/realtime.md +186 -0
  96. package/.agents/skills/upstash/upstash-workflow-js/overview.md +55 -0
  97. package/.agents/skills/upstash/upstash-workflow-js/rest-api.md +156 -0
  98. package/.agents/skills/upstash/upstash-workflow-js/troubleshooting.md +201 -0
  99. package/.agents/skills/upstash-box-js/SKILL.md +248 -0
  100. package/.agents/skills/upstash-box-py/SKILL.md +280 -0
  101. package/.agents/skills/upstash-cli/SKILL.md +143 -0
  102. package/.agents/skills/upstash-qstash-js/SKILL.md +86 -0
  103. package/.agents/skills/upstash-qstash-js/advanced/callbacks.md +147 -0
  104. package/.agents/skills/upstash-qstash-js/advanced/deduplication.md +86 -0
  105. package/.agents/skills/upstash-qstash-js/advanced/dlq.md +164 -0
  106. package/.agents/skills/upstash-qstash-js/advanced/multi-region/summary.md +388 -0
  107. package/.agents/skills/upstash-qstash-js/advanced/multi-region/verify-multi-region-setup.ts +388 -0
  108. package/.agents/skills/upstash-qstash-js/fundamentals/local-development.md +106 -0
  109. package/.agents/skills/upstash-qstash-js/fundamentals/publishing-messages.md +144 -0
  110. package/.agents/skills/upstash-qstash-js/fundamentals/queues-and-flow-control.md +148 -0
  111. package/.agents/skills/upstash-qstash-js/fundamentals/schedules.md +177 -0
  112. package/.agents/skills/upstash-qstash-js/fundamentals/url-groups.md +127 -0
  113. package/.agents/skills/upstash-qstash-js/verification/platform-specific/nextjs.md +171 -0
  114. package/.agents/skills/upstash-qstash-js/verification/receiver.md +213 -0
  115. package/.agents/skills/upstash-ratelimit-js/SKILL.md +31 -0
  116. package/.agents/skills/upstash-ratelimit-js/algorithms.md +84 -0
  117. package/.agents/skills/upstash-ratelimit-js/features.md +117 -0
  118. package/.agents/skills/upstash-ratelimit-js/methods-getting-started.md +77 -0
  119. package/.agents/skills/upstash-ratelimit-js/pricing-cost.md +146 -0
  120. package/.agents/skills/upstash-ratelimit-js/traffic-protection.md +77 -0
  121. package/.agents/skills/upstash-redis-js/SKILL.md +188 -0
  122. package/.agents/skills/upstash-redis-js/advanced-features/auto-pipeline.md +49 -0
  123. package/.agents/skills/upstash-redis-js/advanced-features/pipeline-and-transactions.md +42 -0
  124. package/.agents/skills/upstash-redis-js/advanced-features/scripting.md +124 -0
  125. package/.agents/skills/upstash-redis-js/data-structures/hashes.md +71 -0
  126. package/.agents/skills/upstash-redis-js/data-structures/json.md +133 -0
  127. package/.agents/skills/upstash-redis-js/data-structures/lists.md +72 -0
  128. package/.agents/skills/upstash-redis-js/data-structures/sets.md +90 -0
  129. package/.agents/skills/upstash-redis-js/data-structures/sorted-sets.md +126 -0
  130. package/.agents/skills/upstash-redis-js/data-structures/streams.md +196 -0
  131. package/.agents/skills/upstash-redis-js/data-structures/strings.md +73 -0
  132. package/.agents/skills/upstash-redis-js/migrations/from-ioredis.md +163 -0
  133. package/.agents/skills/upstash-redis-js/migrations/from-redis-node.md +205 -0
  134. package/.agents/skills/upstash-redis-js/patterns/caching.md +58 -0
  135. package/.agents/skills/upstash-redis-js/patterns/distributed-locks.md +130 -0
  136. package/.agents/skills/upstash-redis-js/patterns/leaderboard.md +134 -0
  137. package/.agents/skills/upstash-redis-js/patterns/rate-limiting.md +187 -0
  138. package/.agents/skills/upstash-redis-js/patterns/session-management.md +217 -0
  139. package/.agents/skills/upstash-redis-js/performance/batching-operations.md +76 -0
  140. package/.agents/skills/upstash-redis-js/performance/data-serialization.md +134 -0
  141. package/.agents/skills/upstash-redis-js/performance/error-handling.md +118 -0
  142. package/.agents/skills/upstash-redis-js/performance/pipeline-optimization.md +105 -0
  143. package/.agents/skills/upstash-redis-js/performance/redis-replicas.md +14 -0
  144. package/.agents/skills/upstash-redis-js/performance/ttl-expiration.md +32 -0
  145. package/.agents/skills/upstash-redis-js/search/adapters.md +99 -0
  146. package/.agents/skills/upstash-redis-js/search/commands/aggregating.md +234 -0
  147. package/.agents/skills/upstash-redis-js/search/commands/aliases.md +76 -0
  148. package/.agents/skills/upstash-redis-js/search/commands/index-management.md +124 -0
  149. package/.agents/skills/upstash-redis-js/search/commands/querying.md +315 -0
  150. package/.agents/skills/upstash-redis-js/search/overview.md +155 -0
  151. package/.agents/skills/upstash-redis-start/SKILL.md +76 -0
  152. package/.agents/skills/upstash-search-js/SKILL.md +53 -0
  153. package/.agents/skills/upstash-search-js/quick-start.md +158 -0
  154. package/.agents/skills/upstash-search-js/sdk-overview.md +158 -0
  155. package/.agents/skills/upstash-vector-js/SKILL.md +49 -0
  156. package/.agents/skills/upstash-vector-js/features/filtering-and-metadata.md +82 -0
  157. package/.agents/skills/upstash-vector-js/features/index-structure.md +193 -0
  158. package/.agents/skills/upstash-vector-js/features/namespaces.md +32 -0
  159. package/.agents/skills/upstash-vector-js/sdk-methods.md +210 -0
  160. package/.agents/skills/upstash-workflow-js/SKILL.md +60 -0
  161. package/.agents/skills/upstash-workflow-js/agents.md +248 -0
  162. package/.agents/skills/upstash-workflow-js/basics/client.md +180 -0
  163. package/.agents/skills/upstash-workflow-js/basics/context.md +230 -0
  164. package/.agents/skills/upstash-workflow-js/basics/serve.md +70 -0
  165. package/.agents/skills/upstash-workflow-js/features/flow-control.md +145 -0
  166. package/.agents/skills/upstash-workflow-js/features/invoke.md +97 -0
  167. package/.agents/skills/upstash-workflow-js/features/retries-failures-reliability.md +239 -0
  168. package/.agents/skills/upstash-workflow-js/features/wait-for-event.md +97 -0
  169. package/.agents/skills/upstash-workflow-js/features/webhooks.md +79 -0
  170. package/.agents/skills/upstash-workflow-js/how-to/local-dev.md +177 -0
  171. package/.agents/skills/upstash-workflow-js/how-to/middleware.md +166 -0
  172. package/.agents/skills/upstash-workflow-js/how-to/migrations.md +201 -0
  173. package/.agents/skills/upstash-workflow-js/how-to/realtime.md +186 -0
  174. package/.agents/skills/upstash-workflow-js/rest-api.md +156 -0
  175. package/.agents/skills/upstash-workflow-js/troubleshooting.md +201 -0
  176. package/dist/agents/coding.agent.d.ts +185 -42
  177. package/dist/agents/coding.agent.d.ts.map +1 -1
  178. package/dist/agents/coding.agent.js +42 -5
  179. package/dist/agents/coding.agent.js.map +1 -1
  180. package/dist/agents/manager.d.ts +216 -41
  181. package/dist/agents/manager.d.ts.map +1 -1
  182. package/dist/agents/manager.js +103 -140
  183. package/dist/agents/manager.js.map +1 -1
  184. package/dist/agents/security.agent.d.ts +3 -3
  185. package/dist/agents/swarm/development/lead.d.ts +3 -0
  186. package/dist/agents/swarm/development/lead.d.ts.map +1 -0
  187. package/dist/agents/swarm/development/lead.js +24 -0
  188. package/dist/agents/swarm/development/lead.js.map +1 -0
  189. package/dist/agents/swarm/main.d.ts +69 -0
  190. package/dist/agents/swarm/main.d.ts.map +1 -1
  191. package/dist/agents/swarm/main.js +65 -11
  192. package/dist/agents/swarm/main.js.map +1 -1
  193. package/dist/agents/swarm/registry.d.ts +2 -1
  194. package/dist/agents/swarm/registry.d.ts.map +1 -1
  195. package/dist/agents/swarm/registry.js +225 -95
  196. package/dist/agents/swarm/registry.js.map +1 -1
  197. package/dist/cli/composer.d.ts.map +1 -1
  198. package/dist/cli/composer.js +85 -30
  199. package/dist/cli/composer.js.map +1 -1
  200. package/dist/cli/confirm.d.ts +2 -2
  201. package/dist/cli/confirm.d.ts.map +1 -1
  202. package/dist/cli/confirm.js +373 -4
  203. package/dist/cli/confirm.js.map +1 -1
  204. package/dist/cli/doctor.d.ts +1 -0
  205. package/dist/cli/doctor.d.ts.map +1 -1
  206. package/dist/cli/doctor.js +47 -2
  207. package/dist/cli/doctor.js.map +1 -1
  208. package/dist/cli/format.d.ts +4 -0
  209. package/dist/cli/format.d.ts.map +1 -1
  210. package/dist/cli/format.js +352 -65
  211. package/dist/cli/format.js.map +1 -1
  212. package/dist/cli/interactive.d.ts.map +1 -1
  213. package/dist/cli/interactive.js +80 -2
  214. package/dist/cli/interactive.js.map +1 -1
  215. package/dist/cli/menu.d.ts.map +1 -1
  216. package/dist/cli/menu.js +93 -83
  217. package/dist/cli/menu.js.map +1 -1
  218. package/dist/cli/render.d.ts.map +1 -1
  219. package/dist/cli/render.js +2 -1
  220. package/dist/cli/render.js.map +1 -1
  221. package/dist/cli/setup.d.ts.map +1 -1
  222. package/dist/cli/setup.js +262 -27
  223. package/dist/cli/setup.js.map +1 -1
  224. package/dist/cli/swarm.d.ts.map +1 -1
  225. package/dist/cli/swarm.js +13 -10
  226. package/dist/cli/swarm.js.map +1 -1
  227. package/dist/cli/theme.d.ts +7 -1
  228. package/dist/cli/theme.d.ts.map +1 -1
  229. package/dist/cli/theme.js +4 -16
  230. package/dist/cli/theme.js.map +1 -1
  231. package/dist/cli/update.d.ts.map +1 -1
  232. package/dist/cli/update.js +27 -4
  233. package/dist/cli/update.js.map +1 -1
  234. package/dist/config/env.d.ts +3 -1
  235. package/dist/config/env.d.ts.map +1 -1
  236. package/dist/config/env.js +22 -2
  237. package/dist/config/env.js.map +1 -1
  238. package/dist/config/models.d.ts +1 -0
  239. package/dist/config/models.d.ts.map +1 -1
  240. package/dist/config/models.js +17 -1
  241. package/dist/config/models.js.map +1 -1
  242. package/dist/documents/pdf.d.ts.map +1 -1
  243. package/dist/documents/pdf.js +282 -22
  244. package/dist/documents/pdf.js.map +1 -1
  245. package/dist/documents/slides.d.ts.map +1 -1
  246. package/dist/documents/slides.js +160 -30
  247. package/dist/documents/slides.js.map +1 -1
  248. package/dist/index.js +73 -18
  249. package/dist/index.js.map +1 -1
  250. package/dist/memory/history.js +1 -1
  251. package/dist/observability/doctor.d.ts.map +1 -1
  252. package/dist/observability/doctor.js +3 -0
  253. package/dist/observability/doctor.js.map +1 -1
  254. package/dist/runtime/progress.d.ts +5 -1
  255. package/dist/runtime/progress.d.ts.map +1 -1
  256. package/dist/runtime/progress.js.map +1 -1
  257. package/dist/runtime/swarm.d.ts +1 -1
  258. package/dist/runtime/swarm.d.ts.map +1 -1
  259. package/dist/runtime/swarm.js +19 -3
  260. package/dist/runtime/swarm.js.map +1 -1
  261. package/dist/runtime/tool-utils.d.ts +2 -0
  262. package/dist/runtime/tool-utils.d.ts.map +1 -1
  263. package/dist/runtime/tool-utils.js +91 -0
  264. package/dist/runtime/tool-utils.js.map +1 -1
  265. package/dist/server.js +1 -1
  266. package/dist/server.js.map +1 -1
  267. package/dist/skills/loader.d.ts.map +1 -1
  268. package/dist/skills/loader.js +16 -0
  269. package/dist/skills/loader.js.map +1 -1
  270. package/dist/test-call.d.ts +2 -0
  271. package/dist/test-call.d.ts.map +1 -0
  272. package/dist/test-call.js +29 -0
  273. package/dist/test-call.js.map +1 -0
  274. package/dist/test-manager-call.d.ts +2 -0
  275. package/dist/test-manager-call.d.ts.map +1 -0
  276. package/dist/test-manager-call.js +138 -0
  277. package/dist/test-manager-call.js.map +1 -0
  278. package/dist/test-manager-filtered.d.ts +2 -0
  279. package/dist/test-manager-filtered.d.ts.map +1 -0
  280. package/dist/test-manager-filtered.js +130 -0
  281. package/dist/test-manager-filtered.js.map +1 -0
  282. package/dist/test-mcp-call.d.ts +2 -0
  283. package/dist/test-mcp-call.d.ts.map +1 -0
  284. package/dist/test-mcp-call.js +103 -0
  285. package/dist/test-mcp-call.js.map +1 -0
  286. package/dist/tools/composio.tool.d.ts +1 -1
  287. package/dist/tools/composio.tool.d.ts.map +1 -1
  288. package/dist/tools/composio.tool.js +7 -16
  289. package/dist/tools/composio.tool.js.map +1 -1
  290. package/dist/tools/daytona-browser.tool.js +1 -1
  291. package/dist/tools/daytona-browser.tool.js.map +1 -1
  292. package/dist/tools/executive.tool.d.ts +40 -0
  293. package/dist/tools/executive.tool.d.ts.map +1 -0
  294. package/dist/tools/executive.tool.js +74 -0
  295. package/dist/tools/executive.tool.js.map +1 -0
  296. package/dist/tools/filesystem.tool.d.ts +183 -40
  297. package/dist/tools/filesystem.tool.d.ts.map +1 -1
  298. package/dist/tools/filesystem.tool.js +564 -111
  299. package/dist/tools/filesystem.tool.js.map +1 -1
  300. package/dist/tools/mcp.tool.d.ts +56 -0
  301. package/dist/tools/mcp.tool.d.ts.map +1 -0
  302. package/dist/tools/mcp.tool.js +285 -0
  303. package/dist/tools/mcp.tool.js.map +1 -0
  304. package/dist/tools/osint.tool.d.ts +4 -4
  305. package/dist/tools/pentest.tool.d.ts +2 -2
  306. package/dist/tools/setup-assistant.tool.d.ts +1 -1
  307. package/dist/tools/setup-assistant.tool.js +1 -1
  308. package/dist/tools/setup-assistant.tool.js.map +1 -1
  309. package/dist/workspace/paths.d.ts +1 -0
  310. package/dist/workspace/paths.d.ts.map +1 -1
  311. package/dist/workspace/paths.js +3 -4
  312. package/dist/workspace/paths.js.map +1 -1
  313. package/package.json +8 -4
  314. package/scripts/postinstall.mjs +19 -4
  315. package/scripts/release-github.mjs +11 -11
@@ -0,0 +1,72 @@
1
+ # Lists
2
+
3
+ ## Overview
4
+
5
+ Lists are ordered collections of strings. They support operations at both ends (head and tail) with O(1) time complexity.
6
+
7
+ ## Good For
8
+
9
+ - Activity feeds (latest posts, news)
10
+ - Job queues
11
+ - Recent items (last 100 searches)
12
+ - Stack or queue implementations
13
+
14
+ ## Limitations
15
+
16
+ - Maximum length: 2^32 - 1 (4.2 billion) elements
17
+ - Accessing elements by index is O(N) for large lists
18
+ - No built-in deduplication (use sets for unique values)
19
+
20
+ ## Examples
21
+
22
+ ```typescript
23
+ import { Redis } from "@upstash/redis";
24
+
25
+ const redis = Redis.fromEnv();
26
+
27
+ // Push to left (head) of list
28
+ await redis.lpush("tasks", "task1");
29
+ await redis.lpush("tasks", "task2", "task3"); // ["task3", "task2", "task1"]
30
+
31
+ // Push to right (tail) of list
32
+ await redis.rpush("tasks", "task4"); // ["task3", "task2", "task1", "task4"]
33
+
34
+ // Get list length
35
+ const length = await redis.llen("tasks"); // 4
36
+
37
+ // Get range of elements (0-based index, inclusive)
38
+ const allTasks = await redis.lrange("tasks", 0, -1); // All elements
39
+ const firstTwo = await redis.lrange("tasks", 0, 1); // ["task3", "task2"]
40
+
41
+ // Get element by index
42
+ const first = await redis.lindex("tasks", 0); // "task3"
43
+ const last = await redis.lindex("tasks", -1); // "task4"
44
+
45
+ // Set element at index
46
+ await redis.lset("tasks", 0, "updated-task");
47
+
48
+ // Pop from left (head)
49
+ const leftItem = await redis.lpop("tasks"); // "updated-task"
50
+
51
+ // Pop from right (tail)
52
+ const rightItem = await redis.rpop("tasks"); // "task4"
53
+
54
+ // Pop multiple elements from left
55
+ await redis.lpush("numbers", 1, 2, 3, 4, 5);
56
+ const twoItems = await redis.lpop("numbers", 2); // [5, 4]
57
+
58
+ // Trim list to specified range (keep only indices 0 to 2)
59
+ await redis.ltrim("tasks", 0, 2);
60
+
61
+ // Remove elements by value
62
+ await redis.rpush("items", "a", "b", "c", "b", "d");
63
+ await redis.lrem("items", 2, "b"); // Remove first 2 occurrences of "b" from left
64
+ // Use negative count to remove from right, 0 to remove all
65
+
66
+ // Insert before or after a pivot element
67
+ await redis.linsert("items", "BEFORE", "c", "x"); // Insert "x" before "c"
68
+ await redis.linsert("items", "AFTER", "c", "y"); // Insert "y" after "c"
69
+
70
+ // Delete entire list
71
+ await redis.del("tasks");
72
+ ```
@@ -0,0 +1,90 @@
1
+ # Sets
2
+
3
+ ## Overview
4
+
5
+ Sets are unordered collections of unique strings. They provide fast membership testing and set operations (union, intersection, difference).
6
+
7
+ ## Good For
8
+
9
+ - Unique item tracking (unique visitors, tags)
10
+ - Deduplication
11
+ - Membership testing
12
+ - Set operations (finding common elements between sets)
13
+
14
+ ## Limitations
15
+
16
+ - Maximum members: 2^32 - 1 (4.2 billion) per set
17
+ - Unordered (no guaranteed iteration order)
18
+ - Members must be unique (duplicates are automatically ignored)
19
+
20
+ ## Examples
21
+
22
+ ```typescript
23
+ import { Redis } from "@upstash/redis";
24
+
25
+ const redis = Redis.fromEnv();
26
+
27
+ // Add members to set (duplicates are ignored)
28
+ await redis.sadd("tags", "javascript", "redis", "typescript");
29
+ await redis.sadd("tags", "javascript"); // Ignored, already exists
30
+
31
+ // Get all members
32
+ const allTags = await redis.smembers("tags"); // ["javascript", "redis", "typescript"]
33
+
34
+ // Check if member exists
35
+ const hasRedis = await redis.sismember("tags", "redis"); // 1 if exists, 0 if not
36
+
37
+ // Check multiple members at once
38
+ const exists = await redis.smismember("tags", ["redis", "python", "typescript"]);
39
+ // [1, 0, 1] - redis exists, python doesn't, typescript exists
40
+
41
+ // Get number of members
42
+ const count = await redis.scard("tags"); // 3
43
+
44
+ // Remove members
45
+ await redis.srem("tags", "typescript");
46
+ await redis.srem("tags", "javascript", "redis"); // Remove multiple
47
+
48
+ // Pop random member (removes and returns)
49
+ await redis.sadd("items", "a", "b", "c", "d");
50
+ const random = await redis.spop("items"); // Removes and returns random member
51
+ const twoRandom = await redis.spop("items", 2); // Remove and return 2 random members
52
+
53
+ // Get random member without removing
54
+ const randomItem = await redis.srandmember("items");
55
+ const threeRandom = await redis.srandmember("items", 3);
56
+
57
+ // Set operations with multiple sets
58
+ await redis.sadd("set1", "a", "b", "c");
59
+ await redis.sadd("set2", "b", "c", "d");
60
+ await redis.sadd("set3", "c", "d", "e");
61
+
62
+ // Intersection (common elements)
63
+ const common = await redis.sinter("set1", "set2"); // ["b", "c"]
64
+ const commonAll = await redis.sinter("set1", "set2", "set3"); // ["c"]
65
+
66
+ // Count the intersection without returning members
67
+ const commonCount = await redis.sintercard(["set1", "set2"]); // 2
68
+
69
+ // Store intersection result in new set
70
+ await redis.sinterstore("result", "set1", "set2");
71
+
72
+ // Union (all unique elements from all sets)
73
+ const union = await redis.sunion("set1", "set2"); // ["a", "b", "c", "d"]
74
+
75
+ // Store union result
76
+ await redis.sunionstore("result", "set1", "set2");
77
+
78
+ // Difference (elements in first set but not in others)
79
+ const diff = await redis.sdiff("set1", "set2"); // ["a"]
80
+ const diff2 = await redis.sdiff("set2", "set1"); // ["d"]
81
+
82
+ // Store difference result
83
+ await redis.sdiffstore("result", "set1", "set2");
84
+
85
+ // Move member from one set to another
86
+ await redis.smove("set1", "set2", "a"); // Move "a" from set1 to set2
87
+
88
+ // Delete entire set
89
+ await redis.del("tags");
90
+ ```
@@ -0,0 +1,126 @@
1
+ # Sorted Sets
2
+
3
+ ## Overview
4
+
5
+ Sorted sets store unique members with associated scores. Members are automatically ordered by score, enabling range queries and rankings.
6
+
7
+ ## Good For
8
+
9
+ - Leaderboards and rankings
10
+ - Priority queues
11
+ - Time-series data (using timestamp as score)
12
+ - Trending content (using engagement score)
13
+
14
+ ## Limitations
15
+
16
+ - Maximum members: 2^32 - 1 (4.2 billion) per sorted set
17
+ - Scores are 64-bit floating point numbers
18
+ - Members must be unique (updating a member replaces its score)
19
+
20
+ ## Examples
21
+
22
+ ```typescript
23
+ import { Redis } from "@upstash/redis";
24
+
25
+ const redis = Redis.fromEnv();
26
+
27
+ // Add members with scores
28
+ await redis.zadd("leaderboard", { score: 100, member: "player1" });
29
+ await redis.zadd(
30
+ "leaderboard",
31
+ { score: 250, member: "player2" },
32
+ { score: 150, member: "player3" }
33
+ );
34
+
35
+ // Update score (replaces if member exists)
36
+ await redis.zadd("leaderboard", { score: 300, member: "player1" });
37
+
38
+ // Increment score
39
+ await redis.zincrby("leaderboard", 50, "player3"); // player3 now has 200
40
+
41
+ // Get number of members
42
+ const count = await redis.zcard("leaderboard"); // 3
43
+
44
+ // Get score of a member
45
+ const score = await redis.zscore("leaderboard", "player1"); // 300
46
+
47
+ // Get rank (position) of member (0-based, lowest score = rank 0)
48
+ const rank = await redis.zrank("leaderboard", "player3"); // 0 (lowest score)
49
+
50
+ // Get reverse rank (highest score = rank 0)
51
+ const revRank = await redis.zrevrank("leaderboard", "player1"); // 0 (highest score)
52
+
53
+ // Get range by rank (ascending order)
54
+ const bottom2 = await redis.zrange("leaderboard", 0, 1);
55
+ // ["player3", "player2"] - without scores
56
+
57
+ // Get range with scores
58
+ const bottom2WithScores = await redis.zrange("leaderboard", 0, 1, { withScores: true });
59
+ // [{ member: "player3", score: 200 }, { member: "player2", score: 250 }]
60
+
61
+ // Get range in descending order (highest scores first)
62
+ const top2 = await redis.zrange("leaderboard", 0, 1, { rev: true });
63
+ // ["player1", "player2"]
64
+
65
+ const top2WithScores = await redis.zrange("leaderboard", 0, 1, { withScores: true, rev: true });
66
+ // [{ member: "player1", score: 300 }, { member: "player2", score: 250 }]
67
+
68
+ // Get all members
69
+ const all = await redis.zrange("leaderboard", 0, -1);
70
+
71
+ // Get range by score
72
+ const midRange = await redis.zrange("leaderboard", 150, 250, { byScore: true });
73
+ // ["player3", "player2"]
74
+
75
+ // Get range by score (descending)
76
+ const midRangeDesc = await redis.zrange("leaderboard", 250, 150, { rev: true, byScore: true });
77
+ // ["player2", "player3"]
78
+
79
+ // Count members in score range
80
+ const countInRange = await redis.zcount("leaderboard", 100, 250); // 2
81
+
82
+ // Remove members
83
+ await redis.zrem("leaderboard", "player2");
84
+ await redis.zrem("leaderboard", "player1", "player3"); // Remove multiple
85
+
86
+ // Remove by rank range
87
+ await redis.zadd(
88
+ "scores",
89
+ { score: 1, member: "a" },
90
+ { score: 2, member: "b" },
91
+ { score: 3, member: "c" }
92
+ );
93
+ await redis.zremrangebyrank("scores", 0, 0); // Remove lowest score (rank 0)
94
+
95
+ // Remove by score range
96
+ await redis.zremrangebyscore("scores", 2, 3); // Remove members with scores 2-3
97
+
98
+ // Pop members (remove and return)
99
+ await redis.zadd("items", { score: 1, member: "a" }, { score: 2, member: "b" });
100
+ const lowest = await redis.zpopmin("items"); // Remove and return lowest score
101
+ const highest = await redis.zpopmax("items"); // Remove and return highest score
102
+
103
+ // Pop multiple members
104
+ await redis.zadd(
105
+ "items",
106
+ { score: 1, member: "a" },
107
+ { score: 2, member: "b" },
108
+ { score: 3, member: "c" }
109
+ );
110
+ const twoLowest = await redis.zpopmin("items", 2); // Remove 2 lowest
111
+
112
+ // Practical example: Time-series data
113
+ const now = Date.now();
114
+ await redis.zadd(
115
+ "events",
116
+ { score: now - 3600000, member: "event1" }, // 1 hour ago
117
+ { score: now - 1800000, member: "event2" }, // 30 min ago
118
+ { score: now, member: "event3" } // now
119
+ );
120
+
121
+ // Get events from last hour
122
+ const lastHour = await redis.zrange("events", now - 3600000, now, { byScore: true });
123
+
124
+ // Delete entire sorted set
125
+ await redis.del("leaderboard");
126
+ ```
@@ -0,0 +1,196 @@
1
+ # Streams
2
+
3
+ ## Overview
4
+
5
+ Streams are append-only logs of entries with unique IDs. They support consumer groups for distributed processing and delivery guarantees.
6
+
7
+ ## Good For
8
+
9
+ - Event sourcing
10
+ - Activity logs
11
+ - Message queues with multiple consumers
12
+ - Real-time data feeds
13
+ - Chat systems
14
+
15
+ ## Limitations
16
+
17
+ - Entries cannot be modified after insertion
18
+ - Memory grows unbounded unless trimmed
19
+ - Maximum stream length: practical limits based on memory
20
+
21
+ ## Examples
22
+
23
+ ```typescript
24
+ import { Redis } from "@upstash/redis";
25
+
26
+ const redis = Redis.fromEnv();
27
+
28
+ // Add entry to stream (auto-generated ID)
29
+ const id1 = await redis.xadd("events", "*", {
30
+ type: "user.login",
31
+ userId: "123",
32
+ timestamp: Date.now(),
33
+ });
34
+ // Returns ID like "1642424242424-0"
35
+
36
+ // Add with specific ID (timestamp-sequence format)
37
+ const id2 = await redis.xadd("events", "1642424242424-1", {
38
+ type: "user.logout",
39
+ userId: "123",
40
+ });
41
+
42
+ // Add with trim (limit stream size)
43
+ await redis.xadd(
44
+ "events",
45
+ "*",
46
+ { event: "test" },
47
+ {
48
+ trim: {
49
+ type: "MAXLEN",
50
+ comparison: "=",
51
+ threshold: 1000,
52
+ },
53
+ }
54
+ );
55
+
56
+ // Add with approximate trim (more efficient)
57
+ await redis.xadd(
58
+ "events",
59
+ "*",
60
+ { event: "test" },
61
+ {
62
+ trim: {
63
+ type: "MAXLEN",
64
+ comparison: "~",
65
+ threshold: 1000,
66
+ },
67
+ }
68
+ );
69
+
70
+ // Get stream length
71
+ const length = await redis.xlen("events");
72
+
73
+ // Read entries from stream
74
+ const entries = await redis.xread("events", "0", { count: 10 });
75
+ // Returns: [{ name: "events", messages: [{ id: "...", message: {...} }] }]
76
+
77
+ // Read latest entries
78
+ const latest = await redis.xread("events", "$"); // $ means new entries only
79
+
80
+ // Read from multiple streams
81
+ const multi = await redis.xread(["stream1", "stream2"], ["0", "0"]);
82
+
83
+ // Note: Blocking (BLOCK option) is not yet supported in Upstash Redis
84
+
85
+ // Get range of entries by ID
86
+ const range = await redis.xrange("events", "-", "+"); // All entries
87
+ const specific = await redis.xrange("events", "1642424242424-0", "1642424242424-1");
88
+ const last10 = await redis.xrevrange("events", "+", "-", 10); // Last 10 in reverse
89
+
90
+ // Create consumer group
91
+ await redis.xgroup("events", {
92
+ type: "CREATE",
93
+ group: "processors",
94
+ id: "0",
95
+ options: { MKSTREAM: true },
96
+ });
97
+ // Creates group "processors" starting from beginning
98
+
99
+ // Read as consumer group member
100
+ const groupEntries = await redis.xreadgroup(
101
+ "processors", // group name
102
+ "consumer1", // consumer name
103
+ "events", // stream key
104
+ ">", // > means undelivered messages
105
+ { count: 5 }
106
+ );
107
+
108
+ // Acknowledge processed messages
109
+ if (groupEntries && groupEntries[0]) {
110
+ const messages = (groupEntries[0] as any)[1] as Array<{ 0: string; 1: any }>;
111
+ if (messages && messages.length > 0) {
112
+ const messageIds = messages.map((m) => m[0]);
113
+ await redis.xack("events", "processors", messageIds);
114
+ }
115
+ }
116
+
117
+ // Get pending messages (delivered but not acknowledged)
118
+ const pending = await redis.xpending("events", "processors", "-", "+", 10);
119
+ // Returns pending entry details
120
+
121
+ // Get detailed pending info for specific consumer
122
+ const pendingDetails = await redis.xpending(
123
+ "events", // stream key
124
+ "processors", // group
125
+ "-", // start
126
+ "_+", // end
127
+ 10, // count
128
+ { consumer: "consumer1" } // optional: specific consumer
129
+ );
130
+
131
+ // Claim pending messages (take over from another consumer)
132
+ const claimed = await redis.xclaim(
133
+ "events", // stream key
134
+ "processors", // group
135
+ "consumer2", // new owner (consumer)
136
+ 3600000, // min idle time (ms)
137
+ "1642424242424-0" // message ID(s) to claim
138
+ );
139
+
140
+ // Delete messages
141
+ await redis.xdel("events", [id1, id2]);
142
+
143
+ // Trim stream to maximum length
144
+ await redis.xtrim("events", { strategy: "MAXLEN", threshold: 1000, exactness: "=" });
145
+ await redis.xtrim("events", { strategy: "MAXLEN", threshold: 1000, exactness: "~" }); // Approximate (more efficient)
146
+
147
+ // Get consumer group info
148
+ const groups = await redis.xinfo("events", { type: "GROUPS" });
149
+ // Returns list of consumer groups
150
+
151
+ // Get consumers in group
152
+ const consumers = await redis.xinfo("events", { type: "CONSUMERS", group: "processors" });
153
+ // Returns list of consumers and their stats
154
+
155
+ // Delete consumer from group
156
+ await redis.xgroup("events", {
157
+ type: "DELCONSUMER",
158
+ group: "processors",
159
+ consumer: "consumer1",
160
+ });
161
+
162
+ // Delete consumer group
163
+ await redis.xgroup("events", { type: "DESTROY", group: "processors" });
164
+
165
+ // Practical example: Event log with processing
166
+ await redis.xadd("orders", "*", {
167
+ orderId: "order-123",
168
+ status: "pending",
169
+ amount: 99.99,
170
+ });
171
+
172
+ // Create processor group
173
+ await redis.xgroup("orders", {
174
+ type: "CREATE",
175
+ group: "order-processors",
176
+ id: "0",
177
+ options: { MKSTREAM: true },
178
+ });
179
+
180
+ // Worker reads and processes
181
+ const orders = await redis.xreadgroup("order-processors", "worker-1", "orders", ">", {
182
+ count: 1,
183
+ });
184
+
185
+ if (orders && orders[0]) {
186
+ const messages = (orders[0] as any)[1] as Array<{ 0: string; 1: any }>;
187
+ if (messages && messages.length > 0) {
188
+ const order = messages[0];
189
+ // Process order...
190
+ console.log("Processing:", order[1]);
191
+
192
+ // Acknowledge when done
193
+ await redis.xack("orders", "order-processors", order[0]);
194
+ }
195
+ }
196
+ ```
@@ -0,0 +1,73 @@
1
+ # Strings
2
+
3
+ ## Overview
4
+
5
+ Strings are the most basic Redis data structure. They store a single value and support atomic operations like increment/decrement.
6
+
7
+ ## Good For
8
+
9
+ - Caching simple values (strings, numbers, booleans, objects)
10
+ - Counters (page views, likes, inventory)
11
+ - Feature flags
12
+ - Session tokens
13
+
14
+ ## Limitations
15
+
16
+ - Maximum value size: 512 MB
17
+ - No built-in list or set operations on a single key
18
+ - Increment/decrement only work on values that can be parsed as integers
19
+
20
+ ## Examples
21
+
22
+ ```typescript
23
+ import { Redis } from "@upstash/redis";
24
+
25
+ const redis = Redis.fromEnv();
26
+
27
+ // Set and get strings
28
+ await redis.set("greeting", "Hello World");
29
+ const greeting = await redis.get("greeting"); // "Hello World"
30
+
31
+ // Set and get numbers (automatic serialization)
32
+ await redis.set("views", 100);
33
+ const views = await redis.get("views"); // 100 (as number, not string)
34
+
35
+ // Set and get objects (automatic JSON serialization)
36
+ await redis.set("user", { name: "Alice", age: 30 });
37
+ const user = await redis.get("user"); // { name: "Alice", age: 30 }
38
+
39
+ // Set with expiration (TTL in seconds)
40
+ await redis.setex("session", 3600, { userId: "123" });
41
+
42
+ // Set only if key doesn't exist
43
+ await redis.setnx("lock", "process-1"); // Returns 1 if set, 0 if already exists
44
+
45
+ // Increment and decrement counters
46
+ await redis.incr("views"); // 101
47
+ await redis.decr("views"); // 100
48
+ await redis.incrby("views", 10); // 110
49
+ await redis.decrby("views", 5); // 105
50
+
51
+ // Append to string
52
+ await redis.set("name", "Alice");
53
+ await redis.append("name", " Smith"); // "Alice Smith"
54
+
55
+ // Get and set atomically
56
+ const oldValue = await redis.getset("counter", 0);
57
+
58
+ // Multiple get/set (batch operations)
59
+ await redis.mset({ key1: "value1", key2: "value2", key3: 123 });
60
+ const values = await redis.mget("key1", "key2", "key3"); // ["value1", "value2", 123]
61
+
62
+ // Check if key exists
63
+ const exists = await redis.exists("greeting"); // 1 if exists, 0 if not
64
+
65
+ // Delete key
66
+ await redis.del("greeting");
67
+
68
+ // Get TTL (time to live in seconds)
69
+ await redis.ttl("session"); // seconds remaining, -1 if no expiry, -2 if doesn't exist
70
+
71
+ // Set expiration on existing key
72
+ await redis.expire("key1", 60); // expires in 60 seconds
73
+ ```