zeno-cli 0.3.4__tar.gz → 0.3.6__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.
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/PKG-INFO +1 -1
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/pyproject.toml +1 -1
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/_hooks/cc_bridge.py +36 -4
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/login.py +1 -1
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/main.py +2 -2
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/.gitignore +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/README.md +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_adapters/__init__.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_adapters/_common.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_adapters/anthropic.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_adapters/claude_code.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_adapters/crewai.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_adapters/langgraph.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_adapters/openai.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_core/__init__.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_core/analytics.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_core/rtlx_s.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_core/streak.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_core/tlx_s.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/__init__.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/_generated/__init__.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/_generated/client.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/_migrations/alembic/env.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/_migrations/alembic/script.py.mako +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/_migrations/alembic/versions/0001_initial.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/_migrations/alembic/versions/0002_cognition_samples.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/_migrations/alembic/versions/0003_cognition_drivers.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/_migrations/alembic/versions/0004_transcript_intelligence.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/_migrations/alembic.ini +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/_runtime.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/adapters/__init__.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/adapters/anthropic.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/adapters/claude_code.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/adapters/crewai.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/adapters/langgraph.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/adapters/openai.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/auth.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/client.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/config.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/daemon.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/privacy.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/session.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/storage.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_sdk/types/__init__.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/__init__.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/analytics.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/compression.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/ingest.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/model.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/parsers/__init__.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/parsers/claude_code.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/parsers/codex.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/parsers/cursor.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/prices.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/schema.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/signals.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/_vendor_build/zeno_session_intel/taxonomy.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/data/outreach_suppression.txt +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/hatch_build.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/scripts/install-smoke.sh +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/__init__.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/doctor.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/hook_install.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/hud/__init__.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/hud/hud_install.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/hud/zeno_attention.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/hud/zeno_cognition.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/hud/zeno_hud.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/interview_invites.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/onboard.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/outreach.py +0 -0
- {zeno_cli-0.3.4 → zeno_cli-0.3.6}/src/zeno_cli/version.py +0 -0
|
@@ -194,6 +194,31 @@ def _api_base_url() -> str:
|
|
|
194
194
|
return (os.environ.get("ZENO_API_BASE_URL") or DEFAULT_API_BASE_URL).rstrip("/")
|
|
195
195
|
|
|
196
196
|
|
|
197
|
+
def _api_token() -> str | None:
|
|
198
|
+
"""Bearer token for the capture push, when one is available.
|
|
199
|
+
|
|
200
|
+
Checks the explicit env var first (matches the SDK client's ZENO_API_TOKEN
|
|
201
|
+
precedence), then the keyring slot `zeno login` writes (service "zeno-sdk",
|
|
202
|
+
key "clerk_jwt"). The keyring lookup is best-effort: keyring is an optional
|
|
203
|
+
dependency and may be absent under the system python the hook runs on.
|
|
204
|
+
Returns None on the tailnet Mini, where identity comes from a header the
|
|
205
|
+
`tailscale serve` proxy injects rather than a bearer token - so the push
|
|
206
|
+
stays header-authed there and bearer-authed against a public API.
|
|
207
|
+
"""
|
|
208
|
+
tok = os.environ.get("ZENO_API_TOKEN")
|
|
209
|
+
if tok and tok.strip():
|
|
210
|
+
return tok.strip()
|
|
211
|
+
try:
|
|
212
|
+
import keyring # noqa: PLC0415
|
|
213
|
+
|
|
214
|
+
stored = keyring.get_password("zeno-sdk", "clerk_jwt")
|
|
215
|
+
if stored and stored.strip():
|
|
216
|
+
return stored.strip()
|
|
217
|
+
except Exception:
|
|
218
|
+
return None
|
|
219
|
+
return None
|
|
220
|
+
|
|
221
|
+
|
|
197
222
|
def _sync_timeout_s() -> float:
|
|
198
223
|
try:
|
|
199
224
|
return float(os.environ.get("ZENO_SYNC_TIMEOUT_S") or SYNC_TIMEOUT_S)
|
|
@@ -259,14 +284,21 @@ def _post_ingest(body: dict, timeout_s: float) -> bool:
|
|
|
259
284
|
raises (all exceptions -> False). urllib + an explicit socket timeout only."""
|
|
260
285
|
url = _api_base_url() + SYNC_PATH
|
|
261
286
|
data = json.dumps(body).encode("utf-8")
|
|
287
|
+
headers = {
|
|
288
|
+
"Content-Type": "application/json",
|
|
289
|
+
"Idempotency-Key": _idempotency_key(body),
|
|
290
|
+
}
|
|
291
|
+
# Attach the Clerk bearer token when one is available so the push authenticates
|
|
292
|
+
# against a public API (Cloud Run). Absent it (tailnet Mini), the push relies on
|
|
293
|
+
# the identity header the `tailscale serve` proxy injects - unchanged behavior.
|
|
294
|
+
token = _api_token()
|
|
295
|
+
if token:
|
|
296
|
+
headers["Authorization"] = "Bearer " + token
|
|
262
297
|
req = urllib.request.Request(
|
|
263
298
|
url,
|
|
264
299
|
data=data,
|
|
265
300
|
method="POST",
|
|
266
|
-
headers=
|
|
267
|
-
"Content-Type": "application/json",
|
|
268
|
-
"Idempotency-Key": _idempotency_key(body),
|
|
269
|
-
},
|
|
301
|
+
headers=headers,
|
|
270
302
|
)
|
|
271
303
|
try:
|
|
272
304
|
with urllib.request.urlopen(req, timeout=timeout_s) as resp: # noqa: S310 (trusted tailnet)
|
|
@@ -49,7 +49,7 @@ from zeno_sdk import auth
|
|
|
49
49
|
# default for the argparse default (so the hot `zeno status` path does not
|
|
50
50
|
# import this module just to build the parser).
|
|
51
51
|
DEFAULT_AUTHORIZE_URL = os.environ.get(
|
|
52
|
-
"ZENO_LOGIN_AUTHORIZE_URL", "https://
|
|
52
|
+
"ZENO_LOGIN_AUTHORIZE_URL", "https://demo.zeno.center/cli/authorize"
|
|
53
53
|
)
|
|
54
54
|
|
|
55
55
|
|
|
@@ -46,7 +46,7 @@ DEFAULT_API_BASE_URL = os.environ.get(
|
|
|
46
46
|
# hot `zeno status` path - which builds the full parser - does not have to
|
|
47
47
|
# import the login module (http.server / webbrowser) just to set a default.
|
|
48
48
|
DEFAULT_AUTHORIZE_URL = os.environ.get(
|
|
49
|
-
"ZENO_LOGIN_AUTHORIZE_URL", "https://
|
|
49
|
+
"ZENO_LOGIN_AUTHORIZE_URL", "https://demo.zeno.center/cli/authorize"
|
|
50
50
|
)
|
|
51
51
|
|
|
52
52
|
|
|
@@ -345,7 +345,7 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
345
345
|
default=DEFAULT_AUTHORIZE_URL,
|
|
346
346
|
help=(
|
|
347
347
|
"Dashboard CLI-authorize bridge URL (default: ZENO_LOGIN_AUTHORIZE_URL "
|
|
348
|
-
"or https://
|
|
348
|
+
"or https://demo.zeno.center/cli/authorize)."
|
|
349
349
|
),
|
|
350
350
|
)
|
|
351
351
|
login_p.add_argument(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|