observal-cli 0.2.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.
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.env.example +20 -0
- observal_cli-0.3.3/.gitbook.yaml +11 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.github/workflows/ci.yml +1 -0
- observal_cli-0.3.3/.github/workflows/deploy.yml +62 -0
- observal_cli-0.3.3/.github/workflows/release.yml +383 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.gitignore +19 -7
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.pre-commit-config.yaml +20 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/AGENTS.md +118 -18
- observal_cli-0.3.3/CHANGELOG.md +772 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/CONTRIBUTING.md +12 -8
- {observal_cli-0.2.0 → observal_cli-0.3.3}/Makefile +27 -5
- observal_cli-0.3.3/PKG-INFO +184 -0
- observal_cli-0.3.3/README.md +152 -0
- observal_cli-0.3.3/SETUP.md +16 -0
- observal_cli-0.3.3/cliff.toml +48 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docker/Dockerfile.api +2 -1
- observal_cli-0.3.3/docker/clickhouse/config.d/memory.xml +9 -0
- observal_cli-0.3.3/docker/clickhouse/users.d/memory.xml +22 -0
- observal_cli-0.3.3/docker/docker-compose.production.yml +12 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docker/docker-compose.yml +88 -20
- observal_cli-0.3.3/docker/entrypoint.sh +87 -0
- observal_cli-0.3.3/docker/nginx.conf +19 -0
- observal_cli-0.3.3/docker/nginx.production.conf +73 -0
- observal_cli-0.3.3/docker/server-package/env.template +44 -0
- observal_cli-0.3.3/docker/server-package/setup.sh +126 -0
- observal_cli-0.3.3/docs/README.md +52 -0
- observal_cli-0.3.3/docs/SUMMARY.md +72 -0
- observal_cli-0.3.3/docs/cli/README.md +82 -0
- observal_cli-0.3.3/docs/cli/admin.md +156 -0
- observal_cli-0.3.3/docs/cli/agent.md +120 -0
- observal_cli-0.3.3/docs/cli/auth.md +152 -0
- observal_cli-0.3.3/docs/cli/config.md +116 -0
- observal_cli-0.3.3/docs/cli/doctor.md +88 -0
- observal_cli-0.3.3/docs/cli/ops.md +155 -0
- observal_cli-0.3.3/docs/cli/profile.md +109 -0
- observal_cli-0.3.3/docs/cli/pull.md +108 -0
- observal_cli-0.3.3/docs/cli/registry.md +164 -0
- observal_cli-0.3.3/docs/cli/scan.md +93 -0
- observal_cli-0.3.3/docs/cli/self.md +53 -0
- observal_cli-0.3.3/docs/concepts/README.md +11 -0
- observal_cli-0.3.3/docs/concepts/data-model.md +101 -0
- observal_cli-0.3.3/docs/concepts/evaluation.md +191 -0
- observal_cli-0.3.3/docs/concepts/shim-vs-proxy.md +107 -0
- observal_cli-0.3.3/docs/e2e-test-checklist-enterprise.md +291 -0
- observal_cli-0.3.3/docs/e2e-test-checklist.md +158 -0
- observal_cli-0.3.3/docs/getting-started/core-concepts.md +133 -0
- observal_cli-0.3.3/docs/getting-started/installation.md +115 -0
- observal_cli-0.3.3/docs/getting-started/quickstart.md +168 -0
- observal_cli-0.3.3/docs/integrations/README.md +42 -0
- observal_cli-0.3.3/docs/integrations/claude-code.md +111 -0
- observal_cli-0.3.3/docs/integrations/codex-cli.md +31 -0
- observal_cli-0.3.3/docs/integrations/cursor.md +54 -0
- observal_cli-0.3.3/docs/integrations/gemini-cli.md +43 -0
- observal_cli-0.3.3/docs/integrations/kiro.md +200 -0
- observal_cli-0.3.3/docs/integrations/vscode.md +43 -0
- observal_cli-0.3.3/docs/reference/api-endpoints.md +154 -0
- observal_cli-0.3.3/docs/reference/config-files.md +117 -0
- observal_cli-0.3.3/docs/reference/environment-variables.md +136 -0
- observal_cli-0.3.3/docs/reference/hooks-spec.md +156 -0
- observal_cli-0.3.3/docs/self-hosting/README.md +71 -0
- observal_cli-0.3.3/docs/self-hosting/authentication.md +146 -0
- observal_cli-0.3.3/docs/self-hosting/backup-and-restore.md +151 -0
- observal_cli-0.3.3/docs/self-hosting/configuration.md +151 -0
- observal_cli-0.3.3/docs/self-hosting/databases.md +121 -0
- observal_cli-0.3.3/docs/self-hosting/docker-compose.md +134 -0
- observal_cli-0.3.3/docs/self-hosting/evaluation-engine.md +149 -0
- observal_cli-0.3.3/docs/self-hosting/ports-and-volumes.md +77 -0
- observal_cli-0.3.3/docs/self-hosting/releasing.md +140 -0
- observal_cli-0.3.3/docs/self-hosting/requirements.md +79 -0
- observal_cli-0.3.3/docs/self-hosting/telemetry-pipeline.md +111 -0
- observal_cli-0.3.3/docs/self-hosting/troubleshooting.md +209 -0
- observal_cli-0.3.3/docs/self-hosting/upgrades.md +96 -0
- observal_cli-0.3.3/docs/self-observability.md +82 -0
- observal_cli-0.3.3/docs/use-cases/README.md +25 -0
- observal_cli-0.3.3/docs/use-cases/debug-agent-failures.md +90 -0
- observal_cli-0.3.3/docs/use-cases/evaluate-agents.md +132 -0
- observal_cli-0.3.3/docs/use-cases/observe-mcp-traffic.md +93 -0
- observal_cli-0.3.3/docs/use-cases/share-agent-configs.md +109 -0
- observal_cli-0.3.3/docs/use-cases/team-registry.md +134 -0
- observal_cli-0.3.3/ee/AGENTS.md +105 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/ee/__init__.py +18 -19
- observal_cli-0.3.3/ee/docs/cli-sso.md +164 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/ee/docs/cli.md +40 -9
- observal_cli-0.3.3/ee/docs/oidc-setup.md +271 -0
- observal_cli-0.3.3/ee/docs/saml-setup.md +386 -0
- observal_cli-0.3.3/ee/docs/scim-setup.md +533 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/ee/observal_server/routes/__init__.py +2 -0
- observal_cli-0.3.3/ee/observal_server/routes/admin_sso.py +357 -0
- observal_cli-0.3.3/ee/observal_server/routes/scim.py +585 -0
- observal_cli-0.3.3/ee/observal_server/routes/sso_saml.py +430 -0
- observal_cli-0.3.3/ee/observal_server/services/audit.py +271 -0
- observal_cli-0.3.3/ee/observal_server/services/config_validator.py +51 -0
- observal_cli-0.3.3/ee/observal_server/services/saml.py +176 -0
- observal_cli-0.3.3/ee/observal_server/services/scim_service.py +129 -0
- observal_cli-0.3.3/grafana/dashboards/self-observability.json +235 -0
- observal_cli-0.3.3/grafana/provisioning/datasources/prometheus.yaml +10 -0
- observal_cli-0.3.3/install-server.sh +71 -0
- observal_cli-0.3.3/install.sh +99 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/README.md +1 -1
- observal_cli-0.3.3/observal-server/alembic/versions/0017_add_org_trace_privacy.py +46 -0
- observal_cli-0.3.3/observal-server/alembic/versions/0018_add_saml_config_and_scim_token.py +88 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/deps.py +55 -4
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/graphql.py +23 -8
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/middleware/request_id.py +49 -42
- observal_cli-0.3.3/observal-server/api/ratelimit.py +23 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/admin.py +226 -17
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/agent.py +94 -27
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/alert.py +44 -2
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/auth.py +107 -71
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/bulk.py +9 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/component_source.py +34 -1
- observal_cli-0.3.3/observal-server/api/routes/config.py +62 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/dashboard.py +49 -15
- observal_cli-0.3.3/observal-server/api/routes/device_auth.py +227 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/eval.py +125 -7
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/feedback.py +11 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/hook.py +58 -10
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/mcp.py +66 -10
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/otel_dashboard.py +454 -44
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/otlp.py +2 -31
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/prompt.py +68 -8
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/review.py +361 -16
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/sandbox.py +82 -10
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/skill.py +70 -10
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/config.py +42 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/database.py +2 -2
- observal_cli-0.3.3/observal-server/logging_config.py +54 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/main.py +71 -20
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/__init__.py +4 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/organization.py +2 -1
- observal_cli-0.3.3/observal-server/models/saml_config.py +34 -0
- observal_cli-0.3.3/observal-server/models/scim_token.py +19 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/user.py +2 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/pyproject.toml +5 -2
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/agent.py +1 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/auth.py +41 -21
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/constants.py +4 -2
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/dashboard.py +2 -2
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/hook.py +1 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/mcp.py +1 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/prompt.py +1 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/sandbox.py +1 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/skill.py +1 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/agent_builder.py +90 -12
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/agent_config_generator.py +38 -5
- observal_cli-0.3.3/observal-server/services/audit_helpers.py +43 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/clickhouse.py +123 -29
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/codex_config_generator.py +1 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/config_generator.py +55 -8
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/demo_accounts.py +7 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/eval/adversarial_scorer.py +20 -11
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/eval/eval_engine.py +29 -14
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/eval/eval_service.py +15 -26
- observal_cli-0.3.3/observal-server/services/eval/kernel.py +1825 -0
- observal_cli-0.3.3/observal-server/services/eval/kernel_bridge.py +428 -0
- observal_cli-0.3.3/observal-server/services/eval/kernel_scorer.py +492 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/eval/ragas_eval.py +5 -4
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/eval/sanitizer.py +20 -9
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/eval/score_aggregator.py +58 -13
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/eval/slm_scorer.py +4 -3
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/eval/structural_scorer.py +238 -94
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/events.py +20 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/git_mirror_service.py +7 -2
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/hook_materializer.py +5 -4
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/redis.py +54 -11
- observal_cli-0.3.3/observal-server/services/request_context.py +44 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/tests/test_jwt.py +1 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/tests/test_multi_tenancy.py +1 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/uv.lock +214 -5
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/worker.py +47 -23
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/client.py +2 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_auth.py +567 -200
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_doctor.py +290 -14
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_hook.py +5 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_mcp.py +40 -17
- observal_cli-0.3.3/observal_cli/cmd_migrate.py +1635 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_ops.py +554 -31
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_profile.py +16 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_prompt.py +5 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_pull.py +49 -12
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_sandbox.py +5 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_scan.py +540 -116
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_skill.py +5 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/config.py +4 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/constants.py +4 -2
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/hooks/flush_buffer.py +20 -1
- observal_cli-0.3.3/observal_cli/hooks/gemini_hook.py +180 -0
- observal_cli-0.3.3/observal_cli/hooks/gemini_stop_hook.py +119 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/hooks/kiro_hook.py +17 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/hooks/kiro_stop_hook.py +17 -2
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/hooks/observal-hook.sh +10 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/hooks/observal-stop-hook.sh +18 -7
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/hooks_spec.py +8 -4
- observal_cli-0.3.3/observal_cli/pyinstaller.spec +85 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/otel-collector-config.yaml +2 -2
- observal_cli-0.3.3/prometheus.yml +11 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/pyproject.toml +7 -8
- observal_cli-0.3.3/screenshots/01-review-queue.png +0 -0
- observal_cli-0.3.3/screenshots/02-detail-sheet-mcp.png +0 -0
- observal_cli-0.3.3/screenshots/03-after-bulk-approve.png +0 -0
- observal_cli-0.3.3/screenshots/04-rejection-reason-skills.png +0 -0
- observal_cli-0.3.3/scripts/check_dco.sh +44 -0
- observal_cli-0.3.3/scripts/check_secrets.sh +51 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/README.md +1 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_eval_phase8.py +142 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_agent_composition.py +14 -3
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_agent_config_generator.py +79 -5
- observal_cli-0.3.3/tests/test_agent_name_lookup.py +225 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_audit_logging.py +124 -132
- observal_cli-0.3.3/tests/test_auth2_security.py +568 -0
- observal_cli-0.3.3/tests/test_clickhouse_resource_tuning.py +427 -0
- observal_cli-0.3.3/tests/test_config_generator_utils.py +37 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_demo_accounts.py +17 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_deployment_guards.py +1 -2
- observal_cli-0.3.3/tests/test_device_auth.py +528 -0
- observal_cli-0.3.3/tests/test_endpoint_discovery.py +144 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_enterprise.py +73 -34
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_env_detection_and_config.py +130 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_health.py +9 -2
- observal_cli-0.3.3/tests/test_ide_config_e2e.py +1727 -0
- observal_cli-0.3.3/tests/test_listing_detail_access.py +286 -0
- observal_cli-0.3.3/tests/test_migrate_telemetry.py +1279 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_review_queue.py +2 -1
- observal_cli-0.3.3/tests/test_saml.py +796 -0
- observal_cli-0.3.3/tests/test_saml_scim_integration.py +845 -0
- observal_cli-0.3.3/tests/test_scim.py +298 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_shim_phase3.py +10 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_telemetry_collection.py +22 -4
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_worker_phase5.py +34 -15
- observal_cli-0.3.3/tools/release.sh +164 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/uv.lock +60 -20
- observal_cli-0.3.3/web/AGENTS.md +101 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/package.json +1 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/pnpm-lock.yaml +8 -0
- observal_cli-0.3.3/web/src/app/(admin)/audit-log/page.tsx +260 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(admin)/dashboard/page.tsx +62 -4
- observal_cli-0.3.3/web/src/app/(admin)/diagnostics/page.tsx +169 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(admin)/errors/page.tsx +1 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(admin)/eval/[agentId]/page.tsx +16 -21
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(admin)/eval/page.tsx +25 -14
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(admin)/layout.tsx +1 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(admin)/review/page.tsx +43 -103
- observal_cli-0.3.3/web/src/app/(admin)/security-events/page.tsx +248 -0
- observal_cli-0.3.3/web/src/app/(admin)/settings/page.tsx +486 -0
- observal_cli-0.3.3/web/src/app/(admin)/sso/page.tsx +405 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(admin)/users/page.tsx +108 -12
- observal_cli-0.3.3/web/src/app/(auth)/device/page.tsx +161 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(auth)/login/page.tsx +147 -88
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(registry)/agents/[id]/page.tsx +22 -15
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(registry)/agents/builder/page.tsx +17 -5
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(registry)/agents/page.tsx +28 -10
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(registry)/components/[id]/page.tsx +3 -2
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(registry)/components/page.tsx +52 -19
- observal_cli-0.3.3/web/src/app/(registry)/leaderboard/page.tsx +394 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(registry)/page.tsx +4 -3
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(user)/traces/[id]/page.tsx +46 -15
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(user)/traces/page.tsx +1 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/builder/preview-panel.tsx +56 -7
- observal_cli-0.3.3/web/src/components/dashboard/efficiency-metrics.tsx +213 -0
- observal_cli-0.3.3/web/src/components/dashboard/score-overview.tsx +160 -0
- observal_cli-0.3.3/web/src/components/dashboard/session-dag.tsx +627 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/nav/registry-sidebar.tsx +11 -3
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/install-dialog.tsx +2 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/pull-command.tsx +2 -1
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/submit-component-dialog.tsx +143 -50
- observal_cli-0.3.3/web/src/components/review/review-detail-sheet.tsx +708 -0
- observal_cli-0.3.3/web/src/components/review/validation-badges.tsx +90 -0
- observal_cli-0.3.3/web/src/components/ui/checkbox.tsx +28 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/hooks/use-api.ts +93 -3
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/hooks/use-deployment-config.ts +1 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/lib/api.ts +50 -7
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/lib/ide-features.ts +5 -2
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/lib/types.ts +124 -7
- observal_cli-0.3.3/web/src/lib/utils.ts +46 -0
- observal_cli-0.2.0/.github/workflows/deploy.yml +0 -44
- observal_cli-0.2.0/.github/workflows/publish.yml +0 -48
- observal_cli-0.2.0/CHANGELOG.md +0 -337
- observal_cli-0.2.0/PKG-INFO +0 -528
- observal_cli-0.2.0/README.md +0 -492
- observal_cli-0.2.0/SETUP.md +0 -470
- observal_cli-0.2.0/docker/entrypoint.sh +0 -22
- observal_cli-0.2.0/docs/cli.md +0 -369
- observal_cli-0.2.0/docs/eval.md +0 -112
- observal_cli-0.2.0/docs/kiro-setup.md +0 -298
- observal_cli-0.2.0/docs/superpowers/specs/2026-04-19-unarchive-agent-design.md +0 -117
- observal_cli-0.2.0/ee/observal_server/routes/scim.py +0 -35
- observal_cli-0.2.0/ee/observal_server/routes/sso_saml.py +0 -23
- observal_cli-0.2.0/ee/observal_server/services/audit.py +0 -172
- observal_cli-0.2.0/ee/observal_server/services/config_validator.py +0 -34
- observal_cli-0.2.0/magic-agent.json +0 -28
- observal_cli-0.2.0/observal-server/api/ratelimit.py +0 -14
- observal_cli-0.2.0/observal-server/api/routes/config.py +0 -16
- observal_cli-0.2.0/observal-server/api/routes/scan.py +0 -219
- observal_cli-0.2.0/observal_cli/cmd_migrate.py +0 -764
- observal_cli-0.2.0/web/AGENTS.md +0 -5
- observal_cli-0.2.0/web/src/app/(admin)/settings/page.tsx +0 -273
- observal_cli-0.2.0/web/src/app/(registry)/agents/leaderboard/page.tsx +0 -249
- observal_cli-0.2.0/web/src/lib/utils.ts +0 -16
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.dockerignore +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.editorconfig +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.gitattributes +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.github/ISSUE_TEMPLATE/bug_report_form.yml +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.github/pull_request_template.md +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.github/workflows/codeql.yml +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/.github/workflows/dco.yml +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/CODE_OF_CONDUCT.md +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/LICENSE +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/SECURITY.md +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/demo/README.md +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/demo/run_demo.sh +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/demo/test_all_types.sh +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docker/Dockerfile.web +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/ObservalLogo-removebg-preview.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/agent-builder.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/agents-list.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/command-palette.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/components-list.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/dashboard.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/errors.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/eval-no-config.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/leaderboard.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/login-local.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/registry-home.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/review.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/session-info-claude-code.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/settings.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/traces.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/images/users.png +0 -0
- {observal_cli-0.2.0/docs → observal_cli-0.3.3/docs/internal}/kiro-compatibility-matrix.md +0 -0
- {observal_cli-0.2.0/docs → observal_cli-0.3.3/docs/internal}/kiro-research-notes.md +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/logo-light.svg +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/docs/logo.svg +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/ee/LICENSE +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/ee/README.md +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/ee/observal_server/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/ee/observal_server/middleware/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/ee/observal_server/middleware/enterprise_guard.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/ee/observal_server/routes/audit.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/ee/observal_server/services/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/ee/plugins/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/grafana/dashboards/agent-activity.json +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/grafana/dashboards/audit-log.json +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/grafana/dashboards/cost-tracking.json +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/grafana/dashboards/error-rates.json +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/grafana/dashboards/performance-resources.json +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/grafana/dashboards/scores-eval.json +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/grafana/dashboards/session-overview.json +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/grafana/dashboards/token-usage.json +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/grafana/dashboards/tool-call-frequency.json +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/grafana/provisioning/dashboards/default.yaml +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/grafana/provisioning/datasources/clickhouse.yaml +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/README +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/env.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/script.py.mako +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/.gitkeep +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0001_add_rbac_roles_and_is_demo.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0002_add_password_reset_tokens.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0003_add_api_keys_table.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0004_normalize_email_case.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0005_drop_password_reset_tokens.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0006_drop_api_keys_and_legacy_key_hash.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0007_add_alert_history.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0008_add_mcp_framework_column.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0009_add_docker_image_to_mcp_listings.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0010_add_agents_name_uniqueness.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0011_agent_review_and_bundles.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0012_add_username_to_users.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0013_add_mcp_command_args_url_headers.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0014_add_draft_to_listing_status.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0015_add_webhook_secret_to_alert_rules.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic/versions/0016_add_ide_feature_fields.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/alembic.ini +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/middleware/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/middleware/content_type.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/jwks.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/routes/telemetry.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/api/sanitize.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/agent.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/agent_component.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/alert.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/alert_history.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/base.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/component_bundle.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/component_source.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/download.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/enterprise_config.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/eval.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/exporter_config.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/feedback.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/hook.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/mcp.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/password_reset_token.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/prompt.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/sandbox.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/sanitization.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/scoring.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/skill.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/models/submission.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/admin.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/alert.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/bulk.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/component_source.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/eval.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/feedback.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/judge_output.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/schemas/telemetry.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/agent_resolver.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/alert_evaluator.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/cache.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/crypto.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/download_tracker.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/eval/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/eval/canary.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/eval/eval_watchdog.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/hook_config_generator.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/ide_feature_inference.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/jwt_service.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/mcp_validator.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/registry_telemetry.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/sandbox_config_generator.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/secrets_redactor.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/security_events.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/skill_config_generator.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/versioning.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/webhook_delivery.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/services/webhook_signer.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/tests/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/tests/conftest.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/tests/test_config.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/tests/test_crypto.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/tests/test_payload_protection.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/tests/test_rbac.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal-server/tests/test_security_events.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/README.md +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/analyzer.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/branding.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_agent.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/cmd_uninstall.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/hooks/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/hooks/buffer_event.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/hooks/payload_crypto.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/main.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/prompts.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/proxy.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/render.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/requirements.txt +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/sandbox_runner.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/settings_reconciler.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/shim.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/observal_cli/telemetry_buffer.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/renovate.json +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/scripts/check_migrations.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/scripts/new_migration.sh +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/scripts/seed_test_skill.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/test-agent.json +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/conftest.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/__init__.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_adversarial_self.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_eval_completeness.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_phase8a_sanitizer.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_phase8b_matching.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_phase8d_adversarial.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_phase8e_canary.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_phase8g_pipeline.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_ragas_eval.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_score_aggregator.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_slm_scorer.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/eval/test_structural_scorer.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/mock_mcp.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_agent_review.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_alert_evaluator.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_auth_redis_down.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_bulk.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_bundles.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_cli_errors.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_clickhouse_phase1.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_clickhouse_retention.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_constants_sync.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_docker_detection.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_draft_workflow.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_events.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_field_validation.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_git_mirror.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_graphql_phase6.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_ingest_phase2.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_migrate.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_payload_crypto.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_phase9_10.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_proxy_phase4.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_pull_and_agent_cli.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_registry_types.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_resilience.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_sanitize.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_scan_kiro_home.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_schema_redesign.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_secrets_redactor.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_settings_reconciler.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_skill_config_generator.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_uninstall.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_uninstall_windows.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_versioning.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_webhook_delivery.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_webhook_signer.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/tests/test_webhook_signer_properties.py +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/.gitignore +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/README.md +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/helpers.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/kiro-agent-compat.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/kiro-cli.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/kiro-hooks.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/kiro-lifecycle.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/kiro-live.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/kiro-otlp-logs.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/kiro-otlp-traces.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/kiro-web-agents.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/kiro-web-traces.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/shim-merge.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/sso-login.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/e2e/unarchive-agent.spec.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/eslint.config.mjs +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/next.config.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/playwright.config.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/pnpm-workspace.yaml +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/postcss.config.mjs +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/public/file.svg +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/public/globe.svg +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/public/next.svg +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/public/vercel.svg +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/public/window.svg +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(auth)/layout.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(registry)/layout.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/(user)/layout.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/favicon.ico +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/globals.css +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/icon.png +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/layout.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/app/providers.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/builder/sortable-component-list.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/builder/validation-panel.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/agent-aggregate-chart.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/bar-list.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/dashboard-card.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/dimension-radar.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/export-button.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/latency-heatmap.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/no-data.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/penalty-accordion.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/query-error.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/stat-card.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/time-range-select.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/top-items-card.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/dashboard/trend-chart.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/layouts/admin-guard.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/layouts/auth-guard.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/layouts/dashboard-shell.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/layouts/page-header.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/layouts/role-guard.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/nav/command-menu.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/nav/github-star-banner.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/nav/nav-user.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/agent-card.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/component-card.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/feedback-list.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/ide-badges.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/metrics-panel.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/registry-detail.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/registry-table.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/review-form.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/registry/status-badge.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/shared/empty-state.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/shared/error-state.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/shared/skeleton-layouts.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/traces/span-tree.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/traces/trace-detail.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/traces/trace-list.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/avatar.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/badge.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/breadcrumb.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/button.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/card.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/command.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/dialog.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/dropdown-menu.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/input.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/label.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/popover.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/progress.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/resizable.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/scroll-area.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/select.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/separator.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/sheet.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/sidebar.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/skeleton.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/sonner.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/switch.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/table.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/tabs.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/textarea.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/theme-switcher.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/components/ui/tooltip.tsx +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/hooks/use-admin-guard.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/hooks/use-auth.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/hooks/use-mobile.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/hooks/use-role-guard.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/lib/export.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/lib/graphql-ws.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/src/lib/query-client.ts +0 -0
- {observal_cli-0.2.0 → observal_cli-0.3.3}/web/tsconfig.json +0 -0
|
@@ -20,6 +20,12 @@ EVAL_MODEL_API_KEY=
|
|
|
20
20
|
EVAL_MODEL_NAME=
|
|
21
21
|
EVAL_MODEL_PROVIDER=
|
|
22
22
|
|
|
23
|
+
# Moonshot / Kimi example (OpenAI-compatible). URL and Thinking-Mode toggle
|
|
24
|
+
# are handled automatically when PROVIDER=moonshot.
|
|
25
|
+
# EVAL_MODEL_PROVIDER=moonshot
|
|
26
|
+
# EVAL_MODEL_API_KEY=sk-...
|
|
27
|
+
# EVAL_MODEL_NAME=kimi-k2.5-preview
|
|
28
|
+
|
|
23
29
|
# Optional: AWS credentials for Bedrock eval engine
|
|
24
30
|
AWS_ACCESS_KEY_ID=
|
|
25
31
|
AWS_SECRET_ACCESS_KEY=
|
|
@@ -51,6 +57,10 @@ DEMO_REVIEWER_PASSWORD=reviewer-changeme
|
|
|
51
57
|
DEMO_USER_EMAIL=user@demo.example
|
|
52
58
|
DEMO_USER_PASSWORD=user-changeme
|
|
53
59
|
|
|
60
|
+
# Resource limits (adjust based on your server's available RAM)
|
|
61
|
+
# CLICKHOUSE_MEMORY_LIMIT=2G
|
|
62
|
+
# OTEL_MEMORY_LIMIT=512M
|
|
63
|
+
|
|
54
64
|
# Host port mappings (change these if defaults conflict with other services)
|
|
55
65
|
# API_HOST_PORT=8000
|
|
56
66
|
# POSTGRES_HOST_PORT=5432
|
|
@@ -60,3 +70,13 @@ DEMO_USER_PASSWORD=user-changeme
|
|
|
60
70
|
# OTEL_GRPC_HOST_PORT=4317
|
|
61
71
|
# OTEL_HTTP_HOST_PORT=4318
|
|
62
72
|
# GRAFANA_HOST_PORT=3001
|
|
73
|
+
|
|
74
|
+
# Horizontal scaling (multi-instance deployments)
|
|
75
|
+
# API_REPLICAS=1
|
|
76
|
+
# WORKER_REPLICAS=1
|
|
77
|
+
# CLICKHOUSE_MEMORY_LIMIT=2G
|
|
78
|
+
# DB_POOL_SIZE=10
|
|
79
|
+
# DB_MAX_OVERFLOW=20
|
|
80
|
+
# REDIS_MAX_CONNECTIONS=50
|
|
81
|
+
# CLICKHOUSE_MAX_CONNECTIONS=20
|
|
82
|
+
# GIT_MIRROR_BASE_PATH=
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
name: Deploy to EC2
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
concurrency:
|
|
9
|
+
group: deploy-ec2
|
|
10
|
+
cancel-in-progress: false
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
deploy:
|
|
14
|
+
runs-on: ubuntu-latest
|
|
15
|
+
timeout-minutes: 15
|
|
16
|
+
steps:
|
|
17
|
+
- name: Deploy to EC2
|
|
18
|
+
uses: appleboy/ssh-action@v1
|
|
19
|
+
with:
|
|
20
|
+
host: ${{ secrets.EC2_HOST }}
|
|
21
|
+
username: ubuntu
|
|
22
|
+
key: ${{ secrets.EC2_SSH_KEY }}
|
|
23
|
+
script: |
|
|
24
|
+
set -e
|
|
25
|
+
cd ~/Observal
|
|
26
|
+
git fetch origin main
|
|
27
|
+
git reset --hard origin/main
|
|
28
|
+
|
|
29
|
+
cd docker
|
|
30
|
+
docker compose -f docker-compose.yml -f docker-compose.production.yml up -d --build --remove-orphans
|
|
31
|
+
|
|
32
|
+
# Phase 1: Wait for API container to be alive (bypasses nginx).
|
|
33
|
+
# Uses direct container exec because curl through nginx fails
|
|
34
|
+
# when nginx caches a stale upstream IP from the old container.
|
|
35
|
+
echo "Waiting for API container to start..."
|
|
36
|
+
for i in $(seq 1 60); do
|
|
37
|
+
if docker compose exec -T observal-api python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/livez')" 2>/dev/null; then
|
|
38
|
+
echo "API process is alive"
|
|
39
|
+
break
|
|
40
|
+
fi
|
|
41
|
+
echo "Waiting for API process... ($i/60)"
|
|
42
|
+
sleep 5
|
|
43
|
+
done
|
|
44
|
+
|
|
45
|
+
# Nginx caches upstream container IPs — after rebuild the API
|
|
46
|
+
# gets a new IP but nginx still routes to the old one.
|
|
47
|
+
docker compose -f docker-compose.yml -f docker-compose.production.yml restart observal-lb
|
|
48
|
+
sleep 3
|
|
49
|
+
|
|
50
|
+
# Phase 2: Verify health through nginx (the path clients use)
|
|
51
|
+
for i in $(seq 1 30); do
|
|
52
|
+
if curl -sf https://localhost/health -k > /dev/null 2>&1; then
|
|
53
|
+
echo "API is healthy (full stack verified)"
|
|
54
|
+
exit 0
|
|
55
|
+
fi
|
|
56
|
+
echo "Waiting for health check... ($i/30)"
|
|
57
|
+
sleep 5
|
|
58
|
+
done
|
|
59
|
+
|
|
60
|
+
echo "API failed health check"
|
|
61
|
+
docker compose logs observal-api observal-init observal-lb observal-db observal-clickhouse --tail 20
|
|
62
|
+
exit 1
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
# Automated release pipeline for Observal.
|
|
2
|
+
#
|
|
3
|
+
# Triggered automatically when a release PR merges to main (detected by
|
|
4
|
+
# bump(release) commit), or manually via workflow_dispatch with a version input.
|
|
5
|
+
# Creates the git tag, then builds: CLI binaries (6 platforms), Docker images
|
|
6
|
+
# (GHCR), server tarball, PyPI package. All releases require approval.
|
|
7
|
+
|
|
8
|
+
name: Release
|
|
9
|
+
|
|
10
|
+
on:
|
|
11
|
+
push:
|
|
12
|
+
branches: [main]
|
|
13
|
+
workflow_dispatch:
|
|
14
|
+
inputs:
|
|
15
|
+
version:
|
|
16
|
+
description: "Version to release (e.g. 0.3.2). Leave empty to auto-detect from commit."
|
|
17
|
+
required: false
|
|
18
|
+
type: string
|
|
19
|
+
|
|
20
|
+
concurrency:
|
|
21
|
+
group: release
|
|
22
|
+
cancel-in-progress: false
|
|
23
|
+
|
|
24
|
+
permissions:
|
|
25
|
+
contents: write
|
|
26
|
+
packages: write
|
|
27
|
+
id-token: write
|
|
28
|
+
attestations: write
|
|
29
|
+
|
|
30
|
+
env:
|
|
31
|
+
REGISTRY: ghcr.io
|
|
32
|
+
IMAGE_PREFIX: ghcr.io/blazeup-ai/observal
|
|
33
|
+
|
|
34
|
+
jobs:
|
|
35
|
+
# ── Preflight: detect release commit and create tag ────────
|
|
36
|
+
preflight:
|
|
37
|
+
name: Preflight checks
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
outputs:
|
|
40
|
+
version: ${{ steps.version.outputs.version }}
|
|
41
|
+
bump_type: ${{ steps.version.outputs.bump_type }}
|
|
42
|
+
is_release: ${{ steps.version.outputs.is_release }}
|
|
43
|
+
steps:
|
|
44
|
+
- name: Generate release app token
|
|
45
|
+
id: app-token
|
|
46
|
+
uses: actions/create-github-app-token@v3
|
|
47
|
+
with:
|
|
48
|
+
client-id: ${{ vars.RELEASE_APP_CLIENT_ID }}
|
|
49
|
+
private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
|
50
|
+
|
|
51
|
+
- uses: actions/checkout@v4
|
|
52
|
+
with:
|
|
53
|
+
fetch-depth: 0
|
|
54
|
+
token: ${{ steps.app-token.outputs.token }}
|
|
55
|
+
|
|
56
|
+
- name: Detect release version
|
|
57
|
+
id: version
|
|
58
|
+
run: |
|
|
59
|
+
# Manual dispatch with explicit version takes priority
|
|
60
|
+
if [ -n "${{ inputs.version }}" ]; then
|
|
61
|
+
VERSION="${{ inputs.version }}"
|
|
62
|
+
echo "is_release=true" >> "$GITHUB_OUTPUT"
|
|
63
|
+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
|
|
64
|
+
else
|
|
65
|
+
COMMIT_MSG=$(git log -1 --pretty=%s)
|
|
66
|
+
if [[ "$COMMIT_MSG" =~ ^bump\(release\):\ v([0-9]+\.[0-9]+\.[0-9]+) ]]; then
|
|
67
|
+
VERSION="${BASH_REMATCH[1]}"
|
|
68
|
+
echo "is_release=true" >> "$GITHUB_OUTPUT"
|
|
69
|
+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
|
|
70
|
+
else
|
|
71
|
+
echo "is_release=false" >> "$GITHUB_OUTPUT"
|
|
72
|
+
exit 0
|
|
73
|
+
fi
|
|
74
|
+
fi
|
|
75
|
+
|
|
76
|
+
# Validate version matches pyproject.toml
|
|
77
|
+
PKG_VERSION=$(python3 -c "import re, pathlib; m = re.search(r'^version\s*=\s*\"([^\"]+)\"', pathlib.Path('pyproject.toml').read_text(), re.M); print(m.group(1))")
|
|
78
|
+
if [ "$VERSION" != "$PKG_VERSION" ]; then
|
|
79
|
+
echo "::error::Release version v$VERSION does not match pyproject.toml ($PKG_VERSION)"
|
|
80
|
+
exit 1
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# Detect bump type by comparing to previous tag
|
|
84
|
+
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "v0.0.0")
|
|
85
|
+
PREV="${PREV_TAG#v}"
|
|
86
|
+
IFS='.' read -r PM PMI PP <<< "$PREV"
|
|
87
|
+
IFS='.' read -r CM CMI CP <<< "$VERSION"
|
|
88
|
+
if [ "$CM" != "$PM" ]; then
|
|
89
|
+
echo "bump_type=major" >> "$GITHUB_OUTPUT"
|
|
90
|
+
elif [ "$CMI" != "$PMI" ]; then
|
|
91
|
+
echo "bump_type=feature" >> "$GITHUB_OUTPUT"
|
|
92
|
+
else
|
|
93
|
+
echo "bump_type=patch" >> "$GITHUB_OUTPUT"
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
- name: Create release tag
|
|
97
|
+
if: steps.version.outputs.is_release == 'true'
|
|
98
|
+
run: |
|
|
99
|
+
VERSION="v${{ steps.version.outputs.version }}"
|
|
100
|
+
git config user.name "observal-release[bot]"
|
|
101
|
+
git config user.email "observal-release[bot]@users.noreply.github.com"
|
|
102
|
+
git tag -a "$VERSION" -m "Release $VERSION"
|
|
103
|
+
git push origin "$VERSION"
|
|
104
|
+
|
|
105
|
+
# ── Job 1: Build CLI binaries (5-platform matrix) ──────────
|
|
106
|
+
cli-binaries:
|
|
107
|
+
name: CLI (${{ matrix.os }}-${{ matrix.arch }})
|
|
108
|
+
needs: preflight
|
|
109
|
+
if: needs.preflight.outputs.is_release == 'true'
|
|
110
|
+
strategy:
|
|
111
|
+
fail-fast: false
|
|
112
|
+
matrix:
|
|
113
|
+
include:
|
|
114
|
+
- os: linux
|
|
115
|
+
arch: x64
|
|
116
|
+
runner: ubuntu-latest
|
|
117
|
+
artifact: observal-linux-x64
|
|
118
|
+
- os: linux
|
|
119
|
+
arch: arm64
|
|
120
|
+
runner: ubuntu-24.04-arm
|
|
121
|
+
artifact: observal-linux-arm64
|
|
122
|
+
- os: macos
|
|
123
|
+
arch: arm64
|
|
124
|
+
runner: macos-15
|
|
125
|
+
artifact: observal-macos-arm64
|
|
126
|
+
- os: windows
|
|
127
|
+
arch: x64
|
|
128
|
+
runner: windows-latest
|
|
129
|
+
artifact: observal-windows-x64.exe
|
|
130
|
+
- os: windows
|
|
131
|
+
arch: arm64
|
|
132
|
+
runner: windows-latest
|
|
133
|
+
artifact: observal-windows-arm64.exe
|
|
134
|
+
runs-on: ${{ matrix.runner }}
|
|
135
|
+
steps:
|
|
136
|
+
- uses: actions/checkout@v4
|
|
137
|
+
|
|
138
|
+
- uses: actions/setup-python@v5
|
|
139
|
+
with:
|
|
140
|
+
python-version: "3.12"
|
|
141
|
+
cache: pip
|
|
142
|
+
|
|
143
|
+
- name: Install dependencies
|
|
144
|
+
run: |
|
|
145
|
+
pip install pyinstaller
|
|
146
|
+
pip install -e .
|
|
147
|
+
|
|
148
|
+
- name: Build binary
|
|
149
|
+
run: |
|
|
150
|
+
pyinstaller observal_cli/pyinstaller.spec --noconfirm
|
|
151
|
+
env:
|
|
152
|
+
TARGET_ARCH: ${{ matrix.arch }}
|
|
153
|
+
|
|
154
|
+
- name: Rename artifact (Unix)
|
|
155
|
+
if: matrix.os != 'windows'
|
|
156
|
+
run: mv dist/observal dist/${{ matrix.artifact }}
|
|
157
|
+
|
|
158
|
+
- name: Rename artifact (Windows)
|
|
159
|
+
if: matrix.os == 'windows'
|
|
160
|
+
run: mv dist/observal.exe dist/${{ matrix.artifact }}
|
|
161
|
+
|
|
162
|
+
- uses: actions/upload-artifact@v4
|
|
163
|
+
with:
|
|
164
|
+
name: ${{ matrix.artifact }}
|
|
165
|
+
path: dist/${{ matrix.artifact }}
|
|
166
|
+
|
|
167
|
+
# ── Job 2: Docker images to GHCR (native per-arch builds) ──
|
|
168
|
+
docker-build:
|
|
169
|
+
name: Docker (${{ matrix.image }}-${{ matrix.arch }})
|
|
170
|
+
needs: preflight
|
|
171
|
+
if: needs.preflight.outputs.is_release == 'true'
|
|
172
|
+
strategy:
|
|
173
|
+
fail-fast: false
|
|
174
|
+
matrix:
|
|
175
|
+
image: [api, web]
|
|
176
|
+
arch: [amd64, arm64]
|
|
177
|
+
include:
|
|
178
|
+
- arch: amd64
|
|
179
|
+
runner: ubuntu-latest
|
|
180
|
+
platform: linux/amd64
|
|
181
|
+
- arch: arm64
|
|
182
|
+
runner: ubuntu-24.04-arm
|
|
183
|
+
platform: linux/arm64
|
|
184
|
+
runs-on: ${{ matrix.runner }}
|
|
185
|
+
steps:
|
|
186
|
+
- uses: actions/checkout@v4
|
|
187
|
+
|
|
188
|
+
- uses: docker/setup-buildx-action@v3
|
|
189
|
+
|
|
190
|
+
- uses: docker/login-action@v3
|
|
191
|
+
with:
|
|
192
|
+
registry: ${{ env.REGISTRY }}
|
|
193
|
+
username: ${{ github.actor }}
|
|
194
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
195
|
+
|
|
196
|
+
- name: Build and push by digest
|
|
197
|
+
id: build
|
|
198
|
+
uses: docker/build-push-action@v6
|
|
199
|
+
with:
|
|
200
|
+
context: .
|
|
201
|
+
file: docker/Dockerfile.${{ matrix.image }}
|
|
202
|
+
platforms: ${{ matrix.platform }}
|
|
203
|
+
provenance: false
|
|
204
|
+
outputs: type=image,name=${{ env.IMAGE_PREFIX }}-${{ matrix.image }},push-by-digest=true,name-canonical=true,push=true
|
|
205
|
+
cache-from: type=gha,scope=${{ matrix.image }}-${{ matrix.arch }}
|
|
206
|
+
cache-to: type=gha,scope=${{ matrix.image }}-${{ matrix.arch }},mode=max
|
|
207
|
+
|
|
208
|
+
- name: Export digest
|
|
209
|
+
run: |
|
|
210
|
+
mkdir -p /tmp/digests
|
|
211
|
+
digest="${{ steps.build.outputs.digest }}"
|
|
212
|
+
touch "/tmp/digests/${digest#sha256:}"
|
|
213
|
+
|
|
214
|
+
- uses: actions/upload-artifact@v4
|
|
215
|
+
with:
|
|
216
|
+
name: docker-digest-${{ matrix.image }}-${{ matrix.arch }}
|
|
217
|
+
path: /tmp/digests/*
|
|
218
|
+
if-no-files-found: error
|
|
219
|
+
retention-days: 1
|
|
220
|
+
|
|
221
|
+
docker-merge:
|
|
222
|
+
name: Docker manifest (${{ matrix.image }})
|
|
223
|
+
needs: [preflight, docker-build]
|
|
224
|
+
if: needs.preflight.outputs.is_release == 'true'
|
|
225
|
+
runs-on: ubuntu-latest
|
|
226
|
+
strategy:
|
|
227
|
+
matrix:
|
|
228
|
+
image: [api, web]
|
|
229
|
+
steps:
|
|
230
|
+
- name: Download digests
|
|
231
|
+
uses: actions/download-artifact@v4
|
|
232
|
+
with:
|
|
233
|
+
path: /tmp/digests
|
|
234
|
+
pattern: docker-digest-${{ matrix.image }}-*
|
|
235
|
+
merge-multiple: true
|
|
236
|
+
|
|
237
|
+
- uses: docker/setup-buildx-action@v3
|
|
238
|
+
|
|
239
|
+
- uses: docker/login-action@v3
|
|
240
|
+
with:
|
|
241
|
+
registry: ${{ env.REGISTRY }}
|
|
242
|
+
username: ${{ github.actor }}
|
|
243
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
244
|
+
|
|
245
|
+
- name: Create manifest list and push
|
|
246
|
+
run: |
|
|
247
|
+
IMAGE="${{ env.IMAGE_PREFIX }}-${{ matrix.image }}"
|
|
248
|
+
VERSION="${{ needs.preflight.outputs.version }}"
|
|
249
|
+
docker buildx imagetools create \
|
|
250
|
+
-t "$IMAGE:$VERSION" \
|
|
251
|
+
-t "$IMAGE:latest" \
|
|
252
|
+
$(printf "$IMAGE@sha256:%s " $(ls /tmp/digests/))
|
|
253
|
+
|
|
254
|
+
# ── Job 3: Server deployment tarball ───────────────────────
|
|
255
|
+
server-package:
|
|
256
|
+
name: Server package
|
|
257
|
+
needs: preflight
|
|
258
|
+
if: needs.preflight.outputs.is_release == 'true'
|
|
259
|
+
runs-on: ubuntu-latest
|
|
260
|
+
steps:
|
|
261
|
+
- uses: actions/checkout@v4
|
|
262
|
+
|
|
263
|
+
- name: Build server tarball
|
|
264
|
+
run: |
|
|
265
|
+
VERSION="${{ needs.preflight.outputs.version }}"
|
|
266
|
+
STAGING="observal-server-v${VERSION}"
|
|
267
|
+
mkdir -p "$STAGING/docker/server-package"
|
|
268
|
+
mkdir -p "$STAGING/docker/clickhouse"
|
|
269
|
+
mkdir -p "$STAGING/grafana"
|
|
270
|
+
|
|
271
|
+
# Docker Compose and configs
|
|
272
|
+
cp docker/docker-compose.yml "$STAGING/docker/"
|
|
273
|
+
cp docker/Dockerfile.api "$STAGING/docker/"
|
|
274
|
+
cp docker/Dockerfile.web "$STAGING/docker/"
|
|
275
|
+
cp docker/entrypoint.sh "$STAGING/docker/"
|
|
276
|
+
cp docker/nginx.conf "$STAGING/docker/"
|
|
277
|
+
cp -r docker/clickhouse/ "$STAGING/docker/clickhouse/"
|
|
278
|
+
cp -r docker/server-package/ "$STAGING/docker/server-package/"
|
|
279
|
+
|
|
280
|
+
# Application source
|
|
281
|
+
cp -r observal-server/ "$STAGING/observal-server/"
|
|
282
|
+
cp -r ee/ "$STAGING/ee/"
|
|
283
|
+
cp -r web/ "$STAGING/web/"
|
|
284
|
+
cp -r grafana/ "$STAGING/grafana/"
|
|
285
|
+
cp pyproject.toml "$STAGING/"
|
|
286
|
+
cp otel-collector-config.yaml "$STAGING/"
|
|
287
|
+
cp prometheus.yml "$STAGING/"
|
|
288
|
+
cp .env.example "$STAGING/"
|
|
289
|
+
|
|
290
|
+
tar -czf "observal-server-v${VERSION}.tar.gz" "$STAGING"
|
|
291
|
+
|
|
292
|
+
- uses: actions/upload-artifact@v4
|
|
293
|
+
with:
|
|
294
|
+
name: observal-server-v${{ needs.preflight.outputs.version }}.tar.gz
|
|
295
|
+
path: observal-server-v${{ needs.preflight.outputs.version }}.tar.gz
|
|
296
|
+
|
|
297
|
+
# ── Approval gate (all releases) ────────────────────────────
|
|
298
|
+
approve:
|
|
299
|
+
name: Approval gate
|
|
300
|
+
needs: [preflight, cli-binaries, docker-merge, server-package]
|
|
301
|
+
runs-on: ubuntu-latest
|
|
302
|
+
environment: production
|
|
303
|
+
steps:
|
|
304
|
+
- run: echo "${{ needs.preflight.outputs.bump_type }} release v${{ needs.preflight.outputs.version }} approved"
|
|
305
|
+
|
|
306
|
+
# ── Job 4: PyPI publish (after approval) ───────────────────
|
|
307
|
+
pypi:
|
|
308
|
+
name: Publish to PyPI
|
|
309
|
+
needs: [preflight, approve]
|
|
310
|
+
if: needs.approve.result == 'success'
|
|
311
|
+
runs-on: ubuntu-latest
|
|
312
|
+
environment: pypi
|
|
313
|
+
permissions:
|
|
314
|
+
id-token: write
|
|
315
|
+
steps:
|
|
316
|
+
- uses: actions/checkout@v4
|
|
317
|
+
|
|
318
|
+
- uses: astral-sh/setup-uv@v3
|
|
319
|
+
with:
|
|
320
|
+
enable-cache: true
|
|
321
|
+
|
|
322
|
+
- name: Build sdist and wheel
|
|
323
|
+
run: uv build
|
|
324
|
+
|
|
325
|
+
- name: Publish to PyPI
|
|
326
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
327
|
+
|
|
328
|
+
# ── Final: Create GitHub Release with all artifacts ────────
|
|
329
|
+
release:
|
|
330
|
+
name: GitHub Release
|
|
331
|
+
needs: [preflight, cli-binaries, docker-merge, server-package, pypi, approve]
|
|
332
|
+
if: needs.approve.result == 'success'
|
|
333
|
+
runs-on: ubuntu-latest
|
|
334
|
+
steps:
|
|
335
|
+
- uses: actions/checkout@v4
|
|
336
|
+
with:
|
|
337
|
+
fetch-depth: 0
|
|
338
|
+
|
|
339
|
+
- name: Download release artifacts
|
|
340
|
+
uses: actions/download-artifact@v4
|
|
341
|
+
with:
|
|
342
|
+
path: artifacts
|
|
343
|
+
pattern: observal-*
|
|
344
|
+
|
|
345
|
+
- name: Flatten artifacts
|
|
346
|
+
run: |
|
|
347
|
+
mkdir -p release
|
|
348
|
+
find artifacts -type f \( -name 'observal-*' -o -name '*.tar.gz' \) -exec cp {} release/ \;
|
|
349
|
+
|
|
350
|
+
- name: Generate checksums
|
|
351
|
+
run: |
|
|
352
|
+
cd release
|
|
353
|
+
sha256sum * > checksums.txt
|
|
354
|
+
|
|
355
|
+
- name: Generate release notes
|
|
356
|
+
run: |
|
|
357
|
+
pip install git-cliff
|
|
358
|
+
git-cliff --config cliff.toml --latest --strip header > release/RELEASE_NOTES.md
|
|
359
|
+
|
|
360
|
+
- name: Attest build provenance
|
|
361
|
+
uses: actions/attest-build-provenance@v2
|
|
362
|
+
with:
|
|
363
|
+
subject-path: "release/observal-*"
|
|
364
|
+
|
|
365
|
+
- name: Create GitHub Release
|
|
366
|
+
env:
|
|
367
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
368
|
+
run: |
|
|
369
|
+
VERSION="v${{ needs.preflight.outputs.version }}"
|
|
370
|
+
|
|
371
|
+
gh release create "$VERSION" \
|
|
372
|
+
--draft \
|
|
373
|
+
--title "Observal $VERSION" \
|
|
374
|
+
--notes-file release/RELEASE_NOTES.md \
|
|
375
|
+
--latest \
|
|
376
|
+
release/*
|
|
377
|
+
|
|
378
|
+
- name: Publish release (remove draft)
|
|
379
|
+
env:
|
|
380
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
381
|
+
run: |
|
|
382
|
+
VERSION="v${{ needs.preflight.outputs.version }}"
|
|
383
|
+
gh release edit "$VERSION" --draft=false
|
|
@@ -7,13 +7,27 @@ dist/
|
|
|
7
7
|
build/
|
|
8
8
|
.eggs/
|
|
9
9
|
|
|
10
|
-
# IDE
|
|
10
|
+
# IDE / editor
|
|
11
11
|
.vscode/
|
|
12
12
|
.idea/
|
|
13
13
|
*.swp
|
|
14
14
|
*.swo
|
|
15
15
|
*~
|
|
16
16
|
|
|
17
|
+
# AI agent / coding tool configs
|
|
18
|
+
.claude/
|
|
19
|
+
CLAUDE.md
|
|
20
|
+
.kiro/
|
|
21
|
+
.cursor/
|
|
22
|
+
.cursorignore
|
|
23
|
+
.cursorindexingignore
|
|
24
|
+
.gemini/
|
|
25
|
+
GEMINI.md
|
|
26
|
+
.opencode/
|
|
27
|
+
.github/copilot-instructions.md
|
|
28
|
+
.copilot/
|
|
29
|
+
.worktrees/
|
|
30
|
+
|
|
17
31
|
# OS
|
|
18
32
|
.DS_Store
|
|
19
33
|
Thumbs.db
|
|
@@ -32,10 +46,8 @@ observal-web/dist/
|
|
|
32
46
|
|
|
33
47
|
# Docker
|
|
34
48
|
docker/data/
|
|
49
|
+
docker/clickhouse/users.d/default-user.xml
|
|
35
50
|
|
|
36
|
-
# Local
|
|
37
|
-
.
|
|
38
|
-
|
|
39
|
-
CLAUDE.md
|
|
40
|
-
graphify-out/
|
|
41
|
-
observal-web/tsconfig.tsbuildinfo
|
|
51
|
+
# Local / ephemeral
|
|
52
|
+
.playwright-mcp/
|
|
53
|
+
e2e-screenshots/
|
|
@@ -24,6 +24,15 @@ repos:
|
|
|
24
24
|
- id: no-commit-to-branch
|
|
25
25
|
args: [--branch, main]
|
|
26
26
|
|
|
27
|
+
# ── Secrets / .env guard ───────────────────────────────
|
|
28
|
+
- repo: local
|
|
29
|
+
hooks:
|
|
30
|
+
- id: check-secrets
|
|
31
|
+
name: check for secrets and .env files
|
|
32
|
+
entry: scripts/check_secrets.sh
|
|
33
|
+
language: script
|
|
34
|
+
pass_filenames: false
|
|
35
|
+
|
|
27
36
|
# ── Alembic migrations ─────────────────────────────────
|
|
28
37
|
- repo: local
|
|
29
38
|
hooks:
|
|
@@ -34,6 +43,17 @@ repos:
|
|
|
34
43
|
files: ^observal-server/alembic/versions/.*\.py$
|
|
35
44
|
pass_filenames: false
|
|
36
45
|
|
|
46
|
+
# ── DCO sign-off (pre-push) ────────────────────────────
|
|
47
|
+
- repo: local
|
|
48
|
+
hooks:
|
|
49
|
+
- id: check-dco
|
|
50
|
+
name: check DCO sign-off on all commits
|
|
51
|
+
entry: scripts/check_dco.sh
|
|
52
|
+
language: script
|
|
53
|
+
always_run: true
|
|
54
|
+
pass_filenames: false
|
|
55
|
+
stages: [pre-push]
|
|
56
|
+
|
|
37
57
|
# ── Docker ─────────────────────────────────────────────
|
|
38
58
|
- repo: https://github.com/hadolint/hadolint
|
|
39
59
|
rev: v2.12.0
|