fix(ssh): decode auth timestamps from JSON strings - #2694

Closed
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps
Closed

fix(ssh): decode auth timestamps from JSON strings#2694
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps

Conversation

@ardenworks

@ardenworksardenworks commented May 14, 2026

Copy link
Copy Markdown

What Changed

Use Schema.DateTimeUtcFromString for auth response timestamp fields that are decoded from HTTP JSON responses.

Why

Fixes#2665.

Desktop SSH pairing calls /api/auth/bootstrap/bearer. The remote server returns HTTP 200 with expiresAt serialized as an ISO string, but the desktop contract decoder currently expects a DateTimeUtc value.

That makes pairing fail during desktop:bootstrap-ssh-bearer-session even though the remote API request succeeds.

This fixes the mismatch by using the schema variant that accepts ISO timestamp strings from JSON and decodes them into DateTime.Utc values. The related auth response schemas are updated together because they use the same serialized timestamp shape over HTTP.

UI Changes

None.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Contract-only decoder alignment for serialized timestamps; no auth logic or server behavior changes.

Overview
Auth contract schemas in packages/contracts/src/auth.ts now decode HTTP JSON timestamps with Schema.DateTimeUtcFromString instead of Schema.DateTimeUtc, so ISO 8601 strings from the remote auth API (e.g. desktop SSH bearer bootstrap at /api/auth/bootstrap/bearer) parse correctly instead of failing after a successful 200 response.

The same change is applied across all auth response/session shapes that expose expiresAt, plus createdAt, issuedAt, and nullable lastConnectedAt on pairing links and client sessions.

Reviewed by Cursor Bugbot for commit 14936bd. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix auth timestamp decoding by switching to DateTimeUtcFromString in auth contracts

All timestamp fields in auth-related structs in auth.ts now use DateTimeUtcFromString instead of DateTimeUtc to correctly parse ISO 8601 datetime strings returned from the SSH auth API. This affects expiresAt, issuedAt, createdAt, and lastConnectedAt fields across AuthBootstrapResult, AuthBearerBootstrapResult, AuthWebSocketTokenResult, AuthPairingCredentialResult, AuthPairingLink, AuthClientSession, and AuthSessionState.

Macroscope summarized 14936bd.

@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 61f8cd80-5f6b-4792-8f25-5dad95ba5f82

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels May 14, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward bug fix that mechanically updates timestamp schema types from DateTimeUtc to DateTimeUtcFromString to properly decode JSON string representations. The change is consistent across all affected auth contracts with clear intent and limited scope.

You can customize Macroscope's approvability policy. Learn more.

@Xanacas

Copy link
Copy Markdown
Contributor

Manually confirmed. I ran into the same issue and was able to fix it by applying the batch from within this PR.

@RoyLeviGit

Copy link
Copy Markdown

verified locally, this fixed my issue.

@RoyLeviGitRoyLeviGit left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

verified locally, fixed issue

@bscholar-tt

Copy link
Copy Markdown

Can confirm this fix works for me as well.
Hoping this can be merged in so I don't have to use a fork anymore.

@randomUser00

Copy link
Copy Markdown

verified locally

@PearcekieserPearcekieser mentioned this pull request May 28, 2026
2 tasks
@gthay

gthay commented Jun 1, 2026

Copy link
Copy Markdown

@juliusmarminge please check this PR out.

@ardenworks
ardenworks deleted the fix-ssh-auth-timestamps branch June 3, 2026 18:04
@ardenworks

ardenworks commented Jun 3, 2026

Copy link
Copy Markdown
Author

Closing this since #2858 replaced the old SSH auth bootstrap path and issue #2665 is now closed.

Thanks to everyone who confirmed the fix here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

T3 Code Desktop 0.0.23 fails SSH environment pairing due to DateTime schema mismatch

6 participants

@ardenworks@Xanacas@RoyLeviGit@bscholar-tt@randomUser00@gthay
, '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

fix(ssh): decode auth timestamps from JSON strings - #2694

Closed
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps
Closed

fix(ssh): decode auth timestamps from JSON strings#2694
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps

Conversation

@ardenworks

@ardenworksardenworks commented May 14, 2026

Copy link
Copy Markdown

What Changed

Use Schema.DateTimeUtcFromString for auth response timestamp fields that are decoded from HTTP JSON responses.

Why

Fixes#2665.

Desktop SSH pairing calls /api/auth/bootstrap/bearer. The remote server returns HTTP 200 with expiresAt serialized as an ISO string, but the desktop contract decoder currently expects a DateTimeUtc value.

That makes pairing fail during desktop:bootstrap-ssh-bearer-session even though the remote API request succeeds.

This fixes the mismatch by using the schema variant that accepts ISO timestamp strings from JSON and decodes them into DateTime.Utc values. The related auth response schemas are updated together because they use the same serialized timestamp shape over HTTP.

UI Changes

None.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Contract-only decoder alignment for serialized timestamps; no auth logic or server behavior changes.

Overview
Auth contract schemas in packages/contracts/src/auth.ts now decode HTTP JSON timestamps with Schema.DateTimeUtcFromString instead of Schema.DateTimeUtc, so ISO 8601 strings from the remote auth API (e.g. desktop SSH bearer bootstrap at /api/auth/bootstrap/bearer) parse correctly instead of failing after a successful 200 response.

The same change is applied across all auth response/session shapes that expose expiresAt, plus createdAt, issuedAt, and nullable lastConnectedAt on pairing links and client sessions.

Reviewed by Cursor Bugbot for commit 14936bd. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix auth timestamp decoding by switching to DateTimeUtcFromString in auth contracts

All timestamp fields in auth-related structs in auth.ts now use DateTimeUtcFromString instead of DateTimeUtc to correctly parse ISO 8601 datetime strings returned from the SSH auth API. This affects expiresAt, issuedAt, createdAt, and lastConnectedAt fields across AuthBootstrapResult, AuthBearerBootstrapResult, AuthWebSocketTokenResult, AuthPairingCredentialResult, AuthPairingLink, AuthClientSession, and AuthSessionState.

Macroscope summarized 14936bd.

@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 61f8cd80-5f6b-4792-8f25-5dad95ba5f82

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels May 14, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward bug fix that mechanically updates timestamp schema types from DateTimeUtc to DateTimeUtcFromString to properly decode JSON string representations. The change is consistent across all affected auth contracts with clear intent and limited scope.

You can customize Macroscope's approvability policy. Learn more.

@Xanacas

Copy link
Copy Markdown
Contributor

Manually confirmed. I ran into the same issue and was able to fix it by applying the batch from within this PR.

@RoyLeviGit

Copy link
Copy Markdown

verified locally, this fixed my issue.

@RoyLeviGitRoyLeviGit left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

verified locally, fixed issue

@bscholar-tt

Copy link
Copy Markdown

Can confirm this fix works for me as well.
Hoping this can be merged in so I don't have to use a fork anymore.

@randomUser00

Copy link
Copy Markdown

verified locally

@PearcekieserPearcekieser mentioned this pull request May 28, 2026
2 tasks
@gthay

gthay commented Jun 1, 2026

Copy link
Copy Markdown

@juliusmarminge please check this PR out.

@ardenworks
ardenworks deleted the fix-ssh-auth-timestamps branch June 3, 2026 18:04
@ardenworks

ardenworks commented Jun 3, 2026

Copy link
Copy Markdown
Author

Closing this since #2858 replaced the old SSH auth bootstrap path and issue #2665 is now closed.

Thanks to everyone who confirmed the fix here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

T3 Code Desktop 0.0.23 fails SSH environment pairing due to DateTime schema mismatch

6 participants

@ardenworks@Xanacas@RoyLeviGit@bscholar-tt@randomUser00@gthay
, '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

fix(ssh): decode auth timestamps from JSON strings - #2694

Closed
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps
Closed

fix(ssh): decode auth timestamps from JSON strings#2694
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps

Conversation

@ardenworks

@ardenworksardenworks commented May 14, 2026

Copy link
Copy Markdown

What Changed

Use Schema.DateTimeUtcFromString for auth response timestamp fields that are decoded from HTTP JSON responses.

Why

Fixes#2665.

Desktop SSH pairing calls /api/auth/bootstrap/bearer. The remote server returns HTTP 200 with expiresAt serialized as an ISO string, but the desktop contract decoder currently expects a DateTimeUtc value.

That makes pairing fail during desktop:bootstrap-ssh-bearer-session even though the remote API request succeeds.

This fixes the mismatch by using the schema variant that accepts ISO timestamp strings from JSON and decodes them into DateTime.Utc values. The related auth response schemas are updated together because they use the same serialized timestamp shape over HTTP.

UI Changes

None.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Contract-only decoder alignment for serialized timestamps; no auth logic or server behavior changes.

Overview
Auth contract schemas in packages/contracts/src/auth.ts now decode HTTP JSON timestamps with Schema.DateTimeUtcFromString instead of Schema.DateTimeUtc, so ISO 8601 strings from the remote auth API (e.g. desktop SSH bearer bootstrap at /api/auth/bootstrap/bearer) parse correctly instead of failing after a successful 200 response.

The same change is applied across all auth response/session shapes that expose expiresAt, plus createdAt, issuedAt, and nullable lastConnectedAt on pairing links and client sessions.

Reviewed by Cursor Bugbot for commit 14936bd. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix auth timestamp decoding by switching to DateTimeUtcFromString in auth contracts

All timestamp fields in auth-related structs in auth.ts now use DateTimeUtcFromString instead of DateTimeUtc to correctly parse ISO 8601 datetime strings returned from the SSH auth API. This affects expiresAt, issuedAt, createdAt, and lastConnectedAt fields across AuthBootstrapResult, AuthBearerBootstrapResult, AuthWebSocketTokenResult, AuthPairingCredentialResult, AuthPairingLink, AuthClientSession, and AuthSessionState.

Macroscope summarized 14936bd.

@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 61f8cd80-5f6b-4792-8f25-5dad95ba5f82

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels May 14, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward bug fix that mechanically updates timestamp schema types from DateTimeUtc to DateTimeUtcFromString to properly decode JSON string representations. The change is consistent across all affected auth contracts with clear intent and limited scope.

You can customize Macroscope's approvability policy. Learn more.

@Xanacas

Copy link
Copy Markdown
Contributor

Manually confirmed. I ran into the same issue and was able to fix it by applying the batch from within this PR.

@RoyLeviGit

Copy link
Copy Markdown

verified locally, this fixed my issue.

@RoyLeviGitRoyLeviGit left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

verified locally, fixed issue

@bscholar-tt

Copy link
Copy Markdown

Can confirm this fix works for me as well.
Hoping this can be merged in so I don't have to use a fork anymore.

@randomUser00

Copy link
Copy Markdown

verified locally

@PearcekieserPearcekieser mentioned this pull request May 28, 2026
2 tasks
@gthay

gthay commented Jun 1, 2026

Copy link
Copy Markdown

@juliusmarminge please check this PR out.

@ardenworks
ardenworks deleted the fix-ssh-auth-timestamps branch June 3, 2026 18:04
@ardenworks

ardenworks commented Jun 3, 2026

Copy link
Copy Markdown
Author

Closing this since #2858 replaced the old SSH auth bootstrap path and issue #2665 is now closed.

Thanks to everyone who confirmed the fix here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

T3 Code Desktop 0.0.23 fails SSH environment pairing due to DateTime schema mismatch

6 participants

@ardenworks@Xanacas@RoyLeviGit@bscholar-tt@randomUser00@gthay
, '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

fix(ssh): decode auth timestamps from JSON strings - #2694

Closed
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps
Closed

fix(ssh): decode auth timestamps from JSON strings#2694
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps

Conversation

@ardenworks

@ardenworksardenworks commented May 14, 2026

Copy link
Copy Markdown

What Changed

Use Schema.DateTimeUtcFromString for auth response timestamp fields that are decoded from HTTP JSON responses.

Why

Fixes#2665.

Desktop SSH pairing calls /api/auth/bootstrap/bearer. The remote server returns HTTP 200 with expiresAt serialized as an ISO string, but the desktop contract decoder currently expects a DateTimeUtc value.

That makes pairing fail during desktop:bootstrap-ssh-bearer-session even though the remote API request succeeds.

This fixes the mismatch by using the schema variant that accepts ISO timestamp strings from JSON and decodes them into DateTime.Utc values. The related auth response schemas are updated together because they use the same serialized timestamp shape over HTTP.

UI Changes

None.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Contract-only decoder alignment for serialized timestamps; no auth logic or server behavior changes.

Overview
Auth contract schemas in packages/contracts/src/auth.ts now decode HTTP JSON timestamps with Schema.DateTimeUtcFromString instead of Schema.DateTimeUtc, so ISO 8601 strings from the remote auth API (e.g. desktop SSH bearer bootstrap at /api/auth/bootstrap/bearer) parse correctly instead of failing after a successful 200 response.

The same change is applied across all auth response/session shapes that expose expiresAt, plus createdAt, issuedAt, and nullable lastConnectedAt on pairing links and client sessions.

Reviewed by Cursor Bugbot for commit 14936bd. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix auth timestamp decoding by switching to DateTimeUtcFromString in auth contracts

All timestamp fields in auth-related structs in auth.ts now use DateTimeUtcFromString instead of DateTimeUtc to correctly parse ISO 8601 datetime strings returned from the SSH auth API. This affects expiresAt, issuedAt, createdAt, and lastConnectedAt fields across AuthBootstrapResult, AuthBearerBootstrapResult, AuthWebSocketTokenResult, AuthPairingCredentialResult, AuthPairingLink, AuthClientSession, and AuthSessionState.

Macroscope summarized 14936bd.

@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 61f8cd80-5f6b-4792-8f25-5dad95ba5f82

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels May 14, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward bug fix that mechanically updates timestamp schema types from DateTimeUtc to DateTimeUtcFromString to properly decode JSON string representations. The change is consistent across all affected auth contracts with clear intent and limited scope.

You can customize Macroscope's approvability policy. Learn more.

@Xanacas

Copy link
Copy Markdown
Contributor

Manually confirmed. I ran into the same issue and was able to fix it by applying the batch from within this PR.

@RoyLeviGit

Copy link
Copy Markdown

verified locally, this fixed my issue.

@RoyLeviGitRoyLeviGit left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

verified locally, fixed issue

@bscholar-tt

Copy link
Copy Markdown

Can confirm this fix works for me as well.
Hoping this can be merged in so I don't have to use a fork anymore.

@randomUser00

Copy link
Copy Markdown

verified locally

@PearcekieserPearcekieser mentioned this pull request May 28, 2026
2 tasks
@gthay

gthay commented Jun 1, 2026

Copy link
Copy Markdown

@juliusmarminge please check this PR out.

@ardenworks
ardenworks deleted the fix-ssh-auth-timestamps branch June 3, 2026 18:04
@ardenworks

ardenworks commented Jun 3, 2026

Copy link
Copy Markdown
Author

Closing this since #2858 replaced the old SSH auth bootstrap path and issue #2665 is now closed.

Thanks to everyone who confirmed the fix here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

T3 Code Desktop 0.0.23 fails SSH environment pairing due to DateTime schema mismatch

6 participants

@ardenworks@Xanacas@RoyLeviGit@bscholar-tt@randomUser00@gthay
, '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

fix(ssh): decode auth timestamps from JSON strings - #2694

Closed
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps
Closed

fix(ssh): decode auth timestamps from JSON strings#2694
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps

Conversation

@ardenworks

@ardenworksardenworks commented May 14, 2026

Copy link
Copy Markdown

What Changed

Use Schema.DateTimeUtcFromString for auth response timestamp fields that are decoded from HTTP JSON responses.

Why

Fixes#2665.

Desktop SSH pairing calls /api/auth/bootstrap/bearer. The remote server returns HTTP 200 with expiresAt serialized as an ISO string, but the desktop contract decoder currently expects a DateTimeUtc value.

That makes pairing fail during desktop:bootstrap-ssh-bearer-session even though the remote API request succeeds.

This fixes the mismatch by using the schema variant that accepts ISO timestamp strings from JSON and decodes them into DateTime.Utc values. The related auth response schemas are updated together because they use the same serialized timestamp shape over HTTP.

UI Changes

None.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Contract-only decoder alignment for serialized timestamps; no auth logic or server behavior changes.

Overview
Auth contract schemas in packages/contracts/src/auth.ts now decode HTTP JSON timestamps with Schema.DateTimeUtcFromString instead of Schema.DateTimeUtc, so ISO 8601 strings from the remote auth API (e.g. desktop SSH bearer bootstrap at /api/auth/bootstrap/bearer) parse correctly instead of failing after a successful 200 response.

The same change is applied across all auth response/session shapes that expose expiresAt, plus createdAt, issuedAt, and nullable lastConnectedAt on pairing links and client sessions.

Reviewed by Cursor Bugbot for commit 14936bd. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix auth timestamp decoding by switching to DateTimeUtcFromString in auth contracts

All timestamp fields in auth-related structs in auth.ts now use DateTimeUtcFromString instead of DateTimeUtc to correctly parse ISO 8601 datetime strings returned from the SSH auth API. This affects expiresAt, issuedAt, createdAt, and lastConnectedAt fields across AuthBootstrapResult, AuthBearerBootstrapResult, AuthWebSocketTokenResult, AuthPairingCredentialResult, AuthPairingLink, AuthClientSession, and AuthSessionState.

Macroscope summarized 14936bd.

@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 61f8cd80-5f6b-4792-8f25-5dad95ba5f82

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels May 14, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward bug fix that mechanically updates timestamp schema types from DateTimeUtc to DateTimeUtcFromString to properly decode JSON string representations. The change is consistent across all affected auth contracts with clear intent and limited scope.

You can customize Macroscope's approvability policy. Learn more.

@Xanacas

Copy link
Copy Markdown
Contributor

Manually confirmed. I ran into the same issue and was able to fix it by applying the batch from within this PR.

@RoyLeviGit

Copy link
Copy Markdown

verified locally, this fixed my issue.

@RoyLeviGitRoyLeviGit left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

verified locally, fixed issue

@bscholar-tt

Copy link
Copy Markdown

Can confirm this fix works for me as well.
Hoping this can be merged in so I don't have to use a fork anymore.

@randomUser00

Copy link
Copy Markdown

verified locally

@PearcekieserPearcekieser mentioned this pull request May 28, 2026
2 tasks
@gthay

gthay commented Jun 1, 2026

Copy link
Copy Markdown

@juliusmarminge please check this PR out.

@ardenworks
ardenworks deleted the fix-ssh-auth-timestamps branch June 3, 2026 18:04
@ardenworks

ardenworks commented Jun 3, 2026

Copy link
Copy Markdown
Author

Closing this since #2858 replaced the old SSH auth bootstrap path and issue #2665 is now closed.

Thanks to everyone who confirmed the fix here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

T3 Code Desktop 0.0.23 fails SSH environment pairing due to DateTime schema mismatch

6 participants

@ardenworks@Xanacas@RoyLeviGit@bscholar-tt@randomUser00@gthay
, '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

fix(ssh): decode auth timestamps from JSON strings - #2694

Closed
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps
Closed

fix(ssh): decode auth timestamps from JSON strings#2694
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps

Conversation

@ardenworks

@ardenworksardenworks commented May 14, 2026

Copy link
Copy Markdown

What Changed

Use Schema.DateTimeUtcFromString for auth response timestamp fields that are decoded from HTTP JSON responses.

Why

Fixes#2665.

Desktop SSH pairing calls /api/auth/bootstrap/bearer. The remote server returns HTTP 200 with expiresAt serialized as an ISO string, but the desktop contract decoder currently expects a DateTimeUtc value.

That makes pairing fail during desktop:bootstrap-ssh-bearer-session even though the remote API request succeeds.

This fixes the mismatch by using the schema variant that accepts ISO timestamp strings from JSON and decodes them into DateTime.Utc values. The related auth response schemas are updated together because they use the same serialized timestamp shape over HTTP.

UI Changes

None.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Contract-only decoder alignment for serialized timestamps; no auth logic or server behavior changes.

Overview
Auth contract schemas in packages/contracts/src/auth.ts now decode HTTP JSON timestamps with Schema.DateTimeUtcFromString instead of Schema.DateTimeUtc, so ISO 8601 strings from the remote auth API (e.g. desktop SSH bearer bootstrap at /api/auth/bootstrap/bearer) parse correctly instead of failing after a successful 200 response.

The same change is applied across all auth response/session shapes that expose expiresAt, plus createdAt, issuedAt, and nullable lastConnectedAt on pairing links and client sessions.

Reviewed by Cursor Bugbot for commit 14936bd. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix auth timestamp decoding by switching to DateTimeUtcFromString in auth contracts

All timestamp fields in auth-related structs in auth.ts now use DateTimeUtcFromString instead of DateTimeUtc to correctly parse ISO 8601 datetime strings returned from the SSH auth API. This affects expiresAt, issuedAt, createdAt, and lastConnectedAt fields across AuthBootstrapResult, AuthBearerBootstrapResult, AuthWebSocketTokenResult, AuthPairingCredentialResult, AuthPairingLink, AuthClientSession, and AuthSessionState.

Macroscope summarized 14936bd.

@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 61f8cd80-5f6b-4792-8f25-5dad95ba5f82

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels May 14, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward bug fix that mechanically updates timestamp schema types from DateTimeUtc to DateTimeUtcFromString to properly decode JSON string representations. The change is consistent across all affected auth contracts with clear intent and limited scope.

You can customize Macroscope's approvability policy. Learn more.

@Xanacas

Copy link
Copy Markdown
Contributor

Manually confirmed. I ran into the same issue and was able to fix it by applying the batch from within this PR.

@RoyLeviGit

Copy link
Copy Markdown

verified locally, this fixed my issue.

@RoyLeviGitRoyLeviGit left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

verified locally, fixed issue

@bscholar-tt

Copy link
Copy Markdown

Can confirm this fix works for me as well.
Hoping this can be merged in so I don't have to use a fork anymore.

@randomUser00

Copy link
Copy Markdown

verified locally

@PearcekieserPearcekieser mentioned this pull request May 28, 2026
2 tasks
@gthay

gthay commented Jun 1, 2026

Copy link
Copy Markdown

@juliusmarminge please check this PR out.

@ardenworks
ardenworks deleted the fix-ssh-auth-timestamps branch June 3, 2026 18:04
@ardenworks

ardenworks commented Jun 3, 2026

Copy link
Copy Markdown
Author

Closing this since #2858 replaced the old SSH auth bootstrap path and issue #2665 is now closed.

Thanks to everyone who confirmed the fix here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

T3 Code Desktop 0.0.23 fails SSH environment pairing due to DateTime schema mismatch

6 participants

@ardenworks@Xanacas@RoyLeviGit@bscholar-tt@randomUser00@gthay
, '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

fix(ssh): decode auth timestamps from JSON strings - #2694

Closed
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps
Closed

fix(ssh): decode auth timestamps from JSON strings#2694
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps

Conversation

@ardenworks

@ardenworksardenworks commented May 14, 2026

Copy link
Copy Markdown

What Changed

Use Schema.DateTimeUtcFromString for auth response timestamp fields that are decoded from HTTP JSON responses.

Why

Fixes#2665.

Desktop SSH pairing calls /api/auth/bootstrap/bearer. The remote server returns HTTP 200 with expiresAt serialized as an ISO string, but the desktop contract decoder currently expects a DateTimeUtc value.

That makes pairing fail during desktop:bootstrap-ssh-bearer-session even though the remote API request succeeds.

This fixes the mismatch by using the schema variant that accepts ISO timestamp strings from JSON and decodes them into DateTime.Utc values. The related auth response schemas are updated together because they use the same serialized timestamp shape over HTTP.

UI Changes

None.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Contract-only decoder alignment for serialized timestamps; no auth logic or server behavior changes.

Overview
Auth contract schemas in packages/contracts/src/auth.ts now decode HTTP JSON timestamps with Schema.DateTimeUtcFromString instead of Schema.DateTimeUtc, so ISO 8601 strings from the remote auth API (e.g. desktop SSH bearer bootstrap at /api/auth/bootstrap/bearer) parse correctly instead of failing after a successful 200 response.

The same change is applied across all auth response/session shapes that expose expiresAt, plus createdAt, issuedAt, and nullable lastConnectedAt on pairing links and client sessions.

Reviewed by Cursor Bugbot for commit 14936bd. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix auth timestamp decoding by switching to DateTimeUtcFromString in auth contracts

All timestamp fields in auth-related structs in auth.ts now use DateTimeUtcFromString instead of DateTimeUtc to correctly parse ISO 8601 datetime strings returned from the SSH auth API. This affects expiresAt, issuedAt, createdAt, and lastConnectedAt fields across AuthBootstrapResult, AuthBearerBootstrapResult, AuthWebSocketTokenResult, AuthPairingCredentialResult, AuthPairingLink, AuthClientSession, and AuthSessionState.

Macroscope summarized 14936bd.

@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 61f8cd80-5f6b-4792-8f25-5dad95ba5f82

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels May 14, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward bug fix that mechanically updates timestamp schema types from DateTimeUtc to DateTimeUtcFromString to properly decode JSON string representations. The change is consistent across all affected auth contracts with clear intent and limited scope.

You can customize Macroscope's approvability policy. Learn more.

@Xanacas

Copy link
Copy Markdown
Contributor

Manually confirmed. I ran into the same issue and was able to fix it by applying the batch from within this PR.

@RoyLeviGit

Copy link
Copy Markdown

verified locally, this fixed my issue.

@RoyLeviGitRoyLeviGit left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

verified locally, fixed issue

@bscholar-tt

Copy link
Copy Markdown

Can confirm this fix works for me as well.
Hoping this can be merged in so I don't have to use a fork anymore.

@randomUser00

Copy link
Copy Markdown

verified locally

@PearcekieserPearcekieser mentioned this pull request May 28, 2026
2 tasks
@gthay

gthay commented Jun 1, 2026

Copy link
Copy Markdown

@juliusmarminge please check this PR out.

@ardenworks
ardenworks deleted the fix-ssh-auth-timestamps branch June 3, 2026 18:04
@ardenworks

ardenworks commented Jun 3, 2026

Copy link
Copy Markdown
Author

Closing this since #2858 replaced the old SSH auth bootstrap path and issue #2665 is now closed.

Thanks to everyone who confirmed the fix here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

T3 Code Desktop 0.0.23 fails SSH environment pairing due to DateTime schema mismatch

6 participants

@ardenworks@Xanacas@RoyLeviGit@bscholar-tt@randomUser00@gthay
, '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

fix(ssh): decode auth timestamps from JSON strings - #2694

Closed
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps
Closed

fix(ssh): decode auth timestamps from JSON strings#2694
ardenworks wants to merge 5 commits into
pingdotgg:mainfrom
ardenworks:fix-ssh-auth-timestamps

Conversation

@ardenworks

@ardenworksardenworks commented May 14, 2026

Copy link
Copy Markdown

What Changed

Use Schema.DateTimeUtcFromString for auth response timestamp fields that are decoded from HTTP JSON responses.

Why

Fixes#2665.

Desktop SSH pairing calls /api/auth/bootstrap/bearer. The remote server returns HTTP 200 with expiresAt serialized as an ISO string, but the desktop contract decoder currently expects a DateTimeUtc value.

That makes pairing fail during desktop:bootstrap-ssh-bearer-session even though the remote API request succeeds.

This fixes the mismatch by using the schema variant that accepts ISO timestamp strings from JSON and decodes them into DateTime.Utc values. The related auth response schemas are updated together because they use the same serialized timestamp shape over HTTP.

UI Changes

None.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Low Risk
Contract-only decoder alignment for serialized timestamps; no auth logic or server behavior changes.

Overview
Auth contract schemas in packages/contracts/src/auth.ts now decode HTTP JSON timestamps with Schema.DateTimeUtcFromString instead of Schema.DateTimeUtc, so ISO 8601 strings from the remote auth API (e.g. desktop SSH bearer bootstrap at /api/auth/bootstrap/bearer) parse correctly instead of failing after a successful 200 response.

The same change is applied across all auth response/session shapes that expose expiresAt, plus createdAt, issuedAt, and nullable lastConnectedAt on pairing links and client sessions.

Reviewed by Cursor Bugbot for commit 14936bd. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix auth timestamp decoding by switching to DateTimeUtcFromString in auth contracts

All timestamp fields in auth-related structs in auth.ts now use DateTimeUtcFromString instead of DateTimeUtc to correctly parse ISO 8601 datetime strings returned from the SSH auth API. This affects expiresAt, issuedAt, createdAt, and lastConnectedAt fields across AuthBootstrapResult, AuthBearerBootstrapResult, AuthWebSocketTokenResult, AuthPairingCredentialResult, AuthPairingLink, AuthClientSession, and AuthSessionState.

Macroscope summarized 14936bd.

@coderabbitai

coderabbitaiBot commented May 14, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 61f8cd80-5f6b-4792-8f25-5dad95ba5f82

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels May 14, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved

Straightforward bug fix that mechanically updates timestamp schema types from DateTimeUtc to DateTimeUtcFromString to properly decode JSON string representations. The change is consistent across all affected auth contracts with clear intent and limited scope.

You can customize Macroscope's approvability policy. Learn more.

@Xanacas

Copy link
Copy Markdown
Contributor

Manually confirmed. I ran into the same issue and was able to fix it by applying the batch from within this PR.

@RoyLeviGit

Copy link
Copy Markdown

verified locally, this fixed my issue.

@RoyLeviGitRoyLeviGit left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

verified locally, fixed issue

@bscholar-tt

Copy link
Copy Markdown

Can confirm this fix works for me as well.
Hoping this can be merged in so I don't have to use a fork anymore.

@randomUser00

Copy link
Copy Markdown

verified locally

@PearcekieserPearcekieser mentioned this pull request May 28, 2026
2 tasks
@gthay

gthay commented Jun 1, 2026

Copy link
Copy Markdown

@juliusmarminge please check this PR out.

@ardenworks
ardenworks deleted the fix-ssh-auth-timestamps branch June 3, 2026 18:04
@ardenworks

ardenworks commented Jun 3, 2026

Copy link
Copy Markdown
Author

Closing this since #2858 replaced the old SSH auth bootstrap path and issue #2665 is now closed.

Thanks to everyone who confirmed the fix here.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

T3 Code Desktop 0.0.23 fails SSH environment pairing due to DateTime schema mismatch

6 participants

@ardenworks@Xanacas@RoyLeviGit@bscholar-tt@randomUser00@gthay