Restore sessions from Docker container metadata after server restart - #142

Merged
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141
Feb 13, 2026
Merged

Restore sessions from Docker container metadata after server restart#142
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141

Conversation

CopilotAI commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

After the Axum upgrade, the in-memory SessionMap is cleared on restart. Pre-existing Docker containers remain running but become inaccessible because their session metadata is lost.

Changes

Session metadata persistence via Docker labels

  • Added labels to containers: session_id, owner_id, project_owner_id, project_slug, shell, container_type
  • Applied to both viewer and builder container creation flows

Session restoration on startup

  • restore_sessions_from_containers() queries Docker API for all running TryCli containers
  • Rebuilds SessionContext from container labels
  • Preserves accurate container age using Docker's creation timestamp

Lazy restoration on reconnection

  • restore_specific_session() handles WebSocket connections to sessions not yet restored
  • Filters Docker containers by session_id label for targeted restoration

Security hardening

  • Generic error messages sent to clients (prevents Docker internals leakage)
  • Detailed errors logged server-side via tracing framework

Example

// Container labels now include session metadatalet labels = create_container_labels(&session_id,
owner_id,
project_owner_id,
project_slug.as_deref(),&shell,"viewer",);// On startup, sessions are restored from running containerspubasyncfnrestore_sessions_from_containers(state:&AppState){// Query Docker for containers with managed_by=TryCli Studio// Recreate SessionContext from labels// Preserve accurate timing from container.created timestamp}

Backward Compatibility

Containers created before this change lack the new labels and won't be automatically restored. They follow existing cleanup behavior: reaped after 30s of inactivity.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 3 commits February 13, 2026 11:25
- Add metadata labels to containers (session_id, owner_id, shell, etc.)
- Restore sessions on server startup from existing containers
- Attempt session restoration on WebSocket reconnection
- Update container creation to include comprehensive labels
- Fix pre-existing containers accessibility after upgrade
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Replace detailed Docker/bollard errors with generic messages
- Keep detailed error logging server-side for debugging
- Prevent leaking internal operational details to clients
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Fix timer reset issue: preserve container age on restoration
- Replace println!/eprintln! with tracing::info!/error!
- Use container creation timestamp for accurate session age tracking
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
CopilotAI changed the title [WIP] Upgrade server dependencies for enhanced functionalityRestore sessions from Docker container metadata after server restartFeb 13, 2026
CopilotAI requested a review from Yashb404February 13, 2026 11:33
@Yashb404
Yashb404 marked this pull request as ready for review February 13, 2026 12:09
@Yashb404
Yashb404 merged commit 0280311 into chore/upgrade-depFeb 13, 2026
@Yashb404

Copy link
Copy Markdown
Member

@copilot

the issue is still there , for the containers created before the dependency upgrade they are unable to connect , they do not load in the window.

in the terminal , an attempting to connect and then it fails with

[!] Failed to start viewer container. Please try again later.

[!] Connection Closed.

meanwhile the container was created in background but never connected to the screen

Server listening on port 3000...
Cleaning up session: 1ebcc645-b441-4e09-8b85-d718c838f829
Reaper: Killing Abandoned Session a5c5f89f-aabd-4df8-94d4-b9fe0dbd1360 (Never connected)

@Yashb404
Yashb404 deleted the copilot/sub-pr-141 branch February 13, 2026 20:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Yashb404
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e 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

Restore sessions from Docker container metadata after server restart - #142

Merged
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141
Feb 13, 2026
Merged

Restore sessions from Docker container metadata after server restart#142
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141

Conversation

CopilotAI commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

After the Axum upgrade, the in-memory SessionMap is cleared on restart. Pre-existing Docker containers remain running but become inaccessible because their session metadata is lost.

Changes

Session metadata persistence via Docker labels

  • Added labels to containers: session_id, owner_id, project_owner_id, project_slug, shell, container_type
  • Applied to both viewer and builder container creation flows

Session restoration on startup

  • restore_sessions_from_containers() queries Docker API for all running TryCli containers
  • Rebuilds SessionContext from container labels
  • Preserves accurate container age using Docker's creation timestamp

Lazy restoration on reconnection

  • restore_specific_session() handles WebSocket connections to sessions not yet restored
  • Filters Docker containers by session_id label for targeted restoration

Security hardening

  • Generic error messages sent to clients (prevents Docker internals leakage)
  • Detailed errors logged server-side via tracing framework

Example

// Container labels now include session metadatalet labels = create_container_labels(&session_id,
owner_id,
project_owner_id,
project_slug.as_deref(),&shell,"viewer",);// On startup, sessions are restored from running containerspubasyncfnrestore_sessions_from_containers(state:&AppState){// Query Docker for containers with managed_by=TryCli Studio// Recreate SessionContext from labels// Preserve accurate timing from container.created timestamp}

Backward Compatibility

Containers created before this change lack the new labels and won't be automatically restored. They follow existing cleanup behavior: reaped after 30s of inactivity.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 3 commits February 13, 2026 11:25
- Add metadata labels to containers (session_id, owner_id, shell, etc.)
- Restore sessions on server startup from existing containers
- Attempt session restoration on WebSocket reconnection
- Update container creation to include comprehensive labels
- Fix pre-existing containers accessibility after upgrade
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Replace detailed Docker/bollard errors with generic messages
- Keep detailed error logging server-side for debugging
- Prevent leaking internal operational details to clients
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Fix timer reset issue: preserve container age on restoration
- Replace println!/eprintln! with tracing::info!/error!
- Use container creation timestamp for accurate session age tracking
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
CopilotAI changed the title [WIP] Upgrade server dependencies for enhanced functionalityRestore sessions from Docker container metadata after server restartFeb 13, 2026
CopilotAI requested a review from Yashb404February 13, 2026 11:33
@Yashb404
Yashb404 marked this pull request as ready for review February 13, 2026 12:09
@Yashb404
Yashb404 merged commit 0280311 into chore/upgrade-depFeb 13, 2026
@Yashb404

Copy link
Copy Markdown
Member

@copilot

the issue is still there , for the containers created before the dependency upgrade they are unable to connect , they do not load in the window.

in the terminal , an attempting to connect and then it fails with

[!] Failed to start viewer container. Please try again later.

[!] Connection Closed.

meanwhile the container was created in background but never connected to the screen

Server listening on port 3000...
Cleaning up session: 1ebcc645-b441-4e09-8b85-d718c838f829
Reaper: Killing Abandoned Session a5c5f89f-aabd-4df8-94d4-b9fe0dbd1360 (Never connected)

@Yashb404
Yashb404 deleted the copilot/sub-pr-141 branch February 13, 2026 20:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Yashb404
, '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

Restore sessions from Docker container metadata after server restart - #142

Merged
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141
Feb 13, 2026
Merged

Restore sessions from Docker container metadata after server restart#142
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141

Conversation

CopilotAI commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

After the Axum upgrade, the in-memory SessionMap is cleared on restart. Pre-existing Docker containers remain running but become inaccessible because their session metadata is lost.

Changes

Session metadata persistence via Docker labels

  • Added labels to containers: session_id, owner_id, project_owner_id, project_slug, shell, container_type
  • Applied to both viewer and builder container creation flows

Session restoration on startup

  • restore_sessions_from_containers() queries Docker API for all running TryCli containers
  • Rebuilds SessionContext from container labels
  • Preserves accurate container age using Docker's creation timestamp

Lazy restoration on reconnection

  • restore_specific_session() handles WebSocket connections to sessions not yet restored
  • Filters Docker containers by session_id label for targeted restoration

Security hardening

  • Generic error messages sent to clients (prevents Docker internals leakage)
  • Detailed errors logged server-side via tracing framework

Example

// Container labels now include session metadatalet labels = create_container_labels(&session_id,
owner_id,
project_owner_id,
project_slug.as_deref(),&shell,"viewer",);// On startup, sessions are restored from running containerspubasyncfnrestore_sessions_from_containers(state:&AppState){// Query Docker for containers with managed_by=TryCli Studio// Recreate SessionContext from labels// Preserve accurate timing from container.created timestamp}

Backward Compatibility

Containers created before this change lack the new labels and won't be automatically restored. They follow existing cleanup behavior: reaped after 30s of inactivity.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 3 commits February 13, 2026 11:25
- Add metadata labels to containers (session_id, owner_id, shell, etc.)
- Restore sessions on server startup from existing containers
- Attempt session restoration on WebSocket reconnection
- Update container creation to include comprehensive labels
- Fix pre-existing containers accessibility after upgrade
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Replace detailed Docker/bollard errors with generic messages
- Keep detailed error logging server-side for debugging
- Prevent leaking internal operational details to clients
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Fix timer reset issue: preserve container age on restoration
- Replace println!/eprintln! with tracing::info!/error!
- Use container creation timestamp for accurate session age tracking
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
CopilotAI changed the title [WIP] Upgrade server dependencies for enhanced functionalityRestore sessions from Docker container metadata after server restartFeb 13, 2026
CopilotAI requested a review from Yashb404February 13, 2026 11:33
@Yashb404
Yashb404 marked this pull request as ready for review February 13, 2026 12:09
@Yashb404
Yashb404 merged commit 0280311 into chore/upgrade-depFeb 13, 2026
@Yashb404

Copy link
Copy Markdown
Member

@copilot

the issue is still there , for the containers created before the dependency upgrade they are unable to connect , they do not load in the window.

in the terminal , an attempting to connect and then it fails with

[!] Failed to start viewer container. Please try again later.

[!] Connection Closed.

meanwhile the container was created in background but never connected to the screen

Server listening on port 3000...
Cleaning up session: 1ebcc645-b441-4e09-8b85-d718c838f829
Reaper: Killing Abandoned Session a5c5f89f-aabd-4df8-94d4-b9fe0dbd1360 (Never connected)

@Yashb404
Yashb404 deleted the copilot/sub-pr-141 branch February 13, 2026 20:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Yashb404
, '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 \u003e 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

Restore sessions from Docker container metadata after server restart - #142

Merged
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141
Feb 13, 2026
Merged

Restore sessions from Docker container metadata after server restart#142
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141

Conversation

CopilotAI commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

After the Axum upgrade, the in-memory SessionMap is cleared on restart. Pre-existing Docker containers remain running but become inaccessible because their session metadata is lost.

Changes

Session metadata persistence via Docker labels

  • Added labels to containers: session_id, owner_id, project_owner_id, project_slug, shell, container_type
  • Applied to both viewer and builder container creation flows

Session restoration on startup

  • restore_sessions_from_containers() queries Docker API for all running TryCli containers
  • Rebuilds SessionContext from container labels
  • Preserves accurate container age using Docker's creation timestamp

Lazy restoration on reconnection

  • restore_specific_session() handles WebSocket connections to sessions not yet restored
  • Filters Docker containers by session_id label for targeted restoration

Security hardening

  • Generic error messages sent to clients (prevents Docker internals leakage)
  • Detailed errors logged server-side via tracing framework

Example

// Container labels now include session metadatalet labels = create_container_labels(&session_id,
owner_id,
project_owner_id,
project_slug.as_deref(),&shell,"viewer",);// On startup, sessions are restored from running containerspubasyncfnrestore_sessions_from_containers(state:&AppState){// Query Docker for containers with managed_by=TryCli Studio// Recreate SessionContext from labels// Preserve accurate timing from container.created timestamp}

Backward Compatibility

Containers created before this change lack the new labels and won't be automatically restored. They follow existing cleanup behavior: reaped after 30s of inactivity.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 3 commits February 13, 2026 11:25
- Add metadata labels to containers (session_id, owner_id, shell, etc.)
- Restore sessions on server startup from existing containers
- Attempt session restoration on WebSocket reconnection
- Update container creation to include comprehensive labels
- Fix pre-existing containers accessibility after upgrade
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Replace detailed Docker/bollard errors with generic messages
- Keep detailed error logging server-side for debugging
- Prevent leaking internal operational details to clients
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Fix timer reset issue: preserve container age on restoration
- Replace println!/eprintln! with tracing::info!/error!
- Use container creation timestamp for accurate session age tracking
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
CopilotAI changed the title [WIP] Upgrade server dependencies for enhanced functionalityRestore sessions from Docker container metadata after server restartFeb 13, 2026
CopilotAI requested a review from Yashb404February 13, 2026 11:33
@Yashb404
Yashb404 marked this pull request as ready for review February 13, 2026 12:09
@Yashb404
Yashb404 merged commit 0280311 into chore/upgrade-depFeb 13, 2026
@Yashb404

Copy link
Copy Markdown
Member

@copilot

the issue is still there , for the containers created before the dependency upgrade they are unable to connect , they do not load in the window.

in the terminal , an attempting to connect and then it fails with

[!] Failed to start viewer container. Please try again later.

[!] Connection Closed.

meanwhile the container was created in background but never connected to the screen

Server listening on port 3000...
Cleaning up session: 1ebcc645-b441-4e09-8b85-d718c838f829
Reaper: Killing Abandoned Session a5c5f89f-aabd-4df8-94d4-b9fe0dbd1360 (Never connected)

@Yashb404
Yashb404 deleted the copilot/sub-pr-141 branch February 13, 2026 20:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Yashb404
, '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

Restore sessions from Docker container metadata after server restart - #142

Merged
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141
Feb 13, 2026
Merged

Restore sessions from Docker container metadata after server restart#142
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141

Conversation

CopilotAI commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

After the Axum upgrade, the in-memory SessionMap is cleared on restart. Pre-existing Docker containers remain running but become inaccessible because their session metadata is lost.

Changes

Session metadata persistence via Docker labels

  • Added labels to containers: session_id, owner_id, project_owner_id, project_slug, shell, container_type
  • Applied to both viewer and builder container creation flows

Session restoration on startup

  • restore_sessions_from_containers() queries Docker API for all running TryCli containers
  • Rebuilds SessionContext from container labels
  • Preserves accurate container age using Docker's creation timestamp

Lazy restoration on reconnection

  • restore_specific_session() handles WebSocket connections to sessions not yet restored
  • Filters Docker containers by session_id label for targeted restoration

Security hardening

  • Generic error messages sent to clients (prevents Docker internals leakage)
  • Detailed errors logged server-side via tracing framework

Example

// Container labels now include session metadatalet labels = create_container_labels(&session_id,
owner_id,
project_owner_id,
project_slug.as_deref(),&shell,"viewer",);// On startup, sessions are restored from running containerspubasyncfnrestore_sessions_from_containers(state:&AppState){// Query Docker for containers with managed_by=TryCli Studio// Recreate SessionContext from labels// Preserve accurate timing from container.created timestamp}

Backward Compatibility

Containers created before this change lack the new labels and won't be automatically restored. They follow existing cleanup behavior: reaped after 30s of inactivity.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 3 commits February 13, 2026 11:25
- Add metadata labels to containers (session_id, owner_id, shell, etc.)
- Restore sessions on server startup from existing containers
- Attempt session restoration on WebSocket reconnection
- Update container creation to include comprehensive labels
- Fix pre-existing containers accessibility after upgrade
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Replace detailed Docker/bollard errors with generic messages
- Keep detailed error logging server-side for debugging
- Prevent leaking internal operational details to clients
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Fix timer reset issue: preserve container age on restoration
- Replace println!/eprintln! with tracing::info!/error!
- Use container creation timestamp for accurate session age tracking
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
CopilotAI changed the title [WIP] Upgrade server dependencies for enhanced functionalityRestore sessions from Docker container metadata after server restartFeb 13, 2026
CopilotAI requested a review from Yashb404February 13, 2026 11:33
@Yashb404
Yashb404 marked this pull request as ready for review February 13, 2026 12:09
@Yashb404
Yashb404 merged commit 0280311 into chore/upgrade-depFeb 13, 2026
@Yashb404

Copy link
Copy Markdown
Member

@copilot

the issue is still there , for the containers created before the dependency upgrade they are unable to connect , they do not load in the window.

in the terminal , an attempting to connect and then it fails with

[!] Failed to start viewer container. Please try again later.

[!] Connection Closed.

meanwhile the container was created in background but never connected to the screen

Server listening on port 3000...
Cleaning up session: 1ebcc645-b441-4e09-8b85-d718c838f829
Reaper: Killing Abandoned Session a5c5f89f-aabd-4df8-94d4-b9fe0dbd1360 (Never connected)

@Yashb404
Yashb404 deleted the copilot/sub-pr-141 branch February 13, 2026 20:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Yashb404
, '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

Restore sessions from Docker container metadata after server restart - #142

Merged
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141
Feb 13, 2026
Merged

Restore sessions from Docker container metadata after server restart#142
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141

Conversation

CopilotAI commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

After the Axum upgrade, the in-memory SessionMap is cleared on restart. Pre-existing Docker containers remain running but become inaccessible because their session metadata is lost.

Changes

Session metadata persistence via Docker labels

  • Added labels to containers: session_id, owner_id, project_owner_id, project_slug, shell, container_type
  • Applied to both viewer and builder container creation flows

Session restoration on startup

  • restore_sessions_from_containers() queries Docker API for all running TryCli containers
  • Rebuilds SessionContext from container labels
  • Preserves accurate container age using Docker's creation timestamp

Lazy restoration on reconnection

  • restore_specific_session() handles WebSocket connections to sessions not yet restored
  • Filters Docker containers by session_id label for targeted restoration

Security hardening

  • Generic error messages sent to clients (prevents Docker internals leakage)
  • Detailed errors logged server-side via tracing framework

Example

// Container labels now include session metadatalet labels = create_container_labels(&session_id,
owner_id,
project_owner_id,
project_slug.as_deref(),&shell,"viewer",);// On startup, sessions are restored from running containerspubasyncfnrestore_sessions_from_containers(state:&AppState){// Query Docker for containers with managed_by=TryCli Studio// Recreate SessionContext from labels// Preserve accurate timing from container.created timestamp}

Backward Compatibility

Containers created before this change lack the new labels and won't be automatically restored. They follow existing cleanup behavior: reaped after 30s of inactivity.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 3 commits February 13, 2026 11:25
- Add metadata labels to containers (session_id, owner_id, shell, etc.)
- Restore sessions on server startup from existing containers
- Attempt session restoration on WebSocket reconnection
- Update container creation to include comprehensive labels
- Fix pre-existing containers accessibility after upgrade
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Replace detailed Docker/bollard errors with generic messages
- Keep detailed error logging server-side for debugging
- Prevent leaking internal operational details to clients
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Fix timer reset issue: preserve container age on restoration
- Replace println!/eprintln! with tracing::info!/error!
- Use container creation timestamp for accurate session age tracking
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
CopilotAI changed the title [WIP] Upgrade server dependencies for enhanced functionalityRestore sessions from Docker container metadata after server restartFeb 13, 2026
CopilotAI requested a review from Yashb404February 13, 2026 11:33
@Yashb404
Yashb404 marked this pull request as ready for review February 13, 2026 12:09
@Yashb404
Yashb404 merged commit 0280311 into chore/upgrade-depFeb 13, 2026
@Yashb404

Copy link
Copy Markdown
Member

@copilot

the issue is still there , for the containers created before the dependency upgrade they are unable to connect , they do not load in the window.

in the terminal , an attempting to connect and then it fails with

[!] Failed to start viewer container. Please try again later.

[!] Connection Closed.

meanwhile the container was created in background but never connected to the screen

Server listening on port 3000...
Cleaning up session: 1ebcc645-b441-4e09-8b85-d718c838f829
Reaper: Killing Abandoned Session a5c5f89f-aabd-4df8-94d4-b9fe0dbd1360 (Never connected)

@Yashb404
Yashb404 deleted the copilot/sub-pr-141 branch February 13, 2026 20:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Yashb404
, '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

Restore sessions from Docker container metadata after server restart - #142

Merged
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141
Feb 13, 2026
Merged

Restore sessions from Docker container metadata after server restart#142
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141

Conversation

CopilotAI commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

After the Axum upgrade, the in-memory SessionMap is cleared on restart. Pre-existing Docker containers remain running but become inaccessible because their session metadata is lost.

Changes

Session metadata persistence via Docker labels

  • Added labels to containers: session_id, owner_id, project_owner_id, project_slug, shell, container_type
  • Applied to both viewer and builder container creation flows

Session restoration on startup

  • restore_sessions_from_containers() queries Docker API for all running TryCli containers
  • Rebuilds SessionContext from container labels
  • Preserves accurate container age using Docker's creation timestamp

Lazy restoration on reconnection

  • restore_specific_session() handles WebSocket connections to sessions not yet restored
  • Filters Docker containers by session_id label for targeted restoration

Security hardening

  • Generic error messages sent to clients (prevents Docker internals leakage)
  • Detailed errors logged server-side via tracing framework

Example

// Container labels now include session metadatalet labels = create_container_labels(&session_id,
owner_id,
project_owner_id,
project_slug.as_deref(),&shell,"viewer",);// On startup, sessions are restored from running containerspubasyncfnrestore_sessions_from_containers(state:&AppState){// Query Docker for containers with managed_by=TryCli Studio// Recreate SessionContext from labels// Preserve accurate timing from container.created timestamp}

Backward Compatibility

Containers created before this change lack the new labels and won't be automatically restored. They follow existing cleanup behavior: reaped after 30s of inactivity.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 3 commits February 13, 2026 11:25
- Add metadata labels to containers (session_id, owner_id, shell, etc.)
- Restore sessions on server startup from existing containers
- Attempt session restoration on WebSocket reconnection
- Update container creation to include comprehensive labels
- Fix pre-existing containers accessibility after upgrade
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Replace detailed Docker/bollard errors with generic messages
- Keep detailed error logging server-side for debugging
- Prevent leaking internal operational details to clients
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Fix timer reset issue: preserve container age on restoration
- Replace println!/eprintln! with tracing::info!/error!
- Use container creation timestamp for accurate session age tracking
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
CopilotAI changed the title [WIP] Upgrade server dependencies for enhanced functionalityRestore sessions from Docker container metadata after server restartFeb 13, 2026
CopilotAI requested a review from Yashb404February 13, 2026 11:33
@Yashb404
Yashb404 marked this pull request as ready for review February 13, 2026 12:09
@Yashb404
Yashb404 merged commit 0280311 into chore/upgrade-depFeb 13, 2026
@Yashb404

Copy link
Copy Markdown
Member

@copilot

the issue is still there , for the containers created before the dependency upgrade they are unable to connect , they do not load in the window.

in the terminal , an attempting to connect and then it fails with

[!] Failed to start viewer container. Please try again later.

[!] Connection Closed.

meanwhile the container was created in background but never connected to the screen

Server listening on port 3000...
Cleaning up session: 1ebcc645-b441-4e09-8b85-d718c838f829
Reaper: Killing Abandoned Session a5c5f89f-aabd-4df8-94d4-b9fe0dbd1360 (Never connected)

@Yashb404
Yashb404 deleted the copilot/sub-pr-141 branch February 13, 2026 20:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Yashb404
, '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

Restore sessions from Docker container metadata after server restart - #142

Merged
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141
Feb 13, 2026
Merged

Restore sessions from Docker container metadata after server restart#142
Yashb404 merged 4 commits into
chore/upgrade-depfrom
copilot/sub-pr-141

Conversation

CopilotAI commented Feb 13, 2026

Copy link
Copy Markdown
Contributor

After the Axum upgrade, the in-memory SessionMap is cleared on restart. Pre-existing Docker containers remain running but become inaccessible because their session metadata is lost.

Changes

Session metadata persistence via Docker labels

  • Added labels to containers: session_id, owner_id, project_owner_id, project_slug, shell, container_type
  • Applied to both viewer and builder container creation flows

Session restoration on startup

  • restore_sessions_from_containers() queries Docker API for all running TryCli containers
  • Rebuilds SessionContext from container labels
  • Preserves accurate container age using Docker's creation timestamp

Lazy restoration on reconnection

  • restore_specific_session() handles WebSocket connections to sessions not yet restored
  • Filters Docker containers by session_id label for targeted restoration

Security hardening

  • Generic error messages sent to clients (prevents Docker internals leakage)
  • Detailed errors logged server-side via tracing framework

Example

// Container labels now include session metadatalet labels = create_container_labels(&session_id,
owner_id,
project_owner_id,
project_slug.as_deref(),&shell,"viewer",);// On startup, sessions are restored from running containerspubasyncfnrestore_sessions_from_containers(state:&AppState){// Query Docker for containers with managed_by=TryCli Studio// Recreate SessionContext from labels// Preserve accurate timing from container.created timestamp}

Backward Compatibility

Containers created before this change lack the new labels and won't be automatically restored. They follow existing cleanup behavior: reaped after 30s of inactivity.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

CopilotAIand others added 3 commits February 13, 2026 11:25
- Add metadata labels to containers (session_id, owner_id, shell, etc.)
- Restore sessions on server startup from existing containers
- Attempt session restoration on WebSocket reconnection
- Update container creation to include comprehensive labels
- Fix pre-existing containers accessibility after upgrade
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Replace detailed Docker/bollard errors with generic messages
- Keep detailed error logging server-side for debugging
- Prevent leaking internal operational details to clients
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
- Fix timer reset issue: preserve container age on restoration
- Replace println!/eprintln! with tracing::info!/error!
- Use container creation timestamp for accurate session age tracking
Co-authored-by: Yashb404 <139128977+Yashb404@users.noreply.github.com>
CopilotAI changed the title [WIP] Upgrade server dependencies for enhanced functionalityRestore sessions from Docker container metadata after server restartFeb 13, 2026
CopilotAI requested a review from Yashb404February 13, 2026 11:33
@Yashb404
Yashb404 marked this pull request as ready for review February 13, 2026 12:09
@Yashb404
Yashb404 merged commit 0280311 into chore/upgrade-depFeb 13, 2026
@Yashb404

Copy link
Copy Markdown
Member

@copilot

the issue is still there , for the containers created before the dependency upgrade they are unable to connect , they do not load in the window.

in the terminal , an attempting to connect and then it fails with

[!] Failed to start viewer container. Please try again later.

[!] Connection Closed.

meanwhile the container was created in background but never connected to the screen

Server listening on port 3000...
Cleaning up session: 1ebcc645-b441-4e09-8b85-d718c838f829
Reaper: Killing Abandoned Session a5c5f89f-aabd-4df8-94d4-b9fe0dbd1360 (Never connected)

@Yashb404
Yashb404 deleted the copilot/sub-pr-141 branch February 13, 2026 20:40
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Yashb404