Add on-chain TEE registry discovery with TLS certificate pinning - #6

Merged
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn
May 5, 2026
Merged

Add on-chain TEE registry discovery with TLS certificate pinning#6
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn

Conversation

@adambalogh

Copy link
Copy Markdown
Contributor

Summary

This PR introduces on-chain TEE registry integration to dynamically discover active LLM proxy endpoints with TLS certificate pinning, replacing hardcoded server URLs. The client now resolves TEE endpoints from the registry by default, with optional fallback to static URLs for development/self-hosted scenarios.

Key Changes

  • New TEE Registry Integration (teeRegistry.ts):

    • TEERegistry class queries the on-chain TEE Registry contract to fetch active TEE endpoints and their DER-encoded TLS certificates
    • Implements getActiveTEEsByType() to retrieve all active TEEs of a given type and getLLMTEE() to select a random active LLM proxy
    • Converts hex-encoded certificate data from the contract into Uint8Array format for TLS pinning
  • New TEE Connection Abstraction (teeConnection.ts):

    • TEEConnection interface provides a common contract for static and registry-backed TEE connections
    • StaticTEEConnection for hardcoded endpoints (dev/self-hosted) with disabled TLS verification
    • RegistryTEEConnection for registry-backed discovery with:
      • TLS certificate pinning via buildPinnedAgent() (creates undici Agent with pinned CA certificate)
      • Optional background health check loop (5-minute interval) to detect stale TEE registrations
      • Automatic reconnection and retry on connection failures
    • Proper resource cleanup via close() method for dispatchers and timers
  • Updated LLM Client (llm.ts):

    • Replaced hardcoded serverUrl and streamingServerUrl config with connection: TEEConnection
    • Refactored request flow: requestWithRetry() handles TEE resolution and single-retry-on-failure logic
    • sendOnce() builds a paid fetch with the TEE's pinned dispatcher injected into every request
    • Added close() method to tear down resources
  • Updated Client Factory (client.ts):

    • Automatically creates RegistryTEEConnection by default (queries registry via RPC)
    • Falls back to StaticTEEConnection when llmServerUrl is provided
    • Accepts optional rpcUrl and teeRegistryAddress overrides
    • Added close() method for cleanup
  • Configuration Updates (types.ts, defaults.ts):

    • Removed llmStreamingServerUrl config (both chat and streaming use the same endpoint)
    • Updated llmServerUrl documentation to clarify it disables registry lookup
    • Added rpcUrl and teeRegistryAddress config options
    • Changed defaults from hardcoded LLM URLs to registry RPC URL and contract address
  • Public API Exports (index.ts):

    • Exported TEERegistry, TEEEndpoint, TEE_TYPE_* constants
    • Exported TEEConnection, ActiveTEE, RegistryTEEConnection, StaticTEEConnection, buildPinnedAgent

Notable Implementation Details

  • TLS Certificate Pinning: Instead of trust-on-first-use (TOFU), the client fetches the certificate submitted during TEE registration and pins to it, rejecting any mismatched certificates
  • Hostname Verification Disabled: TEE servers are typically addressed by IP while certificates may be issued for different hostnames; the pinned certificate itself serves as the trust anchor
  • Graceful Degradation: Connection failures trigger a registry refresh and single retry; if the TEE is no longer active, a fresh one is selected
  • Resource Management: Background timers are marked as non-blocking (unref()) and all resources are properly cleaned up on close()
  • Version Bump: Package version updated to 2.1.0

https://claude.ai/code/session_01Nvpzd6GMuRCcgfuFZgotUk

Brings the TS SDK in line with the Python SDK: the LLM endpoint is now
discovered by querying the on-chain TEERegistry contract instead of a
hardcoded URL, and the TEE's TLS certificate is pinned to the value
stored at registration time (no TOFU).
- src/abi/teeRegistry.ts: minimal read-only ABI for getActiveTEEs.
- src/teeRegistry.ts: TEERegistry class wrapping the contract via viem
(getActiveTEEsByType, getLLMTEE).
- src/teeConnection.ts: StaticTEEConnection (hardcoded URL, TLS
verification disabled) and RegistryTEEConnection (registry-resolved,
pinned TLS cert via undici Agent, lazy connect, 5-min health check
with automatic failover).
- src/llm.ts: refactored to drive requests through a TEEConnection,
injecting the pinned dispatcher into the x402-paid fetch and retrying
once on connection failure with a fresh TEE.
- src/client.ts: registry is now the default; passing llmServerUrl
switches to a static connection.
- types.ts/defaults.ts/index.ts: new ClientConfig fields (rpcUrl,
teeRegistryAddress), registry defaults, and re-exports.
- package.json: declare viem and undici as direct deps; bump to 2.1.0.
@socket-security

socket-securityBot commented May 5, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedundici@​6.25.07210010098100

View full report

@adambalogh
adambalogh merged commit 7377767 into mainMay 5, 2026
5 checks passed
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.

2 participants

@adambalogh@claude
, '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

Add on-chain TEE registry discovery with TLS certificate pinning - #6

Merged
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn
May 5, 2026
Merged

Add on-chain TEE registry discovery with TLS certificate pinning#6
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn

Conversation

@adambalogh

Copy link
Copy Markdown
Contributor

Summary

This PR introduces on-chain TEE registry integration to dynamically discover active LLM proxy endpoints with TLS certificate pinning, replacing hardcoded server URLs. The client now resolves TEE endpoints from the registry by default, with optional fallback to static URLs for development/self-hosted scenarios.

Key Changes

  • New TEE Registry Integration (teeRegistry.ts):

    • TEERegistry class queries the on-chain TEE Registry contract to fetch active TEE endpoints and their DER-encoded TLS certificates
    • Implements getActiveTEEsByType() to retrieve all active TEEs of a given type and getLLMTEE() to select a random active LLM proxy
    • Converts hex-encoded certificate data from the contract into Uint8Array format for TLS pinning
  • New TEE Connection Abstraction (teeConnection.ts):

    • TEEConnection interface provides a common contract for static and registry-backed TEE connections
    • StaticTEEConnection for hardcoded endpoints (dev/self-hosted) with disabled TLS verification
    • RegistryTEEConnection for registry-backed discovery with:
      • TLS certificate pinning via buildPinnedAgent() (creates undici Agent with pinned CA certificate)
      • Optional background health check loop (5-minute interval) to detect stale TEE registrations
      • Automatic reconnection and retry on connection failures
    • Proper resource cleanup via close() method for dispatchers and timers
  • Updated LLM Client (llm.ts):

    • Replaced hardcoded serverUrl and streamingServerUrl config with connection: TEEConnection
    • Refactored request flow: requestWithRetry() handles TEE resolution and single-retry-on-failure logic
    • sendOnce() builds a paid fetch with the TEE's pinned dispatcher injected into every request
    • Added close() method to tear down resources
  • Updated Client Factory (client.ts):

    • Automatically creates RegistryTEEConnection by default (queries registry via RPC)
    • Falls back to StaticTEEConnection when llmServerUrl is provided
    • Accepts optional rpcUrl and teeRegistryAddress overrides
    • Added close() method for cleanup
  • Configuration Updates (types.ts, defaults.ts):

    • Removed llmStreamingServerUrl config (both chat and streaming use the same endpoint)
    • Updated llmServerUrl documentation to clarify it disables registry lookup
    • Added rpcUrl and teeRegistryAddress config options
    • Changed defaults from hardcoded LLM URLs to registry RPC URL and contract address
  • Public API Exports (index.ts):

    • Exported TEERegistry, TEEEndpoint, TEE_TYPE_* constants
    • Exported TEEConnection, ActiveTEE, RegistryTEEConnection, StaticTEEConnection, buildPinnedAgent

Notable Implementation Details

  • TLS Certificate Pinning: Instead of trust-on-first-use (TOFU), the client fetches the certificate submitted during TEE registration and pins to it, rejecting any mismatched certificates
  • Hostname Verification Disabled: TEE servers are typically addressed by IP while certificates may be issued for different hostnames; the pinned certificate itself serves as the trust anchor
  • Graceful Degradation: Connection failures trigger a registry refresh and single retry; if the TEE is no longer active, a fresh one is selected
  • Resource Management: Background timers are marked as non-blocking (unref()) and all resources are properly cleaned up on close()
  • Version Bump: Package version updated to 2.1.0

https://claude.ai/code/session_01Nvpzd6GMuRCcgfuFZgotUk

Brings the TS SDK in line with the Python SDK: the LLM endpoint is now
discovered by querying the on-chain TEERegistry contract instead of a
hardcoded URL, and the TEE's TLS certificate is pinned to the value
stored at registration time (no TOFU).
- src/abi/teeRegistry.ts: minimal read-only ABI for getActiveTEEs.
- src/teeRegistry.ts: TEERegistry class wrapping the contract via viem
(getActiveTEEsByType, getLLMTEE).
- src/teeConnection.ts: StaticTEEConnection (hardcoded URL, TLS
verification disabled) and RegistryTEEConnection (registry-resolved,
pinned TLS cert via undici Agent, lazy connect, 5-min health check
with automatic failover).
- src/llm.ts: refactored to drive requests through a TEEConnection,
injecting the pinned dispatcher into the x402-paid fetch and retrying
once on connection failure with a fresh TEE.
- src/client.ts: registry is now the default; passing llmServerUrl
switches to a static connection.
- types.ts/defaults.ts/index.ts: new ClientConfig fields (rpcUrl,
teeRegistryAddress), registry defaults, and re-exports.
- package.json: declare viem and undici as direct deps; bump to 2.1.0.
@socket-security

socket-securityBot commented May 5, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedundici@​6.25.07210010098100

View full report

@adambalogh
adambalogh merged commit 7377767 into mainMay 5, 2026
5 checks passed
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.

2 participants

@adambalogh@claude
, '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

Add on-chain TEE registry discovery with TLS certificate pinning - #6

Merged
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn
May 5, 2026
Merged

Add on-chain TEE registry discovery with TLS certificate pinning#6
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn

Conversation

@adambalogh

Copy link
Copy Markdown
Contributor

Summary

This PR introduces on-chain TEE registry integration to dynamically discover active LLM proxy endpoints with TLS certificate pinning, replacing hardcoded server URLs. The client now resolves TEE endpoints from the registry by default, with optional fallback to static URLs for development/self-hosted scenarios.

Key Changes

  • New TEE Registry Integration (teeRegistry.ts):

    • TEERegistry class queries the on-chain TEE Registry contract to fetch active TEE endpoints and their DER-encoded TLS certificates
    • Implements getActiveTEEsByType() to retrieve all active TEEs of a given type and getLLMTEE() to select a random active LLM proxy
    • Converts hex-encoded certificate data from the contract into Uint8Array format for TLS pinning
  • New TEE Connection Abstraction (teeConnection.ts):

    • TEEConnection interface provides a common contract for static and registry-backed TEE connections
    • StaticTEEConnection for hardcoded endpoints (dev/self-hosted) with disabled TLS verification
    • RegistryTEEConnection for registry-backed discovery with:
      • TLS certificate pinning via buildPinnedAgent() (creates undici Agent with pinned CA certificate)
      • Optional background health check loop (5-minute interval) to detect stale TEE registrations
      • Automatic reconnection and retry on connection failures
    • Proper resource cleanup via close() method for dispatchers and timers
  • Updated LLM Client (llm.ts):

    • Replaced hardcoded serverUrl and streamingServerUrl config with connection: TEEConnection
    • Refactored request flow: requestWithRetry() handles TEE resolution and single-retry-on-failure logic
    • sendOnce() builds a paid fetch with the TEE's pinned dispatcher injected into every request
    • Added close() method to tear down resources
  • Updated Client Factory (client.ts):

    • Automatically creates RegistryTEEConnection by default (queries registry via RPC)
    • Falls back to StaticTEEConnection when llmServerUrl is provided
    • Accepts optional rpcUrl and teeRegistryAddress overrides
    • Added close() method for cleanup
  • Configuration Updates (types.ts, defaults.ts):

    • Removed llmStreamingServerUrl config (both chat and streaming use the same endpoint)
    • Updated llmServerUrl documentation to clarify it disables registry lookup
    • Added rpcUrl and teeRegistryAddress config options
    • Changed defaults from hardcoded LLM URLs to registry RPC URL and contract address
  • Public API Exports (index.ts):

    • Exported TEERegistry, TEEEndpoint, TEE_TYPE_* constants
    • Exported TEEConnection, ActiveTEE, RegistryTEEConnection, StaticTEEConnection, buildPinnedAgent

Notable Implementation Details

  • TLS Certificate Pinning: Instead of trust-on-first-use (TOFU), the client fetches the certificate submitted during TEE registration and pins to it, rejecting any mismatched certificates
  • Hostname Verification Disabled: TEE servers are typically addressed by IP while certificates may be issued for different hostnames; the pinned certificate itself serves as the trust anchor
  • Graceful Degradation: Connection failures trigger a registry refresh and single retry; if the TEE is no longer active, a fresh one is selected
  • Resource Management: Background timers are marked as non-blocking (unref()) and all resources are properly cleaned up on close()
  • Version Bump: Package version updated to 2.1.0

https://claude.ai/code/session_01Nvpzd6GMuRCcgfuFZgotUk

Brings the TS SDK in line with the Python SDK: the LLM endpoint is now
discovered by querying the on-chain TEERegistry contract instead of a
hardcoded URL, and the TEE's TLS certificate is pinned to the value
stored at registration time (no TOFU).
- src/abi/teeRegistry.ts: minimal read-only ABI for getActiveTEEs.
- src/teeRegistry.ts: TEERegistry class wrapping the contract via viem
(getActiveTEEsByType, getLLMTEE).
- src/teeConnection.ts: StaticTEEConnection (hardcoded URL, TLS
verification disabled) and RegistryTEEConnection (registry-resolved,
pinned TLS cert via undici Agent, lazy connect, 5-min health check
with automatic failover).
- src/llm.ts: refactored to drive requests through a TEEConnection,
injecting the pinned dispatcher into the x402-paid fetch and retrying
once on connection failure with a fresh TEE.
- src/client.ts: registry is now the default; passing llmServerUrl
switches to a static connection.
- types.ts/defaults.ts/index.ts: new ClientConfig fields (rpcUrl,
teeRegistryAddress), registry defaults, and re-exports.
- package.json: declare viem and undici as direct deps; bump to 2.1.0.
@socket-security

socket-securityBot commented May 5, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedundici@​6.25.07210010098100

View full report

@adambalogh
adambalogh merged commit 7377767 into mainMay 5, 2026
5 checks passed
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.

2 participants

@adambalogh@claude
, '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

Add on-chain TEE registry discovery with TLS certificate pinning - #6

Merged
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn
May 5, 2026
Merged

Add on-chain TEE registry discovery with TLS certificate pinning#6
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn

Conversation

@adambalogh

Copy link
Copy Markdown
Contributor

Summary

This PR introduces on-chain TEE registry integration to dynamically discover active LLM proxy endpoints with TLS certificate pinning, replacing hardcoded server URLs. The client now resolves TEE endpoints from the registry by default, with optional fallback to static URLs for development/self-hosted scenarios.

Key Changes

  • New TEE Registry Integration (teeRegistry.ts):

    • TEERegistry class queries the on-chain TEE Registry contract to fetch active TEE endpoints and their DER-encoded TLS certificates
    • Implements getActiveTEEsByType() to retrieve all active TEEs of a given type and getLLMTEE() to select a random active LLM proxy
    • Converts hex-encoded certificate data from the contract into Uint8Array format for TLS pinning
  • New TEE Connection Abstraction (teeConnection.ts):

    • TEEConnection interface provides a common contract for static and registry-backed TEE connections
    • StaticTEEConnection for hardcoded endpoints (dev/self-hosted) with disabled TLS verification
    • RegistryTEEConnection for registry-backed discovery with:
      • TLS certificate pinning via buildPinnedAgent() (creates undici Agent with pinned CA certificate)
      • Optional background health check loop (5-minute interval) to detect stale TEE registrations
      • Automatic reconnection and retry on connection failures
    • Proper resource cleanup via close() method for dispatchers and timers
  • Updated LLM Client (llm.ts):

    • Replaced hardcoded serverUrl and streamingServerUrl config with connection: TEEConnection
    • Refactored request flow: requestWithRetry() handles TEE resolution and single-retry-on-failure logic
    • sendOnce() builds a paid fetch with the TEE's pinned dispatcher injected into every request
    • Added close() method to tear down resources
  • Updated Client Factory (client.ts):

    • Automatically creates RegistryTEEConnection by default (queries registry via RPC)
    • Falls back to StaticTEEConnection when llmServerUrl is provided
    • Accepts optional rpcUrl and teeRegistryAddress overrides
    • Added close() method for cleanup
  • Configuration Updates (types.ts, defaults.ts):

    • Removed llmStreamingServerUrl config (both chat and streaming use the same endpoint)
    • Updated llmServerUrl documentation to clarify it disables registry lookup
    • Added rpcUrl and teeRegistryAddress config options
    • Changed defaults from hardcoded LLM URLs to registry RPC URL and contract address
  • Public API Exports (index.ts):

    • Exported TEERegistry, TEEEndpoint, TEE_TYPE_* constants
    • Exported TEEConnection, ActiveTEE, RegistryTEEConnection, StaticTEEConnection, buildPinnedAgent

Notable Implementation Details

  • TLS Certificate Pinning: Instead of trust-on-first-use (TOFU), the client fetches the certificate submitted during TEE registration and pins to it, rejecting any mismatched certificates
  • Hostname Verification Disabled: TEE servers are typically addressed by IP while certificates may be issued for different hostnames; the pinned certificate itself serves as the trust anchor
  • Graceful Degradation: Connection failures trigger a registry refresh and single retry; if the TEE is no longer active, a fresh one is selected
  • Resource Management: Background timers are marked as non-blocking (unref()) and all resources are properly cleaned up on close()
  • Version Bump: Package version updated to 2.1.0

https://claude.ai/code/session_01Nvpzd6GMuRCcgfuFZgotUk

Brings the TS SDK in line with the Python SDK: the LLM endpoint is now
discovered by querying the on-chain TEERegistry contract instead of a
hardcoded URL, and the TEE's TLS certificate is pinned to the value
stored at registration time (no TOFU).
- src/abi/teeRegistry.ts: minimal read-only ABI for getActiveTEEs.
- src/teeRegistry.ts: TEERegistry class wrapping the contract via viem
(getActiveTEEsByType, getLLMTEE).
- src/teeConnection.ts: StaticTEEConnection (hardcoded URL, TLS
verification disabled) and RegistryTEEConnection (registry-resolved,
pinned TLS cert via undici Agent, lazy connect, 5-min health check
with automatic failover).
- src/llm.ts: refactored to drive requests through a TEEConnection,
injecting the pinned dispatcher into the x402-paid fetch and retrying
once on connection failure with a fresh TEE.
- src/client.ts: registry is now the default; passing llmServerUrl
switches to a static connection.
- types.ts/defaults.ts/index.ts: new ClientConfig fields (rpcUrl,
teeRegistryAddress), registry defaults, and re-exports.
- package.json: declare viem and undici as direct deps; bump to 2.1.0.
@socket-security

socket-securityBot commented May 5, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedundici@​6.25.07210010098100

View full report

@adambalogh
adambalogh merged commit 7377767 into mainMay 5, 2026
5 checks passed
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.

2 participants

@adambalogh@claude
, '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

Add on-chain TEE registry discovery with TLS certificate pinning - #6

Merged
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn
May 5, 2026
Merged

Add on-chain TEE registry discovery with TLS certificate pinning#6
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn

Conversation

@adambalogh

Copy link
Copy Markdown
Contributor

Summary

This PR introduces on-chain TEE registry integration to dynamically discover active LLM proxy endpoints with TLS certificate pinning, replacing hardcoded server URLs. The client now resolves TEE endpoints from the registry by default, with optional fallback to static URLs for development/self-hosted scenarios.

Key Changes

  • New TEE Registry Integration (teeRegistry.ts):

    • TEERegistry class queries the on-chain TEE Registry contract to fetch active TEE endpoints and their DER-encoded TLS certificates
    • Implements getActiveTEEsByType() to retrieve all active TEEs of a given type and getLLMTEE() to select a random active LLM proxy
    • Converts hex-encoded certificate data from the contract into Uint8Array format for TLS pinning
  • New TEE Connection Abstraction (teeConnection.ts):

    • TEEConnection interface provides a common contract for static and registry-backed TEE connections
    • StaticTEEConnection for hardcoded endpoints (dev/self-hosted) with disabled TLS verification
    • RegistryTEEConnection for registry-backed discovery with:
      • TLS certificate pinning via buildPinnedAgent() (creates undici Agent with pinned CA certificate)
      • Optional background health check loop (5-minute interval) to detect stale TEE registrations
      • Automatic reconnection and retry on connection failures
    • Proper resource cleanup via close() method for dispatchers and timers
  • Updated LLM Client (llm.ts):

    • Replaced hardcoded serverUrl and streamingServerUrl config with connection: TEEConnection
    • Refactored request flow: requestWithRetry() handles TEE resolution and single-retry-on-failure logic
    • sendOnce() builds a paid fetch with the TEE's pinned dispatcher injected into every request
    • Added close() method to tear down resources
  • Updated Client Factory (client.ts):

    • Automatically creates RegistryTEEConnection by default (queries registry via RPC)
    • Falls back to StaticTEEConnection when llmServerUrl is provided
    • Accepts optional rpcUrl and teeRegistryAddress overrides
    • Added close() method for cleanup
  • Configuration Updates (types.ts, defaults.ts):

    • Removed llmStreamingServerUrl config (both chat and streaming use the same endpoint)
    • Updated llmServerUrl documentation to clarify it disables registry lookup
    • Added rpcUrl and teeRegistryAddress config options
    • Changed defaults from hardcoded LLM URLs to registry RPC URL and contract address
  • Public API Exports (index.ts):

    • Exported TEERegistry, TEEEndpoint, TEE_TYPE_* constants
    • Exported TEEConnection, ActiveTEE, RegistryTEEConnection, StaticTEEConnection, buildPinnedAgent

Notable Implementation Details

  • TLS Certificate Pinning: Instead of trust-on-first-use (TOFU), the client fetches the certificate submitted during TEE registration and pins to it, rejecting any mismatched certificates
  • Hostname Verification Disabled: TEE servers are typically addressed by IP while certificates may be issued for different hostnames; the pinned certificate itself serves as the trust anchor
  • Graceful Degradation: Connection failures trigger a registry refresh and single retry; if the TEE is no longer active, a fresh one is selected
  • Resource Management: Background timers are marked as non-blocking (unref()) and all resources are properly cleaned up on close()
  • Version Bump: Package version updated to 2.1.0

https://claude.ai/code/session_01Nvpzd6GMuRCcgfuFZgotUk

Brings the TS SDK in line with the Python SDK: the LLM endpoint is now
discovered by querying the on-chain TEERegistry contract instead of a
hardcoded URL, and the TEE's TLS certificate is pinned to the value
stored at registration time (no TOFU).
- src/abi/teeRegistry.ts: minimal read-only ABI for getActiveTEEs.
- src/teeRegistry.ts: TEERegistry class wrapping the contract via viem
(getActiveTEEsByType, getLLMTEE).
- src/teeConnection.ts: StaticTEEConnection (hardcoded URL, TLS
verification disabled) and RegistryTEEConnection (registry-resolved,
pinned TLS cert via undici Agent, lazy connect, 5-min health check
with automatic failover).
- src/llm.ts: refactored to drive requests through a TEEConnection,
injecting the pinned dispatcher into the x402-paid fetch and retrying
once on connection failure with a fresh TEE.
- src/client.ts: registry is now the default; passing llmServerUrl
switches to a static connection.
- types.ts/defaults.ts/index.ts: new ClientConfig fields (rpcUrl,
teeRegistryAddress), registry defaults, and re-exports.
- package.json: declare viem and undici as direct deps; bump to 2.1.0.
@socket-security

socket-securityBot commented May 5, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedundici@​6.25.07210010098100

View full report

@adambalogh
adambalogh merged commit 7377767 into mainMay 5, 2026
5 checks passed
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.

2 participants

@adambalogh@claude
, '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

Add on-chain TEE registry discovery with TLS certificate pinning - #6

Merged
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn
May 5, 2026
Merged

Add on-chain TEE registry discovery with TLS certificate pinning#6
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn

Conversation

@adambalogh

Copy link
Copy Markdown
Contributor

Summary

This PR introduces on-chain TEE registry integration to dynamically discover active LLM proxy endpoints with TLS certificate pinning, replacing hardcoded server URLs. The client now resolves TEE endpoints from the registry by default, with optional fallback to static URLs for development/self-hosted scenarios.

Key Changes

  • New TEE Registry Integration (teeRegistry.ts):

    • TEERegistry class queries the on-chain TEE Registry contract to fetch active TEE endpoints and their DER-encoded TLS certificates
    • Implements getActiveTEEsByType() to retrieve all active TEEs of a given type and getLLMTEE() to select a random active LLM proxy
    • Converts hex-encoded certificate data from the contract into Uint8Array format for TLS pinning
  • New TEE Connection Abstraction (teeConnection.ts):

    • TEEConnection interface provides a common contract for static and registry-backed TEE connections
    • StaticTEEConnection for hardcoded endpoints (dev/self-hosted) with disabled TLS verification
    • RegistryTEEConnection for registry-backed discovery with:
      • TLS certificate pinning via buildPinnedAgent() (creates undici Agent with pinned CA certificate)
      • Optional background health check loop (5-minute interval) to detect stale TEE registrations
      • Automatic reconnection and retry on connection failures
    • Proper resource cleanup via close() method for dispatchers and timers
  • Updated LLM Client (llm.ts):

    • Replaced hardcoded serverUrl and streamingServerUrl config with connection: TEEConnection
    • Refactored request flow: requestWithRetry() handles TEE resolution and single-retry-on-failure logic
    • sendOnce() builds a paid fetch with the TEE's pinned dispatcher injected into every request
    • Added close() method to tear down resources
  • Updated Client Factory (client.ts):

    • Automatically creates RegistryTEEConnection by default (queries registry via RPC)
    • Falls back to StaticTEEConnection when llmServerUrl is provided
    • Accepts optional rpcUrl and teeRegistryAddress overrides
    • Added close() method for cleanup
  • Configuration Updates (types.ts, defaults.ts):

    • Removed llmStreamingServerUrl config (both chat and streaming use the same endpoint)
    • Updated llmServerUrl documentation to clarify it disables registry lookup
    • Added rpcUrl and teeRegistryAddress config options
    • Changed defaults from hardcoded LLM URLs to registry RPC URL and contract address
  • Public API Exports (index.ts):

    • Exported TEERegistry, TEEEndpoint, TEE_TYPE_* constants
    • Exported TEEConnection, ActiveTEE, RegistryTEEConnection, StaticTEEConnection, buildPinnedAgent

Notable Implementation Details

  • TLS Certificate Pinning: Instead of trust-on-first-use (TOFU), the client fetches the certificate submitted during TEE registration and pins to it, rejecting any mismatched certificates
  • Hostname Verification Disabled: TEE servers are typically addressed by IP while certificates may be issued for different hostnames; the pinned certificate itself serves as the trust anchor
  • Graceful Degradation: Connection failures trigger a registry refresh and single retry; if the TEE is no longer active, a fresh one is selected
  • Resource Management: Background timers are marked as non-blocking (unref()) and all resources are properly cleaned up on close()
  • Version Bump: Package version updated to 2.1.0

https://claude.ai/code/session_01Nvpzd6GMuRCcgfuFZgotUk

Brings the TS SDK in line with the Python SDK: the LLM endpoint is now
discovered by querying the on-chain TEERegistry contract instead of a
hardcoded URL, and the TEE's TLS certificate is pinned to the value
stored at registration time (no TOFU).
- src/abi/teeRegistry.ts: minimal read-only ABI for getActiveTEEs.
- src/teeRegistry.ts: TEERegistry class wrapping the contract via viem
(getActiveTEEsByType, getLLMTEE).
- src/teeConnection.ts: StaticTEEConnection (hardcoded URL, TLS
verification disabled) and RegistryTEEConnection (registry-resolved,
pinned TLS cert via undici Agent, lazy connect, 5-min health check
with automatic failover).
- src/llm.ts: refactored to drive requests through a TEEConnection,
injecting the pinned dispatcher into the x402-paid fetch and retrying
once on connection failure with a fresh TEE.
- src/client.ts: registry is now the default; passing llmServerUrl
switches to a static connection.
- types.ts/defaults.ts/index.ts: new ClientConfig fields (rpcUrl,
teeRegistryAddress), registry defaults, and re-exports.
- package.json: declare viem and undici as direct deps; bump to 2.1.0.
@socket-security

socket-securityBot commented May 5, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedundici@​6.25.07210010098100

View full report

@adambalogh
adambalogh merged commit 7377767 into mainMay 5, 2026
5 checks passed
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.

2 participants

@adambalogh@claude
, '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

Add on-chain TEE registry discovery with TLS certificate pinning - #6

Merged
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn
May 5, 2026
Merged

Add on-chain TEE registry discovery with TLS certificate pinning#6
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn

Conversation

@adambalogh

Copy link
Copy Markdown
Contributor

Summary

This PR introduces on-chain TEE registry integration to dynamically discover active LLM proxy endpoints with TLS certificate pinning, replacing hardcoded server URLs. The client now resolves TEE endpoints from the registry by default, with optional fallback to static URLs for development/self-hosted scenarios.

Key Changes

  • New TEE Registry Integration (teeRegistry.ts):

    • TEERegistry class queries the on-chain TEE Registry contract to fetch active TEE endpoints and their DER-encoded TLS certificates
    • Implements getActiveTEEsByType() to retrieve all active TEEs of a given type and getLLMTEE() to select a random active LLM proxy
    • Converts hex-encoded certificate data from the contract into Uint8Array format for TLS pinning
  • New TEE Connection Abstraction (teeConnection.ts):

    • TEEConnection interface provides a common contract for static and registry-backed TEE connections
    • StaticTEEConnection for hardcoded endpoints (dev/self-hosted) with disabled TLS verification
    • RegistryTEEConnection for registry-backed discovery with:
      • TLS certificate pinning via buildPinnedAgent() (creates undici Agent with pinned CA certificate)
      • Optional background health check loop (5-minute interval) to detect stale TEE registrations
      • Automatic reconnection and retry on connection failures
    • Proper resource cleanup via close() method for dispatchers and timers
  • Updated LLM Client (llm.ts):

    • Replaced hardcoded serverUrl and streamingServerUrl config with connection: TEEConnection
    • Refactored request flow: requestWithRetry() handles TEE resolution and single-retry-on-failure logic
    • sendOnce() builds a paid fetch with the TEE's pinned dispatcher injected into every request
    • Added close() method to tear down resources
  • Updated Client Factory (client.ts):

    • Automatically creates RegistryTEEConnection by default (queries registry via RPC)
    • Falls back to StaticTEEConnection when llmServerUrl is provided
    • Accepts optional rpcUrl and teeRegistryAddress overrides
    • Added close() method for cleanup
  • Configuration Updates (types.ts, defaults.ts):

    • Removed llmStreamingServerUrl config (both chat and streaming use the same endpoint)
    • Updated llmServerUrl documentation to clarify it disables registry lookup
    • Added rpcUrl and teeRegistryAddress config options
    • Changed defaults from hardcoded LLM URLs to registry RPC URL and contract address
  • Public API Exports (index.ts):

    • Exported TEERegistry, TEEEndpoint, TEE_TYPE_* constants
    • Exported TEEConnection, ActiveTEE, RegistryTEEConnection, StaticTEEConnection, buildPinnedAgent

Notable Implementation Details

  • TLS Certificate Pinning: Instead of trust-on-first-use (TOFU), the client fetches the certificate submitted during TEE registration and pins to it, rejecting any mismatched certificates
  • Hostname Verification Disabled: TEE servers are typically addressed by IP while certificates may be issued for different hostnames; the pinned certificate itself serves as the trust anchor
  • Graceful Degradation: Connection failures trigger a registry refresh and single retry; if the TEE is no longer active, a fresh one is selected
  • Resource Management: Background timers are marked as non-blocking (unref()) and all resources are properly cleaned up on close()
  • Version Bump: Package version updated to 2.1.0

https://claude.ai/code/session_01Nvpzd6GMuRCcgfuFZgotUk

Brings the TS SDK in line with the Python SDK: the LLM endpoint is now
discovered by querying the on-chain TEERegistry contract instead of a
hardcoded URL, and the TEE's TLS certificate is pinned to the value
stored at registration time (no TOFU).
- src/abi/teeRegistry.ts: minimal read-only ABI for getActiveTEEs.
- src/teeRegistry.ts: TEERegistry class wrapping the contract via viem
(getActiveTEEsByType, getLLMTEE).
- src/teeConnection.ts: StaticTEEConnection (hardcoded URL, TLS
verification disabled) and RegistryTEEConnection (registry-resolved,
pinned TLS cert via undici Agent, lazy connect, 5-min health check
with automatic failover).
- src/llm.ts: refactored to drive requests through a TEEConnection,
injecting the pinned dispatcher into the x402-paid fetch and retrying
once on connection failure with a fresh TEE.
- src/client.ts: registry is now the default; passing llmServerUrl
switches to a static connection.
- types.ts/defaults.ts/index.ts: new ClientConfig fields (rpcUrl,
teeRegistryAddress), registry defaults, and re-exports.
- package.json: declare viem and undici as direct deps; bump to 2.1.0.
@socket-security

socket-securityBot commented May 5, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedundici@​6.25.07210010098100

View full report

@adambalogh
adambalogh merged commit 7377767 into mainMay 5, 2026
5 checks passed
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.

2 participants

@adambalogh@claude
, '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

Add on-chain TEE registry discovery with TLS certificate pinning - #6

Merged
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn
May 5, 2026
Merged

Add on-chain TEE registry discovery with TLS certificate pinning#6
adambalogh merged 2 commits into
mainfrom
claude/add-tee-registry-ts-a56Wn

Conversation

@adambalogh

Copy link
Copy Markdown
Contributor

Summary

This PR introduces on-chain TEE registry integration to dynamically discover active LLM proxy endpoints with TLS certificate pinning, replacing hardcoded server URLs. The client now resolves TEE endpoints from the registry by default, with optional fallback to static URLs for development/self-hosted scenarios.

Key Changes

  • New TEE Registry Integration (teeRegistry.ts):

    • TEERegistry class queries the on-chain TEE Registry contract to fetch active TEE endpoints and their DER-encoded TLS certificates
    • Implements getActiveTEEsByType() to retrieve all active TEEs of a given type and getLLMTEE() to select a random active LLM proxy
    • Converts hex-encoded certificate data from the contract into Uint8Array format for TLS pinning
  • New TEE Connection Abstraction (teeConnection.ts):

    • TEEConnection interface provides a common contract for static and registry-backed TEE connections
    • StaticTEEConnection for hardcoded endpoints (dev/self-hosted) with disabled TLS verification
    • RegistryTEEConnection for registry-backed discovery with:
      • TLS certificate pinning via buildPinnedAgent() (creates undici Agent with pinned CA certificate)
      • Optional background health check loop (5-minute interval) to detect stale TEE registrations
      • Automatic reconnection and retry on connection failures
    • Proper resource cleanup via close() method for dispatchers and timers
  • Updated LLM Client (llm.ts):

    • Replaced hardcoded serverUrl and streamingServerUrl config with connection: TEEConnection
    • Refactored request flow: requestWithRetry() handles TEE resolution and single-retry-on-failure logic
    • sendOnce() builds a paid fetch with the TEE's pinned dispatcher injected into every request
    • Added close() method to tear down resources
  • Updated Client Factory (client.ts):

    • Automatically creates RegistryTEEConnection by default (queries registry via RPC)
    • Falls back to StaticTEEConnection when llmServerUrl is provided
    • Accepts optional rpcUrl and teeRegistryAddress overrides
    • Added close() method for cleanup
  • Configuration Updates (types.ts, defaults.ts):

    • Removed llmStreamingServerUrl config (both chat and streaming use the same endpoint)
    • Updated llmServerUrl documentation to clarify it disables registry lookup
    • Added rpcUrl and teeRegistryAddress config options
    • Changed defaults from hardcoded LLM URLs to registry RPC URL and contract address
  • Public API Exports (index.ts):

    • Exported TEERegistry, TEEEndpoint, TEE_TYPE_* constants
    • Exported TEEConnection, ActiveTEE, RegistryTEEConnection, StaticTEEConnection, buildPinnedAgent

Notable Implementation Details

  • TLS Certificate Pinning: Instead of trust-on-first-use (TOFU), the client fetches the certificate submitted during TEE registration and pins to it, rejecting any mismatched certificates
  • Hostname Verification Disabled: TEE servers are typically addressed by IP while certificates may be issued for different hostnames; the pinned certificate itself serves as the trust anchor
  • Graceful Degradation: Connection failures trigger a registry refresh and single retry; if the TEE is no longer active, a fresh one is selected
  • Resource Management: Background timers are marked as non-blocking (unref()) and all resources are properly cleaned up on close()
  • Version Bump: Package version updated to 2.1.0

https://claude.ai/code/session_01Nvpzd6GMuRCcgfuFZgotUk

Brings the TS SDK in line with the Python SDK: the LLM endpoint is now
discovered by querying the on-chain TEERegistry contract instead of a
hardcoded URL, and the TEE's TLS certificate is pinned to the value
stored at registration time (no TOFU).
- src/abi/teeRegistry.ts: minimal read-only ABI for getActiveTEEs.
- src/teeRegistry.ts: TEERegistry class wrapping the contract via viem
(getActiveTEEsByType, getLLMTEE).
- src/teeConnection.ts: StaticTEEConnection (hardcoded URL, TLS
verification disabled) and RegistryTEEConnection (registry-resolved,
pinned TLS cert via undici Agent, lazy connect, 5-min health check
with automatic failover).
- src/llm.ts: refactored to drive requests through a TEEConnection,
injecting the pinned dispatcher into the x402-paid fetch and retrying
once on connection failure with a fresh TEE.
- src/client.ts: registry is now the default; passing llmServerUrl
switches to a static connection.
- types.ts/defaults.ts/index.ts: new ClientConfig fields (rpcUrl,
teeRegistryAddress), registry defaults, and re-exports.
- package.json: declare viem and undici as direct deps; bump to 2.1.0.
@socket-security

socket-securityBot commented May 5, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

DiffPackageSupply Chain
Security
VulnerabilityQualityMaintenanceLicense
Addedundici@​6.25.07210010098100

View full report

@adambalogh
adambalogh merged commit 7377767 into mainMay 5, 2026
5 checks passed
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.

2 participants

@adambalogh@claude