teardrop-cli 0.3.0__tar.gz → 0.3.3__tar.gz
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.
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/PKG-INFO +22 -8
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/README.md +20 -6
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/docs/cli-reference.md +39 -18
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/pyproject.toml +2 -2
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/auth.py +25 -13
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/marketplace.py +74 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/quickstart.py +136 -22
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/run.py +10 -6
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/tools.py +74 -20
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/formatting.py +3 -2
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/conftest.py +31 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/conftest.py +1 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_auth.py +23 -1
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_marketplace.py +49 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_quickstart.py +98 -25
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_token_expiry_fallback.py +24 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_tools.py +128 -0
- teardrop_cli-0.3.0/src/teardrop_cli/__init__.py +0 -1
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/.github/workflows/publish.yml +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/.github/workflows/test.yml +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/.gitignore +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/.vscode/settings.json +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/LICENSE +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/docs/cli-json-schema.md +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/_fixtures.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/_lazy.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/_templates.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/cli.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/__init__.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/agent_tools.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/balance.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/chat.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/config_cmd.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/earnings.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/event_triggers.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/llm_config.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/mcp.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/models.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/schedules.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/usage.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/config.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/pricing.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/README.md +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/__init__.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/conftest.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_auth_e2e.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_billing_e2e.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_marketplace_e2e.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_run_e2e.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_signup_e2e.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_siwe_login_e2e.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/__init__.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/test_config_persistence.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/test_keyring_integration.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/test_perf_lazygroup.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/test_siwe_signing.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_billing.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_chat.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_config_cmd.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_credential_priority.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_earnings.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_event_triggers.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_init_and_byok.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_llm_config.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_mcp.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_models.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_run.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_schedules.py +0 -0
- {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_signup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: teardrop-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: Command-line interface for the Teardrop AI agent platform
|
|
5
5
|
Project-URL: Homepage, https://github.com/teardrop-ai/teardrop-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/teardrop-ai/teardrop-cli
|
|
@@ -45,7 +45,7 @@ Requires-Dist: httpx>=0.27
|
|
|
45
45
|
Requires-Dist: keyring>=25.0
|
|
46
46
|
Requires-Dist: platformdirs>=4.0
|
|
47
47
|
Requires-Dist: rich>=13.0
|
|
48
|
-
Requires-Dist: teardrop-sdk>=0.2
|
|
48
|
+
Requires-Dist: teardrop-sdk>=0.3.2
|
|
49
49
|
Requires-Dist: tomli-w>=1.0
|
|
50
50
|
Requires-Dist: typer>=0.12
|
|
51
51
|
Provides-Extra: dev
|
|
@@ -86,21 +86,27 @@ Requires Python ≥ 3.11.
|
|
|
86
86
|
|
|
87
87
|
## 60-Second Quickstart
|
|
88
88
|
|
|
89
|
-
The wizard walks you through sign-in, BYOK LLM setup, and your first agent run or scaffolded tool:
|
|
89
|
+
The wizard walks you through sign-in, optional BYOK LLM setup, and your first agent run or scaffolded tool:
|
|
90
90
|
|
|
91
91
|
```bash
|
|
92
92
|
teardrop quickstart
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
+
Quickstart keeps local tool scaffolding and public marketplace browsing available
|
|
96
|
+
without sign-in. A saved session is verified when you choose an agent run; if it
|
|
97
|
+
is stale, the wizard offers sign-in again before asking for a prompt or payment
|
|
98
|
+
confirmation. Environment credentials must be updated or unset when they are
|
|
99
|
+
rejected because they take precedence over interactive login.
|
|
100
|
+
|
|
95
101
|
Prefer the manual path? Pick a sign-in method:
|
|
96
102
|
|
|
97
103
|
```bash
|
|
98
|
-
# Wallet-first (no email needed) — generates a wallet on first run if you don't have one
|
|
99
|
-
teardrop auth login --siwe --generate-wallet
|
|
100
|
-
|
|
101
104
|
# Email + password
|
|
102
105
|
teardrop auth signup --email you@example.com --org-name acme
|
|
103
106
|
|
|
107
|
+
# Wallet-first (no email needed) — generates a wallet on first run if you don't have one
|
|
108
|
+
teardrop auth login --siwe --generate-wallet
|
|
109
|
+
|
|
104
110
|
# Already have an account
|
|
105
111
|
teardrop auth login --email you@example.com
|
|
106
112
|
```
|
|
@@ -143,7 +149,7 @@ Scaffold a starter spec, edit it, and publish:
|
|
|
143
149
|
```bash
|
|
144
150
|
teardrop tools init my_scraper # writes ./tool.json
|
|
145
151
|
$EDITOR tool.json # set webhook_url, schema, price
|
|
146
|
-
teardrop tools probe
|
|
152
|
+
teardrop tools probe --from-file tool.json # test webhook health before publishing
|
|
147
153
|
teardrop tools publish --from-file tool.json \
|
|
148
154
|
--settlement-wallet 0xYourChecksumAddress
|
|
149
155
|
```
|
|
@@ -156,7 +162,7 @@ teardrop tools publish
|
|
|
156
162
|
|
|
157
163
|
Tool name rules: `^[a-z][a-z0-9_]*$`, ≤ 64 chars. Prices are in atomic USDC (6 decimals): `5000` = **$0.005** per call. Settlement wallet is required once before your first payout.
|
|
158
164
|
|
|
159
|
-
Test
|
|
165
|
+
Test a local webhook before publishing with `teardrop tools probe --from-file tool.json`; the spec's method and auth settings are used by default. After publishing, use `teardrop tools probe <tool-name>`. Pass `--auth-header-name` and `--auth-header-value` to override auth settings, or use `--method` and `--payload` to customize the probe request.
|
|
160
166
|
|
|
161
167
|
Manage existing tools: `teardrop tools list | info | update | pause | delete | probe`. Full reference: [docs/cli-reference.md](docs/cli-reference.md#tool-management).
|
|
162
168
|
|
|
@@ -295,6 +301,12 @@ teardrop llm-config set --provider google --model gemini-3-flash --routing speed
|
|
|
295
301
|
|
|
296
302
|
Pipe a key from stdin to keep it out of shell history: `--byok-key -`. See [docs/cli-reference.md](docs/cli-reference.md#llm-configuration) for advanced tuning, BYOK details, and benchmarks.
|
|
297
303
|
|
|
304
|
+
### LLM credit model
|
|
305
|
+
|
|
306
|
+
Non-BYOK organizations use Teardrop's shared provider keys. Platform credits or x402 cover the model token costs and Teardrop platform fee. BYOK organizations pay their model provider directly through their own encrypted key, but still need platform credits or x402 for the Teardrop orchestration fee. BYOK uses the configured model and does not use pooled smart routing.
|
|
307
|
+
|
|
308
|
+
New email-authenticated organizations may receive optional promotional credit after verifying their email when the program is enabled. Eligibility and availability are server-configured; SIWE users and marketplace author tools are excluded. A real top-up removes promotional restrictions.
|
|
309
|
+
|
|
298
310
|
---
|
|
299
311
|
|
|
300
312
|
## Browse the Marketplace
|
|
@@ -303,6 +315,8 @@ Pipe a key from stdin to keep it out of shell history: `--byok-key -`. See [docs
|
|
|
303
315
|
teardrop marketplace list
|
|
304
316
|
teardrop marketplace search "weather"
|
|
305
317
|
teardrop marketplace info acme/weather
|
|
318
|
+
teardrop marketplace reputation
|
|
319
|
+
teardrop marketplace reputation acme/weather --json
|
|
306
320
|
teardrop marketplace subscribe acme/weather
|
|
307
321
|
teardrop marketplace subscriptions
|
|
308
322
|
```
|
|
@@ -26,21 +26,27 @@ Requires Python ≥ 3.11.
|
|
|
26
26
|
|
|
27
27
|
## 60-Second Quickstart
|
|
28
28
|
|
|
29
|
-
The wizard walks you through sign-in, BYOK LLM setup, and your first agent run or scaffolded tool:
|
|
29
|
+
The wizard walks you through sign-in, optional BYOK LLM setup, and your first agent run or scaffolded tool:
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
32
|
teardrop quickstart
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
+
Quickstart keeps local tool scaffolding and public marketplace browsing available
|
|
36
|
+
without sign-in. A saved session is verified when you choose an agent run; if it
|
|
37
|
+
is stale, the wizard offers sign-in again before asking for a prompt or payment
|
|
38
|
+
confirmation. Environment credentials must be updated or unset when they are
|
|
39
|
+
rejected because they take precedence over interactive login.
|
|
40
|
+
|
|
35
41
|
Prefer the manual path? Pick a sign-in method:
|
|
36
42
|
|
|
37
43
|
```bash
|
|
38
|
-
# Wallet-first (no email needed) — generates a wallet on first run if you don't have one
|
|
39
|
-
teardrop auth login --siwe --generate-wallet
|
|
40
|
-
|
|
41
44
|
# Email + password
|
|
42
45
|
teardrop auth signup --email you@example.com --org-name acme
|
|
43
46
|
|
|
47
|
+
# Wallet-first (no email needed) — generates a wallet on first run if you don't have one
|
|
48
|
+
teardrop auth login --siwe --generate-wallet
|
|
49
|
+
|
|
44
50
|
# Already have an account
|
|
45
51
|
teardrop auth login --email you@example.com
|
|
46
52
|
```
|
|
@@ -83,7 +89,7 @@ Scaffold a starter spec, edit it, and publish:
|
|
|
83
89
|
```bash
|
|
84
90
|
teardrop tools init my_scraper # writes ./tool.json
|
|
85
91
|
$EDITOR tool.json # set webhook_url, schema, price
|
|
86
|
-
teardrop tools probe
|
|
92
|
+
teardrop tools probe --from-file tool.json # test webhook health before publishing
|
|
87
93
|
teardrop tools publish --from-file tool.json \
|
|
88
94
|
--settlement-wallet 0xYourChecksumAddress
|
|
89
95
|
```
|
|
@@ -96,7 +102,7 @@ teardrop tools publish
|
|
|
96
102
|
|
|
97
103
|
Tool name rules: `^[a-z][a-z0-9_]*$`, ≤ 64 chars. Prices are in atomic USDC (6 decimals): `5000` = **$0.005** per call. Settlement wallet is required once before your first payout.
|
|
98
104
|
|
|
99
|
-
Test
|
|
105
|
+
Test a local webhook before publishing with `teardrop tools probe --from-file tool.json`; the spec's method and auth settings are used by default. After publishing, use `teardrop tools probe <tool-name>`. Pass `--auth-header-name` and `--auth-header-value` to override auth settings, or use `--method` and `--payload` to customize the probe request.
|
|
100
106
|
|
|
101
107
|
Manage existing tools: `teardrop tools list | info | update | pause | delete | probe`. Full reference: [docs/cli-reference.md](docs/cli-reference.md#tool-management).
|
|
102
108
|
|
|
@@ -235,6 +241,12 @@ teardrop llm-config set --provider google --model gemini-3-flash --routing speed
|
|
|
235
241
|
|
|
236
242
|
Pipe a key from stdin to keep it out of shell history: `--byok-key -`. See [docs/cli-reference.md](docs/cli-reference.md#llm-configuration) for advanced tuning, BYOK details, and benchmarks.
|
|
237
243
|
|
|
244
|
+
### LLM credit model
|
|
245
|
+
|
|
246
|
+
Non-BYOK organizations use Teardrop's shared provider keys. Platform credits or x402 cover the model token costs and Teardrop platform fee. BYOK organizations pay their model provider directly through their own encrypted key, but still need platform credits or x402 for the Teardrop orchestration fee. BYOK uses the configured model and does not use pooled smart routing.
|
|
247
|
+
|
|
248
|
+
New email-authenticated organizations may receive optional promotional credit after verifying their email when the program is enabled. Eligibility and availability are server-configured; SIWE users and marketplace author tools are excluded. A real top-up removes promotional restrictions.
|
|
249
|
+
|
|
238
250
|
---
|
|
239
251
|
|
|
240
252
|
## Browse the Marketplace
|
|
@@ -243,6 +255,8 @@ Pipe a key from stdin to keep it out of shell history: `--byok-key -`. See [docs
|
|
|
243
255
|
teardrop marketplace list
|
|
244
256
|
teardrop marketplace search "weather"
|
|
245
257
|
teardrop marketplace info acme/weather
|
|
258
|
+
teardrop marketplace reputation
|
|
259
|
+
teardrop marketplace reputation acme/weather --json
|
|
246
260
|
teardrop marketplace subscribe acme/weather
|
|
247
261
|
teardrop marketplace subscriptions
|
|
248
262
|
```
|
|
@@ -39,7 +39,7 @@ teardrop auth login --client-id <id> --client-secret <secret>
|
|
|
39
39
|
teardrop auth login --token <jwt>
|
|
40
40
|
|
|
41
41
|
# Sign-In With Ethereum (EIP-4361) — pick one source for the key:
|
|
42
|
-
teardrop auth login --siwe #
|
|
42
|
+
teardrop auth login --siwe # hidden prompt when no other source is supplied
|
|
43
43
|
teardrop auth login --siwe --key-file ./wallet.key # read once, never persisted
|
|
44
44
|
teardrop auth login --siwe --generate-wallet # creates a fresh wallet
|
|
45
45
|
TEARDROP_SIWE_PRIVATE_KEY=0x... teardrop auth login --siwe # CI / non-interactive
|
|
@@ -72,8 +72,9 @@ teardrop auth logout # revoke refresh token + clear stored credent
|
|
|
72
72
|
| 1 | `TEARDROP_API_KEY` env var (static JWT) |
|
|
73
73
|
| 2 | `TEARDROP_EMAIL` + `TEARDROP_SECRET` env vars |
|
|
74
74
|
| 3 | `TEARDROP_CLIENT_ID` + `TEARDROP_CLIENT_SECRET` env vars |
|
|
75
|
-
| 4 |
|
|
76
|
-
| 5 |
|
|
75
|
+
| 4 | System keyring (email + secret, or client credentials) |
|
|
76
|
+
| 5 | `access_token` in `~/.teardrop/config.toml` |
|
|
77
|
+
| 6 | Legacy `auth.token` in `~/.teardrop/config.toml` |
|
|
77
78
|
|
|
78
79
|
---
|
|
79
80
|
|
|
@@ -123,17 +124,18 @@ will start a fresh thread.
|
|
|
123
124
|
|
|
124
125
|
## Schedules
|
|
125
126
|
|
|
126
|
-
Recurring interval-based runs:
|
|
127
|
+
Recurring interval-based runs. Most commands accept `--json` to return raw structured payloads for pipeline automation:
|
|
127
128
|
|
|
128
129
|
```bash
|
|
129
130
|
teardrop schedules create \
|
|
130
131
|
--name hourly-briefing \
|
|
131
132
|
--prompt "Summarize open incidents" \
|
|
132
|
-
--interval-seconds 3600
|
|
133
|
+
--interval-seconds 3600 \
|
|
134
|
+
--json
|
|
133
135
|
|
|
134
|
-
teardrop schedules list
|
|
135
|
-
teardrop schedules get <schedule-id>
|
|
136
|
-
teardrop schedules update <schedule-id> --enabled false
|
|
136
|
+
teardrop schedules list --json
|
|
137
|
+
teardrop schedules get <schedule-id> --json
|
|
138
|
+
teardrop schedules update <schedule-id> --enabled false --json
|
|
137
139
|
teardrop schedules update <schedule-id> --clear-callback-url
|
|
138
140
|
teardrop schedules runs <schedule-id> --limit 50 --json
|
|
139
141
|
teardrop schedules delete <schedule-id>
|
|
@@ -150,24 +152,25 @@ Run history output includes: `Run ID`, `Status`, `Cost (USDC)`, `Error Message`,
|
|
|
150
152
|
|
|
151
153
|
## Event Triggers
|
|
152
154
|
|
|
153
|
-
Reactive runs exposed as signed public webhook endpoints:
|
|
155
|
+
Reactive runs exposed as signed public webhook endpoints. Commands support a `--json` option to output formatted shapes (with creation and rotation payloads securely exposing the one-time dispatch secret):
|
|
154
156
|
|
|
155
157
|
```bash
|
|
156
158
|
teardrop event-triggers create \
|
|
157
159
|
--name inbound-orders \
|
|
158
|
-
--prompt "Validate and process this order payload"
|
|
160
|
+
--prompt "Validate and process this order payload" \
|
|
161
|
+
--json
|
|
159
162
|
|
|
160
|
-
teardrop event-triggers list
|
|
161
|
-
teardrop event-triggers get <trigger-id>
|
|
162
|
-
teardrop event-triggers update <trigger-id> --enabled false
|
|
163
|
+
teardrop event-triggers list --json
|
|
164
|
+
teardrop event-triggers get <trigger-id> --json
|
|
165
|
+
teardrop event-triggers update <trigger-id> --enabled false --json
|
|
163
166
|
teardrop event-triggers update <trigger-id> --callback-url https://example.com/hook
|
|
164
167
|
teardrop event-triggers runs <trigger-id> --limit 50 --json
|
|
165
|
-
teardrop event-triggers rotate-secret <trigger-id>
|
|
168
|
+
teardrop event-triggers rotate-secret <trigger-id> --json
|
|
166
169
|
teardrop event-triggers delete <trigger-id>
|
|
167
170
|
teardrop event-triggers delete <trigger-id> --yes
|
|
168
171
|
```
|
|
169
172
|
|
|
170
|
-
`create` and `rotate-secret` display the signing secret once. Store it immediately; subsequent `list`
|
|
173
|
+
`create` and `rotate-secret` display the signing secret once (both inside non-JSON stderr summaries and their corresponding use-once JSON attributes). Store it immediately; subsequent `list`, `get`, or `update` calls permanently exclude the plaintext secret.
|
|
171
174
|
|
|
172
175
|
Non-JSON list output includes: `ID`, `Name`, `Enabled`, `Kind`, `Consecutive Failures`, `Last Run At`.
|
|
173
176
|
|
|
@@ -189,10 +192,16 @@ teardrop usage --json
|
|
|
189
192
|
|
|
190
193
|
The CLI does not support direct top-ups. To add credits or manage your billing methods, please visit the dashboard:
|
|
191
194
|
|
|
192
|
-
[https://teardrop.dev
|
|
195
|
+
[https://teardrop.dev](https://teardrop.dev)
|
|
193
196
|
|
|
194
197
|
If you run out of credits during an agent run, the agent will pause and provide this link.
|
|
195
198
|
|
|
199
|
+
### LLM credit model
|
|
200
|
+
|
|
201
|
+
Non-BYOK organizations use Teardrop's shared provider keys and need credits or x402 for model token costs plus the platform fee. BYOK organizations pay their provider directly through their encrypted key, but still need credits or x402 for the Teardrop orchestration fee. BYOK uses the configured model; pooled smart routing is disabled.
|
|
202
|
+
|
|
203
|
+
Optional promotional credit may be granted after successful email verification when the server-side program is enabled. It is not available to SIWE users or marketplace author tools, and a real top-up removes promotional restrictions. The CLI does not assume eligibility or a fixed promotional amount.
|
|
204
|
+
|
|
196
205
|
---
|
|
197
206
|
|
|
198
207
|
## Tool Management
|
|
@@ -264,7 +273,13 @@ teardrop tools delete get_weather --yes # skip confirmation
|
|
|
264
273
|
|
|
265
274
|
### Test webhook health
|
|
266
275
|
|
|
267
|
-
Before publishing
|
|
276
|
+
Before publishing, test a local spec without authentication or an API lookup:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
teardrop tools probe --from-file tool.json
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
After publishing or updating a webhook URL, test the registered tool:
|
|
268
283
|
|
|
269
284
|
```bash
|
|
270
285
|
teardrop tools probe get_weather # test default POST request
|
|
@@ -287,6 +302,8 @@ teardrop tools probe get_weather --method GET
|
|
|
287
302
|
teardrop tools probe get_weather --payload '{"test": "data"}'
|
|
288
303
|
```
|
|
289
304
|
|
|
305
|
+
For `--from-file`, the spec's `webhook_method`, `auth_header_name`, and `auth_header_value` are used by default. Explicit probe flags override them.
|
|
306
|
+
|
|
290
307
|
Exit code: 0 on success (2xx–3xx), 1 on timeout/5xx/connection error. Warning (exit 0) on 4xx responses (e.g., auth failures).
|
|
291
308
|
|
|
292
309
|
---
|
|
@@ -298,6 +315,8 @@ teardrop marketplace list
|
|
|
298
315
|
teardrop marketplace list --category data --json
|
|
299
316
|
teardrop marketplace search "weather"
|
|
300
317
|
teardrop marketplace info acme/weather
|
|
318
|
+
teardrop marketplace reputation
|
|
319
|
+
teardrop marketplace reputation acme/weather --json
|
|
301
320
|
teardrop marketplace subscribe acme/weather
|
|
302
321
|
teardrop marketplace subscribe acme/weather --yes # skip confirmation
|
|
303
322
|
teardrop marketplace subscriptions
|
|
@@ -352,7 +371,7 @@ teardrop llm-config set \
|
|
|
352
371
|
--timeout-seconds 60
|
|
353
372
|
```
|
|
354
373
|
|
|
355
|
-
**Providers:** `openrouter`, `google`, `anthropic`
|
|
374
|
+
**Providers:** `openrouter`, `google`, `anthropic`, `openai`
|
|
356
375
|
**Routing:** `default` · `cost` · `speed` · `quality`
|
|
357
376
|
**Validation:** temperature 0.0–2.0 · max tokens 1–200,000 · timeout ≥ 1 s
|
|
358
377
|
|
|
@@ -373,6 +392,8 @@ Get-Content "$key_file" | teardrop llm-config set `
|
|
|
373
392
|
teardrop llm-config set --provider anthropic --model claude-sonnet-4-6 --clear-key
|
|
374
393
|
```
|
|
375
394
|
|
|
395
|
+
BYOK keys are encrypted by the platform and used only for the configured provider/model. Teardrop still charges the orchestration fee through credits or x402; it does not charge Teardrop for the provider's model usage.
|
|
396
|
+
|
|
376
397
|
---
|
|
377
398
|
|
|
378
399
|
## MCP Servers
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "teardrop-cli"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.3"
|
|
8
8
|
description = "Command-line interface for the Teardrop AI agent platform"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { file = "LICENSE" }
|
|
@@ -24,7 +24,7 @@ classifiers = [
|
|
|
24
24
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
25
25
|
]
|
|
26
26
|
dependencies = [
|
|
27
|
-
"teardrop-sdk>=0.2
|
|
27
|
+
"teardrop-sdk>=0.3.2",
|
|
28
28
|
"typer>=0.12",
|
|
29
29
|
"rich>=13.0",
|
|
30
30
|
"platformdirs>=4.0",
|
|
@@ -5,6 +5,7 @@ from __future__ import annotations
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import os
|
|
7
7
|
import re
|
|
8
|
+
import sys
|
|
8
9
|
from datetime import UTC, datetime
|
|
9
10
|
from pathlib import Path
|
|
10
11
|
from typing import Annotated
|
|
@@ -319,7 +320,11 @@ def login(
|
|
|
319
320
|
print_success(f"Logged in as [bold]{email}[/bold]{org_label}")
|
|
320
321
|
|
|
321
322
|
|
|
322
|
-
def interactive_reauthenticate(
|
|
323
|
+
def interactive_reauthenticate(
|
|
324
|
+
base_url: str | None = None,
|
|
325
|
+
*,
|
|
326
|
+
warning_message: str = "Your session expired during this command.",
|
|
327
|
+
) -> bool:
|
|
323
328
|
"""Prompt the user to sign in again after an expired session.
|
|
324
329
|
|
|
325
330
|
Returns ``True`` when authentication completed and the caller should retry,
|
|
@@ -328,7 +333,7 @@ def interactive_reauthenticate(base_url: str | None = None) -> bool:
|
|
|
328
333
|
from teardrop_cli import config
|
|
329
334
|
from teardrop_cli.formatting import console, print_warning
|
|
330
335
|
|
|
331
|
-
print_warning(
|
|
336
|
+
print_warning(warning_message)
|
|
332
337
|
console.print("\n[bold]Sign in to continue:[/bold]")
|
|
333
338
|
console.print(" [cyan]0[/cyan] Cancel")
|
|
334
339
|
console.print(" [cyan]1[/cyan] Email + password [recommended]")
|
|
@@ -375,7 +380,7 @@ def _resolve_siwe_private_key(
|
|
|
375
380
|
try:
|
|
376
381
|
from eth_account import Account
|
|
377
382
|
except ImportError:
|
|
378
|
-
print_error("eth-account is required.", hint="pip install
|
|
383
|
+
print_error("eth-account is required.", hint="pip install teardrop-cli")
|
|
379
384
|
raise typer.Exit(1) from None
|
|
380
385
|
acct = Account.create()
|
|
381
386
|
from rich.panel import Panel
|
|
@@ -406,16 +411,21 @@ def _resolve_siwe_private_key(
|
|
|
406
411
|
if env_key := os.environ.get("TEARDROP_SIWE_PRIVATE_KEY"):
|
|
407
412
|
return env_key, False
|
|
408
413
|
|
|
409
|
-
|
|
410
|
-
"
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
" • --key-file PATH\n"
|
|
415
|
-
" • --generate-wallet (creates a new wallet)"
|
|
416
|
-
),
|
|
414
|
+
hint = (
|
|
415
|
+
"Provide one via:\n"
|
|
416
|
+
" • TEARDROP_SIWE_PRIVATE_KEY env var\n"
|
|
417
|
+
" • --key-file PATH\n"
|
|
418
|
+
" • --generate-wallet (creates a new wallet)"
|
|
417
419
|
)
|
|
418
|
-
|
|
420
|
+
if not sys.stdin.isatty():
|
|
421
|
+
print_error("No Ethereum private key found.", hint=hint)
|
|
422
|
+
raise typer.Exit(1)
|
|
423
|
+
|
|
424
|
+
private_key = typer.prompt("Ethereum private key", hide_input=True).strip()
|
|
425
|
+
if not private_key:
|
|
426
|
+
print_error("No Ethereum private key provided.", hint=hint)
|
|
427
|
+
raise typer.Exit(1)
|
|
428
|
+
return private_key, False
|
|
419
429
|
|
|
420
430
|
|
|
421
431
|
async def _siwe_auth_async(
|
|
@@ -452,7 +462,9 @@ async def _siwe_auth_async(
|
|
|
452
462
|
|
|
453
463
|
async with AsyncTeardropClient(url) as client:
|
|
454
464
|
nonce_resp = await client.get_siwe_nonce()
|
|
455
|
-
|
|
465
|
+
# get_siwe_nonce() returns a SiweNonceResponse pydantic model (nonce: str),
|
|
466
|
+
# not a dict — access the attribute directly.
|
|
467
|
+
nonce = nonce_resp.nonce
|
|
456
468
|
|
|
457
469
|
from urllib.parse import urlparse
|
|
458
470
|
|
|
@@ -240,6 +240,80 @@ def info(
|
|
|
240
240
|
data_console.print_json(json.dumps(schema, default=str))
|
|
241
241
|
|
|
242
242
|
|
|
243
|
+
# ---------------------------------------------------------------------------
|
|
244
|
+
# reputation
|
|
245
|
+
# ---------------------------------------------------------------------------
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
@app.command()
|
|
249
|
+
def reputation(
|
|
250
|
+
qualified_name: Annotated[
|
|
251
|
+
str | None,
|
|
252
|
+
typer.Argument(metavar="ORG/TOOL", help="Optional qualified tool name filter."),
|
|
253
|
+
] = None,
|
|
254
|
+
as_json: Annotated[bool, typer.Option("--json", help="Output as JSON.")] = False,
|
|
255
|
+
base_url: Annotated[str | None, typer.Option("--base-url", hidden=True)] = None,
|
|
256
|
+
) -> None:
|
|
257
|
+
"""Show public reputation metrics for marketplace tools (no auth required)."""
|
|
258
|
+
from teardrop_cli import config
|
|
259
|
+
from teardrop_cli.formatting import data_console, print_error, print_json, print_table, spinner
|
|
260
|
+
|
|
261
|
+
client = config.get_client(base_url, require_auth=False)
|
|
262
|
+
|
|
263
|
+
async def _fetch() -> dict:
|
|
264
|
+
try:
|
|
265
|
+
response = await client.get_public_reputation()
|
|
266
|
+
return response.model_dump() if hasattr(response, "model_dump") else dict(response)
|
|
267
|
+
finally:
|
|
268
|
+
await client.close()
|
|
269
|
+
|
|
270
|
+
with spinner("Fetching public reputation…"):
|
|
271
|
+
data = asyncio.run(_fetch())
|
|
272
|
+
|
|
273
|
+
tools = data.get("tools", [])
|
|
274
|
+
if qualified_name is not None:
|
|
275
|
+
tools = [tool for tool in tools if tool.get("qualified_tool_name") == qualified_name]
|
|
276
|
+
if not tools:
|
|
277
|
+
print_error(f"No public reputation found for {qualified_name!r}.")
|
|
278
|
+
raise typer.Exit(1)
|
|
279
|
+
data["tools"] = tools
|
|
280
|
+
|
|
281
|
+
if as_json:
|
|
282
|
+
print_json(data)
|
|
283
|
+
return
|
|
284
|
+
|
|
285
|
+
if not tools:
|
|
286
|
+
data_console.print("[dim]No public reputation data available.[/dim]")
|
|
287
|
+
return
|
|
288
|
+
|
|
289
|
+
data_console.print(
|
|
290
|
+
f"Schema: {data.get('schema_version', '—')} | "
|
|
291
|
+
f"Generated: {data.get('generated_at') or '—'} | "
|
|
292
|
+
f"Methodology: {data.get('methodology_url') or '—'}"
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
rows = [
|
|
296
|
+
[
|
|
297
|
+
tool.get("qualified_tool_name", "—"),
|
|
298
|
+
(
|
|
299
|
+
f"score={tool.get('reputation_score', '—')} "
|
|
300
|
+
f"success={tool.get('success_rate', '—')} "
|
|
301
|
+
f"sample={tool.get('sample_size', '—')} "
|
|
302
|
+
f"confidence={tool.get('confidence', '—')} "
|
|
303
|
+
f"freshness={tool.get('freshness', '—')} "
|
|
304
|
+
f"latency_ms={tool.get('average_latency_ms', '—')} "
|
|
305
|
+
f"callers={tool.get('unique_caller_count', '—')}"
|
|
306
|
+
),
|
|
307
|
+
]
|
|
308
|
+
for tool in tools
|
|
309
|
+
]
|
|
310
|
+
print_table(
|
|
311
|
+
["Tool", "Metrics"],
|
|
312
|
+
rows,
|
|
313
|
+
title="Public Tool Reputation",
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
|
|
243
317
|
# ---------------------------------------------------------------------------
|
|
244
318
|
# subscribe
|
|
245
319
|
# ---------------------------------------------------------------------------
|