authsome 0.3.2__tar.gz → 0.4.1__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.4.1/.github/release-please-manifest.json +3 -0
- {authsome-0.3.2 → authsome-0.4.1}/AGENTS.md +21 -10
- {authsome-0.3.2 → authsome-0.4.1}/CHANGELOG.md +58 -0
- authsome-0.4.1/CONTEXT.md +251 -0
- {authsome-0.3.2 → authsome-0.4.1}/CONTRIBUTING.md +3 -0
- {authsome-0.3.2 → authsome-0.4.1}/PKG-INFO +10 -1
- {authsome-0.3.2 → authsome-0.4.1}/README.md +8 -0
- authsome-0.4.1/TODOS.md +274 -0
- authsome-0.4.1/assets/authsome-logo-dark.svg +31 -0
- authsome-0.4.1/assets/authsome-logo-light.svg +31 -0
- authsome-0.4.1/docs/UBIQUITOUS_LANGUAGE.md +128 -0
- authsome-0.4.1/docs/adr/0003-principal-owned-vault.md +33 -0
- authsome-0.4.1/docs/adr/0003-proxy-unmatched-pass-through.md +47 -0
- authsome-0.4.1/docs/agents/domain.md +37 -0
- authsome-0.4.1/docs/agents/issue-tracker.md +22 -0
- authsome-0.4.1/docs/agents/triage-labels.md +15 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/internal/manual-testing.md +61 -48
- authsome-0.4.1/docs/refactor.md +503 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/docs.json +1 -0
- authsome-0.4.1/docs/site/favicon.svg +106 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/installation.mdx +11 -3
- authsome-0.4.1/docs/site/integrations/agents/hermes.mdx +166 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/index.mdx +4 -1
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/nanoclaw.mdx +6 -4
- authsome-0.4.1/docs/site/logo/dark.svg +31 -0
- authsome-0.4.1/docs/site/logo/light.svg +31 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/daemon-api.mdx +26 -2
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/file-layout.mdx +3 -3
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/security/encryption.mdx +20 -4
- {authsome-0.3.2 → authsome-0.4.1}/pyproject.toml +2 -1
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/__init__.py +0 -3
- authsome-0.4.1/src/authsome/auth/__init__.py +1 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/api_key.py +2 -2
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/base.py +2 -2
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/dcr_pkce.py +2 -2
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/device_code.py +2 -2
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/pkce.py +2 -2
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/models/config.py +1 -1
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/models/connection.py +12 -6
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/sessions.py +5 -2
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/utils.py +2 -10
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/client.py +64 -11
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/daemon_control.py +2 -6
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/main.py +72 -19
- authsome-0.4.1/src/authsome/identity/__init__.py +73 -0
- authsome-0.3.2/src/authsome/identity/keys.py → authsome-0.4.1/src/authsome/identity/local.py +62 -21
- authsome-0.4.1/src/authsome/identity/principal.py +61 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/identity/proof.py +1 -1
- authsome-0.4.1/src/authsome/identity/registry.py +19 -0
- authsome-0.4.1/src/authsome/server/analytics.py +63 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/app.py +26 -10
- authsome-0.3.2/src/authsome/auth/service.py → authsome-0.4.1/src/authsome/server/credential_service.py +174 -111
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/dependencies.py +108 -7
- authsome-0.4.1/src/authsome/server/hosted_auth.py +114 -0
- authsome-0.4.1/src/authsome/server/identity_bootstrap.py +116 -0
- authsome-0.4.1/src/authsome/server/ownership.py +116 -0
- authsome-0.4.1/src/authsome/server/proxy_catalog.py +73 -0
- authsome-0.4.1/src/authsome/server/registries.py +266 -0
- authsome-0.4.1/src/authsome/server/routes/_deps.py +180 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/routes/auth.py +103 -75
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/routes/connections.py +38 -26
- authsome-0.4.1/src/authsome/server/routes/health.py +153 -0
- authsome-0.4.1/src/authsome/server/routes/identities.py +45 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/routes/providers.py +19 -19
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/routes/proxy.py +13 -10
- authsome-0.4.1/src/authsome/server/routes/ui.py +821 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/schemas.py +6 -0
- authsome-0.4.1/src/authsome/server/ui/pages.py +421 -0
- authsome-0.4.1/src/authsome/server/ui_sessions.py +146 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/static/app.js +32 -2
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/static/style.css +85 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/_layout.html +12 -6
- authsome-0.4.1/src/authsome/ui/templates/app_detail_managed.html +24 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/app_detail_oauth.html +0 -46
- authsome-0.4.1/src/authsome/ui/templates/app_provider.html +128 -0
- authsome-0.4.1/src/authsome/ui/templates/applications.html +57 -0
- authsome-0.4.1/src/authsome/ui/templates/connections.html +51 -0
- authsome-0.4.1/src/authsome/ui/templates/identity.html +16 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/utils.py +40 -1
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/vault/__init__.py +62 -7
- authsome-0.4.1/src/authsome/vault/crypto.py +365 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/auth/test_flows.py +18 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/auth/test_models.py +6 -2
- {authsome-0.3.2 → authsome-0.4.1}/tests/auth/test_service.py +21 -5
- {authsome-0.3.2 → authsome-0.4.1}/tests/auth/test_service_provider_clients.py +156 -40
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/conftest.py +9 -1
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_client_signing.py +95 -3
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_identity.py +1 -1
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_init.py +12 -4
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_ui.py +4 -4
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_whoami.py +25 -1
- {authsome-0.3.2 → authsome-0.4.1}/tests/common/test_utils.py +4 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/conftest.py +1 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/identity/test_identity.py +27 -1
- {authsome-0.3.2 → authsome-0.4.1}/tests/identity/test_proof.py +1 -1
- authsome-0.4.1/tests/identity/test_registry.py +41 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/proxy/test_proxy.py +2 -2
- authsome-0.4.1/tests/server/test_analytics.py +43 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/server/test_auth_sessions.py +8 -2
- authsome-0.4.1/tests/server/test_hosted_auth.py +83 -0
- authsome-0.4.1/tests/server/test_identity_bootstrap.py +66 -0
- authsome-0.4.1/tests/server/test_ownership.py +63 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/server/test_pop_auth.py +87 -4
- {authsome-0.3.2 → authsome-0.4.1}/tests/server/test_provider_operation_policy.py +14 -1
- authsome-0.4.1/tests/server/test_ui_dashboard.py +516 -0
- authsome-0.4.1/tests/server/test_ui_sessions.py +292 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/vault/test_crypto.py +117 -3
- authsome-0.4.1/tests/vault/test_rekey.py +167 -0
- {authsome-0.3.2 → authsome-0.4.1}/uv.lock +152 -117
- authsome-0.3.2/.github/release-please-manifest.json +0 -3
- authsome-0.3.2/assets/authsome-logo-dark.svg +0 -6
- authsome-0.3.2/assets/authsome-logo-light.svg +0 -6
- authsome-0.3.2/docs/UBIQUITOUS_LANGUAGE.md +0 -111
- authsome-0.3.2/docs/site/favicon.svg +0 -4
- authsome-0.3.2/docs/site/logo/dark.svg +0 -6
- authsome-0.3.2/docs/site/logo/light.svg +0 -6
- authsome-0.3.2/src/authsome/auth/__init__.py +0 -8
- authsome-0.3.2/src/authsome/identity/__init__.py +0 -44
- authsome-0.3.2/src/authsome/identity/registry.py +0 -87
- authsome-0.3.2/src/authsome/server/analytics.py +0 -37
- authsome-0.3.2/src/authsome/server/routes/_deps.py +0 -96
- authsome-0.3.2/src/authsome/server/routes/health.py +0 -119
- authsome-0.3.2/src/authsome/server/routes/identities.py +0 -38
- authsome-0.3.2/src/authsome/server/routes/ui.py +0 -485
- authsome-0.3.2/src/authsome/server/ui/pages.py +0 -199
- authsome-0.3.2/src/authsome/server/ui_sessions.py +0 -128
- authsome-0.3.2/src/authsome/ui/templates/connections.html +0 -60
- authsome-0.3.2/src/authsome/vault/crypto.py +0 -153
- authsome-0.3.2/tests/server/test_ui_sessions.py +0 -115
- {authsome-0.3.2 → authsome-0.4.1}/.claude/commands/run-evals.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.claude-plugin/marketplace.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.github/dependabot.yml +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.github/pull_request_template.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.github/release-please-config.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.github/workflows/pr-title.yml +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.github/workflows/publish-rc.yml +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.github/workflows/publish.yml +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.github/workflows/release-please.yml +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.github/workflows/test.yml +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.gitignore +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/.pre-commit-config.yaml +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/CLAUDE.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/LICENSE +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/assets/authsome-how-it-works-dark.svg +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/assets/authsome-how-it-works-light.svg +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/adr/0001-provider-client-record-server-scope.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/adr/0002-server-registered-identities.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/internal/authsome-design.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/internal/cli-design-review.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/register-provider.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/README.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/changelog.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/compared.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/architecture.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/credential-storage.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/profiles-vs-connections.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/provider-registry.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/proxy-injection.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/concepts/the-daemon.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/custom-providers.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/headless-device-code.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/login-with-oauth.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/multiple-connections.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/profiles.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/run-agents-with-proxy.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/guides/use-api-keys.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/images/login-github-authsome.png +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/index.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/anthropic-sdk.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/claude-code.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/codex.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/cowork.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/cursor.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/langchain.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/llamaindex.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/openai-agents-sdk.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/opencode.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/agents/python.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/ahrefs.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/apollo.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/ashby.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/beehiiv.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/brevo.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/buffer.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/calendly.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/clearbit.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/dub.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/g2.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/hunter.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/index.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/instantly.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/intercom.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/keywords-everywhere.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/klaviyo.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/lemlist.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/livestorm.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/mailchimp.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/mention-me.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/openai.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/optimizely.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/postmark.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/resend.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/rewardful.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/savvycal.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/semrush.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/sendgrid.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/tolt.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/typeform.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/wistia.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/api-key/zapier.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/atlassian.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/discord.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/github.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/gitlab.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/google.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/hubspot.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/index.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/klaviyo-oauth.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/linear.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/microsoft.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/notion-dcr.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/notion.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/postiz.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/slack.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/integrations/oauth/x.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/quickstart.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/audit-log.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/bundled-providers.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/cli.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/environment-variables.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/provider-schema.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/reference/python-library.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/roadmap.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/security/daemon-trust-boundary.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/security/disclosure.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/security/hosted-deployment.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/security/threat-model.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/snippets/masked-input-note.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/snippets/multi-connections-cta.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/snippets/whats-next-apikey.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/snippets/whats-next-oauth.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/auth-errors.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/daemon-issues.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/doctor.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/oauth-callbacks.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/proxy-networking.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/docs/site/troubleshooting/token-refresh.mdx +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/evals/.gitignore +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/evals/evals.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/evals/generate_report.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/skills/authsome/SKILL.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/skills/authsome/references/adding-provider.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/skills/authsome/references/feedback.md +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/audit/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/ahrefs.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/apollo.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/ashby.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/atlassian.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/beehiiv.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/brevo.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/buffer.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/calendly.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/clearbit.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/discord.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/dub.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/g2.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/github.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/gitlab.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/google.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/hubspot.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/hunter.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/instantly.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/intercom.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/keywords-everywhere.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/klaviyo-oauth.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/klaviyo.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/lemlist.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/linear.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/livestorm.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/mailchimp.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/mention-me.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/microsoft.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/notion.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/notion_dcr.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/openai.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/optimizely.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/postiz.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/postmark.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/resend.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/rewardful.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/savvycal.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/semrush.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/sendgrid.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/slack.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/tolt.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/typeform.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/wistia.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/x.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/bundled_providers/zapier.json +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/flows/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/input_provider.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/models/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/models/enums.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/auth/models/provider.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/client_config.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/context.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/cli/helpers.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/errors.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/paths.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/proxy/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/proxy/certs.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/proxy/router.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/proxy/runner.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/proxy/server.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/py.typed +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/daemon.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/routes/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/ui/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/ui/web_theme.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/server/urls.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/store/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/store/interfaces.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/store/local.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/_app_detail_shell.html +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/app_detail_apikey.html +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/app_detail_disconnected.html +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/src/authsome/ui/templates/overview.html +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/auth/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/auth/test_url_template.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_daemon.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_doctor.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_get.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_helpers.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_import_env.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_list.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_login.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_logout.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_register.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/cli/test_revoke.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/common/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/common/test_audit.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/common/test_errors.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/common/test_logging.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/proxy/__init__.py +0 -0
- {authsome-0.3.2 → authsome-0.4.1}/tests/vault/__init__.py +0 -0
|
@@ -56,6 +56,8 @@ These rules govern all changes to this codebase — apply them without exception
|
|
|
56
56
|
|
|
57
57
|
**Deep modules over shallow ones.** Prefer a small surface area with rich internals over many thin wrappers. More files is not more modular.
|
|
58
58
|
|
|
59
|
+
**Composition over inheritance.** Prefer small collaborators wired together through explicit dependencies over inheritance hierarchies. Use inheritance only when there is a real subtype relationship and composition would make the design less clear.
|
|
60
|
+
|
|
59
61
|
**Single responsibility and separation of concerns.** Auth authenticates. Vault stores credentials. CLI presents output. A flow must not write to storage; storage must not know about OAuth. If a function is hard to name, it's doing too many things.
|
|
60
62
|
|
|
61
63
|
**No premature optimization.** Don't add caching, batching, or concurrency before a measured performance problem exists. Simple and slow is fixable; complex and wrong is not.
|
|
@@ -102,15 +104,24 @@ These rules govern all changes to this codebase — apply them without exception
|
|
|
102
104
|
|
|
103
105
|
## Architecture
|
|
104
106
|
|
|
105
|
-
**Identity (`src/authsome/identity
|
|
107
|
+
**Identity (`src/authsome/identity/local.py`)** manages local Ed25519 key pairs and `did:key` DIDs. Key material lives at `~/.authsome/identities/<handle>.key` (mode `0600`); metadata at `~/.authsome/identities/<handle>.json`. An Identity is a cryptographic agent — it is not a credential namespace. Credential namespacing is owned by a Vault (see below).
|
|
106
108
|
|
|
107
|
-
**
|
|
109
|
+
**Principal & Vault domain models (`src/authsome/identity/principal.py`)** define the two concepts that own credentials. A **Principal** is a non-cryptographic logical partition (human or team) identified by an opaque `PrincipalId`. A **Vault** is a named credential store owned by exactly one Principal and identified by an opaque `VaultId`. Credentials are scoped to a vault: `vault:<vault_id>:...`. An Identity claims membership in a Principal via an `IdentityClaimRecord`; the claim must be accepted before vault access is granted.
|
|
108
110
|
|
|
109
|
-
**
|
|
111
|
+
**Five server-owned registries** persist in `~/.authsome/server/` and are implemented in `src/authsome/server/registries.py`:
|
|
112
|
+
| Registry | File | Authoritative for |
|
|
113
|
+
|----------|------|-------------------|
|
|
114
|
+
| `IdentityRegistry` | `identity_registry.json` | Handle → DID mapping (PoP JWT validation) |
|
|
115
|
+
| `PrincipalRegistry` | `principal_registry.json` | PrincipalId → email |
|
|
116
|
+
| `VaultRegistry` | `vault_registry.json` | VaultId → VaultHandle |
|
|
117
|
+
| `IdentityClaimRegistry` | `identity_claim_registry.json` | Identity → Principal claim + ClaimStatus |
|
|
118
|
+
| `PrincipalVaultBindingRegistry` | `principal_vault_binding_registry.json` | Principal → default Vault binding |
|
|
119
|
+
|
|
120
|
+
**PoP Auth (`src/authsome/identity/proof.py`)** implements Proof-of-Possession JWT creation and validation. Every protected daemon request carries `Authorization: PoP <jwt>` signed with the local Ed25519 key. The JWT is bound to the specific HTTP method, path, and body SHA-256. The daemon validates the signature, checks the `jti` replay cache, and confirms `sub` (handle) → `iss` (DID) via the Identity Registry.
|
|
110
121
|
|
|
111
|
-
**AuthService (`src/authsome/
|
|
122
|
+
**AuthService (`src/authsome/server/credential_service.py`)** is the authentication and credential lifecycle coordinator. It owns OAuth flows, token refresh, login/logout/revoke. Lives in `server/` because it coordinates `auth/` flows with `vault/` storage and `audit/` logging. Constructed with `(vault, identity, principal_id, vault_id)`; all credential store keys are namespaced as `vault:<vault_id>:...`. The caller (server dependency injection) resolves `vault_id` from the `PrincipalVaultBindingRegistry` before constructing `AuthService`.
|
|
112
123
|
|
|
113
|
-
**Flows (`src/authsome/auth/flows/`)** implement the `AuthFlow.authenticate()` interface. Each flow returns a `ConnectionRecord`.
|
|
124
|
+
**Flows (`src/authsome/auth/flows/`)** implement the `AuthFlow.authenticate()` interface. Each flow returns a `ConnectionRecord`. The `auth/` module is a leaf — it imports nothing from `vault/`, `audit/`, or `server/`.
|
|
114
125
|
|
|
115
126
|
| Flow | Class | Notes |
|
|
116
127
|
|------|-------|-------|
|
|
@@ -119,19 +130,19 @@ These rules govern all changes to this codebase — apply them without exception
|
|
|
119
130
|
| `dcr_pkce` | `DcrPkceFlow` | Dynamic Client Registration then PKCE |
|
|
120
131
|
| `api_key` | `ApiKeyFlow` | Prompts via secure browser bridge |
|
|
121
132
|
|
|
122
|
-
**Provider Registry
|
|
133
|
+
**Provider Registry** resolves providers in this order: custom providers stored in the vault under the `providers` collection override bundled JSON in `src/authsome/auth/bundled_providers/`. Bundled providers (GitHub, Google, Okta, Linear, OpenAI) are loaded via `importlib.resources`.
|
|
123
134
|
|
|
124
135
|
**Vault (`src/authsome/vault/`)** is the encrypted KV store. The master key lives at `~/.authsome/server/master.key` (mode `0600`) or in the OS keyring. All credential blobs are encrypted at rest; the AuthService reads and writes plaintext through the Vault without knowing encryption details.
|
|
125
136
|
|
|
126
137
|
**Storage** uses a DiskStore-backed KV at `~/.authsome/server/kv_store/`. Store keys follow the pattern:
|
|
127
138
|
```
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
139
|
+
vault:<vault_id>:<provider>:connection:<connection_name>
|
|
140
|
+
vault:<vault_id>:<provider>:metadata
|
|
141
|
+
vault:<vault_id>:<provider>:state
|
|
131
142
|
server:<provider>:client
|
|
132
143
|
```
|
|
133
144
|
|
|
134
|
-
**Config** (`GlobalConfig`) is stored in the KV store under `config/global`. Key
|
|
145
|
+
**Config** (`GlobalConfig`) is stored in the KV store under `config/global`. Key fields: `active_identity` (the handle of the current identity), `vault_id` (the active vault resolved at `authsome init`). Encryption mode is set via `config.encryption.mode` (`local_key` or `keyring`).
|
|
135
146
|
|
|
136
147
|
**CLI (`src/authsome/cli/main.py`)** is Click-based. All commands support `--json` for machine-readable output. `authsome init` creates the local identity, registers it with the daemon, and writes `active_identity` to config.
|
|
137
148
|
|
|
@@ -1,5 +1,63 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.4.1](https://github.com/agentrhq/authsome/compare/authsome-v0.4.0...authsome-v0.4.1) (2026-05-25)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* enable provider configuration management for hosted admins with required credential inputs and scope persistence ([e26d584](https://github.com/agentrhq/authsome/commit/e26d5841f34467af77e67903eaf6ee8b97d59313))
|
|
9
|
+
* enable provider configuration management for hosted admins with… ([30b2f8a](https://github.com/agentrhq/authsome/commit/30b2f8a3814a04b710fd37206889e3e1a71fd43f))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* rename AUTHSOME_ADMIN_PRINCIPLES environment variable to fix typo ([10f17f4](https://github.com/agentrhq/authsome/commit/10f17f48e35f118e76d7cb5c797a498408c51db7))
|
|
15
|
+
|
|
16
|
+
## [0.4.0](https://github.com/agentrhq/authsome/compare/authsome-v0.3.2...authsome-v0.4.0) (2026-05-25)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### ⚠ BREAKING CHANGES
|
|
20
|
+
|
|
21
|
+
* Create version 0.4 which adds support for principal, identity, vault key loading precedence and many more fixes
|
|
22
|
+
|
|
23
|
+
### Features
|
|
24
|
+
|
|
25
|
+
* ClaimStatus lifecycle, vault_id gating, ADR 0003 alignment ([d8553ba](https://github.com/agentrhq/authsome/commit/d8553baabbfba595580fd0d6d0c0a90ba282e911))
|
|
26
|
+
* Cleanup server routes ([225d7fd](https://github.com/agentrhq/authsome/commit/225d7fdcfba184c60bffdb70ba28e9576109b25c))
|
|
27
|
+
* disable analytics automatically when running under pytest and add verification tests ([d1abc48](https://github.com/agentrhq/authsome/commit/d1abc48f11255419f5d58cc13d5280fa221a3b21))
|
|
28
|
+
* implement HostedAccountService for email/password authentication and JWT session management ([c161ab9](https://github.com/agentrhq/authsome/commit/c161ab96d0d78ad02ce98b5ad4c0269ba3fd0530))
|
|
29
|
+
* implement master key rotation via rekey command and API endpoint ([f78f872](https://github.com/agentrhq/authsome/commit/f78f872624b1da899d76dd0c1a04ee81fafca772))
|
|
30
|
+
* implement opt-out telemetry support via environment variables and add associated documentation and tests ([9d7c88f](https://github.com/agentrhq/authsome/commit/9d7c88fb0a1a777b535f5e06b11a60a00eda263c))
|
|
31
|
+
* implement opt-out telemetry support via environment variables and add associated tests ([1c1554c](https://github.com/agentrhq/authsome/commit/1c1554c9cf3fbf093d107d7c6a3fd15103572096))
|
|
32
|
+
* implement vault rekey functionality with encryption source validation and add corresponding API and unit tests. ([e7f4187](https://github.com/agentrhq/authsome/commit/e7f418707aacde9b7705a5f79c8a84b28878715d))
|
|
33
|
+
* login flow ([e0ea86d](https://github.com/agentrhq/authsome/commit/e0ea86dc99de0d1d616b3c609e48c2ba6a61d516))
|
|
34
|
+
* scope connections to vault, add claim flow and principal concept ([d3f2006](https://github.com/agentrhq/authsome/commit/d3f2006d67c572fef7dd05b539c7e2c83de8ddaa))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
### Bug Fixes
|
|
38
|
+
|
|
39
|
+
* correct import path and test fixture for ready endpoint ([3951af8](https://github.com/agentrhq/authsome/commit/3951af82390994ad6d5acbdc06e59d91c8ccd962))
|
|
40
|
+
* deduplicate error class name in daemon responses and stop orphaned daemon ([76e2320](https://github.com/agentrhq/authsome/commit/76e2320c96e1e06eaa9d6822e98f33f8e027db1c))
|
|
41
|
+
* improve whoami robustness by handling connection failures gracefully and isolating keyring tests ([83709f4](https://github.com/agentrhq/authsome/commit/83709f4e373a3057b49af0e3b9e40b2166883d43))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
### Documentation
|
|
45
|
+
|
|
46
|
+
* add dedicated Hermes Agent integration page, drop stale Hermes refs ([b7297dd](https://github.com/agentrhq/authsome/commit/b7297dd5e658bf20baf0251a21460f6c6b5b7048))
|
|
47
|
+
* add dedicated Hermes Agent integration page, drop stale Hermes refs ([e12082f](https://github.com/agentrhq/authsome/commit/e12082f0786504e5049550375ea97831657125e7))
|
|
48
|
+
* add hosted UI auth and identity claim design spec ([e552805](https://github.com/agentrhq/authsome/commit/e5528053c146e6a8652cd8fe44409d286d8a2d6a))
|
|
49
|
+
* fix CONTEXT.md dependency graph and direction ([17fff13](https://github.com/agentrhq/authsome/commit/17fff13aa893d049b65e16e1922f80130f388da2))
|
|
50
|
+
* make auth/ a leaf module, move AuthService to server/ ([d92611c](https://github.com/agentrhq/authsome/commit/d92611ccd4fc987595034b1e6b1ee49e1049af16))
|
|
51
|
+
* resolve merge conflicts in UBIQUITOUS_LANGUAGE.md ([48229eb](https://github.com/agentrhq/authsome/commit/48229eb8b456cbdaeeb7a7a1a2e0bf02800fb21e))
|
|
52
|
+
* rewrite CONTEXT.md with module boundaries, create TODOS.md ([c7a1629](https://github.com/agentrhq/authsome/commit/c7a1629166324729a9e14868ebaa9ad082165053))
|
|
53
|
+
* rewrite login and proxy sections in manual-testing guide ([3719d13](https://github.com/agentrhq/authsome/commit/3719d13a960430d2839df85b458d55ec83071006))
|
|
54
|
+
* update architecture language, retire Profile, add Principal/Vault/Claim terms ([8dc663e](https://github.com/agentrhq/authsome/commit/8dc663e21e505a5327a7168ea47a245ed94b8db7))
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
### Code Refactoring
|
|
58
|
+
|
|
59
|
+
* Create version 0.4 which adds support for principal, identity, vault key loading precedence and many more fixes ([bb5a2a6](https://github.com/agentrhq/authsome/commit/bb5a2a615291a89bfd5c1a581692b2d86a82dca4))
|
|
60
|
+
|
|
3
61
|
## [0.3.2](https://github.com/agentrhq/authsome/compare/authsome-v0.3.1...authsome-v0.3.2) (2026-05-20)
|
|
4
62
|
|
|
5
63
|
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# authsome
|
|
2
|
+
|
|
3
|
+
authsome is the local auth layer for AI agents — it answers which agent, acting on behalf of whom, accessed what credential, and was that allowed.
|
|
4
|
+
|
|
5
|
+
## Module Responsibilities
|
|
6
|
+
|
|
7
|
+
Each module has one job. `identity/`, `auth/`, `vault/`, and `audit/` are **leaf modules** — they import nothing from this codebase and can be used and tested in isolation. `server/` is the only composition root.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
identity/ ←─┐
|
|
11
|
+
auth/ ←─┤
|
|
12
|
+
vault/ ←─┤ server/ ←── cli/ (via HTTP, not Python import)
|
|
13
|
+
audit/ ←─┘ ←── proxy/ (via HTTP, not Python import)
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
### `identity/` — Cryptographic identity primitives
|
|
19
|
+
|
|
20
|
+
Think of this as the OpenID Connect layer. Handles key material, DIDs, and proof-of-possession tokens.
|
|
21
|
+
|
|
22
|
+
**Owns:**
|
|
23
|
+
- Ed25519 key pair generation and serialization (`local.py`)
|
|
24
|
+
- `did:key` DID derivation from public keys (`local.py`)
|
|
25
|
+
- `IdentityMetadata` model — client-side cached state for a local identity
|
|
26
|
+
- `IdentityRegistration` model — the server's record of a registered handle/DID binding
|
|
27
|
+
- PoP JWT creation and validation (`proof.py`)
|
|
28
|
+
- `ClaimStatus`, `PrincipalRecord`, `VaultRecord`, `IdentityClaimRecord`, `PrincipalVaultBindingRecord` — shared domain models
|
|
29
|
+
|
|
30
|
+
**Does not own:**
|
|
31
|
+
- Filesystem-backed registries (those are server state, not identity primitives)
|
|
32
|
+
- Client config management (that is `cli/` territory)
|
|
33
|
+
- Principal/vault lifecycle decisions (that is `server/` territory)
|
|
34
|
+
|
|
35
|
+
**Imports nothing from this codebase.** Used by: `server/`, `cli/`
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
### `auth/` — OAuth and API key flow implementations
|
|
40
|
+
|
|
41
|
+
Think of this as the OAuth 2.0 protocol library. Each flow takes provider config and credentials in, returns tokens out. No storage, no audit, no identity imports.
|
|
42
|
+
|
|
43
|
+
**Owns:**
|
|
44
|
+
- OAuth 2.0 flows: PKCE, Device Code, DCR+PKCE (`flows/`)
|
|
45
|
+
- API key collection flow (`flows/api_key.py`)
|
|
46
|
+
- Flow base class and token refresh logic
|
|
47
|
+
- Provider models: `ProviderDefinition`, `OAuthConfig`, `ApiKeyConfig`, bundled provider JSON
|
|
48
|
+
- Credential models: `ConnectionRecord`, `ProviderClientRecord`, `ProviderMetadataRecord`, `ProviderStateRecord`
|
|
49
|
+
- `AuthSession` — transient flow session state
|
|
50
|
+
|
|
51
|
+
**Does not own:**
|
|
52
|
+
- Credential persistence (that is `vault/` + `server/` territory)
|
|
53
|
+
- Audit logging (that is `audit/` + `server/` territory)
|
|
54
|
+
- Proxy route catalog building
|
|
55
|
+
- Server registry reads
|
|
56
|
+
|
|
57
|
+
**Imports nothing from this codebase.** Used by: `server/`
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
### `server/` — CredentialService and application orchestration
|
|
62
|
+
|
|
63
|
+
`server/` owns `CredentialService` (currently called `AuthService`) — the stateful coordinator that wires `auth/` flows with `vault/` storage and `audit/` logging. It is the only place where flows, storage, and audit are combined.
|
|
64
|
+
|
|
65
|
+
`CredentialService` is constructed per-request by the server with `(vault, identity, principal_id, vault_id)` and calls `auth/` flows to execute protocols, `vault/` to persist results, and `audit/` to record events.
|
|
66
|
+
|
|
67
|
+
> Current state: `AuthService` lives in `auth/` and imports `vault/` and `audit/` directly. Moving it to `server/` (TODOS phase E) makes `auth/` a true leaf.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
### `vault/` — Encrypted credential storage
|
|
72
|
+
|
|
73
|
+
Think of this as the secrets layer. Encrypts and decrypts credential blobs transparently.
|
|
74
|
+
|
|
75
|
+
**Owns:**
|
|
76
|
+
- `Vault` — AES-256-GCM encrypted KV wrapper over `AsyncKeyValue`
|
|
77
|
+
- `VaultCrypto` — key management (local file, OS keyring)
|
|
78
|
+
- Encrypted get/put/delete/list over named collections
|
|
79
|
+
|
|
80
|
+
**Does not own:**
|
|
81
|
+
- Server filesystem layout or path resolution
|
|
82
|
+
- Registry lookups
|
|
83
|
+
- Business logic about which vault belongs to which principal
|
|
84
|
+
|
|
85
|
+
**Imports nothing from this codebase.** Imported by: `auth/`, `server/`
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### `audit/` — Structured event recording
|
|
90
|
+
|
|
91
|
+
Think of this as the append-only ledger. Records who did what and when.
|
|
92
|
+
|
|
93
|
+
**Owns:**
|
|
94
|
+
- `AuditEvent` model
|
|
95
|
+
- `log()` / `alog()` — append to a structured JSON-lines log file
|
|
96
|
+
- `setup()` / `clear()` — log file lifecycle (called by server at startup/shutdown)
|
|
97
|
+
|
|
98
|
+
**Does not own:**
|
|
99
|
+
- Business logic
|
|
100
|
+
- Any storage beyond the append-only log file
|
|
101
|
+
|
|
102
|
+
**Imports nothing from this codebase.** Imported by: `auth/`, `server/`
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
### `server/` — Application orchestration and server-owned state
|
|
107
|
+
|
|
108
|
+
Think of this as the daemon process. Wires identity + auth + vault + audit together. Owns all server-side persistence.
|
|
109
|
+
|
|
110
|
+
**Owns:**
|
|
111
|
+
- `server/registries.py` — all filesystem-backed registry implementations:
|
|
112
|
+
- `IdentityRegistry` (handle → DID)
|
|
113
|
+
- `PrincipalRegistry` (principal_id → email)
|
|
114
|
+
- `VaultRegistry` (vault_id → handle)
|
|
115
|
+
- `IdentityClaimRegistry` (identity → principal + ClaimStatus)
|
|
116
|
+
- `PrincipalVaultBindingRegistry` (principal → default vault)
|
|
117
|
+
- `server/ownership.py` — `OwnershipResolver` (local and hosted variants), `ResolvedOwnership`
|
|
118
|
+
- `server/identity_bootstrap.py` — deployment-specific identity registration behavior
|
|
119
|
+
- `server/dependencies.py` — infrastructure wiring (paths, store, vault, config)
|
|
120
|
+
- `server/app.py` — FastAPI application factory and lifespan
|
|
121
|
+
- `server/routes/` — HTTP API surface
|
|
122
|
+
- `server/schemas.py` — API response schemas
|
|
123
|
+
|
|
124
|
+
**All filesystem interaction for server-owned state lives here.** No other module writes to server-owned paths.
|
|
125
|
+
|
|
126
|
+
**Imported by:** nothing (top of the import graph)
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
### `proxy/` — Credential injection proxy
|
|
131
|
+
|
|
132
|
+
A mitmproxy-based HTTPS proxy. Intercepts outgoing agent requests and injects auth headers.
|
|
133
|
+
|
|
134
|
+
**Owns:**
|
|
135
|
+
- `proxy/server.py` — mitmproxy addon that intercepts requests
|
|
136
|
+
- `proxy/runner.py` — background thread lifecycle
|
|
137
|
+
- `proxy/router.py` — `RouteMatch` / `RouteResolution` types
|
|
138
|
+
- `proxy/certs.py` — CA certificate management
|
|
139
|
+
|
|
140
|
+
**Does not own:**
|
|
141
|
+
- Credential loading (asks the server)
|
|
142
|
+
- Route catalog construction (asks the server)
|
|
143
|
+
- Provider definitions
|
|
144
|
+
|
|
145
|
+
**Imported by:** `cli/`
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
### `cli/` — Client to the daemon
|
|
150
|
+
|
|
151
|
+
Click-based CLI and HTTP client. Everything here is a client to the server HTTP API.
|
|
152
|
+
|
|
153
|
+
**Owns:**
|
|
154
|
+
- `cli/main.py` — Click command tree
|
|
155
|
+
- `cli/client.py` — `RuntimeClient` (async HTTP client for daemon requests, attaches PoP JWT)
|
|
156
|
+
- `cli/client_config.py` — client-owned config (`active_identity`, `vault_id`, proxy settings)
|
|
157
|
+
- `cli/context.py` — `CliRuntime` wiring container
|
|
158
|
+
- `cli/daemon_control.py` — start/stop the daemon process
|
|
159
|
+
|
|
160
|
+
**Does not own:**
|
|
161
|
+
- Server registry operations
|
|
162
|
+
- Direct vault or store access
|
|
163
|
+
- Identity key generation (delegates to `identity/`, result stored by CLI via `identity/local.py`)
|
|
164
|
+
|
|
165
|
+
**Imported by:** nothing (entry point)
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## Domain Language
|
|
170
|
+
|
|
171
|
+
### Identity & Authentication
|
|
172
|
+
|
|
173
|
+
**Identity**: The cryptographic agent — Ed25519 key pair, `did:key` DID, and human-readable Handle. Created locally; registered with the daemon. Is not a credential namespace.
|
|
174
|
+
|
|
175
|
+
**Handle**: Human-readable name for an Identity (e.g., `brisk-boldly-clearly-1234`). Used as `sub` in PoP JWTs.
|
|
176
|
+
|
|
177
|
+
**DID**: `did:key` Ed25519 identifier derived from the Identity's public key. Used as `iss` in PoP JWTs.
|
|
178
|
+
|
|
179
|
+
**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
|
+
|
|
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.
|
|
182
|
+
_Avoid_: User, account, PrincipalHandle, profile
|
|
183
|
+
|
|
184
|
+
**PrincipalId**: Opaque stable identifier for a Principal. Never the email or handle — those can change; the PrincipalId cannot.
|
|
185
|
+
_Avoid_: principal_handle, principal_name, username
|
|
186
|
+
|
|
187
|
+
**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
|
+
_Avoid_: credential store, token store, secret store, profile store
|
|
189
|
+
|
|
190
|
+
**VaultId**: Opaque stable identifier for a Vault. Used as the storage key segment. Stable across naming changes.
|
|
191
|
+
_Avoid_: vault_name, vault_handle
|
|
192
|
+
|
|
193
|
+
**VaultHandle**: Human-readable name for a Vault (e.g., `default`). Used in UIs and CLI; the VaultId is authoritative in storage.
|
|
194
|
+
|
|
195
|
+
**IdentityClaimRecord**: Binding from an Identity (Handle) to a Principal (PrincipalId) with a `ClaimStatus`. Created during `authsome init --email`. Vault access is gated until the claim is accepted.
|
|
196
|
+
_Avoid_: Claim, IdentityRegistration (as claim), join request
|
|
197
|
+
|
|
198
|
+
**ClaimStatus**: Lifecycle state: `pending` → `accepted` | `rejected`.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Initialization & Claim Flow
|
|
203
|
+
|
|
204
|
+
**Local mode**: `authsome init` creates an Identity, auto-accepts its claim under the implicit local Principal, and creates the default Vault. No email required.
|
|
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.
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Key Relationships
|
|
211
|
+
|
|
212
|
+
- An **Identity** is a cryptographic agent. It does not own credentials directly.
|
|
213
|
+
- An **Identity** claims a **Principal** via an **IdentityClaimRecord**. Claim must be `accepted` for vault access.
|
|
214
|
+
- A **Principal** owns one or more **Vaults** via **PrincipalVaultBindingRecords**. The server resolves the default Vault before constructing `AuthService`.
|
|
215
|
+
- A **Vault** contains zero or more **Connections**, each scoped to one **Provider**.
|
|
216
|
+
- Multiple Identities may share one Vault by claiming the same Principal.
|
|
217
|
+
- A **ConnectionRecord** belongs to exactly one Vault. `vault:<vault_id>:...` is the key prefix.
|
|
218
|
+
- **ClientCredentials** are server-scoped — one `ProviderClientRecord` per Provider, shared across all Vaults.
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## AuthService Contract
|
|
223
|
+
|
|
224
|
+
`AuthService` is a per-request credential lifecycle object constructed by the server:
|
|
225
|
+
|
|
226
|
+
```python
|
|
227
|
+
AuthService(vault=vault, identity=handle, principal_id=pid, vault_id=vid, deployment_mode=mode)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
- `identity` — agent Handle, used for audit logging only
|
|
231
|
+
- `principal_id` — resolved by `OwnershipResolver` from the PoP JWT subject
|
|
232
|
+
- `vault_id` — resolved from `PrincipalVaultBindingRegistry` by the server before constructing AuthService
|
|
233
|
+
- `vault` — the encrypted KV store; AuthService reads/writes only through this
|
|
234
|
+
|
|
235
|
+
AuthService does not query registries, does not know about server filesystem paths, and does not build proxy route catalogs.
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Audit Contract
|
|
240
|
+
|
|
241
|
+
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
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Flagged Ambiguities
|
|
246
|
+
|
|
247
|
+
- **"PrincipalHandle"** — retired. The Principal is now identified by an opaque `PrincipalId`. Do not use PrincipalHandle in new code.
|
|
248
|
+
- **"VaultHandle"** — the human-readable display name. Do not use VaultHandle as a storage key; use VaultId.
|
|
249
|
+
- **"Claim"** — use `IdentityClaimRecord` for the binding object; use "claim" (lowercase) only as a verb.
|
|
250
|
+
- **"identity=server"** — a temporary hack in `app.py` where `AuthService` is instantiated at startup without a real identity. This is a known violation to be removed.
|
|
251
|
+
- **"credential"** — use **Connection** for the full authenticated session; use **access token** / **API key** for the individual secret.
|
|
@@ -33,6 +33,9 @@ Reach for a well-maintained dependency before writing your own crypto, HTTP clie
|
|
|
33
33
|
**Deep modules over shallow ones.**
|
|
34
34
|
Prefer a module with a small surface area and rich internals over a sprawl of thin wrappers. A single `AuthClient` that handles everything cleanly beats a dozen one-method classes. More files is not more modular.
|
|
35
35
|
|
|
36
|
+
**Composition over inheritance.**
|
|
37
|
+
Prefer small collaborators wired together through explicit dependencies over inheritance hierarchies. Use inheritance only when there is a real subtype relationship and composition would make the design less clear.
|
|
38
|
+
|
|
36
39
|
**Single responsibility and separation of concerns.**
|
|
37
40
|
Auth authenticates. Vault stores credentials. The CLI presents output. These boundaries are not negotiable — a flow should not write to storage, and storage should not know about OAuth. If a function is hard to name, it's doing too many things.
|
|
38
41
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: authsome
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.1
|
|
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,6 +14,7 @@ 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: argon2-cffi>=25.1.0
|
|
17
18
|
Requires-Dist: base58>=2.1.1
|
|
18
19
|
Requires-Dist: click>=8.0
|
|
19
20
|
Requires-Dist: cryptography>=41.0
|
|
@@ -205,6 +206,14 @@ npm i -g mint # requires Node.js >= 20.17.0
|
|
|
205
206
|
mint dev
|
|
206
207
|
```
|
|
207
208
|
|
|
209
|
+
## Telemetry
|
|
210
|
+
|
|
211
|
+
Authsome's daemon can emit product analytics through PostHog. You can disable telemetry with any of these environment variables:
|
|
212
|
+
|
|
213
|
+
- `DO_NOT_TRACK=1` disables analytics using the standard opt-out convention.
|
|
214
|
+
- `POSTHOG_DISABLED=1` disables analytics using PostHog's recommended kill switch.
|
|
215
|
+
- `AUTHSOME_ANALYTICS=0` disables analytics with an Authsome-specific override.
|
|
216
|
+
|
|
208
217
|
## Community
|
|
209
218
|
|
|
210
219
|
- **[Discord](https://discord.gg/9YP2C9tvMp)** for questions, help, and showing what you're building.
|
|
@@ -165,6 +165,14 @@ npm i -g mint # requires Node.js >= 20.17.0
|
|
|
165
165
|
mint dev
|
|
166
166
|
```
|
|
167
167
|
|
|
168
|
+
## Telemetry
|
|
169
|
+
|
|
170
|
+
Authsome's daemon can emit product analytics through PostHog. You can disable telemetry with any of these environment variables:
|
|
171
|
+
|
|
172
|
+
- `DO_NOT_TRACK=1` disables analytics using the standard opt-out convention.
|
|
173
|
+
- `POSTHOG_DISABLED=1` disables analytics using PostHog's recommended kill switch.
|
|
174
|
+
- `AUTHSOME_ANALYTICS=0` disables analytics with an Authsome-specific override.
|
|
175
|
+
|
|
168
176
|
## Community
|
|
169
177
|
|
|
170
178
|
- **[Discord](https://discord.gg/9YP2C9tvMp)** for questions, help, and showing what you're building.
|