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,100 @@
1
+ ---
2
+ name: tavily-research
3
+ description: |
4
+ Conduct comprehensive AI-powered research with citations via the Tavily CLI. Use this skill when the user wants deep research, a detailed report, a comparison, market analysis, literature review, or says "research", "investigate", "analyze in depth", "compare X vs Y", "what does the market look like for", or needs multi-source synthesis with explicit citations. Returns a structured report grounded in web sources. Takes 30-120 seconds. For quick fact-finding, use tavily-search instead.
5
+ allowed-tools: Bash(tvly *)
6
+ ---
7
+
8
+ # tavily research
9
+
10
+ AI-powered deep research that gathers sources, analyzes them, and produces a cited report. Takes 30-120 seconds.
11
+
12
+ ## Before running any command
13
+
14
+ If `tvly` is not found on PATH, install it first:
15
+
16
+ ```bash
17
+ curl -fsSL https://cli.tavily.com/install.sh | bash && tvly login
18
+ ```
19
+
20
+ Do not skip this step or fall back to other tools.
21
+
22
+ See [tavily-cli](../tavily-cli/SKILL.md) for alternative install methods and auth options.
23
+
24
+ ## When to use
25
+
26
+ - You need comprehensive, multi-source analysis
27
+ - The user wants a comparison, market report, or literature review
28
+ - Quick searches aren't enough — you need synthesis with citations
29
+ - Step 5 in the [workflow](../tavily-cli/SKILL.md): search → extract → map → crawl → **research**
30
+
31
+ ## Quick start
32
+
33
+ ```bash
34
+ # Basic research (waits for completion)
35
+ tvly research "competitive landscape of AI code assistants"
36
+
37
+ # Pro model for comprehensive analysis
38
+ tvly research "electric vehicle market analysis" --model pro
39
+
40
+ # Stream results in real-time
41
+ tvly research "AI agent frameworks comparison" --stream
42
+
43
+ # Save report to file
44
+ tvly research "fintech trends 2025" --model pro -o fintech-report.md
45
+
46
+ # JSON output for agents
47
+ tvly research "quantum computing breakthroughs" --json
48
+ ```
49
+
50
+ ## Options
51
+
52
+ | Option | Description |
53
+ |--------|-------------|
54
+ | `--model` | `mini`, `pro`, or `auto` (default) |
55
+ | `--stream` | Stream results in real-time |
56
+ | `--no-wait` | Return request_id immediately (async) |
57
+ | `--output-schema` | Path to JSON schema for structured output |
58
+ | `--citation-format` | `numbered`, `mla`, `apa`, `chicago` |
59
+ | `--poll-interval` | Seconds between checks (default: 10) |
60
+ | `--timeout` | Max wait seconds (default: 600) |
61
+ | `-o, --output` | Save output to file |
62
+ | `--json` | Structured JSON output |
63
+
64
+ ## Model selection
65
+
66
+ | Model | Use for | Speed |
67
+ |-------|---------|-------|
68
+ | `mini` | Single-topic, targeted research | ~30s |
69
+ | `pro` | Comprehensive multi-angle analysis | ~60-120s |
70
+ | `auto` | API chooses based on complexity | Varies |
71
+
72
+ **Rule of thumb:** "What does X do?" → mini. "X vs Y vs Z" or "best way to..." → pro.
73
+
74
+ ## Async workflow
75
+
76
+ For long-running research, you can start and poll separately:
77
+
78
+ ```bash
79
+ # Start without waiting
80
+ tvly research "topic" --no-wait --json # returns request_id
81
+
82
+ # Check status
83
+ tvly research status <request_id> --json
84
+
85
+ # Wait for completion
86
+ tvly research poll <request_id> --json -o result.json
87
+ ```
88
+
89
+ ## Tips
90
+
91
+ - **Research takes 30-120 seconds** — use `--stream` to see progress in real-time.
92
+ - **Use `--model pro`** for complex comparisons or multi-faceted topics.
93
+ - **Use `--output-schema`** to get structured JSON output matching a custom schema.
94
+ - **For quick facts**, use `tvly search` instead — research is for deep synthesis.
95
+ - Read from stdin: `echo "query" | tvly research - --json`
96
+
97
+ ## See also
98
+
99
+ - [tavily-search](../tavily-search/SKILL.md) — quick web search for simple lookups
100
+ - [tavily-crawl](../tavily-crawl/SKILL.md) — bulk extract from a site for your own analysis
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: upstash
3
+ description: Work with any Upstash TypeScript/JavaScript SDK including Redis, Box, QStash, Workflow, Vector, Search and Ratelimit. Use when the user is working with any Upstash product or SDK.
4
+ ---
5
+
6
+ # Upstash Skills
7
+
8
+ This skill combines documentation for all Upstash SDKs. Pick the relevant sub-skill below.
9
+
10
+ ## [upstash-box-js](upstash-box-js/overview.md)
11
+
12
+ Work with the @upstash/box TypeScript/JavaScript SDK for sandboxed cloud containers with AI agents, shell, filesystem, and git. Use when building with Upstash Box, creating sandboxed environments, running AI agents in containers, or orchestrating parallel boxes.
13
+
14
+ ## [upstash-box-py](upstash-box-py/overview.md)
15
+
16
+ Work with the upstash-box Python SDK for sandboxed cloud containers with AI agents, shell, filesystem, and git. Use when building with Upstash Box in Python, creating sandboxed environments, running AI agents in containers, or orchestrating parallel boxes.
17
+
18
+ ## [upstash-cli](upstash-cli/overview.md)
19
+
20
+ Run the Upstash CLI (`upstash`) against the Upstash Developer API for Redis, Vector, Search, QStash, and teams. Use when listing or managing databases, backups, vector/search indexes, QStash instances, team members, stats, or any non-interactive Upstash automation with JSON output and terminal commands.
21
+
22
+ ## [upstash-qstash-js](upstash-qstash-js/overview.md)
23
+
24
+ Work with the QStash TypeScript/JavaScript SDK for serverless messaging, scheduling. Use when publishing messages to HTTP endpoints, creating schedules, managing queues, verifying incoming messages and other QStash features in serverless environments.
25
+
26
+ ## [upstash-ratelimit-js](upstash-ratelimit-js/overview.md)
27
+
28
+ Lightweight guidance for using the Upstash Redis RateLimit TypeScript/JavaScript SDK, including setup steps, basic usage, and pointers to advanced algorithm, features, pricing, and traffic‑protection docs.
29
+
30
+ ## [upstash-redis-js](upstash-redis-js/overview.md)
31
+
32
+ Work with the Upstash Redis TypeScript/JavaScript SDK for serverless Redis operations. Use for caching, session storage, rate limiting, leaderboards, full-text search (querying, filtering, aggregating) with Upstash Redis Search (different from regular FT.SEARCH), and all Redis data structures. Supports automatic serialization/deserialization of JavaScript types. Upstash Redis Search also available via @upstash/search-redis and @upstash/search-ioredis adapters for TCP clients.
33
+
34
+ ## [upstash-redis-start](upstash-redis-start/overview.md)
35
+
36
+ Provision a zero-config, no-signup Upstash Redis database for an AI agent via a single POST to `https://upstash.com/start-redis`. Use when an agent needs scratch Redis for short-term memory, conversation history, sub-agent work queues, or ranked recall and the user has not provided credentials. The database lives 3 days unless the user claims it.
37
+
38
+ ## [upstash-search-js](upstash-search-js/overview.md)
39
+
40
+ Skills covering Upstash Search quick starts, core concepts, and TypeScript/JavaScript SDK usage. Use when a user asks how to get started, how indexing works, or how to use the TS client.
41
+
42
+ ## [upstash-vector-js](upstash-vector-js/overview.md)
43
+
44
+ Skills for Upstash Vector features, TypeScript/JavaScript SDK usage, and integrations. Use when users ask how to work with Vector, its TS SDK, features, or supported frameworks.
45
+
46
+ ## [upstash-workflow-js](upstash-workflow-js/overview.md)
47
+
48
+ Skills for the Upstash Workflow TypeScript/JavaScript SDK to define, trigger, and manage workflows. Use this Skill whenever a user wants to create workflow endpoints, run steps, or interact with the Upstash Workflow client.
@@ -0,0 +1,243 @@
1
+ # @upstash/box SDK
2
+
3
+ Sandboxed cloud containers with built-in AI agents, shell, filesystem, and git.
4
+
5
+ ## Install & Setup
6
+
7
+ ```bash
8
+ npm install @upstash/box
9
+ ```
10
+
11
+ Set `UPSTASH_BOX_API_KEY` env var or pass `apiKey` to constructors.
12
+
13
+ ## Box Lifecycle
14
+
15
+ ```ts
16
+ import { Box, Agent, ClaudeCode, BoxApiKey } from "@upstash/box"
17
+
18
+ // Create with agent + git + env vars
19
+ const box = await Box.create({
20
+ runtime: "node", // "node" | "python" | "golang" | "ruby" | "rust"
21
+ agent: {
22
+ harness: Agent.ClaudeCode, // Agent.Codex | Agent.OpenCode
23
+ model: ClaudeCode.Sonnet_4_5,
24
+ // apiKey options:
25
+ // omit → server decides which key to use
26
+ // BoxApiKey.UpstashKey → use Upstash-provided LLM key
27
+ // BoxApiKey.StoredKey → use key previously stored via Upstash Console
28
+ // "sk-..." → direct API key string
29
+ apiKey: BoxApiKey.UpstashKey,
30
+ },
31
+ git: { // all fields optional
32
+ token: process.env.GITHUB_TOKEN, // alternatively link your GitHub account via Upstash Console
33
+ userName: "Bot",
34
+ userEmail: "bot@example.com",
35
+ },
36
+ env: { DATABASE_URL: "..." },
37
+ skills: ["upstash/qstash-js"], // GitHub repos as agent skills
38
+ })
39
+
40
+ // Reconnect, list, delete, pause/resume
41
+ const same = await Box.get(box.id)
42
+ const all = await Box.list()
43
+ await box.pause()
44
+ await box.resume()
45
+ await box.delete() // irreversible
46
+ const { status } = await box.getStatus()
47
+ ```
48
+
49
+ ## Agent Runs
50
+
51
+ ```ts
52
+ import { z } from "zod"
53
+
54
+ // Structured output with Zod schema
55
+ const run = await box.agent.run({
56
+ prompt: "Review the code for security issues",
57
+ responseSchema: z.object({
58
+ verdict: z.enum(["approved", "changes_requested"]),
59
+ findings: z.array(z.object({
60
+ severity: z.enum(["high", "medium", "low"]),
61
+ file: z.string(),
62
+ issue: z.string(),
63
+ })),
64
+ }),
65
+ timeout: 120_000,
66
+ maxRetries: 2,
67
+ onToolUse: (tool) => console.log(tool.name, tool.input),
68
+ })
69
+
70
+ run.status // "running" | "completed" | "failed" | "cancelled" | "detached"
71
+ run.result // typed from schema
72
+ run.cost // { inputTokens, outputTokens, computeMs, totalUsd }
73
+
74
+ // Streaming
75
+ const stream = await box.agent.stream({
76
+ prompt: "Build a REST API",
77
+ })
78
+ for await (const chunk of stream) { console.log(chunk) }
79
+
80
+ // Fire-and-forget with webhook
81
+ await box.agent.run({
82
+ prompt: "Run tests",
83
+ webhook: { url: "https://example.com/hook", headers: { Authorization: "Bearer ..." } },
84
+ })
85
+ ```
86
+
87
+ ## Run Fields
88
+
89
+ Every `run` (agent, command, or code) returns a `Run<T>`:
90
+
91
+ ```ts
92
+ const run = await box.exec.command("npm test")
93
+ run.id // run ID
94
+ run.status // "completed" | "failed" | ...
95
+ run.result // string output (or typed T with responseSchema)
96
+ run.exitCode // number | null (null for agent runs)
97
+ run.cost // { inputTokens, outputTokens, computeMs, totalUsd }
98
+
99
+ await run.cancel() // cancel a running run
100
+ const logs = await run.logs() // [{ timestamp, level, message }]
101
+ ```
102
+
103
+ ## Shell Execution
104
+
105
+ ```ts
106
+ // Run commands
107
+ const run = await box.exec.command("echo hello && ls -la")
108
+
109
+ // Run code snippets — lang: "js" | "ts" | "python"
110
+ const run2 = await box.exec.code({ code: "console.log(1+1)", lang: "js", timeout: 10_000 })
111
+
112
+ // Streaming shell
113
+ const stream = await box.exec.stream("npm run build")
114
+ for await (const chunk of stream) {
115
+ // chunk: { type: "output", data } | { type: "exit", exitCode, cpuNs }
116
+ }
117
+ ```
118
+
119
+ ## Filesystem
120
+
121
+ ```ts
122
+ await box.files.write({ path: "/workspace/home/app.js", content: "console.log('hi')" })
123
+ const content = await box.files.read("/workspace/home/app.js")
124
+ const entries = await box.files.list("/workspace/home") // [{ name, path, size, is_dir, mod_time }]
125
+
126
+ // Binary files — use encoding: "base64" for read and write
127
+ await box.files.write({ path: "/workspace/home/image.png", content: base64String, encoding: "base64" })
128
+ const b64 = await box.files.read("/workspace/home/image.png", { encoding: "base64" })
129
+
130
+ // Upload local files, download box files
131
+ await box.files.upload([{ path: "./local/file.txt", destination: "/workspace/home/file.txt" }])
132
+ await box.files.download({ folder: "./output" })
133
+ ```
134
+
135
+ ## cd / Working Directory
136
+
137
+ The SDK tracks `cwd` client-side. All operations (exec, files, git, agent) run relative to it.
138
+
139
+ ```ts
140
+ box.cwd // current working directory (starts at /workspace/home)
141
+ await box.cd("my-repo") // relative to current cwd
142
+ await box.cd("/workspace/home/other") // absolute path
143
+ ```
144
+
145
+ ## Git
146
+
147
+ ```ts
148
+ await box.git.clone({ repo: "github.com/org/repo", branch: "main" })
149
+ await box.cd("repo") // cd into cloned repo
150
+
151
+ const status = await box.git.status()
152
+ const diff = await box.git.diff()
153
+ const { sha } = await box.git.commit({ message: "fix: resolve bug" })
154
+ await box.git.push({ branch: "feature/fix" })
155
+
156
+ await box.git.checkout({ branch: "release/v2" })
157
+ const pr = await box.git.createPR({ title: "Fix bug", body: "...", base: "main" })
158
+ // pr: { url, number, title, base }
159
+
160
+ // Arbitrary git commands
161
+ const { output } = await box.git.exec({ args: ["log", "--oneline", "-5"] })
162
+ ```
163
+
164
+ ## Snapshots & Fork
165
+
166
+ ```ts
167
+ // Snapshot — checkpoint workspace state
168
+ const snap = await box.snapshot({ name: "after-setup" })
169
+ // snap: { id, name, box_id, size_bytes, status, created_at }
170
+
171
+ const restored = await Box.fromSnapshot(snap.id)
172
+ const snaps = await box.listSnapshots()
173
+ await box.deleteSnapshot(snap.id)
174
+
175
+ // Fork — clone live state into a new box
176
+ const forked = await box.fork()
177
+ ```
178
+
179
+ ## EphemeralBox
180
+
181
+ Lightweight, short-lived boxes (max 3 days). No agent, git, snapshot, or fork. Supports exec, files, cd, and snapshots only.
182
+
183
+ ```ts
184
+ import { EphemeralBox } from "@upstash/box"
185
+
186
+ const ebox = await EphemeralBox.create({
187
+ runtime: "python",
188
+ ttl: 3600, // seconds, max 259200 (3 days)
189
+ env: { API_KEY: "..." },
190
+ })
191
+
192
+ ebox.expiresAt // unix timestamp when auto-deleted
193
+ await ebox.exec.command("python -c 'print(1+1)'")
194
+ await ebox.exec.code({ code: "print('hi')", lang: "python" })
195
+ await ebox.files.write({ path: "/workspace/home/data.json", content: "{}" })
196
+ await ebox.cd("subdir")
197
+ await ebox.delete()
198
+
199
+ // Restore from snapshot
200
+ const ebox2 = await EphemeralBox.fromSnapshot(snap.id, { ttl: 7200 })
201
+ ```
202
+
203
+ ## Public URLs
204
+
205
+ Expose box ports as public URLs with optional auth.
206
+
207
+ ```ts
208
+ const publicURL = await box.getPublicURL(3000)
209
+ // publicURL: { url: "https://{id}-3000.preview.box.upstash.com", port }
210
+
211
+ const authed = await box.getPublicURL(3000, { bearerToken: true })
212
+ // authed: { url, port, token }
213
+
214
+ const basic = await box.getPublicURL(3000, { basicAuth: true })
215
+ // basic: { url, port, username, password }
216
+
217
+ const { publicURLs } = await box.listPublicURLs()
218
+ await box.deletePublicURL(3000)
219
+ ```
220
+
221
+ ## MCP Servers
222
+
223
+ Attach MCP servers to the box agent.
224
+
225
+ ```ts
226
+ const box = await Box.create({
227
+ agent: { harness: Agent.ClaudeCode, model: ClaudeCode.Sonnet_4_5 },
228
+ mcpServers: [
229
+ { name: "fs", package: "@modelcontextprotocol/server-filesystem" },
230
+ { name: "custom", url: "https://mcp.example.com/sse", headers: { Authorization: "..." } },
231
+ ],
232
+ })
233
+ ```
234
+
235
+ ## Gotchas
236
+
237
+ - Default working directory is `/workspace/home`, not `/home` or `/`
238
+ - `box.cd()` is client-side tracking — it validates the path exists but doesn't change the box's shell cwd. All SDK methods use it automatically.
239
+ - `EphemeralBox` does NOT support `agent`, `git`, `fork`, or public URLs — use full `Box` for those
240
+ - `run.exitCode` is `null` for agent runs, only available for exec commands
241
+ - `box.delete()` is irreversible — snapshot first if you need the state
242
+ - Git operations require `git.token` in `BoxConfig` for private repos and PRs
243
+ - `Box.fromSnapshot()` creates a new box — it does not modify the original
@@ -0,0 +1,275 @@
1
+ # upstash-box Python SDK
2
+
3
+ Sandboxed cloud containers with built-in AI agents, shell, filesystem, and git.
4
+
5
+ ## Install & Setup
6
+
7
+ ```bash
8
+ pip install upstash-box
9
+ ```
10
+
11
+ Set `UPSTASH_BOX_API_KEY` env var or pass `api_key` to constructors.
12
+
13
+ The SDK ships both a synchronous `Box` (used in the examples below) and an
14
+ asynchronous `AsyncBox` (`box = await AsyncBox.create(...)`, `await box.agent.run(...)`).
15
+ The async surface is identical with `await` and `async for`.
16
+
17
+ ## Box Lifecycle
18
+
19
+ ```python
20
+ import os
21
+ from upstash_box import Box, Agent, ClaudeCode, BoxApiKey
22
+
23
+ # Create with agent + git + env vars
24
+ box = Box.create(
25
+ runtime="node", # "node" | "python" | "golang" | "ruby" | "rust"
26
+ agent={
27
+ "harness": Agent.CLAUDE_CODE, # Agent.CODEX | Agent.OPEN_CODE
28
+ "model": ClaudeCode.SONNET_4_5, # or a plain string "anthropic/claude-sonnet-4-5"
29
+ # api_key options:
30
+ # omit → server decides which key to use
31
+ # BoxApiKey.UPSTASH_KEY → use Upstash-provided LLM key
32
+ # BoxApiKey.STORED_KEY → use key previously stored via Upstash Console
33
+ # "sk-..." → direct API key string
34
+ "api_key": BoxApiKey.UPSTASH_KEY,
35
+ },
36
+ git={ # all fields optional
37
+ "token": os.environ["GITHUB_TOKEN"], # or link your GitHub account via Upstash Console
38
+ "user_name": "Bot",
39
+ "user_email": "bot@example.com",
40
+ },
41
+ env={"DATABASE_URL": "..."},
42
+ skills=["upstash/qstash-js"], # GitHub repos as agent skills
43
+ )
44
+
45
+ # Reconnect, list, delete, pause/resume
46
+ same = Box.get(box.id)
47
+ all_boxes = Box.list()
48
+ box.pause()
49
+ box.resume()
50
+ box.delete() # irreversible
51
+ status = box.get_status()["status"]
52
+ ```
53
+
54
+ ## Agent Runs
55
+
56
+ ```python
57
+ from pydantic import BaseModel
58
+
59
+ # Structured output with a Pydantic model (or a raw JSON-schema dict)
60
+ class Finding(BaseModel):
61
+ severity: str # "high" | "medium" | "low"
62
+ file: str
63
+ issue: str
64
+
65
+ class Review(BaseModel):
66
+ verdict: str # "approved" | "changes_requested"
67
+ findings: list[Finding]
68
+
69
+ run = box.agent.run(
70
+ prompt="Review the code for security issues",
71
+ response_schema=Review,
72
+ timeout=120_000,
73
+ max_retries=2,
74
+ on_tool_use=lambda tool: print(tool["name"], tool["input"]),
75
+ )
76
+
77
+ run.status # "running" | "completed" | "failed" | "cancelled" | "detached"
78
+ run.result # typed from schema (a Review instance)
79
+ run.cost # RunCost(input_tokens, output_tokens, compute_ms, total_usd)
80
+
81
+ # Streaming
82
+ stream = box.agent.stream(prompt="Build a REST API")
83
+ for chunk in stream:
84
+ print(chunk)
85
+
86
+ # Fire-and-forget with webhook
87
+ box.agent.run(
88
+ prompt="Run tests",
89
+ webhook={"url": "https://example.com/hook", "headers": {"Authorization": "Bearer ..."}},
90
+ )
91
+ ```
92
+
93
+ ## Run Fields
94
+
95
+ Every `run` (agent, command, or code) returns a `Run`:
96
+
97
+ ```python
98
+ run = box.exec.command("npm test")
99
+ run.id # run ID
100
+ run.status # "completed" | "failed" | ...
101
+ run.result # string output (or typed result with response_schema)
102
+ run.exit_code # int | None (None for agent runs)
103
+ run.cost # RunCost(input_tokens, output_tokens, compute_ms, total_usd)
104
+
105
+ run.cancel() # cancel a running run
106
+ logs = run.logs() # [RunLog(timestamp, level, message)]
107
+ ```
108
+
109
+ ## Shell Execution
110
+
111
+ ```python
112
+ # Run commands
113
+ run = box.exec.command("echo hello && ls -la")
114
+
115
+ # Run code snippets — lang: "js" | "ts" | "python"
116
+ run2 = box.exec.code(code="print(1 + 1)", lang="python", timeout=10_000)
117
+
118
+ # Streaming shell
119
+ stream = box.exec.stream("npm run build")
120
+ for chunk in stream:
121
+ # chunk: ExecOutputChunk(type="output", data) | ExecExitChunk(type="exit", exit_code, cpu_ns)
122
+ ...
123
+ ```
124
+
125
+ ## Filesystem
126
+
127
+ ```python
128
+ box.files.write(path="/workspace/home/app.py", content="print('hi')")
129
+ content = box.files.read("/workspace/home/app.py")
130
+ entries = box.files.list("/workspace/home") # [FileEntry(name, path, size, is_dir, mod_time)]
131
+
132
+ # Binary files — use encoding="base64" for read and write
133
+ box.files.write(path="/workspace/home/image.png", content=base64_string, encoding="base64")
134
+ b64 = box.files.read("/workspace/home/image.png", encoding="base64")
135
+
136
+ # Upload local files, download box files
137
+ box.files.upload([{"path": "./local/file.txt", "destination": "/workspace/home/file.txt"}])
138
+ box.files.download(folder="./output")
139
+ ```
140
+
141
+ ## cd / Working Directory
142
+
143
+ The SDK tracks `cwd` client-side. All operations (exec, files, git, agent) run relative to it.
144
+
145
+ ```python
146
+ box.cwd # current working directory (starts at /workspace/home)
147
+ box.cd("my-repo") # relative to current cwd
148
+ box.cd("/workspace/home/other") # absolute path
149
+ ```
150
+
151
+ ## Git
152
+
153
+ ```python
154
+ box.git.clone(repo="github.com/org/repo", branch="main")
155
+ box.cd("repo") # cd into cloned repo
156
+
157
+ status = box.git.status()
158
+ diff = box.git.diff()
159
+ result = box.git.commit(message="fix: resolve bug") # GitCommitResult(sha, message)
160
+ box.git.push(branch="feature/fix")
161
+
162
+ box.git.checkout(branch="release/v2")
163
+ pr = box.git.create_pr(title="Fix bug", body="...", base="main")
164
+ # pr: PullRequest(url, number, title, base)
165
+
166
+ # Arbitrary git commands
167
+ output = box.git.exec(args=["log", "--oneline", "-5"])
168
+ ```
169
+
170
+ ## Snapshots
171
+
172
+ ```python
173
+ # Snapshot — checkpoint workspace state
174
+ snap = box.snapshot(name="after-setup")
175
+ # snap: Snapshot(id, name, box_id, size_bytes, status, created_at)
176
+
177
+ restored = Box.from_snapshot(snap.id)
178
+ snaps = box.list_snapshots()
179
+ box.delete_snapshot(snap.id)
180
+ ```
181
+
182
+ ## EphemeralBox
183
+
184
+ Lightweight, short-lived boxes (max 3 days). No agent or git. Supports exec, files,
185
+ schedule, cd, network policy, and snapshots only.
186
+
187
+ ```python
188
+ from upstash_box import EphemeralBox
189
+
190
+ ebox = EphemeralBox.create(
191
+ runtime="python",
192
+ ttl=3600, # seconds, max 259200 (3 days)
193
+ env={"API_KEY": "..."},
194
+ )
195
+
196
+ ebox.expires_at # unix timestamp when auto-deleted
197
+ ebox.exec.command("python -c 'print(1+1)'")
198
+ ebox.exec.code(code="print('hi')", lang="python")
199
+ ebox.files.write(path="/workspace/home/data.json", content="{}")
200
+ ebox.cd("subdir")
201
+ ebox.delete()
202
+
203
+ # Restore from snapshot
204
+ ebox2 = EphemeralBox.from_snapshot(snap.id, ttl=7200)
205
+ ```
206
+
207
+ ## Public URLs
208
+
209
+ Expose box ports as public URLs with optional auth.
210
+
211
+ ```python
212
+ public_url = box.get_public_url(3000)
213
+ # public_url: PublicURL(url="https://{id}-3000.preview.box.upstash.com", port)
214
+
215
+ authed = box.get_public_url(3000, bearer_token=True)
216
+ # authed: PublicURL(url, port, token)
217
+
218
+ basic = box.get_public_url(3000, basic_auth=True)
219
+ # basic: PublicURL(url, port, username, password)
220
+
221
+ result = box.list_public_urls() # {"public_urls": [PublicURL, ...]}
222
+ box.delete_public_url(3000)
223
+ ```
224
+
225
+ ## MCP Servers
226
+
227
+ Attach MCP servers to the box agent.
228
+
229
+ ```python
230
+ box = Box.create(
231
+ agent={"harness": Agent.CLAUDE_CODE, "model": ClaudeCode.SONNET_4_5},
232
+ mcp_servers=[
233
+ {"name": "fs", "package": "@modelcontextprotocol/server-filesystem"},
234
+ {"name": "custom", "url": "https://mcp.example.com/sse", "headers": {"Authorization": "..."}},
235
+ ],
236
+ )
237
+ ```
238
+
239
+ ## Async client
240
+
241
+ The async client mirrors the sync API exactly — `await` the calls and use `async for` to stream.
242
+
243
+ ```python
244
+ import asyncio
245
+ from upstash_box import AsyncBox, Agent
246
+
247
+ async def main():
248
+ box = await AsyncBox.create(runtime="node", agent={"harness": Agent.CLAUDE_CODE})
249
+ run = await box.agent.run(prompt="Set up a Next.js project")
250
+ print(run.result)
251
+
252
+ stream = await box.agent.stream(prompt="Build a REST API")
253
+ async for chunk in stream:
254
+ print(chunk)
255
+
256
+ await box.delete()
257
+
258
+ asyncio.run(main())
259
+ ```
260
+
261
+ `asyncio.gather` over many `AsyncBox.create(...)` / `box.agent.run(...)` calls runs boxes in parallel.
262
+
263
+ ## Gotchas
264
+
265
+ - Public API option keys are **snake_case** in Python: `api_key`, `user_name`, `network_policy`, `response_schema`, `max_retries`, `on_tool_use`, and agent `options` like `max_turns`, `max_budget_usd`.
266
+ - Agent config takes **`harness`** (not the deprecated `provider`/`runner`) — `harness` is required.
267
+ - `response_schema` accepts a Pydantic `BaseModel` subclass (returns a typed instance) or a raw JSON-schema `dict` (returns a `dict`).
268
+ - Default working directory is `/workspace/home`, not `/home` or `/`.
269
+ - `box.cd()` is client-side tracking — it validates the path exists but doesn't change the box's shell cwd. All SDK methods use it automatically.
270
+ - `EphemeralBox` does NOT support `agent` or `git` — use full `Box` for those.
271
+ - `run.exit_code` is `None` for agent runs, only available for exec commands.
272
+ - `box.delete()` is irreversible — snapshot first if you need the state.
273
+ - Git operations require `git.token` in the box config for private repos and PRs.
274
+ - `Box.from_snapshot()` creates a new box — it does not modify the original.
275
+ - Close the transport when done: `box.delete()` closes it, or use `with box:` / `box.close()` (`async with` / `await box.aclose()` for `AsyncBox`).