feat: derive agent identity from a single private-key env var - #435

Merged
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable
Jun 16, 2026
Merged

feat: derive agent identity from a single private-key env var#435
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable

Conversation

@rishabhraj36

Copy link
Copy Markdown
Collaborator

Description

Agent identity is now fully derivable from a single environment variable, AUTHSOME_IDENTITY_PRIVATE_KEY. The DID is computed locally from the key, and the human-readable handle is resolved from the identity server by DID. This removes the need for AUTHSOME_IDENTITY, local identity files, or authsome init in headless/agent deployments.

Key changes:

  • RuntimeIdentity.load() accepts a key-only env and defers the handle (the runtime handle is now optional and resolved later instead of raising ValueError).
  • The CLI client resolves the handle from the server by DID before PoP signing. When the DID is unknown (brand-new agent), a handle is generated and registered via the existing claim flow.
  • New reverse-lookup: GET /api/identities/by-did/{did} route + IdentityRegistry.resolve_by_did().
  • AUTHSOME_IDENTITY is kept as an optional, deprecated handle override for backward compatibility.
  • Docs updated with the single-key setup and a migration note.

Motivation and Context

The previous two-variable setup (AUTHSOME_IDENTITY + AUTHSOME_IDENTITY_PRIVATE_KEY) plus local filesystem bootstrap was unnecessarily convoluted for CI, containers, and ephemeral agents. This aligns with the cryptographic model: the identity is the key pair, and the handle is server-registered metadata that should be resolved from the identity server rather than supplied locally.

Closes#426.

How Has This Been Tested?

  • Added unit tests following TDD (written first, watched fail, then implemented):
    • IdentityRegistry.resolve_by_did() returns the registered handle / None for unknown DIDs.
    • GET /api/identities/by-did/{did} returns the handle or 404.
    • RuntimeIdentity.load() with a key-only env derives the DID and leaves the handle unresolved.
    • Client resolves the handle from the server for a key-only env, with no filesystem identity artifacts.
    • Unknown DID auto-generates and registers a handle.
  • Replaced the obsolete tests that asserted the old "private key requires AUTHSOME_IDENTITY" error.
  • Full suite: 430 passed, 3 skipped. ruff and ty clean on all changed files.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My code follows the code style of this project.
  • I have read the CONTRIBUTING document.
  • All new and existing tests passed.

@mintlify

mintlifyBot commented Jun 16, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
agentr🟢 ReadyView PreviewJun 16, 2026, 8:04 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@rishabhraj36
rishabhraj36 requested a review from beubaxJune 16, 2026 08:06
@rishabhraj36
rishabhraj36 marked this pull request as ready for review June 16, 2026 08:06
When two processes with the same private key race to register, the loser
gets a 409 from the identity server. Re-resolve the handle by DID and
continue instead of failing startup.
Co-authored-by: Cursor <cursoragent@cursor.com>
@manojbajaj95
manojbajaj95 merged commit 0890c0b into mainJun 16, 2026
6 checks passed
@manojbajaj95
manojbajaj95 deleted the 426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable branch June 16, 2026 15:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Simplify agent identity to a single private-key environment variable

2 participants

@rishabhraj36@manojbajaj95
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: derive agent identity from a single private-key env var - #435

Merged
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable
Jun 16, 2026
Merged

feat: derive agent identity from a single private-key env var#435
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable

Conversation

@rishabhraj36

Copy link
Copy Markdown
Collaborator

Description

Agent identity is now fully derivable from a single environment variable, AUTHSOME_IDENTITY_PRIVATE_KEY. The DID is computed locally from the key, and the human-readable handle is resolved from the identity server by DID. This removes the need for AUTHSOME_IDENTITY, local identity files, or authsome init in headless/agent deployments.

Key changes:

  • RuntimeIdentity.load() accepts a key-only env and defers the handle (the runtime handle is now optional and resolved later instead of raising ValueError).
  • The CLI client resolves the handle from the server by DID before PoP signing. When the DID is unknown (brand-new agent), a handle is generated and registered via the existing claim flow.
  • New reverse-lookup: GET /api/identities/by-did/{did} route + IdentityRegistry.resolve_by_did().
  • AUTHSOME_IDENTITY is kept as an optional, deprecated handle override for backward compatibility.
  • Docs updated with the single-key setup and a migration note.

Motivation and Context

The previous two-variable setup (AUTHSOME_IDENTITY + AUTHSOME_IDENTITY_PRIVATE_KEY) plus local filesystem bootstrap was unnecessarily convoluted for CI, containers, and ephemeral agents. This aligns with the cryptographic model: the identity is the key pair, and the handle is server-registered metadata that should be resolved from the identity server rather than supplied locally.

Closes#426.

How Has This Been Tested?

  • Added unit tests following TDD (written first, watched fail, then implemented):
    • IdentityRegistry.resolve_by_did() returns the registered handle / None for unknown DIDs.
    • GET /api/identities/by-did/{did} returns the handle or 404.
    • RuntimeIdentity.load() with a key-only env derives the DID and leaves the handle unresolved.
    • Client resolves the handle from the server for a key-only env, with no filesystem identity artifacts.
    • Unknown DID auto-generates and registers a handle.
  • Replaced the obsolete tests that asserted the old "private key requires AUTHSOME_IDENTITY" error.
  • Full suite: 430 passed, 3 skipped. ruff and ty clean on all changed files.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My code follows the code style of this project.
  • I have read the CONTRIBUTING document.
  • All new and existing tests passed.

@mintlify

mintlifyBot commented Jun 16, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
agentr🟢 ReadyView PreviewJun 16, 2026, 8:04 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@rishabhraj36
rishabhraj36 requested a review from beubaxJune 16, 2026 08:06
@rishabhraj36
rishabhraj36 marked this pull request as ready for review June 16, 2026 08:06
When two processes with the same private key race to register, the loser
gets a 409 from the identity server. Re-resolve the handle by DID and
continue instead of failing startup.
Co-authored-by: Cursor <cursoragent@cursor.com>
@manojbajaj95
manojbajaj95 merged commit 0890c0b into mainJun 16, 2026
6 checks passed
@manojbajaj95
manojbajaj95 deleted the 426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable branch June 16, 2026 15:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Simplify agent identity to a single private-key environment variable

2 participants

@rishabhraj36@manojbajaj95
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: derive agent identity from a single private-key env var - #435

Merged
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable
Jun 16, 2026
Merged

feat: derive agent identity from a single private-key env var#435
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable

Conversation

@rishabhraj36

Copy link
Copy Markdown
Collaborator

Description

Agent identity is now fully derivable from a single environment variable, AUTHSOME_IDENTITY_PRIVATE_KEY. The DID is computed locally from the key, and the human-readable handle is resolved from the identity server by DID. This removes the need for AUTHSOME_IDENTITY, local identity files, or authsome init in headless/agent deployments.

Key changes:

  • RuntimeIdentity.load() accepts a key-only env and defers the handle (the runtime handle is now optional and resolved later instead of raising ValueError).
  • The CLI client resolves the handle from the server by DID before PoP signing. When the DID is unknown (brand-new agent), a handle is generated and registered via the existing claim flow.
  • New reverse-lookup: GET /api/identities/by-did/{did} route + IdentityRegistry.resolve_by_did().
  • AUTHSOME_IDENTITY is kept as an optional, deprecated handle override for backward compatibility.
  • Docs updated with the single-key setup and a migration note.

Motivation and Context

The previous two-variable setup (AUTHSOME_IDENTITY + AUTHSOME_IDENTITY_PRIVATE_KEY) plus local filesystem bootstrap was unnecessarily convoluted for CI, containers, and ephemeral agents. This aligns with the cryptographic model: the identity is the key pair, and the handle is server-registered metadata that should be resolved from the identity server rather than supplied locally.

Closes#426.

How Has This Been Tested?

  • Added unit tests following TDD (written first, watched fail, then implemented):
    • IdentityRegistry.resolve_by_did() returns the registered handle / None for unknown DIDs.
    • GET /api/identities/by-did/{did} returns the handle or 404.
    • RuntimeIdentity.load() with a key-only env derives the DID and leaves the handle unresolved.
    • Client resolves the handle from the server for a key-only env, with no filesystem identity artifacts.
    • Unknown DID auto-generates and registers a handle.
  • Replaced the obsolete tests that asserted the old "private key requires AUTHSOME_IDENTITY" error.
  • Full suite: 430 passed, 3 skipped. ruff and ty clean on all changed files.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My code follows the code style of this project.
  • I have read the CONTRIBUTING document.
  • All new and existing tests passed.

@mintlify

mintlifyBot commented Jun 16, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
agentr🟢 ReadyView PreviewJun 16, 2026, 8:04 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@rishabhraj36
rishabhraj36 requested a review from beubaxJune 16, 2026 08:06
@rishabhraj36
rishabhraj36 marked this pull request as ready for review June 16, 2026 08:06
When two processes with the same private key race to register, the loser
gets a 409 from the identity server. Re-resolve the handle by DID and
continue instead of failing startup.
Co-authored-by: Cursor <cursoragent@cursor.com>
@manojbajaj95
manojbajaj95 merged commit 0890c0b into mainJun 16, 2026
6 checks passed
@manojbajaj95
manojbajaj95 deleted the 426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable branch June 16, 2026 15:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Simplify agent identity to a single private-key environment variable

2 participants

@rishabhraj36@manojbajaj95
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: derive agent identity from a single private-key env var - #435

Merged
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable
Jun 16, 2026
Merged

feat: derive agent identity from a single private-key env var#435
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable

Conversation

@rishabhraj36

Copy link
Copy Markdown
Collaborator

Description

Agent identity is now fully derivable from a single environment variable, AUTHSOME_IDENTITY_PRIVATE_KEY. The DID is computed locally from the key, and the human-readable handle is resolved from the identity server by DID. This removes the need for AUTHSOME_IDENTITY, local identity files, or authsome init in headless/agent deployments.

Key changes:

  • RuntimeIdentity.load() accepts a key-only env and defers the handle (the runtime handle is now optional and resolved later instead of raising ValueError).
  • The CLI client resolves the handle from the server by DID before PoP signing. When the DID is unknown (brand-new agent), a handle is generated and registered via the existing claim flow.
  • New reverse-lookup: GET /api/identities/by-did/{did} route + IdentityRegistry.resolve_by_did().
  • AUTHSOME_IDENTITY is kept as an optional, deprecated handle override for backward compatibility.
  • Docs updated with the single-key setup and a migration note.

Motivation and Context

The previous two-variable setup (AUTHSOME_IDENTITY + AUTHSOME_IDENTITY_PRIVATE_KEY) plus local filesystem bootstrap was unnecessarily convoluted for CI, containers, and ephemeral agents. This aligns with the cryptographic model: the identity is the key pair, and the handle is server-registered metadata that should be resolved from the identity server rather than supplied locally.

Closes#426.

How Has This Been Tested?

  • Added unit tests following TDD (written first, watched fail, then implemented):
    • IdentityRegistry.resolve_by_did() returns the registered handle / None for unknown DIDs.
    • GET /api/identities/by-did/{did} returns the handle or 404.
    • RuntimeIdentity.load() with a key-only env derives the DID and leaves the handle unresolved.
    • Client resolves the handle from the server for a key-only env, with no filesystem identity artifacts.
    • Unknown DID auto-generates and registers a handle.
  • Replaced the obsolete tests that asserted the old "private key requires AUTHSOME_IDENTITY" error.
  • Full suite: 430 passed, 3 skipped. ruff and ty clean on all changed files.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My code follows the code style of this project.
  • I have read the CONTRIBUTING document.
  • All new and existing tests passed.

@mintlify

mintlifyBot commented Jun 16, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
agentr🟢 ReadyView PreviewJun 16, 2026, 8:04 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@rishabhraj36
rishabhraj36 requested a review from beubaxJune 16, 2026 08:06
@rishabhraj36
rishabhraj36 marked this pull request as ready for review June 16, 2026 08:06
When two processes with the same private key race to register, the loser
gets a 409 from the identity server. Re-resolve the handle by DID and
continue instead of failing startup.
Co-authored-by: Cursor <cursoragent@cursor.com>
@manojbajaj95
manojbajaj95 merged commit 0890c0b into mainJun 16, 2026
6 checks passed
@manojbajaj95
manojbajaj95 deleted the 426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable branch June 16, 2026 15:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Simplify agent identity to a single private-key environment variable

2 participants

@rishabhraj36@manojbajaj95
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: derive agent identity from a single private-key env var - #435

Merged
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable
Jun 16, 2026
Merged

feat: derive agent identity from a single private-key env var#435
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable

Conversation

@rishabhraj36

Copy link
Copy Markdown
Collaborator

Description

Agent identity is now fully derivable from a single environment variable, AUTHSOME_IDENTITY_PRIVATE_KEY. The DID is computed locally from the key, and the human-readable handle is resolved from the identity server by DID. This removes the need for AUTHSOME_IDENTITY, local identity files, or authsome init in headless/agent deployments.

Key changes:

  • RuntimeIdentity.load() accepts a key-only env and defers the handle (the runtime handle is now optional and resolved later instead of raising ValueError).
  • The CLI client resolves the handle from the server by DID before PoP signing. When the DID is unknown (brand-new agent), a handle is generated and registered via the existing claim flow.
  • New reverse-lookup: GET /api/identities/by-did/{did} route + IdentityRegistry.resolve_by_did().
  • AUTHSOME_IDENTITY is kept as an optional, deprecated handle override for backward compatibility.
  • Docs updated with the single-key setup and a migration note.

Motivation and Context

The previous two-variable setup (AUTHSOME_IDENTITY + AUTHSOME_IDENTITY_PRIVATE_KEY) plus local filesystem bootstrap was unnecessarily convoluted for CI, containers, and ephemeral agents. This aligns with the cryptographic model: the identity is the key pair, and the handle is server-registered metadata that should be resolved from the identity server rather than supplied locally.

Closes#426.

How Has This Been Tested?

  • Added unit tests following TDD (written first, watched fail, then implemented):
    • IdentityRegistry.resolve_by_did() returns the registered handle / None for unknown DIDs.
    • GET /api/identities/by-did/{did} returns the handle or 404.
    • RuntimeIdentity.load() with a key-only env derives the DID and leaves the handle unresolved.
    • Client resolves the handle from the server for a key-only env, with no filesystem identity artifacts.
    • Unknown DID auto-generates and registers a handle.
  • Replaced the obsolete tests that asserted the old "private key requires AUTHSOME_IDENTITY" error.
  • Full suite: 430 passed, 3 skipped. ruff and ty clean on all changed files.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My code follows the code style of this project.
  • I have read the CONTRIBUTING document.
  • All new and existing tests passed.

@mintlify

mintlifyBot commented Jun 16, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
agentr🟢 ReadyView PreviewJun 16, 2026, 8:04 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@rishabhraj36
rishabhraj36 requested a review from beubaxJune 16, 2026 08:06
@rishabhraj36
rishabhraj36 marked this pull request as ready for review June 16, 2026 08:06
When two processes with the same private key race to register, the loser
gets a 409 from the identity server. Re-resolve the handle by DID and
continue instead of failing startup.
Co-authored-by: Cursor <cursoragent@cursor.com>
@manojbajaj95
manojbajaj95 merged commit 0890c0b into mainJun 16, 2026
6 checks passed
@manojbajaj95
manojbajaj95 deleted the 426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable branch June 16, 2026 15:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Simplify agent identity to a single private-key environment variable

2 participants

@rishabhraj36@manojbajaj95
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: derive agent identity from a single private-key env var - #435

Merged
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable
Jun 16, 2026
Merged

feat: derive agent identity from a single private-key env var#435
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable

Conversation

@rishabhraj36

Copy link
Copy Markdown
Collaborator

Description

Agent identity is now fully derivable from a single environment variable, AUTHSOME_IDENTITY_PRIVATE_KEY. The DID is computed locally from the key, and the human-readable handle is resolved from the identity server by DID. This removes the need for AUTHSOME_IDENTITY, local identity files, or authsome init in headless/agent deployments.

Key changes:

  • RuntimeIdentity.load() accepts a key-only env and defers the handle (the runtime handle is now optional and resolved later instead of raising ValueError).
  • The CLI client resolves the handle from the server by DID before PoP signing. When the DID is unknown (brand-new agent), a handle is generated and registered via the existing claim flow.
  • New reverse-lookup: GET /api/identities/by-did/{did} route + IdentityRegistry.resolve_by_did().
  • AUTHSOME_IDENTITY is kept as an optional, deprecated handle override for backward compatibility.
  • Docs updated with the single-key setup and a migration note.

Motivation and Context

The previous two-variable setup (AUTHSOME_IDENTITY + AUTHSOME_IDENTITY_PRIVATE_KEY) plus local filesystem bootstrap was unnecessarily convoluted for CI, containers, and ephemeral agents. This aligns with the cryptographic model: the identity is the key pair, and the handle is server-registered metadata that should be resolved from the identity server rather than supplied locally.

Closes#426.

How Has This Been Tested?

  • Added unit tests following TDD (written first, watched fail, then implemented):
    • IdentityRegistry.resolve_by_did() returns the registered handle / None for unknown DIDs.
    • GET /api/identities/by-did/{did} returns the handle or 404.
    • RuntimeIdentity.load() with a key-only env derives the DID and leaves the handle unresolved.
    • Client resolves the handle from the server for a key-only env, with no filesystem identity artifacts.
    • Unknown DID auto-generates and registers a handle.
  • Replaced the obsolete tests that asserted the old "private key requires AUTHSOME_IDENTITY" error.
  • Full suite: 430 passed, 3 skipped. ruff and ty clean on all changed files.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My code follows the code style of this project.
  • I have read the CONTRIBUTING document.
  • All new and existing tests passed.

@mintlify

mintlifyBot commented Jun 16, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
agentr🟢 ReadyView PreviewJun 16, 2026, 8:04 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@rishabhraj36
rishabhraj36 requested a review from beubaxJune 16, 2026 08:06
@rishabhraj36
rishabhraj36 marked this pull request as ready for review June 16, 2026 08:06
When two processes with the same private key race to register, the loser
gets a 409 from the identity server. Re-resolve the handle by DID and
continue instead of failing startup.
Co-authored-by: Cursor <cursoragent@cursor.com>
@manojbajaj95
manojbajaj95 merged commit 0890c0b into mainJun 16, 2026
6 checks passed
@manojbajaj95
manojbajaj95 deleted the 426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable branch June 16, 2026 15:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Simplify agent identity to a single private-key environment variable

2 participants

@rishabhraj36@manojbajaj95
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: derive agent identity from a single private-key env var - #435

Merged
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable
Jun 16, 2026
Merged

feat: derive agent identity from a single private-key env var#435
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable

Conversation

@rishabhraj36

Copy link
Copy Markdown
Collaborator

Description

Agent identity is now fully derivable from a single environment variable, AUTHSOME_IDENTITY_PRIVATE_KEY. The DID is computed locally from the key, and the human-readable handle is resolved from the identity server by DID. This removes the need for AUTHSOME_IDENTITY, local identity files, or authsome init in headless/agent deployments.

Key changes:

  • RuntimeIdentity.load() accepts a key-only env and defers the handle (the runtime handle is now optional and resolved later instead of raising ValueError).
  • The CLI client resolves the handle from the server by DID before PoP signing. When the DID is unknown (brand-new agent), a handle is generated and registered via the existing claim flow.
  • New reverse-lookup: GET /api/identities/by-did/{did} route + IdentityRegistry.resolve_by_did().
  • AUTHSOME_IDENTITY is kept as an optional, deprecated handle override for backward compatibility.
  • Docs updated with the single-key setup and a migration note.

Motivation and Context

The previous two-variable setup (AUTHSOME_IDENTITY + AUTHSOME_IDENTITY_PRIVATE_KEY) plus local filesystem bootstrap was unnecessarily convoluted for CI, containers, and ephemeral agents. This aligns with the cryptographic model: the identity is the key pair, and the handle is server-registered metadata that should be resolved from the identity server rather than supplied locally.

Closes#426.

How Has This Been Tested?

  • Added unit tests following TDD (written first, watched fail, then implemented):
    • IdentityRegistry.resolve_by_did() returns the registered handle / None for unknown DIDs.
    • GET /api/identities/by-did/{did} returns the handle or 404.
    • RuntimeIdentity.load() with a key-only env derives the DID and leaves the handle unresolved.
    • Client resolves the handle from the server for a key-only env, with no filesystem identity artifacts.
    • Unknown DID auto-generates and registers a handle.
  • Replaced the obsolete tests that asserted the old "private key requires AUTHSOME_IDENTITY" error.
  • Full suite: 430 passed, 3 skipped. ruff and ty clean on all changed files.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My code follows the code style of this project.
  • I have read the CONTRIBUTING document.
  • All new and existing tests passed.

@mintlify

mintlifyBot commented Jun 16, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
agentr🟢 ReadyView PreviewJun 16, 2026, 8:04 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@rishabhraj36
rishabhraj36 requested a review from beubaxJune 16, 2026 08:06
@rishabhraj36
rishabhraj36 marked this pull request as ready for review June 16, 2026 08:06
When two processes with the same private key race to register, the loser
gets a 409 from the identity server. Re-resolve the handle by DID and
continue instead of failing startup.
Co-authored-by: Cursor <cursoragent@cursor.com>
@manojbajaj95
manojbajaj95 merged commit 0890c0b into mainJun 16, 2026
6 checks passed
@manojbajaj95
manojbajaj95 deleted the 426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable branch June 16, 2026 15:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Simplify agent identity to a single private-key environment variable

2 participants

@rishabhraj36@manojbajaj95
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: derive agent identity from a single private-key env var - #435

Merged
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable
Jun 16, 2026
Merged

feat: derive agent identity from a single private-key env var#435
manojbajaj95 merged 3 commits into
mainfrom
426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable

Conversation

@rishabhraj36

Copy link
Copy Markdown
Collaborator

Description

Agent identity is now fully derivable from a single environment variable, AUTHSOME_IDENTITY_PRIVATE_KEY. The DID is computed locally from the key, and the human-readable handle is resolved from the identity server by DID. This removes the need for AUTHSOME_IDENTITY, local identity files, or authsome init in headless/agent deployments.

Key changes:

  • RuntimeIdentity.load() accepts a key-only env and defers the handle (the runtime handle is now optional and resolved later instead of raising ValueError).
  • The CLI client resolves the handle from the server by DID before PoP signing. When the DID is unknown (brand-new agent), a handle is generated and registered via the existing claim flow.
  • New reverse-lookup: GET /api/identities/by-did/{did} route + IdentityRegistry.resolve_by_did().
  • AUTHSOME_IDENTITY is kept as an optional, deprecated handle override for backward compatibility.
  • Docs updated with the single-key setup and a migration note.

Motivation and Context

The previous two-variable setup (AUTHSOME_IDENTITY + AUTHSOME_IDENTITY_PRIVATE_KEY) plus local filesystem bootstrap was unnecessarily convoluted for CI, containers, and ephemeral agents. This aligns with the cryptographic model: the identity is the key pair, and the handle is server-registered metadata that should be resolved from the identity server rather than supplied locally.

Closes#426.

How Has This Been Tested?

  • Added unit tests following TDD (written first, watched fail, then implemented):
    • IdentityRegistry.resolve_by_did() returns the registered handle / None for unknown DIDs.
    • GET /api/identities/by-did/{did} returns the handle or 404.
    • RuntimeIdentity.load() with a key-only env derives the DID and leaves the handle unresolved.
    • Client resolves the handle from the server for a key-only env, with no filesystem identity artifacts.
    • Unknown DID auto-generates and registers a handle.
  • Replaced the obsolete tests that asserted the old "private key requires AUTHSOME_IDENTITY" error.
  • Full suite: 430 passed, 3 skipped. ruff and ty clean on all changed files.

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

  • My code follows the code style of this project.
  • I have read the CONTRIBUTING document.
  • All new and existing tests passed.

@mintlify

mintlifyBot commented Jun 16, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

ProjectStatusPreviewUpdated (UTC)
agentr🟢 ReadyView PreviewJun 16, 2026, 8:04 AM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@rishabhraj36
rishabhraj36 requested a review from beubaxJune 16, 2026 08:06
@rishabhraj36
rishabhraj36 marked this pull request as ready for review June 16, 2026 08:06
When two processes with the same private key race to register, the loser
gets a 409 from the identity server. Re-resolve the handle by DID and
continue instead of failing startup.
Co-authored-by: Cursor <cursoragent@cursor.com>
@manojbajaj95
manojbajaj95 merged commit 0890c0b into mainJun 16, 2026
6 checks passed
@manojbajaj95
manojbajaj95 deleted the 426-feat-simplify-agent-identity-to-a-single-private-key-environment-variable branch June 16, 2026 15:50
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Simplify agent identity to a single private-key environment variable

2 participants

@rishabhraj36@manojbajaj95