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.
Files changed (69) hide show
  1. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/PKG-INFO +22 -8
  2. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/README.md +20 -6
  3. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/docs/cli-reference.md +39 -18
  4. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/pyproject.toml +2 -2
  5. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/auth.py +25 -13
  6. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/marketplace.py +74 -0
  7. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/quickstart.py +136 -22
  8. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/run.py +10 -6
  9. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/tools.py +74 -20
  10. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/formatting.py +3 -2
  11. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/conftest.py +31 -0
  12. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/conftest.py +1 -0
  13. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_auth.py +23 -1
  14. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_marketplace.py +49 -0
  15. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_quickstart.py +98 -25
  16. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_token_expiry_fallback.py +24 -0
  17. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_tools.py +128 -0
  18. teardrop_cli-0.3.0/src/teardrop_cli/__init__.py +0 -1
  19. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/.github/workflows/publish.yml +0 -0
  20. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/.github/workflows/test.yml +0 -0
  21. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/.gitignore +0 -0
  22. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/.vscode/settings.json +0 -0
  23. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/LICENSE +0 -0
  24. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/docs/cli-json-schema.md +0 -0
  25. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/_fixtures.py +0 -0
  26. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/_lazy.py +0 -0
  27. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/_templates.py +0 -0
  28. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/cli.py +0 -0
  29. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/__init__.py +0 -0
  30. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/agent_tools.py +0 -0
  31. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/balance.py +0 -0
  32. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/chat.py +0 -0
  33. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/config_cmd.py +0 -0
  34. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/earnings.py +0 -0
  35. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/event_triggers.py +0 -0
  36. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/llm_config.py +0 -0
  37. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/mcp.py +0 -0
  38. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/models.py +0 -0
  39. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/schedules.py +0 -0
  40. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/commands/usage.py +0 -0
  41. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/config.py +0 -0
  42. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/src/teardrop_cli/pricing.py +0 -0
  43. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/README.md +0 -0
  44. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/__init__.py +0 -0
  45. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/conftest.py +0 -0
  46. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_auth_e2e.py +0 -0
  47. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_billing_e2e.py +0 -0
  48. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_marketplace_e2e.py +0 -0
  49. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_run_e2e.py +0 -0
  50. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_signup_e2e.py +0 -0
  51. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/e2e/test_siwe_login_e2e.py +0 -0
  52. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/__init__.py +0 -0
  53. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/test_config_persistence.py +0 -0
  54. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/test_keyring_integration.py +0 -0
  55. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/test_perf_lazygroup.py +0 -0
  56. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/smoke/test_siwe_signing.py +0 -0
  57. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_billing.py +0 -0
  58. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_chat.py +0 -0
  59. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_config_cmd.py +0 -0
  60. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_credential_priority.py +0 -0
  61. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_earnings.py +0 -0
  62. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_event_triggers.py +0 -0
  63. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_init_and_byok.py +0 -0
  64. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_llm_config.py +0 -0
  65. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_mcp.py +0 -0
  66. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_models.py +0 -0
  67. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_run.py +0 -0
  68. {teardrop_cli-0.3.0 → teardrop_cli-0.3.3}/tests/test_schedules.py +0 -0
  69. {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.0
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.0
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 my_scraper # test webhook health before publishing
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 your webhook before publishing with `teardrop tools probe <tool-name>`. Optionally pass `--auth-header-name` and `--auth-header-value` if your webhook requires auth, or use `--method` and `--payload` to customize the probe request.
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 my_scraper # test webhook health before publishing
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 your webhook before publishing with `teardrop tools probe <tool-name>`. Optionally pass `--auth-header-name` and `--auth-header-value` if your webhook requires auth, or use `--method` and `--payload` to customize the probe request.
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 # interactive hidden prompt
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 | `access_token` in `~/.teardrop/config.toml` |
76
- | 5 | System keyring (email + secret, or client credentials) |
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` and `get` calls do not return the plaintext secret.
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/billing](https://teardrop.dev/billing)
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 or after updating a webhook URL, test it:
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.0"
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.0",
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(base_url: str | None = None) -> bool:
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("Your session expired during this command.")
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 'teardrop-cli[siwe]'")
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
- print_error(
410
- "No Ethereum private key found.",
411
- hint=(
412
- "Provide one via:\n"
413
- " • TEARDROP_SIWE_PRIVATE_KEY env var\n"
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
- raise typer.Exit(1)
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
- nonce = nonce_resp.get("nonce", nonce_resp.get("value", ""))
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
  # ---------------------------------------------------------------------------