clawmetry 0.12.415__tar.gz → 0.12.416__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.
- {clawmetry-0.12.415/clawmetry.egg-info → clawmetry-0.12.416}/PKG-INFO +1 -1
- {clawmetry-0.12.415 → clawmetry-0.12.416/clawmetry.egg-info}/PKG-INFO +1 -1
- {clawmetry-0.12.415 → clawmetry-0.12.416}/dashboard.py +1 -1
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/update_check.py +41 -3
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_auto_update.py +23 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/ARCHITECTURE.md +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/CHANGELOG.md +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/CLAUDE.md +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/LICENSE +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/MANIFEST.in +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/README.md +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/__init__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/__main__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/_gate.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/adapters/__init__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/adapters/base.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/adapters/nemo.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/adapters/openclaw.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/adapters/registry.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/alert_evaluator.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/approvals.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/audit.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/blueprints/__init__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/cli.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/config.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/connector_health.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/dives_prompt.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/dives_sql_safety.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/entitlements.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/error_patterns.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/error_signal.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/eval_regression_replay.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/eval_runner.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/eval_suite_runner.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/extensions.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/gateway_tap.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/insights.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/interceptor.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/latency_tracker.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/license.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/local_server.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/otel_exporter.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/otel_push.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/outcome_classifier.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/providers/__init__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/providers/base.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/providers/local.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/providers/turso.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/providers_pricing.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/proxy.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/py.typed +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/redaction.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/relay.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/resources/add-nemoclaw-clawmetry-preset.sh +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/risk.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/siem.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/css/dashboard.css +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/img/logo.svg +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/js/alerts.js +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/js/app.js +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/js/auth-bootstrap.js +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/js/dives.js +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/js/gw-setup.js +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/js/i18n.js +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/js/nav-dropdown.js +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/_glossary.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/_meta.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/ar.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/bn.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/de.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/el.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/en.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/es-419.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/es.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/fa.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/fil.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/fr.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/gu.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/he.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/hi.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/id.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/it.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/ja.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/kn.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/ko.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/ml.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/mr.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/nl.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/pa.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/pl.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/pt-BR.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/pt-PT.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/ru.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/sv.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/ta.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/te.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/th.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/tr.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/uk.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/ur.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/vi.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/zh-CN.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/locales/zh-TW.json +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/v2/dist/assets/index-Dtt_uBk_.js +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/v2/dist/assets/index-NbINX9rU.css +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/v2/dist/index.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/sync.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/telemetry.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/README.md +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/partials/banners.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/partials/budget-modal.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/partials/cloud-modal.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/partials/overlays.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/partials/paywall_modal.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/alerts.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/approvals.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/brain.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/clusters.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/context-economics.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/context.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/crons.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/dives.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/flow.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/history.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/logs.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/memory.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/models.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/nemoclaw.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/notifications.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/overview.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/policy.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/security.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/selfevolve.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/skills.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/subagents.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/swimlane.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/tool-catalog.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/tracing.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/transcripts.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/turn-anatomy.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/usage.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/templates/tabs/version-impact.html +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/tests/__init__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/tests/e2e/__init__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/tests/e2e/test_cloud_sync_resilience.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/tests/integration/__init__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/tests/integration/test_fast_paths_cross_process.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/token_confidence.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/track.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/v2/__init__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/v2/routes.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/waste_flags.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry.egg-info/SOURCES.txt +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry.egg-info/dependency_links.txt +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry.egg-info/entry_points.txt +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry.egg-info/requires.txt +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry.egg-info/top_level.txt +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/helpers/__init__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/helpers/gateway.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/helpers/hardware.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/helpers/logs.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/helpers/openapi.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/helpers/pricing.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/helpers/streams.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/helpers/system.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/__init__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/_dedupe.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/advisor.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/agents.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/alerts.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/assets.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/audit.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/autonomy.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/bootstrap.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/brain.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/channels.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/components.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/context_economics.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/crons.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/dives.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/entitlement.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/evals.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/fleet_history.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/health.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/heartbeat.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/hitl.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/infra.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/insights.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/local_query.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/meta.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/nemoclaw.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/otel_export.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/overview.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/plugins.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/policy.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/reasoning.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/review.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/runtime_ingest.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/scheduler.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/selfconfig.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/selfevolve.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/sessions.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/skills.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/sla.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/tool_catalog.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/tracing.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/turn_anatomy.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/usage.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/routes/workspaces.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/setup.cfg +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/setup.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/__init__.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/_moat_perf_fixture.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/conftest.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/eval_ci_mock_agent.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_adapter_gating.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_adapter_registry_override.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_adapters.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_adaptive_heartbeat.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_advertised_runtimes_match_catalogue.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_advisor_auth_resolution.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_aesgcm_swallow_fix.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_alert_evaluator_unit.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_alert_rules_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_alerts_evaluator_duckdb.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_anon_auth_fail_ping.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_api.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_appjs_units.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_approvals_duckdb_watcher.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_approvals_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_audit.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_auth_detected_token.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_automation_analysis_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_autonomy_v3_shape.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_backfill_family_cost.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_blueprint_uniqueness.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_bootstrap_capture.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_brain_cache_push.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_brain_cache_push_channel_events.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_brain_clusters_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_brain_history_v3_event_detail.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_brain_llm_call_timeline.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_brain_local_fastpath.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_brain_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_brain_no_log_keyword_noise.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_brain_sse_reconnect.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_budget_cap.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_cache_trends.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_channel_bluebubbles_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_channel_config_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_channel_event_chokepoint.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_channel_signal_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_channel_telegram_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_channel_tui_duckdb_fastpath.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_channel_whatsapp_duckdb_fastpath.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_channels_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_circular_import.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_class_bug_parent_sid_drain.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_claude_sessions_privacy_boundary.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_claudecode.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_claudecode_loads_plugins.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_cli.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_cli_banner.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_component_gateway_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_component_tool_model_completed.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_component_tool_timeout.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_connector_health.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_context_anatomy_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_context_window_model_aware.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_cost_optimizer_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_cron_health.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_cron_runs_duckdb_ingest.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_cron_runs_events_only.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_crons_cache_push.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_crons_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_crons_runs_endpoint.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_daemon_error_event_pipeline.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_daemon_health_endpoint.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_dashboard_perf_hotfix.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_decoding_config_extract.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_delegation_tree_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_dives_prompt.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_dives_sql_safety.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_duckdb_coverage_batch_2026_05_13.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_duckdb_coverage_phase2_2026_05_13.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_duckdb_coverage_phase3_2026_05_13.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_duckdb_coverage_phase4_channels_2026_05_13.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_duckdb_coverage_phase5_channels_2026_05_13.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_duckdb_fastpath_v3_invariants.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_duckdb_relay_integration.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_e2e.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_e2e_browserstack.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_e2e_cross_repo_handoff.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_e2e_nightly_workflow.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_e2e_oss_all_tabs.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_e2e_oss_golden_path.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_e2e_real_openclaw_pipeline.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_e2e_telegram_brain_ingest.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_entitlement_api.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_entitlements.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_entitlements_catalogue.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_error_patterns.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_error_triage.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_eval_regression_replay.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_eval_runner.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_eval_suite_runner.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_evaluate_alerts_integration.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_event_id_unification_and_dedup.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_event_metrics_extraction.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_events_only_computation.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_extensions.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_fallbacks_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_family_runtime_ingest.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_first_heartbeat_onboarding.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_flow_events_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_flow_runs_endpoint.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_flow_sse_reconnect.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_forward_progress.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_gateway_health.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_gateway_health_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_gateway_metric_history.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_gateway_tap.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_gateway_tap_opt_in_banner.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_gateway_token_fallback.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_gateway_ws_handshake_client_id.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_hallucination_risk.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_health_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_heartbeat_agent_install_piggyback.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_heartbeat_dispatch.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_heartbeat_envelope.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_heartbeat_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_heartbeat_loop_detector.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_heartbeat_relay_e2e.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_i18n_catalog.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_i18n_no_raw_codes.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_insights.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_install_script_linux_restart.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_install_script_no_duplicate_daemon.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_integrity_hash_chain.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_interceptor.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_issue_1127_ux_dead_ends.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_latency_tracker.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_license.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_license_api.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_local_max_bytes_auto_vacuum.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_local_query_api.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_local_query_dispatch_edge_cases.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_local_server_proxy.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_local_store_concurrent_flush_1590.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_local_store_default_on.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_local_store_missing_writers.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_local_store_multi_agent.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_local_store_rename.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_local_store_sync_integration.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_log_sse_reconnect.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_loop_signals_integration.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_memory_cache_push.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_memory_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_memory_rag.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_bug_class_v3_event_shape_gate.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_cloud_robustness.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_cloud_roundtrip_e2e.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_cloud_sync_e2e.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_component_tool_e2e.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_cross_repo_version_skew.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_daemon_crash_recovery.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_event_shape_manifest_guard.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_live_openclaw_e2e.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_perf_benchmark.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_real_e2e.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_regression_1129.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_send_message_e2e.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_moat_tier1_daemon_proxy_sweep.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_model_transitions_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_multi_workspace_discovery.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_nemo_adapter.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_nemo_adapter_pro_gate.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_nemoclaw_events_metrics.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_nemoclaw_governance.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_nemoclaw_runtime_adapter.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_no_agent_detected_state.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_no_direct_get_store_in_routes.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_oauth_detection.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_openclaw_claude_session_ingest.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_openclaw_detection_real.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_openclaw_list_events.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_openclaw_sessions_followup.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_oss_routes_source_canary.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_oss_stubs_after_pro_move.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_otel_export.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_otlp_metrics_edge_cases.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_outcome_classifier.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_overview_autonomy_score.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_overview_heartbeat.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_overview_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_pending_query_dispatch.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_per_agent_budget.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_phase2_stubs.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_phase3_stubs.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_phase4_adapter_move.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_phase_2_to_5_live_e2e.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_plugins_invocations_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_providers_pricing.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_proxy.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_proxy_budget_abort.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_proxy_loads_plugins.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_query_sessions_message_count.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_rate_limits_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_read_cloud_token_fallback.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_real_openclaw_binary_e2e.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_reasoning_v3_shape.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_redaction.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_relay.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_reliability.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_retention_prune.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_review_queue.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_route_gates.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_routes_runtimes.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_run_compare.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_run_daemon_uniqueness.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_runtime_detection_snapshot.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_runtime_filter_no_leak.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_runtime_switcher_gating.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_schema_migration_failure_integrity.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_security_threat_heuristics.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_selfconfig_session_attribution.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_session_cost_intel.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_session_export.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_session_export_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_session_insight.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_session_tools_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sessions_by_type_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sessions_clusters_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sessions_local_fastpath.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sessions_retention_cap.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sigterm_ring_flush.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_skills_fidelity_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_skills_fidelity_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_skills_multi_dir_discovery.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_spans_e2e.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_spans_ingest.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_spans_otlp_edge_cases.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_status_live.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_subagent_attribution_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_subagents_events_only.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_subagents_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_subscribe_queue_bounded.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sync_cloud_plan_cache.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sync_daemon_crash_recovery.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sync_loads_plugins.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sync_main_block_at_eof.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sync_progress_sticky.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sync_reliability.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sync_skip_sidecar_jsonls.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_sync_trial_gating.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_system_snapshot_dlq.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_task_runs_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_telegram_gatewaylog_parser.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_telegram_ingest.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_telemetry.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_tier1_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_tier_pro_paywall_no_flash.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_token_attribution_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_token_confidence.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_token_spike_rules.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_token_velocity_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_tool_alternatives.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_tool_catalog_provenance_and_calls.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_tool_modal_fastpath_2026_05_13.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_tracing_accuracy.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_track.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_track_source.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_transcript_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_transcript_openclaw_shapes.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_transcripts_list_detail_count_parity.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_trial_copy_consistency.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_update_banner_live_version.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_uptime_portable.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_usage_cache_trends_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_usage_forecast_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_usage_local_store.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_usage_per_session.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_v3_schema_parser.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_verify_integrity_cli_proxy.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_version_impact.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_version_impact_local_store_v3.py +0 -0
- {clawmetry-0.12.415 → clawmetry-0.12.416}/tests/test_workspace_switcher_copy.py +0 -0
|
@@ -160,7 +160,7 @@ except ImportError:
|
|
|
160
160
|
metrics_service_pb2 = None
|
|
161
161
|
trace_service_pb2 = None
|
|
162
162
|
|
|
163
|
-
__version__ = "0.12.
|
|
163
|
+
__version__ = "0.12.416"
|
|
164
164
|
|
|
165
165
|
# Extensions (Phase 2): import the plugin host now, but defer the actual
|
|
166
166
|
# load_plugins() call until after the Flask app is created below so we can
|
|
@@ -223,12 +223,34 @@ def _check_for_update():
|
|
|
223
223
|
|
|
224
224
|
_record_update_check(current, latest, update_available, CHANGELOG_URL)
|
|
225
225
|
|
|
226
|
+
# Age (hours) of the latest release, for the auto-update staleness rail.
|
|
227
|
+
# NEVER blocks the banner — only the silent upgrade waits for the release
|
|
228
|
+
# to have survived a stability window before installing it unattended.
|
|
229
|
+
_age_h = None
|
|
230
|
+
try:
|
|
231
|
+
_files = (data.get("releases", {}) or {}).get(latest) or []
|
|
232
|
+
_times = [
|
|
233
|
+
f.get("upload_time_iso_8601") or f.get("upload_time")
|
|
234
|
+
for f in _files
|
|
235
|
+
if f.get("upload_time_iso_8601") or f.get("upload_time")
|
|
236
|
+
]
|
|
237
|
+
if _times:
|
|
238
|
+
from datetime import datetime as _dt, timezone as _tz
|
|
239
|
+
_t0 = min(
|
|
240
|
+
_dt.fromisoformat(str(t).replace("Z", "+00:00")) for t in _times
|
|
241
|
+
)
|
|
242
|
+
if _t0.tzinfo is None:
|
|
243
|
+
_t0 = _t0.replace(tzinfo=_tz.utc)
|
|
244
|
+
_age_h = (_dt.now(_tz.utc) - _t0).total_seconds() / 3600.0
|
|
245
|
+
except Exception:
|
|
246
|
+
_age_h = None
|
|
247
|
+
|
|
226
248
|
# Auto-update: if the user opted in, install the newer release now (no
|
|
227
249
|
# click). Runs in the always-on dashboard server process, so it works
|
|
228
250
|
# with no browser open. Guarded so a pending restart isn't re-triggered.
|
|
229
251
|
if update_available:
|
|
230
252
|
try:
|
|
231
|
-
_maybe_auto_update(current, latest)
|
|
253
|
+
_maybe_auto_update(current, latest, _age_h)
|
|
232
254
|
except Exception as exc:
|
|
233
255
|
log.warning("auto-update trigger failed: %s", exc)
|
|
234
256
|
|
|
@@ -246,14 +268,30 @@ def _check_for_update():
|
|
|
246
268
|
_auto_update_in_progress = False
|
|
247
269
|
|
|
248
270
|
|
|
249
|
-
def _maybe_auto_update(current, latest):
|
|
250
|
-
"""Install a newer release automatically when ``auto_update`` is enabled.
|
|
271
|
+
def _maybe_auto_update(current, latest, age_hours=None):
|
|
272
|
+
"""Install a newer release automatically when ``auto_update`` is enabled.
|
|
273
|
+
|
|
274
|
+
Staleness rail: unattended upgrades wait until the release has been on PyPI
|
|
275
|
+
for at least ``CLAWMETRY_AUTOUPDATE_MIN_AGE_HOURS`` (default 48h), so a node
|
|
276
|
+
never auto-installs a brand-new (possibly broken) release the instant it
|
|
277
|
+
publishes. The update banner is unaffected — only the silent upgrade waits.
|
|
278
|
+
``age_hours=None`` (age unknown) does not block, preserving prior behaviour.
|
|
279
|
+
"""
|
|
251
280
|
global _auto_update_in_progress
|
|
252
281
|
if _auto_update_in_progress:
|
|
253
282
|
return
|
|
254
283
|
cfg = _get_update_check_config()
|
|
255
284
|
if not cfg.get("auto_update"):
|
|
256
285
|
return
|
|
286
|
+
try:
|
|
287
|
+
import os as _os
|
|
288
|
+
_min_age = float(_os.environ.get("CLAWMETRY_AUTOUPDATE_MIN_AGE_HOURS", "48") or 48)
|
|
289
|
+
except Exception:
|
|
290
|
+
_min_age = 48.0
|
|
291
|
+
if age_hours is not None and age_hours < _min_age:
|
|
292
|
+
log.info("auto-update: holding v%s (released %.1fh ago < %.0fh stability "
|
|
293
|
+
"window) — will install once it ages in", latest, age_hours, _min_age)
|
|
294
|
+
return
|
|
257
295
|
_auto_update_in_progress = True
|
|
258
296
|
log.info("auto-update: opted in — upgrading clawmetry v%s -> v%s", current, latest)
|
|
259
297
|
try:
|
|
@@ -70,3 +70,26 @@ def test_auto_update_in_allowed_config_keys(monkeypatch):
|
|
|
70
70
|
with app.test_request_context(json={"auto_update": True, "bogus": "x"}):
|
|
71
71
|
uc.api_update_check_config_post()
|
|
72
72
|
assert captured == {"auto_update": True}, "auto_update must pass the allow-list, bogus keys filtered"
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def test_auto_update_holds_fresh_release(monkeypatch):
|
|
76
|
+
uc = _uc()
|
|
77
|
+
calls = []
|
|
78
|
+
_mock_self_update(monkeypatch, calls)
|
|
79
|
+
monkeypatch.setattr(uc, "_get_update_check_config", lambda: {"auto_update": True})
|
|
80
|
+
monkeypatch.setenv("CLAWMETRY_AUTOUPDATE_MIN_AGE_HOURS", "48")
|
|
81
|
+
# 2h-old release → held (too fresh)
|
|
82
|
+
uc._maybe_auto_update("0.12.1", "0.12.2", age_hours=2.0)
|
|
83
|
+
assert calls == [], "must hold a release younger than the stability window"
|
|
84
|
+
# 72h-old release → installs
|
|
85
|
+
uc._maybe_auto_update("0.12.1", "0.12.2", age_hours=72.0)
|
|
86
|
+
assert calls == ["auto"], "must install once the release has aged in"
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_auto_update_unknown_age_does_not_block(monkeypatch):
|
|
90
|
+
uc = _uc()
|
|
91
|
+
calls = []
|
|
92
|
+
_mock_self_update(monkeypatch, calls)
|
|
93
|
+
monkeypatch.setattr(uc, "_get_update_check_config", lambda: {"auto_update": True})
|
|
94
|
+
uc._maybe_auto_update("0.12.1", "0.12.2", age_hours=None)
|
|
95
|
+
assert calls == ["auto"], "unknown age must not block (back-compat)"
|
|
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
|
{clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/resources/add-nemoclaw-clawmetry-preset.sh
RENAMED
|
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
|
{clawmetry-0.12.415 → clawmetry-0.12.416}/clawmetry/static/v2/dist/assets/index-NbINX9rU.css
RENAMED
|
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
|
|
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
|