zilmate 1.8.1 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/copywriting/SKILL.md +252 -0
- package/.agents/skills/copywriting/evals/evals.json +111 -0
- package/.agents/skills/copywriting/references/copy-frameworks.md +344 -0
- package/.agents/skills/copywriting/references/natural-transitions.md +272 -0
- package/.agents/skills/firecrawl-deep-research/SKILL.md +108 -0
- package/.agents/skills/shadcn/SKILL.md +267 -0
- package/.agents/skills/shadcn/agents/openai.yml +5 -0
- package/.agents/skills/shadcn/assets/shadcn-small.png +0 -0
- package/.agents/skills/shadcn/assets/shadcn.png +0 -0
- package/.agents/skills/shadcn/cli.md +290 -0
- package/.agents/skills/shadcn/customization.md +209 -0
- package/.agents/skills/shadcn/evals/evals.json +47 -0
- package/.agents/skills/shadcn/mcp.md +105 -0
- package/.agents/skills/shadcn/registry.md +277 -0
- package/.agents/skills/shadcn/rules/base-vs-radix.md +306 -0
- package/.agents/skills/shadcn/rules/composition.md +195 -0
- package/.agents/skills/shadcn/rules/forms.md +192 -0
- package/.agents/skills/shadcn/rules/icons.md +101 -0
- package/.agents/skills/shadcn/rules/styling.md +162 -0
- package/.agents/skills/tavily-research/SKILL.md +100 -0
- package/.agents/skills/upstash/SKILL.md +48 -0
- package/.agents/skills/upstash/upstash-box-js/overview.md +243 -0
- package/.agents/skills/upstash/upstash-box-py/overview.md +275 -0
- package/.agents/skills/upstash/upstash-cli/overview.md +138 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/callbacks.md +147 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/deduplication.md +86 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/dlq.md +164 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/multi-region/summary.md +388 -0
- package/.agents/skills/upstash/upstash-qstash-js/advanced/multi-region/verify-multi-region-setup.ts +388 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/local-development.md +106 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/publishing-messages.md +144 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/queues-and-flow-control.md +148 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/schedules.md +177 -0
- package/.agents/skills/upstash/upstash-qstash-js/fundamentals/url-groups.md +127 -0
- package/.agents/skills/upstash/upstash-qstash-js/overview.md +81 -0
- package/.agents/skills/upstash/upstash-qstash-js/verification/platform-specific/nextjs.md +171 -0
- package/.agents/skills/upstash/upstash-qstash-js/verification/receiver.md +213 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/algorithms.md +84 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/features.md +117 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/methods-getting-started.md +77 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/overview.md +26 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/pricing-cost.md +146 -0
- package/.agents/skills/upstash/upstash-ratelimit-js/traffic-protection.md +77 -0
- package/.agents/skills/upstash/upstash-redis-js/advanced-features/auto-pipeline.md +49 -0
- package/.agents/skills/upstash/upstash-redis-js/advanced-features/pipeline-and-transactions.md +42 -0
- package/.agents/skills/upstash/upstash-redis-js/advanced-features/scripting.md +124 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/hashes.md +71 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/json.md +133 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/lists.md +72 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/sets.md +90 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/sorted-sets.md +126 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/streams.md +196 -0
- package/.agents/skills/upstash/upstash-redis-js/data-structures/strings.md +73 -0
- package/.agents/skills/upstash/upstash-redis-js/migrations/from-ioredis.md +163 -0
- package/.agents/skills/upstash/upstash-redis-js/migrations/from-redis-node.md +205 -0
- package/.agents/skills/upstash/upstash-redis-js/overview.md +183 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/caching.md +58 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/distributed-locks.md +130 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/leaderboard.md +134 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/rate-limiting.md +187 -0
- package/.agents/skills/upstash/upstash-redis-js/patterns/session-management.md +217 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/batching-operations.md +76 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/data-serialization.md +134 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/error-handling.md +118 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/pipeline-optimization.md +105 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/redis-replicas.md +14 -0
- package/.agents/skills/upstash/upstash-redis-js/performance/ttl-expiration.md +32 -0
- package/.agents/skills/upstash/upstash-redis-js/search/adapters.md +99 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/aggregating.md +234 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/aliases.md +76 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/index-management.md +124 -0
- package/.agents/skills/upstash/upstash-redis-js/search/commands/querying.md +315 -0
- package/.agents/skills/upstash/upstash-redis-js/search/overview.md +155 -0
- package/.agents/skills/upstash/upstash-redis-start/overview.md +71 -0
- package/.agents/skills/upstash/upstash-search-js/overview.md +48 -0
- package/.agents/skills/upstash/upstash-search-js/quick-start.md +158 -0
- package/.agents/skills/upstash/upstash-search-js/sdk-overview.md +158 -0
- package/.agents/skills/upstash/upstash-vector-js/features/filtering-and-metadata.md +82 -0
- package/.agents/skills/upstash/upstash-vector-js/features/index-structure.md +193 -0
- package/.agents/skills/upstash/upstash-vector-js/features/namespaces.md +32 -0
- package/.agents/skills/upstash/upstash-vector-js/overview.md +44 -0
- package/.agents/skills/upstash/upstash-vector-js/sdk-methods.md +210 -0
- package/.agents/skills/upstash/upstash-workflow-js/agents.md +248 -0
- package/.agents/skills/upstash/upstash-workflow-js/basics/client.md +180 -0
- package/.agents/skills/upstash/upstash-workflow-js/basics/context.md +230 -0
- package/.agents/skills/upstash/upstash-workflow-js/basics/serve.md +70 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/flow-control.md +145 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/invoke.md +97 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/retries-failures-reliability.md +239 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/wait-for-event.md +97 -0
- package/.agents/skills/upstash/upstash-workflow-js/features/webhooks.md +79 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/local-dev.md +177 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/middleware.md +166 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/migrations.md +201 -0
- package/.agents/skills/upstash/upstash-workflow-js/how-to/realtime.md +186 -0
- package/.agents/skills/upstash/upstash-workflow-js/overview.md +55 -0
- package/.agents/skills/upstash/upstash-workflow-js/rest-api.md +156 -0
- package/.agents/skills/upstash/upstash-workflow-js/troubleshooting.md +201 -0
- package/.agents/skills/upstash-box-js/SKILL.md +248 -0
- package/.agents/skills/upstash-box-py/SKILL.md +280 -0
- package/.agents/skills/upstash-cli/SKILL.md +143 -0
- package/.agents/skills/upstash-qstash-js/SKILL.md +86 -0
- package/.agents/skills/upstash-qstash-js/advanced/callbacks.md +147 -0
- package/.agents/skills/upstash-qstash-js/advanced/deduplication.md +86 -0
- package/.agents/skills/upstash-qstash-js/advanced/dlq.md +164 -0
- package/.agents/skills/upstash-qstash-js/advanced/multi-region/summary.md +388 -0
- package/.agents/skills/upstash-qstash-js/advanced/multi-region/verify-multi-region-setup.ts +388 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/local-development.md +106 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/publishing-messages.md +144 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/queues-and-flow-control.md +148 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/schedules.md +177 -0
- package/.agents/skills/upstash-qstash-js/fundamentals/url-groups.md +127 -0
- package/.agents/skills/upstash-qstash-js/verification/platform-specific/nextjs.md +171 -0
- package/.agents/skills/upstash-qstash-js/verification/receiver.md +213 -0
- package/.agents/skills/upstash-ratelimit-js/SKILL.md +31 -0
- package/.agents/skills/upstash-ratelimit-js/algorithms.md +84 -0
- package/.agents/skills/upstash-ratelimit-js/features.md +117 -0
- package/.agents/skills/upstash-ratelimit-js/methods-getting-started.md +77 -0
- package/.agents/skills/upstash-ratelimit-js/pricing-cost.md +146 -0
- package/.agents/skills/upstash-ratelimit-js/traffic-protection.md +77 -0
- package/.agents/skills/upstash-redis-js/SKILL.md +188 -0
- package/.agents/skills/upstash-redis-js/advanced-features/auto-pipeline.md +49 -0
- package/.agents/skills/upstash-redis-js/advanced-features/pipeline-and-transactions.md +42 -0
- package/.agents/skills/upstash-redis-js/advanced-features/scripting.md +124 -0
- package/.agents/skills/upstash-redis-js/data-structures/hashes.md +71 -0
- package/.agents/skills/upstash-redis-js/data-structures/json.md +133 -0
- package/.agents/skills/upstash-redis-js/data-structures/lists.md +72 -0
- package/.agents/skills/upstash-redis-js/data-structures/sets.md +90 -0
- package/.agents/skills/upstash-redis-js/data-structures/sorted-sets.md +126 -0
- package/.agents/skills/upstash-redis-js/data-structures/streams.md +196 -0
- package/.agents/skills/upstash-redis-js/data-structures/strings.md +73 -0
- package/.agents/skills/upstash-redis-js/migrations/from-ioredis.md +163 -0
- package/.agents/skills/upstash-redis-js/migrations/from-redis-node.md +205 -0
- package/.agents/skills/upstash-redis-js/patterns/caching.md +58 -0
- package/.agents/skills/upstash-redis-js/patterns/distributed-locks.md +130 -0
- package/.agents/skills/upstash-redis-js/patterns/leaderboard.md +134 -0
- package/.agents/skills/upstash-redis-js/patterns/rate-limiting.md +187 -0
- package/.agents/skills/upstash-redis-js/patterns/session-management.md +217 -0
- package/.agents/skills/upstash-redis-js/performance/batching-operations.md +76 -0
- package/.agents/skills/upstash-redis-js/performance/data-serialization.md +134 -0
- package/.agents/skills/upstash-redis-js/performance/error-handling.md +118 -0
- package/.agents/skills/upstash-redis-js/performance/pipeline-optimization.md +105 -0
- package/.agents/skills/upstash-redis-js/performance/redis-replicas.md +14 -0
- package/.agents/skills/upstash-redis-js/performance/ttl-expiration.md +32 -0
- package/.agents/skills/upstash-redis-js/search/adapters.md +99 -0
- package/.agents/skills/upstash-redis-js/search/commands/aggregating.md +234 -0
- package/.agents/skills/upstash-redis-js/search/commands/aliases.md +76 -0
- package/.agents/skills/upstash-redis-js/search/commands/index-management.md +124 -0
- package/.agents/skills/upstash-redis-js/search/commands/querying.md +315 -0
- package/.agents/skills/upstash-redis-js/search/overview.md +155 -0
- package/.agents/skills/upstash-redis-start/SKILL.md +76 -0
- package/.agents/skills/upstash-search-js/SKILL.md +53 -0
- package/.agents/skills/upstash-search-js/quick-start.md +158 -0
- package/.agents/skills/upstash-search-js/sdk-overview.md +158 -0
- package/.agents/skills/upstash-vector-js/SKILL.md +49 -0
- package/.agents/skills/upstash-vector-js/features/filtering-and-metadata.md +82 -0
- package/.agents/skills/upstash-vector-js/features/index-structure.md +193 -0
- package/.agents/skills/upstash-vector-js/features/namespaces.md +32 -0
- package/.agents/skills/upstash-vector-js/sdk-methods.md +210 -0
- package/.agents/skills/upstash-workflow-js/SKILL.md +60 -0
- package/.agents/skills/upstash-workflow-js/agents.md +248 -0
- package/.agents/skills/upstash-workflow-js/basics/client.md +180 -0
- package/.agents/skills/upstash-workflow-js/basics/context.md +230 -0
- package/.agents/skills/upstash-workflow-js/basics/serve.md +70 -0
- package/.agents/skills/upstash-workflow-js/features/flow-control.md +145 -0
- package/.agents/skills/upstash-workflow-js/features/invoke.md +97 -0
- package/.agents/skills/upstash-workflow-js/features/retries-failures-reliability.md +239 -0
- package/.agents/skills/upstash-workflow-js/features/wait-for-event.md +97 -0
- package/.agents/skills/upstash-workflow-js/features/webhooks.md +79 -0
- package/.agents/skills/upstash-workflow-js/how-to/local-dev.md +177 -0
- package/.agents/skills/upstash-workflow-js/how-to/middleware.md +166 -0
- package/.agents/skills/upstash-workflow-js/how-to/migrations.md +201 -0
- package/.agents/skills/upstash-workflow-js/how-to/realtime.md +186 -0
- package/.agents/skills/upstash-workflow-js/rest-api.md +156 -0
- package/.agents/skills/upstash-workflow-js/troubleshooting.md +201 -0
- package/dist/agents/coding.agent.d.ts +185 -42
- package/dist/agents/coding.agent.d.ts.map +1 -1
- package/dist/agents/coding.agent.js +42 -5
- package/dist/agents/coding.agent.js.map +1 -1
- package/dist/agents/manager.d.ts +216 -41
- package/dist/agents/manager.d.ts.map +1 -1
- package/dist/agents/manager.js +103 -140
- package/dist/agents/manager.js.map +1 -1
- package/dist/agents/security.agent.d.ts +3 -3
- package/dist/agents/swarm/development/lead.d.ts +3 -0
- package/dist/agents/swarm/development/lead.d.ts.map +1 -0
- package/dist/agents/swarm/development/lead.js +24 -0
- package/dist/agents/swarm/development/lead.js.map +1 -0
- package/dist/agents/swarm/main.d.ts +69 -0
- package/dist/agents/swarm/main.d.ts.map +1 -1
- package/dist/agents/swarm/main.js +65 -11
- package/dist/agents/swarm/main.js.map +1 -1
- package/dist/agents/swarm/registry.d.ts +2 -1
- package/dist/agents/swarm/registry.d.ts.map +1 -1
- package/dist/agents/swarm/registry.js +225 -95
- package/dist/agents/swarm/registry.js.map +1 -1
- package/dist/cli/composer.d.ts.map +1 -1
- package/dist/cli/composer.js +85 -30
- package/dist/cli/composer.js.map +1 -1
- package/dist/cli/confirm.d.ts +2 -2
- package/dist/cli/confirm.d.ts.map +1 -1
- package/dist/cli/confirm.js +373 -4
- package/dist/cli/confirm.js.map +1 -1
- package/dist/cli/doctor.d.ts +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +47 -2
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/format.d.ts +4 -0
- package/dist/cli/format.d.ts.map +1 -1
- package/dist/cli/format.js +352 -65
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +80 -2
- package/dist/cli/interactive.js.map +1 -1
- package/dist/cli/menu.d.ts.map +1 -1
- package/dist/cli/menu.js +93 -83
- package/dist/cli/menu.js.map +1 -1
- package/dist/cli/render.d.ts.map +1 -1
- package/dist/cli/render.js +2 -1
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +292 -28
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/swarm.d.ts.map +1 -1
- package/dist/cli/swarm.js +13 -10
- package/dist/cli/swarm.js.map +1 -1
- package/dist/cli/theme.d.ts +7 -1
- package/dist/cli/theme.d.ts.map +1 -1
- package/dist/cli/theme.js +4 -16
- package/dist/cli/theme.js.map +1 -1
- package/dist/cli/tunnel.d.ts +2 -0
- package/dist/cli/tunnel.d.ts.map +1 -1
- package/dist/cli/tunnel.js +63 -7
- package/dist/cli/tunnel.js.map +1 -1
- package/dist/cli/update.d.ts.map +1 -1
- package/dist/cli/update.js +12 -4
- package/dist/cli/update.js.map +1 -1
- package/dist/config/env.d.ts +3 -1
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +22 -2
- package/dist/config/env.js.map +1 -1
- package/dist/config/models.d.ts +1 -0
- package/dist/config/models.d.ts.map +1 -1
- package/dist/config/models.js +17 -1
- package/dist/config/models.js.map +1 -1
- package/dist/documents/pdf.d.ts.map +1 -1
- package/dist/documents/pdf.js +282 -22
- package/dist/documents/pdf.js.map +1 -1
- package/dist/documents/slides.d.ts.map +1 -1
- package/dist/documents/slides.js +160 -30
- package/dist/documents/slides.js.map +1 -1
- package/dist/index.js +73 -18
- package/dist/index.js.map +1 -1
- package/dist/memory/history.js +1 -1
- package/dist/observability/doctor.d.ts.map +1 -1
- package/dist/observability/doctor.js +3 -0
- package/dist/observability/doctor.js.map +1 -1
- package/dist/runtime/progress.d.ts +5 -1
- package/dist/runtime/progress.d.ts.map +1 -1
- package/dist/runtime/progress.js.map +1 -1
- package/dist/runtime/swarm.d.ts +1 -1
- package/dist/runtime/swarm.d.ts.map +1 -1
- package/dist/runtime/swarm.js +19 -3
- package/dist/runtime/swarm.js.map +1 -1
- package/dist/runtime/tool-utils.d.ts +2 -0
- package/dist/runtime/tool-utils.d.ts.map +1 -1
- package/dist/runtime/tool-utils.js +91 -0
- package/dist/runtime/tool-utils.js.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/skills/loader.d.ts.map +1 -1
- package/dist/skills/loader.js +16 -0
- package/dist/skills/loader.js.map +1 -1
- package/dist/test-call.d.ts +2 -0
- package/dist/test-call.d.ts.map +1 -0
- package/dist/test-call.js +29 -0
- package/dist/test-call.js.map +1 -0
- package/dist/test-manager-call.d.ts +2 -0
- package/dist/test-manager-call.d.ts.map +1 -0
- package/dist/test-manager-call.js +138 -0
- package/dist/test-manager-call.js.map +1 -0
- package/dist/test-manager-filtered.d.ts +2 -0
- package/dist/test-manager-filtered.d.ts.map +1 -0
- package/dist/test-manager-filtered.js +130 -0
- package/dist/test-manager-filtered.js.map +1 -0
- package/dist/test-mcp-call.d.ts +2 -0
- package/dist/test-mcp-call.d.ts.map +1 -0
- package/dist/test-mcp-call.js +103 -0
- package/dist/test-mcp-call.js.map +1 -0
- package/dist/tools/composio.tool.d.ts +1 -1
- package/dist/tools/composio.tool.d.ts.map +1 -1
- package/dist/tools/composio.tool.js +7 -16
- package/dist/tools/composio.tool.js.map +1 -1
- package/dist/tools/executive.tool.d.ts +40 -0
- package/dist/tools/executive.tool.d.ts.map +1 -0
- package/dist/tools/executive.tool.js +74 -0
- package/dist/tools/executive.tool.js.map +1 -0
- package/dist/tools/filesystem.tool.d.ts +183 -40
- package/dist/tools/filesystem.tool.d.ts.map +1 -1
- package/dist/tools/filesystem.tool.js +564 -111
- package/dist/tools/filesystem.tool.js.map +1 -1
- package/dist/tools/mcp.tool.d.ts +56 -0
- package/dist/tools/mcp.tool.d.ts.map +1 -0
- package/dist/tools/mcp.tool.js +285 -0
- package/dist/tools/mcp.tool.js.map +1 -0
- package/dist/tools/osint.tool.d.ts +4 -4
- package/dist/tools/pentest.tool.d.ts +2 -2
- package/dist/tools/setup-assistant.tool.d.ts +1 -1
- package/dist/tools/setup-assistant.tool.js +1 -1
- package/dist/tools/setup-assistant.tool.js.map +1 -1
- package/dist/workspace/paths.d.ts +1 -0
- package/dist/workspace/paths.d.ts.map +1 -1
- package/dist/workspace/paths.js +3 -4
- package/dist/workspace/paths.js.map +1 -1
- package/package.json +6 -3
- package/scripts/postinstall.mjs +19 -4
- package/scripts/release-github.mjs +13 -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`).
|