fix(web): Remove saved environments atomically - #2917

Merged
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup
Jun 19, 2026
Merged

fix(web): Remove saved environments atomically#2917
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup

Conversation

@mwolson

@mwolsonmwolson commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#2914.

This makes saved-environment removal use a single persistence operation that removes metadata and embedded credentials together, and tightens rollback behavior when replacing stale desktop SSH records.

Problem and Fix

Problem and Why it HappenedFix
Removing a saved environment updated persisted metadata and bearer-token state separately, so SSH cleanup could race with deletion and stale records could reappear.Add removeSavedEnvironment to the local persistence API and desktop IPC bridge so metadata and embedded secrets are removed atomically.
The UI cleared saved-environment state before durable removal finished.Persist removal first, then clear registry/runtime/UI state, while still awaiting SSH cleanup before returning.
Browser fallback persistence did not have an equivalent atomic saved-environment removal path.Add browser-storage removal alongside the desktop bridge implementation.
Replacing a stale desktop SSH record only snapshotted the new environment id.Snapshot both the new id and stale SSH record so rollback can restore the previous saved record if credential persistence fails.

Defensive Fixes

Problem and Why it HappenedFix
Rollback errors could hide the original credential persistence error.Preserve and rethrow the primary credential persistence failure after best-effort rollback.
SSH cleanup errors during removal could block state cleanup in the wrong order.Remove persisted saved-environment state first, then await SSH cleanup and log cleanup failures without restoring stale persistence.

Validation

  • bun fmt
  • bun lint
  • bun typecheck
  • bun run --filter @t3tools/desktop test -- DesktopSavedEnvironments
  • bun run --filter @t3tools/web test -- localApi catalog service.addSavedEnvironment service.savedEnvironments

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes: N/A, persistence behavior only
  • I included a video for animation/interaction changes: N/A

Note

Medium Risk
Changes on-disk saved-environment and credential persistence, but the scope is narrow and covered by a new atomic-removal test.

Overview
Adds removeEnvironment(environmentId) to desktop saved-environment persistence so registry metadata and the embedded encryptedBearerToken are dropped in one registry write, instead of relying on separate metadata vs secret updates.

The file-backed implementation filters the matching record out of the persisted document (no-op if missing). The in-memory test layer clears both the records ref and secrets ref together. A new test asserts the registry is empty and getSecret is none after removal.

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

Note

Add removeEnvironment to DesktopSavedEnvironments to delete registry records and secrets atomically

  • Adds removeEnvironment(environmentId) to DesktopSavedEnvironmentsShape, which removes the matching record from the registry document and its embedded encryptedBearerToken in a single write.
  • The production layer reads the current registry, filters out the matching record, and writes the updated document preserving the version field.
  • The test layer removes the record from recordsRef and the secret from secretsRef together, with a new test asserting both are cleared after calling removeEnvironment.
📊 Macroscope summarized da654c7. 1 file reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 2, 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: ac600f50-14f0-4e9b-a0b2-2173b5f12614

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jun 2, 2026
@macroscopeapp

macroscopeappBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. This PR adds new functionality and has an unresolved review comment identifying an error type mismatch where removeEnvironment can throw errors not declared in its interface signature.

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 2, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 2, 2026 23:50

Dismissing prior approval to re-evaluate 933a157

Comment threadapps/web/src/environments/runtime/service.ts Outdated
Comment threadapps/web/src/environments/runtime/service.ts Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 3, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 57451d3 to 61426fdCompareJune 3, 2026 12:43
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 3, 2026 12:44

Dismissing prior approval to re-evaluate 61426fd

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 61426fd to 177b89bCompareJune 3, 2026 13:40
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/desktop/src/app/DesktopApp.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 1e011dc to cfc3112CompareJune 3, 2026 13:46
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from cfc3112 to c3497b0CompareJune 3, 2026 14:02
@juliusmarminge
juliusmarmingeforce-pushed the fix/saved-environment-persistence-cleanup branch from c3497b0 to cc9d672CompareJune 4, 2026 00:58
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 4 times, most recently from 33193f4 to 9e5bd2aCompareJune 11, 2026 13:35
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 95c5ea1 to c9bcc76CompareJune 16, 2026 23:34
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 30c2ad5 to a980c75CompareJune 16, 2026 23:46

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a980c750b2c825b09cebfe83fb3839b602d34574. Configure here.

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 9c4afac to da654c7CompareJune 19, 2026 01:45
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from da654c7 to 01dee9cCompareJune 19, 2026 01:48
Comment threadapps/desktop/src/settings/DesktopSavedEnvironments.ts
@mwolson

Copy link
Copy Markdown
ContributorAuthor

@macroscope-app review

@macroscopeapp

Copy link
Copy Markdown
Contributor

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@juliusmarminge
juliusmarminge merged commit 1fcc57a into pingdotgg:mainJun 19, 2026
15 checks passed
@mwolson
mwolson deleted the fix/saved-environment-persistence-cleanup branch June 19, 2026 03:21
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Jun 24, 2026
…-connection-runtime
fix(web): Remove saved environments atomically (pingdotgg#2917)
Morphexe pushed a commit to Morphexe/t3code that referenced this pull request Jul 30, 2026
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
darjss pushed a commit to darjss/t3code that referenced this pull request Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

[Bug]: Saved SSH environments can reappear or lose rollback state during removal

2 participants

@mwolson@juliusmarminge
, '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(web): Remove saved environments atomically - #2917

Merged
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup
Jun 19, 2026
Merged

fix(web): Remove saved environments atomically#2917
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup

Conversation

@mwolson

@mwolsonmwolson commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#2914.

This makes saved-environment removal use a single persistence operation that removes metadata and embedded credentials together, and tightens rollback behavior when replacing stale desktop SSH records.

Problem and Fix

Problem and Why it HappenedFix
Removing a saved environment updated persisted metadata and bearer-token state separately, so SSH cleanup could race with deletion and stale records could reappear.Add removeSavedEnvironment to the local persistence API and desktop IPC bridge so metadata and embedded secrets are removed atomically.
The UI cleared saved-environment state before durable removal finished.Persist removal first, then clear registry/runtime/UI state, while still awaiting SSH cleanup before returning.
Browser fallback persistence did not have an equivalent atomic saved-environment removal path.Add browser-storage removal alongside the desktop bridge implementation.
Replacing a stale desktop SSH record only snapshotted the new environment id.Snapshot both the new id and stale SSH record so rollback can restore the previous saved record if credential persistence fails.

Defensive Fixes

Problem and Why it HappenedFix
Rollback errors could hide the original credential persistence error.Preserve and rethrow the primary credential persistence failure after best-effort rollback.
SSH cleanup errors during removal could block state cleanup in the wrong order.Remove persisted saved-environment state first, then await SSH cleanup and log cleanup failures without restoring stale persistence.

Validation

  • bun fmt
  • bun lint
  • bun typecheck
  • bun run --filter @t3tools/desktop test -- DesktopSavedEnvironments
  • bun run --filter @t3tools/web test -- localApi catalog service.addSavedEnvironment service.savedEnvironments

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes: N/A, persistence behavior only
  • I included a video for animation/interaction changes: N/A

Note

Medium Risk
Changes on-disk saved-environment and credential persistence, but the scope is narrow and covered by a new atomic-removal test.

Overview
Adds removeEnvironment(environmentId) to desktop saved-environment persistence so registry metadata and the embedded encryptedBearerToken are dropped in one registry write, instead of relying on separate metadata vs secret updates.

The file-backed implementation filters the matching record out of the persisted document (no-op if missing). The in-memory test layer clears both the records ref and secrets ref together. A new test asserts the registry is empty and getSecret is none after removal.

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

Note

Add removeEnvironment to DesktopSavedEnvironments to delete registry records and secrets atomically

  • Adds removeEnvironment(environmentId) to DesktopSavedEnvironmentsShape, which removes the matching record from the registry document and its embedded encryptedBearerToken in a single write.
  • The production layer reads the current registry, filters out the matching record, and writes the updated document preserving the version field.
  • The test layer removes the record from recordsRef and the secret from secretsRef together, with a new test asserting both are cleared after calling removeEnvironment.
📊 Macroscope summarized da654c7. 1 file reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 2, 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: ac600f50-14f0-4e9b-a0b2-2173b5f12614

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jun 2, 2026
@macroscopeapp

macroscopeappBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. This PR adds new functionality and has an unresolved review comment identifying an error type mismatch where removeEnvironment can throw errors not declared in its interface signature.

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 2, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 2, 2026 23:50

Dismissing prior approval to re-evaluate 933a157

Comment threadapps/web/src/environments/runtime/service.ts Outdated
Comment threadapps/web/src/environments/runtime/service.ts Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 3, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 57451d3 to 61426fdCompareJune 3, 2026 12:43
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 3, 2026 12:44

Dismissing prior approval to re-evaluate 61426fd

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 61426fd to 177b89bCompareJune 3, 2026 13:40
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/desktop/src/app/DesktopApp.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 1e011dc to cfc3112CompareJune 3, 2026 13:46
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from cfc3112 to c3497b0CompareJune 3, 2026 14:02
@juliusmarminge
juliusmarmingeforce-pushed the fix/saved-environment-persistence-cleanup branch from c3497b0 to cc9d672CompareJune 4, 2026 00:58
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 4 times, most recently from 33193f4 to 9e5bd2aCompareJune 11, 2026 13:35
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 95c5ea1 to c9bcc76CompareJune 16, 2026 23:34
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 30c2ad5 to a980c75CompareJune 16, 2026 23:46

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a980c750b2c825b09cebfe83fb3839b602d34574. Configure here.

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 9c4afac to da654c7CompareJune 19, 2026 01:45
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from da654c7 to 01dee9cCompareJune 19, 2026 01:48
Comment threadapps/desktop/src/settings/DesktopSavedEnvironments.ts
@mwolson

Copy link
Copy Markdown
ContributorAuthor

@macroscope-app review

@macroscopeapp

Copy link
Copy Markdown
Contributor

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@juliusmarminge
juliusmarminge merged commit 1fcc57a into pingdotgg:mainJun 19, 2026
15 checks passed
@mwolson
mwolson deleted the fix/saved-environment-persistence-cleanup branch June 19, 2026 03:21
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Jun 24, 2026
…-connection-runtime
fix(web): Remove saved environments atomically (pingdotgg#2917)
Morphexe pushed a commit to Morphexe/t3code that referenced this pull request Jul 30, 2026
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
darjss pushed a commit to darjss/t3code that referenced this pull request Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

[Bug]: Saved SSH environments can reappear or lose rollback state during removal

2 participants

@mwolson@juliusmarminge
, '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(web): Remove saved environments atomically - #2917

Merged
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup
Jun 19, 2026
Merged

fix(web): Remove saved environments atomically#2917
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup

Conversation

@mwolson

@mwolsonmwolson commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#2914.

This makes saved-environment removal use a single persistence operation that removes metadata and embedded credentials together, and tightens rollback behavior when replacing stale desktop SSH records.

Problem and Fix

Problem and Why it HappenedFix
Removing a saved environment updated persisted metadata and bearer-token state separately, so SSH cleanup could race with deletion and stale records could reappear.Add removeSavedEnvironment to the local persistence API and desktop IPC bridge so metadata and embedded secrets are removed atomically.
The UI cleared saved-environment state before durable removal finished.Persist removal first, then clear registry/runtime/UI state, while still awaiting SSH cleanup before returning.
Browser fallback persistence did not have an equivalent atomic saved-environment removal path.Add browser-storage removal alongside the desktop bridge implementation.
Replacing a stale desktop SSH record only snapshotted the new environment id.Snapshot both the new id and stale SSH record so rollback can restore the previous saved record if credential persistence fails.

Defensive Fixes

Problem and Why it HappenedFix
Rollback errors could hide the original credential persistence error.Preserve and rethrow the primary credential persistence failure after best-effort rollback.
SSH cleanup errors during removal could block state cleanup in the wrong order.Remove persisted saved-environment state first, then await SSH cleanup and log cleanup failures without restoring stale persistence.

Validation

  • bun fmt
  • bun lint
  • bun typecheck
  • bun run --filter @t3tools/desktop test -- DesktopSavedEnvironments
  • bun run --filter @t3tools/web test -- localApi catalog service.addSavedEnvironment service.savedEnvironments

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes: N/A, persistence behavior only
  • I included a video for animation/interaction changes: N/A

Note

Medium Risk
Changes on-disk saved-environment and credential persistence, but the scope is narrow and covered by a new atomic-removal test.

Overview
Adds removeEnvironment(environmentId) to desktop saved-environment persistence so registry metadata and the embedded encryptedBearerToken are dropped in one registry write, instead of relying on separate metadata vs secret updates.

The file-backed implementation filters the matching record out of the persisted document (no-op if missing). The in-memory test layer clears both the records ref and secrets ref together. A new test asserts the registry is empty and getSecret is none after removal.

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

Note

Add removeEnvironment to DesktopSavedEnvironments to delete registry records and secrets atomically

  • Adds removeEnvironment(environmentId) to DesktopSavedEnvironmentsShape, which removes the matching record from the registry document and its embedded encryptedBearerToken in a single write.
  • The production layer reads the current registry, filters out the matching record, and writes the updated document preserving the version field.
  • The test layer removes the record from recordsRef and the secret from secretsRef together, with a new test asserting both are cleared after calling removeEnvironment.
📊 Macroscope summarized da654c7. 1 file reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 2, 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: ac600f50-14f0-4e9b-a0b2-2173b5f12614

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jun 2, 2026
@macroscopeapp

macroscopeappBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. This PR adds new functionality and has an unresolved review comment identifying an error type mismatch where removeEnvironment can throw errors not declared in its interface signature.

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 2, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 2, 2026 23:50

Dismissing prior approval to re-evaluate 933a157

Comment threadapps/web/src/environments/runtime/service.ts Outdated
Comment threadapps/web/src/environments/runtime/service.ts Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 3, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 57451d3 to 61426fdCompareJune 3, 2026 12:43
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 3, 2026 12:44

Dismissing prior approval to re-evaluate 61426fd

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 61426fd to 177b89bCompareJune 3, 2026 13:40
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/desktop/src/app/DesktopApp.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 1e011dc to cfc3112CompareJune 3, 2026 13:46
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from cfc3112 to c3497b0CompareJune 3, 2026 14:02
@juliusmarminge
juliusmarmingeforce-pushed the fix/saved-environment-persistence-cleanup branch from c3497b0 to cc9d672CompareJune 4, 2026 00:58
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 4 times, most recently from 33193f4 to 9e5bd2aCompareJune 11, 2026 13:35
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 95c5ea1 to c9bcc76CompareJune 16, 2026 23:34
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 30c2ad5 to a980c75CompareJune 16, 2026 23:46

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a980c750b2c825b09cebfe83fb3839b602d34574. Configure here.

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 9c4afac to da654c7CompareJune 19, 2026 01:45
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from da654c7 to 01dee9cCompareJune 19, 2026 01:48
Comment threadapps/desktop/src/settings/DesktopSavedEnvironments.ts
@mwolson

Copy link
Copy Markdown
ContributorAuthor

@macroscope-app review

@macroscopeapp

Copy link
Copy Markdown
Contributor

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@juliusmarminge
juliusmarminge merged commit 1fcc57a into pingdotgg:mainJun 19, 2026
15 checks passed
@mwolson
mwolson deleted the fix/saved-environment-persistence-cleanup branch June 19, 2026 03:21
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Jun 24, 2026
…-connection-runtime
fix(web): Remove saved environments atomically (pingdotgg#2917)
Morphexe pushed a commit to Morphexe/t3code that referenced this pull request Jul 30, 2026
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
darjss pushed a commit to darjss/t3code that referenced this pull request Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

[Bug]: Saved SSH environments can reappear or lose rollback state during removal

2 participants

@mwolson@juliusmarminge
, '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(web): Remove saved environments atomically - #2917

Merged
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup
Jun 19, 2026
Merged

fix(web): Remove saved environments atomically#2917
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup

Conversation

@mwolson

@mwolsonmwolson commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#2914.

This makes saved-environment removal use a single persistence operation that removes metadata and embedded credentials together, and tightens rollback behavior when replacing stale desktop SSH records.

Problem and Fix

Problem and Why it HappenedFix
Removing a saved environment updated persisted metadata and bearer-token state separately, so SSH cleanup could race with deletion and stale records could reappear.Add removeSavedEnvironment to the local persistence API and desktop IPC bridge so metadata and embedded secrets are removed atomically.
The UI cleared saved-environment state before durable removal finished.Persist removal first, then clear registry/runtime/UI state, while still awaiting SSH cleanup before returning.
Browser fallback persistence did not have an equivalent atomic saved-environment removal path.Add browser-storage removal alongside the desktop bridge implementation.
Replacing a stale desktop SSH record only snapshotted the new environment id.Snapshot both the new id and stale SSH record so rollback can restore the previous saved record if credential persistence fails.

Defensive Fixes

Problem and Why it HappenedFix
Rollback errors could hide the original credential persistence error.Preserve and rethrow the primary credential persistence failure after best-effort rollback.
SSH cleanup errors during removal could block state cleanup in the wrong order.Remove persisted saved-environment state first, then await SSH cleanup and log cleanup failures without restoring stale persistence.

Validation

  • bun fmt
  • bun lint
  • bun typecheck
  • bun run --filter @t3tools/desktop test -- DesktopSavedEnvironments
  • bun run --filter @t3tools/web test -- localApi catalog service.addSavedEnvironment service.savedEnvironments

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes: N/A, persistence behavior only
  • I included a video for animation/interaction changes: N/A

Note

Medium Risk
Changes on-disk saved-environment and credential persistence, but the scope is narrow and covered by a new atomic-removal test.

Overview
Adds removeEnvironment(environmentId) to desktop saved-environment persistence so registry metadata and the embedded encryptedBearerToken are dropped in one registry write, instead of relying on separate metadata vs secret updates.

The file-backed implementation filters the matching record out of the persisted document (no-op if missing). The in-memory test layer clears both the records ref and secrets ref together. A new test asserts the registry is empty and getSecret is none after removal.

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

Note

Add removeEnvironment to DesktopSavedEnvironments to delete registry records and secrets atomically

  • Adds removeEnvironment(environmentId) to DesktopSavedEnvironmentsShape, which removes the matching record from the registry document and its embedded encryptedBearerToken in a single write.
  • The production layer reads the current registry, filters out the matching record, and writes the updated document preserving the version field.
  • The test layer removes the record from recordsRef and the secret from secretsRef together, with a new test asserting both are cleared after calling removeEnvironment.
📊 Macroscope summarized da654c7. 1 file reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 2, 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: ac600f50-14f0-4e9b-a0b2-2173b5f12614

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jun 2, 2026
@macroscopeapp

macroscopeappBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. This PR adds new functionality and has an unresolved review comment identifying an error type mismatch where removeEnvironment can throw errors not declared in its interface signature.

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 2, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 2, 2026 23:50

Dismissing prior approval to re-evaluate 933a157

Comment threadapps/web/src/environments/runtime/service.ts Outdated
Comment threadapps/web/src/environments/runtime/service.ts Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 3, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 57451d3 to 61426fdCompareJune 3, 2026 12:43
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 3, 2026 12:44

Dismissing prior approval to re-evaluate 61426fd

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 61426fd to 177b89bCompareJune 3, 2026 13:40
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/desktop/src/app/DesktopApp.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 1e011dc to cfc3112CompareJune 3, 2026 13:46
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from cfc3112 to c3497b0CompareJune 3, 2026 14:02
@juliusmarminge
juliusmarmingeforce-pushed the fix/saved-environment-persistence-cleanup branch from c3497b0 to cc9d672CompareJune 4, 2026 00:58
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 4 times, most recently from 33193f4 to 9e5bd2aCompareJune 11, 2026 13:35
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 95c5ea1 to c9bcc76CompareJune 16, 2026 23:34
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 30c2ad5 to a980c75CompareJune 16, 2026 23:46

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a980c750b2c825b09cebfe83fb3839b602d34574. Configure here.

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 9c4afac to da654c7CompareJune 19, 2026 01:45
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from da654c7 to 01dee9cCompareJune 19, 2026 01:48
Comment threadapps/desktop/src/settings/DesktopSavedEnvironments.ts
@mwolson

Copy link
Copy Markdown
ContributorAuthor

@macroscope-app review

@macroscopeapp

Copy link
Copy Markdown
Contributor

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@juliusmarminge
juliusmarminge merged commit 1fcc57a into pingdotgg:mainJun 19, 2026
15 checks passed
@mwolson
mwolson deleted the fix/saved-environment-persistence-cleanup branch June 19, 2026 03:21
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Jun 24, 2026
…-connection-runtime
fix(web): Remove saved environments atomically (pingdotgg#2917)
Morphexe pushed a commit to Morphexe/t3code that referenced this pull request Jul 30, 2026
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
darjss pushed a commit to darjss/t3code that referenced this pull request Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

[Bug]: Saved SSH environments can reappear or lose rollback state during removal

2 participants

@mwolson@juliusmarminge
, '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(web): Remove saved environments atomically - #2917

Merged
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup
Jun 19, 2026
Merged

fix(web): Remove saved environments atomically#2917
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup

Conversation

@mwolson

@mwolsonmwolson commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#2914.

This makes saved-environment removal use a single persistence operation that removes metadata and embedded credentials together, and tightens rollback behavior when replacing stale desktop SSH records.

Problem and Fix

Problem and Why it HappenedFix
Removing a saved environment updated persisted metadata and bearer-token state separately, so SSH cleanup could race with deletion and stale records could reappear.Add removeSavedEnvironment to the local persistence API and desktop IPC bridge so metadata and embedded secrets are removed atomically.
The UI cleared saved-environment state before durable removal finished.Persist removal first, then clear registry/runtime/UI state, while still awaiting SSH cleanup before returning.
Browser fallback persistence did not have an equivalent atomic saved-environment removal path.Add browser-storage removal alongside the desktop bridge implementation.
Replacing a stale desktop SSH record only snapshotted the new environment id.Snapshot both the new id and stale SSH record so rollback can restore the previous saved record if credential persistence fails.

Defensive Fixes

Problem and Why it HappenedFix
Rollback errors could hide the original credential persistence error.Preserve and rethrow the primary credential persistence failure after best-effort rollback.
SSH cleanup errors during removal could block state cleanup in the wrong order.Remove persisted saved-environment state first, then await SSH cleanup and log cleanup failures without restoring stale persistence.

Validation

  • bun fmt
  • bun lint
  • bun typecheck
  • bun run --filter @t3tools/desktop test -- DesktopSavedEnvironments
  • bun run --filter @t3tools/web test -- localApi catalog service.addSavedEnvironment service.savedEnvironments

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes: N/A, persistence behavior only
  • I included a video for animation/interaction changes: N/A

Note

Medium Risk
Changes on-disk saved-environment and credential persistence, but the scope is narrow and covered by a new atomic-removal test.

Overview
Adds removeEnvironment(environmentId) to desktop saved-environment persistence so registry metadata and the embedded encryptedBearerToken are dropped in one registry write, instead of relying on separate metadata vs secret updates.

The file-backed implementation filters the matching record out of the persisted document (no-op if missing). The in-memory test layer clears both the records ref and secrets ref together. A new test asserts the registry is empty and getSecret is none after removal.

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

Note

Add removeEnvironment to DesktopSavedEnvironments to delete registry records and secrets atomically

  • Adds removeEnvironment(environmentId) to DesktopSavedEnvironmentsShape, which removes the matching record from the registry document and its embedded encryptedBearerToken in a single write.
  • The production layer reads the current registry, filters out the matching record, and writes the updated document preserving the version field.
  • The test layer removes the record from recordsRef and the secret from secretsRef together, with a new test asserting both are cleared after calling removeEnvironment.
📊 Macroscope summarized da654c7. 1 file reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 2, 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: ac600f50-14f0-4e9b-a0b2-2173b5f12614

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jun 2, 2026
@macroscopeapp

macroscopeappBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. This PR adds new functionality and has an unresolved review comment identifying an error type mismatch where removeEnvironment can throw errors not declared in its interface signature.

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 2, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 2, 2026 23:50

Dismissing prior approval to re-evaluate 933a157

Comment threadapps/web/src/environments/runtime/service.ts Outdated
Comment threadapps/web/src/environments/runtime/service.ts Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 3, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 57451d3 to 61426fdCompareJune 3, 2026 12:43
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 3, 2026 12:44

Dismissing prior approval to re-evaluate 61426fd

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 61426fd to 177b89bCompareJune 3, 2026 13:40
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/desktop/src/app/DesktopApp.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 1e011dc to cfc3112CompareJune 3, 2026 13:46
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from cfc3112 to c3497b0CompareJune 3, 2026 14:02
@juliusmarminge
juliusmarmingeforce-pushed the fix/saved-environment-persistence-cleanup branch from c3497b0 to cc9d672CompareJune 4, 2026 00:58
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 4 times, most recently from 33193f4 to 9e5bd2aCompareJune 11, 2026 13:35
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 95c5ea1 to c9bcc76CompareJune 16, 2026 23:34
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 30c2ad5 to a980c75CompareJune 16, 2026 23:46

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a980c750b2c825b09cebfe83fb3839b602d34574. Configure here.

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 9c4afac to da654c7CompareJune 19, 2026 01:45
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from da654c7 to 01dee9cCompareJune 19, 2026 01:48
Comment threadapps/desktop/src/settings/DesktopSavedEnvironments.ts
@mwolson

Copy link
Copy Markdown
ContributorAuthor

@macroscope-app review

@macroscopeapp

Copy link
Copy Markdown
Contributor

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@juliusmarminge
juliusmarminge merged commit 1fcc57a into pingdotgg:mainJun 19, 2026
15 checks passed
@mwolson
mwolson deleted the fix/saved-environment-persistence-cleanup branch June 19, 2026 03:21
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Jun 24, 2026
…-connection-runtime
fix(web): Remove saved environments atomically (pingdotgg#2917)
Morphexe pushed a commit to Morphexe/t3code that referenced this pull request Jul 30, 2026
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
darjss pushed a commit to darjss/t3code that referenced this pull request Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

[Bug]: Saved SSH environments can reappear or lose rollback state during removal

2 participants

@mwolson@juliusmarminge
, '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(web): Remove saved environments atomically - #2917

Merged
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup
Jun 19, 2026
Merged

fix(web): Remove saved environments atomically#2917
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup

Conversation

@mwolson

@mwolsonmwolson commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#2914.

This makes saved-environment removal use a single persistence operation that removes metadata and embedded credentials together, and tightens rollback behavior when replacing stale desktop SSH records.

Problem and Fix

Problem and Why it HappenedFix
Removing a saved environment updated persisted metadata and bearer-token state separately, so SSH cleanup could race with deletion and stale records could reappear.Add removeSavedEnvironment to the local persistence API and desktop IPC bridge so metadata and embedded secrets are removed atomically.
The UI cleared saved-environment state before durable removal finished.Persist removal first, then clear registry/runtime/UI state, while still awaiting SSH cleanup before returning.
Browser fallback persistence did not have an equivalent atomic saved-environment removal path.Add browser-storage removal alongside the desktop bridge implementation.
Replacing a stale desktop SSH record only snapshotted the new environment id.Snapshot both the new id and stale SSH record so rollback can restore the previous saved record if credential persistence fails.

Defensive Fixes

Problem and Why it HappenedFix
Rollback errors could hide the original credential persistence error.Preserve and rethrow the primary credential persistence failure after best-effort rollback.
SSH cleanup errors during removal could block state cleanup in the wrong order.Remove persisted saved-environment state first, then await SSH cleanup and log cleanup failures without restoring stale persistence.

Validation

  • bun fmt
  • bun lint
  • bun typecheck
  • bun run --filter @t3tools/desktop test -- DesktopSavedEnvironments
  • bun run --filter @t3tools/web test -- localApi catalog service.addSavedEnvironment service.savedEnvironments

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes: N/A, persistence behavior only
  • I included a video for animation/interaction changes: N/A

Note

Medium Risk
Changes on-disk saved-environment and credential persistence, but the scope is narrow and covered by a new atomic-removal test.

Overview
Adds removeEnvironment(environmentId) to desktop saved-environment persistence so registry metadata and the embedded encryptedBearerToken are dropped in one registry write, instead of relying on separate metadata vs secret updates.

The file-backed implementation filters the matching record out of the persisted document (no-op if missing). The in-memory test layer clears both the records ref and secrets ref together. A new test asserts the registry is empty and getSecret is none after removal.

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

Note

Add removeEnvironment to DesktopSavedEnvironments to delete registry records and secrets atomically

  • Adds removeEnvironment(environmentId) to DesktopSavedEnvironmentsShape, which removes the matching record from the registry document and its embedded encryptedBearerToken in a single write.
  • The production layer reads the current registry, filters out the matching record, and writes the updated document preserving the version field.
  • The test layer removes the record from recordsRef and the secret from secretsRef together, with a new test asserting both are cleared after calling removeEnvironment.
📊 Macroscope summarized da654c7. 1 file reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 2, 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: ac600f50-14f0-4e9b-a0b2-2173b5f12614

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jun 2, 2026
@macroscopeapp

macroscopeappBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. This PR adds new functionality and has an unresolved review comment identifying an error type mismatch where removeEnvironment can throw errors not declared in its interface signature.

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 2, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 2, 2026 23:50

Dismissing prior approval to re-evaluate 933a157

Comment threadapps/web/src/environments/runtime/service.ts Outdated
Comment threadapps/web/src/environments/runtime/service.ts Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 3, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 57451d3 to 61426fdCompareJune 3, 2026 12:43
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 3, 2026 12:44

Dismissing prior approval to re-evaluate 61426fd

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 61426fd to 177b89bCompareJune 3, 2026 13:40
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/desktop/src/app/DesktopApp.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 1e011dc to cfc3112CompareJune 3, 2026 13:46
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from cfc3112 to c3497b0CompareJune 3, 2026 14:02
@juliusmarminge
juliusmarmingeforce-pushed the fix/saved-environment-persistence-cleanup branch from c3497b0 to cc9d672CompareJune 4, 2026 00:58
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 4 times, most recently from 33193f4 to 9e5bd2aCompareJune 11, 2026 13:35
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 95c5ea1 to c9bcc76CompareJune 16, 2026 23:34
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 30c2ad5 to a980c75CompareJune 16, 2026 23:46

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a980c750b2c825b09cebfe83fb3839b602d34574. Configure here.

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 9c4afac to da654c7CompareJune 19, 2026 01:45
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from da654c7 to 01dee9cCompareJune 19, 2026 01:48
Comment threadapps/desktop/src/settings/DesktopSavedEnvironments.ts
@mwolson

Copy link
Copy Markdown
ContributorAuthor

@macroscope-app review

@macroscopeapp

Copy link
Copy Markdown
Contributor

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@juliusmarminge
juliusmarminge merged commit 1fcc57a into pingdotgg:mainJun 19, 2026
15 checks passed
@mwolson
mwolson deleted the fix/saved-environment-persistence-cleanup branch June 19, 2026 03:21
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Jun 24, 2026
…-connection-runtime
fix(web): Remove saved environments atomically (pingdotgg#2917)
Morphexe pushed a commit to Morphexe/t3code that referenced this pull request Jul 30, 2026
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
darjss pushed a commit to darjss/t3code that referenced this pull request Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

[Bug]: Saved SSH environments can reappear or lose rollback state during removal

2 participants

@mwolson@juliusmarminge
, '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(web): Remove saved environments atomically - #2917

Merged
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup
Jun 19, 2026
Merged

fix(web): Remove saved environments atomically#2917
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup

Conversation

@mwolson

@mwolsonmwolson commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#2914.

This makes saved-environment removal use a single persistence operation that removes metadata and embedded credentials together, and tightens rollback behavior when replacing stale desktop SSH records.

Problem and Fix

Problem and Why it HappenedFix
Removing a saved environment updated persisted metadata and bearer-token state separately, so SSH cleanup could race with deletion and stale records could reappear.Add removeSavedEnvironment to the local persistence API and desktop IPC bridge so metadata and embedded secrets are removed atomically.
The UI cleared saved-environment state before durable removal finished.Persist removal first, then clear registry/runtime/UI state, while still awaiting SSH cleanup before returning.
Browser fallback persistence did not have an equivalent atomic saved-environment removal path.Add browser-storage removal alongside the desktop bridge implementation.
Replacing a stale desktop SSH record only snapshotted the new environment id.Snapshot both the new id and stale SSH record so rollback can restore the previous saved record if credential persistence fails.

Defensive Fixes

Problem and Why it HappenedFix
Rollback errors could hide the original credential persistence error.Preserve and rethrow the primary credential persistence failure after best-effort rollback.
SSH cleanup errors during removal could block state cleanup in the wrong order.Remove persisted saved-environment state first, then await SSH cleanup and log cleanup failures without restoring stale persistence.

Validation

  • bun fmt
  • bun lint
  • bun typecheck
  • bun run --filter @t3tools/desktop test -- DesktopSavedEnvironments
  • bun run --filter @t3tools/web test -- localApi catalog service.addSavedEnvironment service.savedEnvironments

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes: N/A, persistence behavior only
  • I included a video for animation/interaction changes: N/A

Note

Medium Risk
Changes on-disk saved-environment and credential persistence, but the scope is narrow and covered by a new atomic-removal test.

Overview
Adds removeEnvironment(environmentId) to desktop saved-environment persistence so registry metadata and the embedded encryptedBearerToken are dropped in one registry write, instead of relying on separate metadata vs secret updates.

The file-backed implementation filters the matching record out of the persisted document (no-op if missing). The in-memory test layer clears both the records ref and secrets ref together. A new test asserts the registry is empty and getSecret is none after removal.

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

Note

Add removeEnvironment to DesktopSavedEnvironments to delete registry records and secrets atomically

  • Adds removeEnvironment(environmentId) to DesktopSavedEnvironmentsShape, which removes the matching record from the registry document and its embedded encryptedBearerToken in a single write.
  • The production layer reads the current registry, filters out the matching record, and writes the updated document preserving the version field.
  • The test layer removes the record from recordsRef and the secret from secretsRef together, with a new test asserting both are cleared after calling removeEnvironment.
📊 Macroscope summarized da654c7. 1 file reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 2, 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: ac600f50-14f0-4e9b-a0b2-2173b5f12614

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jun 2, 2026
@macroscopeapp

macroscopeappBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. This PR adds new functionality and has an unresolved review comment identifying an error type mismatch where removeEnvironment can throw errors not declared in its interface signature.

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 2, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 2, 2026 23:50

Dismissing prior approval to re-evaluate 933a157

Comment threadapps/web/src/environments/runtime/service.ts Outdated
Comment threadapps/web/src/environments/runtime/service.ts Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 3, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 57451d3 to 61426fdCompareJune 3, 2026 12:43
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 3, 2026 12:44

Dismissing prior approval to re-evaluate 61426fd

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 61426fd to 177b89bCompareJune 3, 2026 13:40
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/desktop/src/app/DesktopApp.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 1e011dc to cfc3112CompareJune 3, 2026 13:46
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from cfc3112 to c3497b0CompareJune 3, 2026 14:02
@juliusmarminge
juliusmarmingeforce-pushed the fix/saved-environment-persistence-cleanup branch from c3497b0 to cc9d672CompareJune 4, 2026 00:58
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 4 times, most recently from 33193f4 to 9e5bd2aCompareJune 11, 2026 13:35
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 95c5ea1 to c9bcc76CompareJune 16, 2026 23:34
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 30c2ad5 to a980c75CompareJune 16, 2026 23:46

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a980c750b2c825b09cebfe83fb3839b602d34574. Configure here.

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 9c4afac to da654c7CompareJune 19, 2026 01:45
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from da654c7 to 01dee9cCompareJune 19, 2026 01:48
Comment threadapps/desktop/src/settings/DesktopSavedEnvironments.ts
@mwolson

Copy link
Copy Markdown
ContributorAuthor

@macroscope-app review

@macroscopeapp

Copy link
Copy Markdown
Contributor

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@juliusmarminge
juliusmarminge merged commit 1fcc57a into pingdotgg:mainJun 19, 2026
15 checks passed
@mwolson
mwolson deleted the fix/saved-environment-persistence-cleanup branch June 19, 2026 03:21
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Jun 24, 2026
…-connection-runtime
fix(web): Remove saved environments atomically (pingdotgg#2917)
Morphexe pushed a commit to Morphexe/t3code that referenced this pull request Jul 30, 2026
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
darjss pushed a commit to darjss/t3code that referenced this pull request Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

[Bug]: Saved SSH environments can reappear or lose rollback state during removal

2 participants

@mwolson@juliusmarminge
, '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(web): Remove saved environments atomically - #2917

Merged
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup
Jun 19, 2026
Merged

fix(web): Remove saved environments atomically#2917
juliusmarminge merged 1 commit into
pingdotgg:mainfrom
mwolson:fix/saved-environment-persistence-cleanup

Conversation

@mwolson

@mwolsonmwolson commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes#2914.

This makes saved-environment removal use a single persistence operation that removes metadata and embedded credentials together, and tightens rollback behavior when replacing stale desktop SSH records.

Problem and Fix

Problem and Why it HappenedFix
Removing a saved environment updated persisted metadata and bearer-token state separately, so SSH cleanup could race with deletion and stale records could reappear.Add removeSavedEnvironment to the local persistence API and desktop IPC bridge so metadata and embedded secrets are removed atomically.
The UI cleared saved-environment state before durable removal finished.Persist removal first, then clear registry/runtime/UI state, while still awaiting SSH cleanup before returning.
Browser fallback persistence did not have an equivalent atomic saved-environment removal path.Add browser-storage removal alongside the desktop bridge implementation.
Replacing a stale desktop SSH record only snapshotted the new environment id.Snapshot both the new id and stale SSH record so rollback can restore the previous saved record if credential persistence fails.

Defensive Fixes

Problem and Why it HappenedFix
Rollback errors could hide the original credential persistence error.Preserve and rethrow the primary credential persistence failure after best-effort rollback.
SSH cleanup errors during removal could block state cleanup in the wrong order.Remove persisted saved-environment state first, then await SSH cleanup and log cleanup failures without restoring stale persistence.

Validation

  • bun fmt
  • bun lint
  • bun typecheck
  • bun run --filter @t3tools/desktop test -- DesktopSavedEnvironments
  • bun run --filter @t3tools/web test -- localApi catalog service.addSavedEnvironment service.savedEnvironments

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes: N/A, persistence behavior only
  • I included a video for animation/interaction changes: N/A

Note

Medium Risk
Changes on-disk saved-environment and credential persistence, but the scope is narrow and covered by a new atomic-removal test.

Overview
Adds removeEnvironment(environmentId) to desktop saved-environment persistence so registry metadata and the embedded encryptedBearerToken are dropped in one registry write, instead of relying on separate metadata vs secret updates.

The file-backed implementation filters the matching record out of the persisted document (no-op if missing). The in-memory test layer clears both the records ref and secrets ref together. A new test asserts the registry is empty and getSecret is none after removal.

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

Note

Add removeEnvironment to DesktopSavedEnvironments to delete registry records and secrets atomically

  • Adds removeEnvironment(environmentId) to DesktopSavedEnvironmentsShape, which removes the matching record from the registry document and its embedded encryptedBearerToken in a single write.
  • The production layer reads the current registry, filters out the matching record, and writes the updated document preserving the version field.
  • The test layer removes the record from recordsRef and the secret from secretsRef together, with a new test asserting both are cleared after calling removeEnvironment.
📊 Macroscope summarized da654c7. 1 file reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitaiBot commented Jun 2, 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: ac600f50-14f0-4e9b-a0b2-2173b5f12614

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 size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Jun 2, 2026
@macroscopeapp

macroscopeappBot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

1 blocking correctness issue found. This PR adds new functionality and has an unresolved review comment identifying an error type mismatch where removeEnvironment can throw errors not declared in its interface signature.

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

macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 2, 2026
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 2, 2026 23:50

Dismissing prior approval to re-evaluate 933a157

Comment threadapps/web/src/environments/runtime/service.ts Outdated
Comment threadapps/web/src/environments/runtime/service.ts Outdated
macroscopeapp[bot]
macroscopeappBot previously approved these changes Jun 3, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 57451d3 to 61426fdCompareJune 3, 2026 12:43
@macroscopeapp
macroscopeappBot dismissed their stale reviewJune 3, 2026 12:44

Dismissing prior approval to re-evaluate 61426fd

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from 61426fd to 177b89bCompareJune 3, 2026 13:40
@github-actionsgithub-actionsBot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/desktop/src/app/DesktopApp.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 1e011dc to cfc3112CompareJune 3, 2026 13:46
@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Jun 3, 2026
Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from cfc3112 to c3497b0CompareJune 3, 2026 14:02
@juliusmarminge
juliusmarmingeforce-pushed the fix/saved-environment-persistence-cleanup branch from c3497b0 to cc9d672CompareJune 4, 2026 00:58
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 4 times, most recently from 33193f4 to 9e5bd2aCompareJune 11, 2026 13:35
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 95c5ea1 to c9bcc76CompareJune 16, 2026 23:34
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 30c2ad5 to a980c75CompareJune 16, 2026 23:46

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit a980c750b2c825b09cebfe83fb3839b602d34574. Configure here.

Comment threadapps/web/src/environments/runtime/service.ts Outdated
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch 2 times, most recently from 9c4afac to da654c7CompareJune 19, 2026 01:45
@github-actionsgithub-actionsBot added size:M 30-99 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Jun 19, 2026
@mwolson
mwolsonforce-pushed the fix/saved-environment-persistence-cleanup branch from da654c7 to 01dee9cCompareJune 19, 2026 01:48
Comment threadapps/desktop/src/settings/DesktopSavedEnvironments.ts
@mwolson

Copy link
Copy Markdown
ContributorAuthor

@macroscope-app review

@macroscopeapp

Copy link
Copy Markdown
Contributor

Sorry, I'm unable to act on this request because you do not have permissions within this repository.

@juliusmarminge
juliusmarminge merged commit 1fcc57a into pingdotgg:mainJun 19, 2026
15 checks passed
@mwolson
mwolson deleted the fix/saved-environment-persistence-cleanup branch June 19, 2026 03:21
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal pushed a commit to aaditagrawal/t3code that referenced this pull request Jun 19, 2026
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Jun 24, 2026
…-connection-runtime
fix(web): Remove saved environments atomically (pingdotgg#2917)
Morphexe pushed a commit to Morphexe/t3code that referenced this pull request Jul 30, 2026
NeilTheFisher pushed a commit to NeilTheFisher/t3code that referenced this pull request Aug 18, 2026
darjss pushed a commit to darjss/t3code that referenced this pull request Aug 26, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M30-99 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.

[Bug]: Saved SSH environments can reappear or lose rollback state during removal

2 participants

@mwolson@juliusmarminge