authsome 0.4.2__tar.gz → 0.5.0__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.
- authsome-0.5.0/.github/release-please-manifest.json +3 -0
- authsome-0.5.0/.gitleaksignore +2 -0
- {authsome-0.4.2 → authsome-0.5.0}/CHANGELOG.md +55 -0
- {authsome-0.4.2 → authsome-0.5.0}/CONTEXT.md +26 -12
- {authsome-0.4.2 → authsome-0.5.0}/PKG-INFO +7 -1
- authsome-0.5.0/docs/adr/0005-audit-otel-sqlite.md +22 -0
- authsome-0.5.0/docs/adr/0006-principal-roles-admin-user.md +18 -0
- authsome-0.5.0/docs/adr/0007-unified-deployment-flow.md +36 -0
- authsome-0.5.0/docs/internal/manual-testing.md +435 -0
- authsome-0.5.0/docs/refactor.md +336 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/roadmap.mdx +9 -4
- {authsome-0.4.2 → authsome-0.5.0}/pyproject.toml +7 -1
- authsome-0.5.0/src/authsome/audit/__init__.py +74 -0
- authsome-0.5.0/src/authsome/auth/browser_cookies.py +59 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/github.json +5 -2
- authsome-0.5.0/src/authsome/auth/bundled_providers/linkedin-browser.json +25 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/openai.json +1 -0
- authsome-0.5.0/src/authsome/auth/bundled_providers/x-browser.json +28 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/__init__.py +3 -2
- authsome-0.5.0/src/authsome/auth/flows/browser.py +184 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/models/__init__.py +1 -2
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/models/config.py +0 -8
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/models/connection.py +3 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/models/enums.py +2 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/models/provider.py +42 -2
- authsome-0.5.0/src/authsome/auth/utils.py +164 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/client.py +27 -10
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/daemon_control.py +18 -11
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/helpers.py +3 -1
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/main.py +174 -4
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/identity/__init__.py +0 -4
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/identity/local.py +1 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/identity/principal.py +9 -22
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/proxy/runner.py +2 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/proxy/server.py +72 -30
- authsome-0.4.2/src/authsome/server/hosted_auth.py → authsome-0.5.0/src/authsome/server/account_auth.py +13 -13
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/analytics.py +1 -1
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/app.py +21 -27
- authsome-0.5.0/src/authsome/server/credential_repository.py +248 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/credential_service.py +158 -334
- authsome-0.5.0/src/authsome/server/dependencies.py +162 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/identity_bootstrap.py +21 -39
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/ownership.py +24 -49
- authsome-0.5.0/src/authsome/server/provider_repository.py +67 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/proxy_catalog.py +22 -4
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/_deps.py +51 -22
- authsome-0.5.0/src/authsome/server/routes/audit.py +40 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/auth.py +16 -7
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/connections.py +3 -3
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/health.py +16 -13
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/identities.py +1 -1
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/providers.py +3 -3
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/ui.py +168 -90
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/schemas.py +32 -2
- authsome-0.5.0/src/authsome/server/secrets.py +120 -0
- authsome-0.5.0/src/authsome/server/store/__init__.py +6 -0
- authsome-0.5.0/src/authsome/server/store/database.py +237 -0
- authsome-0.5.0/src/authsome/server/store/repositories.py +677 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/ui_sessions.py +11 -11
- authsome-0.5.0/src/authsome/server/web_pages/__init__.py +7 -0
- {authsome-0.4.2/src/authsome/server/ui → authsome-0.5.0/src/authsome/server/web_pages}/pages.py +13 -13
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/static/app.js +1 -1
- authsome-0.5.0/src/authsome/ui/static/style.css +1130 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/_app_detail_shell.html +1 -1
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/_layout.html +22 -11
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/app_detail_apikey.html +1 -1
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/app_detail_disconnected.html +2 -2
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/app_detail_managed.html +4 -3
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/app_detail_oauth.html +2 -2
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/app_provider.html +3 -3
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/applications.html +19 -3
- authsome-0.5.0/src/authsome/ui/templates/audit.html +71 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/connections.html +3 -2
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/identity.html +10 -3
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/templates/overview.html +16 -17
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/utils.py +1 -129
- authsome-0.5.0/src/authsome/vault/__init__.py +85 -0
- authsome-0.5.0/src/authsome/vault/crypto.py +143 -0
- authsome-0.5.0/tests/auth/test_browser_cookies.py +99 -0
- authsome-0.5.0/tests/auth/test_browser_flow.py +196 -0
- authsome-0.5.0/tests/auth/test_browser_service.py +171 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/auth/test_models.py +2 -2
- {authsome-0.4.2 → authsome-0.5.0}/tests/auth/test_service.py +71 -21
- {authsome-0.4.2 → authsome-0.5.0}/tests/auth/test_service_provider_clients.py +67 -38
- authsome-0.5.0/tests/auth/test_service_provider_definitions.py +77 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_daemon.py +21 -21
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_init.py +0 -5
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_revoke.py +1 -1
- authsome-0.5.0/tests/common/test_utils.py +46 -0
- authsome-0.5.0/tests/identity/test_registry.py +52 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/proxy/test_proxy.py +44 -32
- authsome-0.5.0/tests/server/test_account_auth.py +99 -0
- authsome-0.5.0/tests/server/test_audit_events.py +97 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/server/test_auth_sessions.py +3 -10
- authsome-0.5.0/tests/server/test_credential_repository.py +144 -0
- authsome-0.5.0/tests/server/test_identity_bootstrap.py +56 -0
- authsome-0.5.0/tests/server/test_ownership.py +63 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/server/test_pop_auth.py +38 -31
- {authsome-0.4.2 → authsome-0.5.0}/tests/server/test_provider_operation_policy.py +47 -20
- authsome-0.5.0/tests/server/test_provider_repository.py +82 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/server/test_ui_dashboard.py +93 -61
- {authsome-0.4.2 → authsome-0.5.0}/tests/server/test_ui_sessions.py +39 -52
- authsome-0.5.0/tests/test_import_boundaries.py +48 -0
- authsome-0.5.0/tests/vault/test_crypto.py +115 -0
- {authsome-0.4.2 → authsome-0.5.0}/uv.lock +341 -1
- authsome-0.4.2/.github/release-please-manifest.json +0 -3
- authsome-0.4.2/TODOS.md +0 -274
- authsome-0.4.2/docs/internal/manual-testing.md +0 -429
- authsome-0.4.2/docs/refactor.md +0 -503
- authsome-0.4.2/src/authsome/audit/__init__.py +0 -85
- authsome-0.4.2/src/authsome/auth/utils.py +0 -55
- authsome-0.4.2/src/authsome/cli/admin.py +0 -193
- authsome-0.4.2/src/authsome/server/dependencies.py +0 -238
- authsome-0.4.2/src/authsome/server/registries.py +0 -266
- authsome-0.4.2/src/authsome/server/ui/__init__.py +0 -1
- authsome-0.4.2/src/authsome/store/__init__.py +0 -5
- authsome-0.4.2/src/authsome/store/interfaces.py +0 -47
- authsome-0.4.2/src/authsome/store/local.py +0 -54
- authsome-0.4.2/src/authsome/ui/static/style.css +0 -717
- authsome-0.4.2/src/authsome/vault/__init__.py +0 -123
- authsome-0.4.2/src/authsome/vault/crypto.py +0 -273
- authsome-0.4.2/tests/common/test_audit.py +0 -28
- authsome-0.4.2/tests/common/test_utils.py +0 -101
- authsome-0.4.2/tests/identity/test_registry.py +0 -41
- authsome-0.4.2/tests/server/test_analytics.py +0 -43
- authsome-0.4.2/tests/server/test_hosted_auth.py +0 -83
- authsome-0.4.2/tests/server/test_identity_bootstrap.py +0 -66
- authsome-0.4.2/tests/server/test_ownership.py +0 -63
- authsome-0.4.2/tests/vault/test_crypto.py +0 -312
- {authsome-0.4.2 → authsome-0.5.0}/.claude/commands/run-evals.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.claude-plugin/marketplace.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.github/dependabot.yml +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.github/pull_request_template.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.github/release-please-config.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.github/workflows/pr-title.yml +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.github/workflows/publish-rc.yml +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.github/workflows/publish.yml +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.github/workflows/release-please.yml +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.github/workflows/test.yml +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.gitignore +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/.pre-commit-config.yaml +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/AGENTS.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/CLAUDE.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/CONTRIBUTING.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/LICENSE +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/README.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/assets/authsome-how-it-works-dark.svg +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/assets/authsome-how-it-works-light.svg +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/assets/authsome-logo-dark.svg +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/assets/authsome-logo-light.svg +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/UBIQUITOUS_LANGUAGE.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/adr/0001-provider-client-record-server-scope.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/adr/0002-server-registered-identities.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/adr/0003-principal-owned-vault.md +0 -0
- /authsome-0.4.2/docs/adr/0003-proxy-unmatched-pass-through.md → /authsome-0.5.0/docs/adr/0004-proxy-unmatched-pass-through.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/agents/domain.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/agents/issue-tracker.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/agents/triage-labels.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/internal/authsome-design.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/internal/cli-design-review.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/register-provider.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/README.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/changelog.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/compared.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/architecture.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/credential-storage.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/profiles-vs-connections.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/provider-registry.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/proxy-injection.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/concepts/the-daemon.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/docs.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/favicon.svg +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/custom-providers.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/headless-device-code.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/login-with-oauth.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/multiple-connections.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/profiles.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/run-agents-with-proxy.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/guides/use-api-keys.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/images/login-github-authsome.png +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/index.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/installation.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/anthropic-sdk.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/claude-code.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/codex.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/cowork.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/cursor.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/hermes.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/index.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/langchain.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/llamaindex.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/nanoclaw.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/openai-agents-sdk.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/opencode.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/agents/python.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/ahrefs.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/apollo.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/ashby.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/beehiiv.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/brevo.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/buffer.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/calendly.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/clearbit.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/dub.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/g2.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/hunter.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/index.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/instantly.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/intercom.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/keywords-everywhere.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/klaviyo.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/lemlist.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/livestorm.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/mailchimp.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/mention-me.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/openai.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/optimizely.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/postmark.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/resend.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/rewardful.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/savvycal.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/semrush.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/sendgrid.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/tolt.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/typeform.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/wistia.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/api-key/zapier.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/atlassian.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/discord.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/github.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/gitlab.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/google.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/hubspot.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/index.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/klaviyo-oauth.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/linear.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/microsoft.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/notion-dcr.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/notion.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/postiz.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/slack.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/integrations/oauth/x.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/logo/dark.svg +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/logo/light.svg +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/quickstart.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/audit-log.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/bundled-providers.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/cli.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/daemon-api.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/environment-variables.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/file-layout.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/provider-schema.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/reference/python-library.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/security/daemon-trust-boundary.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/security/disclosure.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/security/encryption.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/security/hosted-deployment.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/security/threat-model.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/snippets/masked-input-note.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/snippets/multi-connections-cta.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/snippets/whats-next-apikey.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/snippets/whats-next-oauth.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/auth-errors.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/daemon-issues.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/doctor.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/oauth-callbacks.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/proxy-networking.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/docs/site/troubleshooting/token-refresh.mdx +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/evals/.gitignore +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/evals/evals.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/evals/generate_report.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/skills/authsome/SKILL.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/skills/authsome/references/adding-provider.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/skills/authsome/references/feedback.md +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/ahrefs.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/apollo.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/ashby.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/atlassian.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/beehiiv.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/brevo.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/buffer.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/calendly.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/clearbit.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/discord.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/dub.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/g2.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/gitlab.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/google.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/hubspot.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/hunter.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/instantly.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/intercom.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/keywords-everywhere.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/klaviyo-oauth.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/klaviyo.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/lemlist.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/linear.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/livestorm.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/mailchimp.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/mention-me.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/microsoft.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/notion.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/notion_dcr.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/optimizely.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/postiz.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/postmark.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/resend.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/rewardful.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/savvycal.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/semrush.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/sendgrid.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/slack.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/tolt.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/typeform.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/wistia.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/x.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/bundled_providers/zapier.json +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/api_key.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/base.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/dcr_pkce.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/device_code.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/flows/pkce.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/input_provider.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/auth/sessions.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/client_config.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/cli/context.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/errors.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/identity/proof.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/identity/registry.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/paths.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/proxy/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/proxy/certs.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/proxy/router.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/py.typed +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/daemon.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/routes/proxy.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/server/urls.py +0 -0
- {authsome-0.4.2/src/authsome/server/ui → authsome-0.5.0/src/authsome/server/web_pages}/web_theme.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/src/authsome/ui/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/auth/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/auth/test_flows.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/auth/test_url_template.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/conftest.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_client_signing.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_doctor.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_get.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_helpers.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_identity.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_import_env.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_list.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_login.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_logout.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_register.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/cli/test_whoami.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/common/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/common/test_errors.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/common/test_logging.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/conftest.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/identity/test_identity.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/identity/test_proof.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/proxy/__init__.py +0 -0
- {authsome-0.4.2 → authsome-0.5.0}/tests/vault/__init__.py +0 -0
|
@@ -1,5 +1,60 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.5.0](https://github.com/agentrhq/authsome/compare/authsome-v0.4.2...authsome-v0.5.0) (2026-05-29)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### ⚠ BREAKING CHANGES
|
|
7
|
+
|
|
8
|
+
* existing local installs have an unclaimed identity under local@authsome.internal and are rejected until the user registers a principal (email+password) and claims the identity.
|
|
9
|
+
* existing Fernet-encrypted vaults cannot be read back; migration requires re-importing credentials.
|
|
10
|
+
* mount dashboard at / instead of /ui
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
* add admin audit dashboard ([1bc5044](https://github.com/agentrhq/authsome/commit/1bc504472ace6629e88a9ad06531c927ff31da26))
|
|
15
|
+
* add Anthropic and Gemini bundled providers ([1e47c48](https://github.com/agentrhq/authsome/commit/1e47c48b07ee76d5a9dfdd58c238150316dca2a0))
|
|
16
|
+
* add Anthropic and Gemini bundled providers ([e788328](https://github.com/agentrhq/authsome/commit/e78832884f69492978a097587374d0e3853371db))
|
|
17
|
+
* add browser SSO via Chrome cookie reading (browser-cookie3) ([aeb4263](https://github.com/agentrhq/authsome/commit/aeb426357f43abe6a13b3684de135c3e6e110166))
|
|
18
|
+
* Add docs for design of principal roles and audit ([de33f8a](https://github.com/agentrhq/authsome/commit/de33f8a5148ff9f6d30e5b392b76e57af751b5ed))
|
|
19
|
+
* add principal_role parameter to AuthService and dependency injection routes ([7d43b56](https://github.com/agentrhq/authsome/commit/7d43b567c8c3e0eec8e4ef33b7fd0eb53cb431b4))
|
|
20
|
+
* browser SSO via Chrome cookie reading (browser-cookie3) ([7607600](https://github.com/agentrhq/authsome/commit/7607600eba2e62125aac801cd09ad28f3948cf3c))
|
|
21
|
+
* implement audit events and principal roles ([9503710](https://github.com/agentrhq/authsome/commit/950371088ba46e5f38086dd0c7fccabd0333f83d))
|
|
22
|
+
* implement audit events and principal roles ([0ed077b](https://github.com/agentrhq/authsome/commit/0ed077b9df60808f840d37460de3a75c5dd8303c))
|
|
23
|
+
* move daemon management commands from admin module to main CLI ([397a8e8](https://github.com/agentrhq/authsome/commit/397a8e8e0aa1142a432ba1af73a3f4235ecccfd9))
|
|
24
|
+
* move daemon management commands from admin module to main CLI ([af356d5](https://github.com/agentrhq/authsome/commit/af356d5f4ff435488484c736516cdad1f61780f4))
|
|
25
|
+
* replace flat master-key vault encryption with Argon2id KEK/DEK model ([b76903d](https://github.com/agentrhq/authsome/commit/b76903d74b61ff469a4221d41e95713a04bdaeb2))
|
|
26
|
+
* respect AUTHSOME_DAEMON_URL in all daemon control paths ([fa23037](https://github.com/agentrhq/authsome/commit/fa23037d73c6c1cc2892654eca6a5d6931f79243))
|
|
27
|
+
* respect AUTHSOME_DAEMON_URL in all daemon control paths ([1ba904b](https://github.com/agentrhq/authsome/commit/1ba904bf0db74fb20e43a370fecf559e97e1f95c))
|
|
28
|
+
* server store refactor ([acb2013](https://github.com/agentrhq/authsome/commit/acb20132f04ef05c81f9d16ce6c2685607ee4171))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
### Bug Fixes
|
|
32
|
+
|
|
33
|
+
* added support for cookie expiry date ([5ea8aa9](https://github.com/agentrhq/authsome/commit/5ea8aa977e8d044420d4f469c047319ed1c3765c))
|
|
34
|
+
* Fix incorrect posthog key and remove unnecessary tests ([77c7bb7](https://github.com/agentrhq/authsome/commit/77c7bb7b24e9bd4f8135685127ff53617e9a73b1))
|
|
35
|
+
* Fix incorrect posthog key and remove unnecessary tests ([8f8d9b9](https://github.com/agentrhq/authsome/commit/8f8d9b9e59f6896dca3f3b6b14d33f363d4738b3))
|
|
36
|
+
* refresh DCR provider client on replace ([9af604d](https://github.com/agentrhq/authsome/commit/9af604d80d023ef0762f5f1c6ae41857302de0de))
|
|
37
|
+
* refresh DCR provider client on replace ([595de28](https://github.com/agentrhq/authsome/commit/595de28f25f5526f63cf6e9136291d86c6972754))
|
|
38
|
+
* remove extraneous admin command argument from daemon subprocess invocation ([2c43de6](https://github.com/agentrhq/authsome/commit/2c43de6449ad38f95bd80c6e6d1901b8526e952c))
|
|
39
|
+
* ruff check ([6dbef78](https://github.com/agentrhq/authsome/commit/6dbef782679cdb82a0735dfd879234316d34efad))
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
### Reverts
|
|
43
|
+
|
|
44
|
+
* display input fields for dcr providers ([6c108cb](https://github.com/agentrhq/authsome/commit/6c108cb44f5c63ee0c069f941ff2302e9f7a9ff3))
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
### Documentation
|
|
48
|
+
|
|
49
|
+
* correct manual testing guide against the current CLI surface ([0a7c379](https://github.com/agentrhq/authsome/commit/0a7c379c007afe1b01d48341b2df14f199411841))
|
|
50
|
+
* update manual testing guide for the unified claim flow ([70e5539](https://github.com/agentrhq/authsome/commit/70e5539a5924a96b7864862444957dc4e385f49e))
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
### Code Refactoring
|
|
54
|
+
|
|
55
|
+
* mount dashboard at / instead of /ui ([f8cf936](https://github.com/agentrhq/authsome/commit/f8cf93663f7a4bc757082155c6f4d6bde51da366))
|
|
56
|
+
* unify local and hosted into a single deployment flow ([63bd4c9](https://github.com/agentrhq/authsome/commit/63bd4c90aa10e31d4b11ad9b190f00f1e1e1a316))
|
|
57
|
+
|
|
3
58
|
## [0.4.2](https://github.com/agentrhq/authsome/compare/authsome-v0.4.1...authsome-v0.4.2) (2026-05-25)
|
|
4
59
|
|
|
5
60
|
|
|
@@ -88,18 +88,19 @@ Think of this as the secrets layer. Encrypts and decrypts credential blobs trans
|
|
|
88
88
|
|
|
89
89
|
### `audit/` — Structured event recording
|
|
90
90
|
|
|
91
|
-
Think of this as the
|
|
91
|
+
Think of this as the audit instrumentation layer. Defines what happened; `server/` decides where it goes.
|
|
92
92
|
|
|
93
93
|
**Owns:**
|
|
94
|
-
- `AuditEvent` model
|
|
95
|
-
- `log()` / `alog()` —
|
|
96
|
-
-
|
|
94
|
+
- `AuditEvent` domain model — mandatory fields: `identity`, `principal_id`, `provider`, `connection`; optional: `method`, `path`, `status`, `metadata`
|
|
95
|
+
- `log()` / `alog()` — emit an `AuditEvent` as an OTel `LogRecord` via `get_logger_provider()`
|
|
96
|
+
- Translation from `AuditEvent` → OTel `LogRecord`
|
|
97
97
|
|
|
98
98
|
**Does not own:**
|
|
99
|
-
-
|
|
100
|
-
-
|
|
99
|
+
- Storage — no file I/O, no database
|
|
100
|
+
- Provider lifecycle (`setup()` / `clear()` removed — owned by `server/`)
|
|
101
|
+
- Knowledge of where events are routed
|
|
101
102
|
|
|
102
|
-
**Imports nothing from this codebase.** Imported by: `
|
|
103
|
+
**Imports:** `opentelemetry-api` only (no SDK, no storage). **Imports nothing from this codebase.** Imported by: `server/`, `proxy/`
|
|
103
104
|
|
|
104
105
|
---
|
|
105
106
|
|
|
@@ -120,6 +121,9 @@ Think of this as the daemon process. Wires identity + auth + vault + audit toget
|
|
|
120
121
|
- `server/app.py` — FastAPI application factory and lifespan
|
|
121
122
|
- `server/routes/` — HTTP API surface
|
|
122
123
|
- `server/schemas.py` — API response schemas
|
|
124
|
+
- `server/audit_store.py` — `SQLiteLogExporter` (OTel `LogExporter` impl) + `AuditStore` query interface; `LoggerProvider` lifecycle (setup at startup, shutdown at teardown)
|
|
125
|
+
- `server/routes/audit.py` — `GET /audit/events` (filtered, paginated admin read)
|
|
126
|
+
- `POST /audit/events` — ingest endpoint for proxy-side external AuditEvents; server enriches `principal_id` from PoP JWT
|
|
123
127
|
|
|
124
128
|
**All filesystem interaction for server-owned state lives here.** No other module writes to server-owned paths.
|
|
125
129
|
|
|
@@ -141,6 +145,7 @@ A mitmproxy-based HTTPS proxy. Intercepts outgoing agent requests and injects au
|
|
|
141
145
|
- Credential loading (asks the server)
|
|
142
146
|
- Route catalog construction (asks the server)
|
|
143
147
|
- Provider definitions
|
|
148
|
+
- Audit storage — ships External AuditEvents to server via `POST /audit/events` (fire-and-forget); does not call `audit.log()` directly
|
|
144
149
|
|
|
145
150
|
**Imported by:** `cli/`
|
|
146
151
|
|
|
@@ -178,12 +183,15 @@ Click-based CLI and HTTP client. Everything here is a client to the server HTTP
|
|
|
178
183
|
|
|
179
184
|
**PoP JWT**: Short-lived (60 s) Proof-of-Possession token signed with the Identity's Ed25519 private key. Bound to `htm`, `htu`, `body_sha256`. Sent as `Authorization: PoP <token>`.
|
|
180
185
|
|
|
181
|
-
**Principal**: Non-cryptographic logical partition (human or team) that owns Vaults. Identified by an opaque **PrincipalId** (e.g., `principal_abc123def456`). Has no cryptographic key.
|
|
186
|
+
**Principal**: Non-cryptographic logical partition (human or team) that owns Vaults. Identified by an opaque **PrincipalId** (e.g., `principal_abc123def456`). Has no cryptographic key. Carries exactly one **PrincipalRole**.
|
|
182
187
|
_Avoid_: User, account, PrincipalHandle, profile
|
|
183
188
|
|
|
184
189
|
**PrincipalId**: Opaque stable identifier for a Principal. Never the email or handle — those can change; the PrincipalId cannot.
|
|
185
190
|
_Avoid_: principal_handle, principal_name, username
|
|
186
191
|
|
|
192
|
+
**PrincipalRole**: Authorization tier for a Principal. Either `admin` or `user`. The first Principal created on a server is always `admin`; all subsequent Principals are `user`. Stored as a column on the Principal record — not in environment variables or a separate table.
|
|
193
|
+
_Avoid_: permission level, access level, user type
|
|
194
|
+
|
|
187
195
|
**Vault**: Named credential store owned by exactly one Principal. Identified by an opaque **VaultId** (e.g., `vault_a1b2c3d4e5f6`). All credential store keys are prefixed `vault:<vault_id>:...`.
|
|
188
196
|
_Avoid_: credential store, token store, secret store, profile store
|
|
189
197
|
|
|
@@ -192,7 +200,7 @@ _Avoid_: vault_name, vault_handle
|
|
|
192
200
|
|
|
193
201
|
**VaultHandle**: Human-readable name for a Vault (e.g., `default`). Used in UIs and CLI; the VaultId is authoritative in storage.
|
|
194
202
|
|
|
195
|
-
**IdentityClaimRecord**: Binding from an Identity (Handle) to a Principal (PrincipalId) with a `ClaimStatus`. Created
|
|
203
|
+
**IdentityClaimRecord**: Binding from an Identity (Handle) to a Principal (PrincipalId) with a `ClaimStatus`. Created when an authenticated Principal confirms the browser claim that `authsome init` initiates. Vault access is gated until the claim is accepted.
|
|
196
204
|
_Avoid_: Claim, IdentityRegistration (as claim), join request
|
|
197
205
|
|
|
198
206
|
**ClaimStatus**: Lifecycle state: `pending` → `accepted` | `rejected`.
|
|
@@ -201,9 +209,7 @@ _Avoid_: Claim, IdentityRegistration (as claim), join request
|
|
|
201
209
|
|
|
202
210
|
## Initialization & Claim Flow
|
|
203
211
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
**Hosted mode**: `authsome init --email manoj@example.com` creates an Identity, creates or finds the Principal by email, and registers an `IdentityClaimRecord` with `claim_status = pending`. A human reviews the claim in the UI and accepts or rejects it. All vault operations return `403` until the claim is accepted.
|
|
212
|
+
There is a single flow for every deployment — no deployment mode (see ADR 0007). `authsome init` creates an Identity and registers it; the daemon returns `registration_status = "claim_required"` with a browser **claim URL**. The user opens the URL and registers (or logs in) with **email + password**: the first Principal created on a server becomes `admin`, all subsequent Principals are `user`. The authenticated Principal then confirms the claim, which binds the Identity to the Principal and creates the Principal's default Vault. Until the claim is `accepted`, all vault operations return `403`. The CLI opens the claim URL automatically and polls for completion (and prints the URL to stderr for headless use).
|
|
207
213
|
|
|
208
214
|
---
|
|
209
215
|
|
|
@@ -240,6 +246,14 @@ AuthService does not query registries, does not know about server filesystem pat
|
|
|
240
246
|
|
|
241
247
|
Every `AuditEvent` carries `identity` (the agent Handle) and `principal_id` (the PrincipalId). Both are required — every auditable action has an acting agent and an owning principal.
|
|
242
248
|
|
|
249
|
+
**External AuditEvent**: An event produced by the proxy layer — records an outbound HTTP call an agent made through the proxy to a third-party API (e.g., a call to `api.github.com`). Classified by provider and connection. Mandatory fields: identity, principal_id, provider, connection. Optional fields: HTTP method, path, response status.
|
|
250
|
+
_Avoid_: proxy event, API event, outbound event
|
|
251
|
+
|
|
252
|
+
**Internal AuditEvent**: An event produced by the server layer — records credential lifecycle operations (login, logout, token refresh, revocation) and auth flow steps.
|
|
253
|
+
_Avoid_: server event, auth event, lifecycle event
|
|
254
|
+
|
|
255
|
+
**Audit delivery**: External AuditEvents are shipped from the proxy to the server via `POST /audit/events` (fire-and-forget, best-effort). The proxy does not write to a local audit file. The server is the single source of truth for all audit events. `principal_id` is resolved server-side from the PoP JWT on the ingest request — the proxy does not need to supply it.
|
|
256
|
+
|
|
243
257
|
---
|
|
244
258
|
|
|
245
259
|
## Flagged Ambiguities
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: authsome
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: A portable local authentication library for AI agents and developer tools
|
|
5
5
|
Author-email: Manoj Bajaj <manojbajaj95@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -14,8 +14,11 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
14
14
|
Classifier: Topic :: Security
|
|
15
15
|
Classifier: Topic :: Software Development :: Libraries
|
|
16
16
|
Requires-Python: >=3.13
|
|
17
|
+
Requires-Dist: aiosqlite>=0.20
|
|
17
18
|
Requires-Dist: argon2-cffi>=25.1.0
|
|
19
|
+
Requires-Dist: asyncpg>=0.30
|
|
18
20
|
Requires-Dist: base58>=2.1.1
|
|
21
|
+
Requires-Dist: browser-cookie3>=0.19
|
|
19
22
|
Requires-Dist: click>=8.0
|
|
20
23
|
Requires-Dist: cryptography>=41.0
|
|
21
24
|
Requires-Dist: fastapi>=0.115
|
|
@@ -23,6 +26,8 @@ Requires-Dist: jinja2>=3.1
|
|
|
23
26
|
Requires-Dist: keyring>=24.0
|
|
24
27
|
Requires-Dist: loguru>=0.7
|
|
25
28
|
Requires-Dist: mitmproxy>=11.0
|
|
29
|
+
Requires-Dist: opentelemetry-api>=1.42.1
|
|
30
|
+
Requires-Dist: opentelemetry-sdk>=1.42.1
|
|
26
31
|
Requires-Dist: posthog>=3.0
|
|
27
32
|
Requires-Dist: py-key-value-aio[disk]
|
|
28
33
|
Requires-Dist: pydantic>=2.0
|
|
@@ -32,6 +37,7 @@ Requires-Dist: requests>=2.28
|
|
|
32
37
|
Requires-Dist: uvicorn>=0.30
|
|
33
38
|
Provides-Extra: dev
|
|
34
39
|
Requires-Dist: httpx>=0.28.1; extra == 'dev'
|
|
40
|
+
Requires-Dist: pre-commit>=4.6.0; extra == 'dev'
|
|
35
41
|
Requires-Dist: pytest-asyncio>=1.3.0; extra == 'dev'
|
|
36
42
|
Requires-Dist: pytest-cov>=4.0; extra == 'dev'
|
|
37
43
|
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Audit events use OTel Logs API with a SQLite exporter owned by the server
|
|
2
|
+
|
|
3
|
+
The proxy runs on the client machine and the server runs remotely, so writing audit events to a local file produces two disjoint logs that an IT admin cannot view in one place. We need a single server-owned audit store that both the proxy and the server write into.
|
|
4
|
+
|
|
5
|
+
**Decision:** `audit/` is a pure leaf that imports only `opentelemetry-api`. It defines `AuditEvent`, translates it to an OTel `LogRecord`, and emits via the globally registered `LoggerProvider` — with no knowledge of where events go. `server/` owns a custom `SQLiteLogExporter` (implementing the OTel `LogExporter` interface), registers a `LoggerProvider` with a `BatchLogRecordProcessor` at daemon startup, and exposes `GET /audit/events` for admin queries. The proxy ships External AuditEvents to the server fire-and-forget via `POST /audit/events` rather than writing to a local file; the server enriches each inbound event with `principal_id` resolved from the PoP JWT.
|
|
6
|
+
|
|
7
|
+
**Considered alternatives:**
|
|
8
|
+
|
|
9
|
+
- *Flat JSON-lines file per process* — the current approach. Rejected because it produces two disjoint audit logs in the client/server topology, with no queryable interface for the admin view.
|
|
10
|
+
- *Proxy hosted on server* — rejected because it routes all agent traffic through the server machine, adding a network round-trip to every API call and making the server a traffic bottleneck.
|
|
11
|
+
- *Pure OTLP to an external collector* — rejected as the primary store because it requires operator-provisioned infrastructure. OTLP remains a valid future second exporter on the same `LoggerProvider` for teams that already run Grafana or Datadog.
|
|
12
|
+
- *SQLite owned by `audit/`* — rejected to preserve `audit/` as a dependency-free leaf. Storage decisions belong to `server/`, consistent with how all other server-owned state is managed.
|
|
13
|
+
|
|
14
|
+
**Not considered:** replacing loguru with OTel for operational logging. Loguru (68 call sites) serves developers debugging live systems — free-form, level-filtered, short-retention. Audit serves IT admins answering compliance questions — structured, required fields, long-retention, queryable. Routing loguru through the SQLite exporter would fill the admin view with operational noise. They are different things with different audiences and must stay separate.
|
|
15
|
+
|
|
16
|
+
**Consequences:**
|
|
17
|
+
|
|
18
|
+
- `audit/` gains `opentelemetry-api` as a dependency; `server/` gains `opentelemetry-sdk` and `aiosqlite` (or `sqlite3`).
|
|
19
|
+
- `audit.setup()` / `audit.clear()` are removed; `server/app.py` lifespan manages the `LoggerProvider`.
|
|
20
|
+
- The proxy's two existing direct `audit.log()` calls (`proxy_no_credentials`, `proxy_deny`) move to fire-and-forget HTTP posts to the server.
|
|
21
|
+
- A second OTLP exporter can be added to the `LoggerProvider` at any time without touching `audit/` or `proxy/`.
|
|
22
|
+
- All audit events — Internal (server) and External (proxy) — are queryable from a single `GET /audit/events` endpoint.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Principal roles: admin / user, first-created principal is admin
|
|
2
|
+
|
|
3
|
+
Principals need an authorization tier to gate deployment-level operations (audit log access, provider registration/deletion, cross-vault credential revocation) from per-principal operations (own connections, claim accept/reject). We store a `role` column (`admin` | `user`) directly on the `principals` table. The first Principal created on a server is assigned `admin`; all subsequent Principals receive `user`. Role assignment is immutable at creation time (mutation is deferred to a future milestone).
|
|
4
|
+
|
|
5
|
+
## Considered options
|
|
6
|
+
|
|
7
|
+
**Environment variable (`AUTHSOME_ADMIN_PRINCIPALS`)** — the prior approach. Rejected because it requires knowing the PrincipalId before the server starts, cannot be changed without a restart, and is invisible to the UI and route layer.
|
|
8
|
+
|
|
9
|
+
**Separate `principal_roles` table** — considered for future extensibility (multiple roles per principal). Rejected as premature: the role model is binary and a join adds complexity without benefit today.
|
|
10
|
+
|
|
11
|
+
**Default admin account created at server init** — would require deciding on credentials before any real user exists. Rejected in favour of first-user-becomes-admin: the first principal to register is admin, all subsequent principals are users. (Originally justified as "zero-config" for an implicit local principal; that implicit-principal path was later removed when local and hosted were unified into a single registration + claim flow — see ADR 0007. First-principal-is-admin remains the rule, now reached the same way in every deployment.)
|
|
12
|
+
|
|
13
|
+
## Consequences
|
|
14
|
+
|
|
15
|
+
- `AUTHSOME_ADMIN_PRINCIPALS` env var and `is_admin_principal()` are removed entirely.
|
|
16
|
+
- Admin enforcement at the route level uses a `get_admin_auth_service` FastAPI dependency (parallel to `get_protected_auth_service`) that raises `HTTP 403` for non-admin principals.
|
|
17
|
+
- Admin-only routes: `GET /audit/events`, `POST /providers`, `DELETE /providers/{provider}`, `POST /connections/{provider}/revoke`.
|
|
18
|
+
- Schema migration: `ALTER TABLE principals ADD COLUMN role TEXT NOT NULL DEFAULT 'user'`, followed by setting the earliest-created principal to `'admin'`.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Unified deployment flow: one registration + claim path for every deployment
|
|
2
|
+
|
|
3
|
+
The daemon previously branched on a deployment mode (`AUTHSOME_DEPLOYMENT_MODE`, defaulting to `local`) selected at startup, and ran two parallel implementations of nearly every ownership concept:
|
|
4
|
+
|
|
5
|
+
- **Local**: every Identity collapsed onto one synthetic Principal (`local@authsome.internal`); no claim was required; the Ed25519 PoP key was the only credential. Implemented by `LocalOwnershipResolver` and `LocalIdentityBootstrapService`.
|
|
6
|
+
- **Hosted**: each account was its own Principal authenticated by email+password in the browser; an Identity had to be explicitly claimed and accepted. Implemented by `HostedOwnershipResolver` and `HostedIdentityBootstrapService`.
|
|
7
|
+
|
|
8
|
+
Two code paths doubled the test surface, scattered `if get_deployment_mode() == "hosted"` branches across `dependencies.py`, `routes/_deps.py`, `routes/ui.py`, `routes/health.py`, and `credential_service.py`, and — most importantly — meant "local and hosted behave the same" was asserted in prose but never enforced in code, so the two paths were free to drift. The synthetic local Principal also had a latent wart: a second local Identity silently inherited the *admin* Principal and its Vault, which the hosted model would never allow.
|
|
9
|
+
|
|
10
|
+
## Decision
|
|
11
|
+
|
|
12
|
+
Collapse to a single flow, identical for every deployment. There is no deployment mode.
|
|
13
|
+
|
|
14
|
+
1. `authsome init` generates the Ed25519 Identity and registers it; the daemon returns `registration_status = "claim_required"` with a browser **claim URL**.
|
|
15
|
+
2. The user opens the claim URL and **registers (or logs in) with email + password**. The first Principal created on a server becomes **admin** (ADR 0006); all subsequent Principals are users.
|
|
16
|
+
3. The authenticated Principal **confirms the claim**, binding the Identity to the Principal and creating the Principal's default Vault.
|
|
17
|
+
4. PoP-authenticated calls are then authorized; `OwnershipResolver.resolve` requires an *accepted* claim.
|
|
18
|
+
|
|
19
|
+
The one irreducible difference between a single-machine and a networked deployment — *who authenticates the claiming Principal* — is resolved by always requiring the email+password browser step. Local is no longer special-cased; the local user is simply the first to sign up and therefore the admin.
|
|
20
|
+
|
|
21
|
+
The CLI (`AuthsomeApiClient.ensure_identity_ready`) was already mode-agnostic: it reacts to `claim_required` by opening the browser and polling, so it required no behavioural change. It now prints the claim URL to stderr so headless users can complete the step manually.
|
|
22
|
+
|
|
23
|
+
This supersedes the local/hosted split described in ADR 0003 (§ "local mode … hosted mode") and the "zero-config local" rationale in ADR 0006.
|
|
24
|
+
|
|
25
|
+
## Considered alternatives
|
|
26
|
+
|
|
27
|
+
**Single resolver with an injected claim-acceptance policy** (local auto-accepts, hosted requires a human). Keeps one code path while preserving local's zero-config experience. Rejected by explicit product decision: we want local and hosted to be byte-for-byte identical, with no second path or policy seam to maintain.
|
|
28
|
+
|
|
29
|
+
**Keep two resolvers, only harden with tests + docs.** Smallest change, but leaves the drift risk and duplicate test surface in place. Rejected.
|
|
30
|
+
|
|
31
|
+
## Consequences
|
|
32
|
+
|
|
33
|
+
- `AUTHSOME_DEPLOYMENT_MODE`, `get_deployment_mode()`, `LOCAL_PRINCIPAL_EMAIL`, the `Local*`/`Hosted*` resolver and bootstrap classes, and the `AuthService(deployment_mode=...)` parameter are all removed. `OwnershipResolver` and `IdentityBootstrapService` are single concrete classes.
|
|
34
|
+
- Admin enforcement is purely role-based: `_ensure_admin_operation_allowed` / `_ensure_provider_client_mutation_allowed` raise for any non-admin Principal, in every deployment (previously non-admins were implicitly allowed in local mode because the sole local Principal was always admin).
|
|
35
|
+
- The server-rendered UI always requires a hosted browser session; the local filesystem-identity UI path is gone. `HealthResponse.mode` is removed.
|
|
36
|
+
- **Breaking change.** Existing local installs have an Identity registered with no accepted claim and data under the `local@authsome.internal` Principal/Vault. After upgrading, those Identities are rejected until the user registers a Principal (email+password) and claims the Identity. A migration that rebinds the existing local Vault to a freshly registered Principal is possible but is intentionally out of scope here.
|