Skip to content

Let user SSH options override the daemon-transport keepalive defaults - #5809

Closed
kays0x wants to merge 2 commits into
manaflow-ai:mainfrom
kays0x:fix-ssh-keepalive-overridable
Closed

kays0x wants to merge 2 commits into
manaflow-ai:mainfrom
kays0x:fix-ssh-keepalive-overridable

Conversation

@kays0x

@kays0x kays0x commented Jun 10, 2026 •

Copy link
Copy Markdown
Contributor

Summary

What: The daemon-transport SSH command builders emitted ConnectTimeout, ServerAliveInterval, and ServerAliveCountMax unconditionally at the front of the ssh argv, before appending the configuration's own SSH options. OpenSSH applies the first value it sees for an option, so:

  1. A user could never override these keepalives via their SSH options - the hardcoded defaults always won.
  2. The default budget (ServerAliveInterval=20 x ServerAliveCountMax=2 = ~40s) tore the supervision connection down on brief network blips, producing the "attempt N/20" reconnect flapping.

Why / fix: Guard each default with hasSSHOptionKey so it is emitted only when the configuration has not already set it (matching the existing StrictHostKeyChecking guard right below it), and raise the default ServerAliveCountMax from 2 to 6 (~120s budget) so a short outage no longer kills the connection.

Applied to both daemon-transport builders:

  • CmuxCore - WorkspaceRemoteConfiguration.batchSSHArguments() (daemonTransportArguments / daemonSocketForwardArguments / reverse-relay).
  • CmuxRemoteSession - RemoteSessionCoordinator.sshCommonArguments(batchMode:).

Testing

swift test --package-path Packages/CmuxCore --filter WorkspaceRemoteConfigurationSSHBatchCommandsTests - 9 passed.

Two new regression tests (two-commit red/green):

  • supervision keepalive default tolerates longer outages (ServerAliveCountMax=6)
  • user-supplied keepalive options override the supervision defaults - verifies a user's ServerAliveInterval/ServerAliveCountMax/ConnectTimeout survive exactly once and no default token is emitted.

Verified locally that both fail on the test-only commit (the argv contains both the hardcoded =2 and the user's value) and pass on the fix commit. CmuxRemoteSession builds clean.

Demo Video

Terminal-only argv change; before/after is the argument list asserted in the tests above. Before: -o ServerAliveCountMax=2 ... -o ServerAliveCountMax=12 (user value ignored, first-wins). After: -o ServerAliveCountMax=12 only (user value honored), default =6 when unset.

Review Trigger

Override semantics for daemon-transport keepalives + default budget change.

Checklist

  • Defaults overridable by user SSH options
  • Regression tests (red without fix, green with fix)
  • Both daemon-transport builders covered

Summary by CodeRabbit

  • Bug Fixes

    • Improved SSH connection reliability for remote workspace operations by applying more robust keepalive defaults (including a higher ServerAliveCountMax) when those options aren’t already set. User-supplied SSH keepalive settings continue to fully override the defaults.
  • Tests

    • Updated and expanded SSH batch-argument expectations to cover the new default keepalive behavior and verify that user-provided values replace defaults as intended.

@vercel

vercel Bot commented Jun 10, 2026

Copy link
Copy Markdown

@kays0x is attempting to deploy a commit to the Manaflow Team on Vercel.

A member of the Team first needs to authorize it.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Something went wrong. Try again later by commenting “@codex review”.

This workspace is deactivated. Select an active workspace and try again.
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@greptile-apps

greptile-apps Bot commented Jun 10, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR fixes a silent precedence bug in two SSH argument builders (batchSSHArguments and sshCommonArguments) where hardcoded keepalive defaults were unconditionally prepended, causing any user-supplied ConnectTimeout, ServerAliveInterval, or ServerAliveCountMax values to be silently overridden (OpenSSH is first-value-wins on the command line). It also raises the default ServerAliveCountMax from 2 to 6, giving flaky links ~120 s of silence before the daemon transport is torn down instead of ~40 s.

  • Bug fix: Both WorkspaceRemoteConfiguration.batchSSHArguments() and RemoteSessionCoordinator.sshCommonArguments() now emit each supervision default only when hasSSHOptionKey confirms the user has not already configured it, matching the existing behavior for StrictHostKeyChecking=accept-new.
  • Default bump: ServerAliveCountMax raised from 2 → 6; tests updated to pin the new value and assert the old one is absent.
  • New tests: Two tests added to WorkspaceRemoteConfigurationSSHBatchCommandsTests covering the default value and the user-override path; the RemoteSessionCoordinator path shares the same logic but has no new dedicated test.

Confidence Score: 5/5

Safe to merge; the change is a targeted, well-tested fix that eliminates silent option suppression and increases keepalive headroom on flaky links.

Both changed builders apply the same conditional guard that already existed for StrictHostKeyChecking, the logic is straightforward and exercised by tight new tests, and no other SSH command builder in the codebase retains the old hardcoded CountMax=2.

RemoteSessionCoordinator+SSHArguments.swift has identical logic to the tested batch builder but carries no new dedicated tests for the keepalive-override path; CI coverage is the only gate for that code path.

Important Files Changed

Filename Overview
Packages/CmuxCore/Sources/CmuxCore/Remote/WorkspaceRemoteConfiguration+SSHBatchCommands.swift Supervision defaults now guarded by hasSSHOptionKey before emission; ServerAliveCountMax raised from 2 to 6; logic is symmetric with the existing StrictHostKeyChecking guard.
Packages/CmuxRemoteSession/Sources/CmuxRemoteSession/Session/RemoteSessionCoordinator+SSHArguments.swift Same conditional-emission fix applied to sshCommonArguments; both batch and non-batch paths benefit. No new unit tests for this path, but the logic is identical to the tested batch builder.
Packages/CmuxCore/Tests/CmuxCoreTests/WorkspaceRemoteConfigurationSSHBatchCommandsTests.swift Existing tests updated from CountMax=2 to CountMax=6; two new tests cover the default-value and user-override paths; assertions are tight (exact count checks to catch duplicates).

Sequence Diagram

sequenceDiagram
    participant User as User sshOptions
    participant Builder as batchSSHArguments / sshCommonArguments
    participant SSH as ssh process

    Note over Builder: For each supervision key
    Builder->>User: hasSSHOptionKey(effectiveSSHOptions, key)
    alt key NOT in user options
        Builder-->>SSH: "-o Key=default (CountMax=6, Interval=20, ConnectTimeout=6)"
    else key already set by user
        Builder-->>SSH: default suppressed, user value wins
    end

    Builder->>User: hasSSHOptionKey(effectiveSSHOptions, StrictHostKeyChecking)
    alt not set
        Builder-->>SSH: "-o StrictHostKeyChecking=accept-new"
    end

    Builder-->>SSH: "-o BatchMode=yes, -o ControlMaster=no, -p port, -i identity"
    Builder-->>SSH: -o each user option from effectiveSSHOptions
Loading

Reviews (5): Last reviewed commit: "fix: let user SSH options override daemo..." | Re-trigger Greptile

@coderabbitai

coderabbitai Bot commented Jun 10, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 7a2602f8-6d19-4ef5-9686-b99922412de3

📥 Commits

Reviewing files that changed from the base of the PR and between cec94b5 and 71413cd.

📒 Files selected for processing (2)
  • Packages/CmuxCore/Sources/CmuxCore/Remote/WorkspaceRemoteConfiguration+SSHBatchCommands.swift
  • Packages/CmuxCore/Tests/CmuxCoreTests/WorkspaceRemoteConfigurationSSHBatchCommandsTests.swift
💤 Files with no reviewable changes (2)
  • Packages/CmuxCore/Tests/CmuxCoreTests/WorkspaceRemoteConfigurationSSHBatchCommandsTests.swift
  • Packages/CmuxCore/Sources/CmuxCore/Remote/WorkspaceRemoteConfiguration+SSHBatchCommands.swift

📝 Walkthrough

Walkthrough

batchSSHArguments() now conditionally appends ConnectTimeout=6, ServerAliveInterval=20, and ServerAliveCountMax=6 only when those keys are absent from effectiveSSHOptions. The ServerAliveCountMax default is raised from 2 to 6. Tests are updated to match and new tests cover default emission and user-override suppression.

Changes

SSH Supervision Keepalive Defaults

Layer / File(s) Summary
Conditional keepalive emission in batchSSHArguments
Packages/CmuxCore/Sources/CmuxCore/Remote/WorkspaceRemoteConfiguration+SSHBatchCommands.swift
Replaces unconditional keepalive defaults with per-key presence checks against effectiveSSHOptions; raises ServerAliveCountMax default from 2 to 6.
Updated and new keepalive tests
Packages/CmuxCore/Tests/CmuxCoreTests/WorkspaceRemoteConfigurationSSHBatchCommandsTests.swift
Updates expectedBatchArguments and daemonTransportArguments expectations to ServerAliveCountMax=6; adds tests asserting default emission and user-option override suppression.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐇 Hop, hop, the keepalive grows,
from two to six, as the connection flows.
If you set your own, no override shall creep,
conditionals guard each option we keep.
Six chances to ping before we sleep! 🌙


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Cmux Algorithmic Complexity ❌ Error Production code calls hasSSHOptionKey() 4 times per function on unbounded SSH options collection, creating nested full-collection scans violating algorithmic-complexity.md. Build configuredSSHOptionKeys set once per function call and reuse it for all 4 key checks (ConnectTimeout, ServerAliveInterval, ServerAliveCountMax, StrictHostKeyChecking) to achieve O(n) instead of O(4n).
Docstring Coverage ⚠️ Warning Docstring coverage is 18.52% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (19 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: enabling user SSH options to override daemon-transport keepalive defaults.
Description check ✅ Passed The description covers all required template sections: Summary (what/why), Testing (how tested), and a completed Checklist with verification of the key changes.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed PR modifies only a private method in a Sendable struct and test code; no MainActor-implicit models, service protocols, shared mutable Sendable types, or UI-bound stores from background contexts int...
Cmux Swift Blocking Runtime ✅ Passed PR modifies SSH argument composition only (WorkspaceRemoteConfiguration+SSHBatchCommands.swift), adding option guards and adjusting defaults. No blocking synchronization primitives (semaphores, loc...
Cmux Expensive Synchronous Load ✅ Passed Changes are lightweight SSH argument string parsing/building with no expensive synchronous loaders (file I/O, syscalls, or index loads) added to main actor or interactive paths.
Cmux Cache Substitution Correctness ✅ Passed The PR modifies SSH argument composition to conditionally apply defaults only when user-supplied options don't already set them. This is not a cache substitution issue: sshOptions are loaded fresh...
Cmux No Hacky Sleeps ✅ Passed PR contains only Swift code changes; the custom check explicitly excludes Swift sleeps (covered by separate swift-blocking-runtime check). Changes modify SSH command-line arguments, not timing/de...
Cmux Swift Concurrency ✅ Passed The PR introduces no legacy async patterns: no DispatchQueue, Combine, completion handlers, or fire-and-forget Tasks. Changes are purely synchronous SSH argument composition logic.
Cmux Swift @Concurrent ✅ Passed All code changes are purely synchronous functions performing string/array manipulation for SSH argument composition with no async functions, @concurrent annotations, or actor-isolation concerns.
Cmux Swift File And Package Boundaries ✅ Passed Both modified Swift files are extension files under 400 lines with single/coherent responsibilities (SSH argument composition). No additions to existing 800+ line files, no responsibility mixing, a...
Cmux Swift Logging ✅ Passed No Swift logging violations found; production code contains no print/debugPrint/dump/NSLog calls, ad hoc logging, MainActor-coupled Logger constants, or sensitive data exposure.
Cmux User-Facing Error Privacy ✅ Passed The PR contains only SSH configuration changes and tests with no user-facing error messages, credential exposure, or vendor name leakage. Changes are internal SSH argument composition excluded from...
Cmux Full Internationalization ✅ Passed PR modifies only internal SSH command construction (literal protocol tokens) and test fixtures. No user-facing text, UI strings, alerts, or localization-requiring content is introduced.
Cmux Swiftui State Layout ✅ Passed PR contains no SwiftUI code changes. Modified files are pure Swift SSH configuration logic with no observable objects, state properties, view types, or render-time mutations.
Cmux Architecture Rethink ✅ Passed PR fixes SSH option override semantics through conditional guard logic with clear ownership in WorkspaceRemoteConfiguration struct; no timing mechanisms, state duplication, or lifecycle issues intr...
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR modifies only SSH daemon transport configuration and tests; contains zero window-related code (NSWindow, NSPanel, NSWindowController, SwiftUI Window/WindowGroup). Check is not applicable.
Cmux Source Artifacts ✅ Passed All changed files are hand-written Swift source and test code with no artifact patterns, generated file markers, or scratch directories detected.
✨ 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.

@kays0x

kays0x commented Jun 10, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the Greptile findings in bcc960f:

  • WorkspaceRemoteSSHBatchCommandBuilder.batchArguments had the same hardcoded-first override bug — and on current main it builds the actual persistent daemon transport, so it was the path that mattered most. The canonical sshSupervisionArguments helper now lives on the builder; WorkspaceRemoteSessionController delegates to it.
  • WorkspaceRemoteConfiguration.sshForegroundAuthCommand (already override-safe) now shares the same helper, so its keepalive budget is consistent with the new default instead of keeping the old 40s.
  • Added end-to-end daemonTransportArguments tests for both the user-override and defaults-applied cases.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Sources/WorkspaceRemoteSSHBatchCommandBuilder.swift`:
- Around line 81-99: The code repeatedly rescans effectiveSSHOptions with
hasSSHOptionKey; change the flow to compute a single Set of lowercased option
keys once (e.g. let optionKeys =
Set(backgroundSSHOptions(configuration.sshOptions).map { $0.lowercased() })) and
reuse it: modify sshSupervisionArguments to accept this Set (or add a helper
that returns default supervision args given the Set) and update batchArguments
to call that helper and to check StrictHostKeyChecking against the same Set
instead of calling hasSSHOptionKey multiple times; ensure keys compared use a
consistent lowercase form like "connecttimeout", "serveraliveinterval",
"serveralivecountmax", "stricthostkeychecking".
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 84e5731f-7a56-4c37-8908-aa564d7fe761

📥 Commits

Reviewing files that changed from the base of the PR and between 6892370 and bcc960f.

📒 Files selected for processing (4)
  • Sources/Workspace.swift
  • Sources/WorkspaceRemoteConfiguration.swift
  • Sources/WorkspaceRemoteSSHBatchCommandBuilder.swift
  • cmuxTests/WorkspaceRemoteConnectionTests.swift

Comment thread Sources/WorkspaceRemoteSSHBatchCommandBuilder.swift Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Sources/WorkspaceRemoteSSHBatchCommandBuilder.swift (1)

96-101: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Build the configured-keys Set once and reuse it for both supervision defaults and StrictHostKeyChecking.

batchArguments rescans effectiveSSHOptions via hasSSHOptionKey on line 99 after sshSupervisionArguments already scanned the same list to build a Set on line 82. Build the Set once at the top of batchArguments and pass it to both checks.

♻️ Proposed refactor
 private static func batchArguments(configuration: WorkspaceRemoteConfiguration) -> [String] {
     let effectiveSSHOptions = backgroundSSHOptions(configuration.sshOptions)
-    var args: [String] = sshSupervisionArguments(effectiveSSHOptions: effectiveSSHOptions)
-    if !hasSSHOptionKey(effectiveSSHOptions, key: "StrictHostKeyChecking") {
+    let configuredKeys = Set(effectiveSSHOptions.compactMap(sshOptionKey))
+    var args: [String] = sshSupervisionArguments(configuredKeys: configuredKeys)
+    if !configuredKeys.contains("stricthostkeychecking") {
         args += ["-o", "StrictHostKeyChecking=accept-new"]
     }
     args += ["-o", "BatchMode=yes"]

Then update the helper signature:

-static func sshSupervisionArguments(effectiveSSHOptions: [String]) -> [String] {
-    let configuredKeys = Set(effectiveSSHOptions.compactMap(sshOptionKey))
+static func sshSupervisionArguments(configuredKeys: Set<String>) -> [String] {
     var args: [String] = []

Or keep the existing signature and add an overload that accepts the Set, making the array-accepting version delegate to it.

Based on coding guidelines .github/review-bot-rules/algorithmic-complexity.md: "Prefer one-pass parsing (scan once, store results in a Set/Map) rather than multiple contains(where:)/filter/first(where:) over the same collection for each generated -o option."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Sources/WorkspaceRemoteSSHBatchCommandBuilder.swift` around lines 96 - 101,
batchArguments currently calls backgroundSSHOptions then calls
sshSupervisionArguments which scans effectiveSSHOptions to build a Set, and
later calls hasSSHOptionKey which rescans the same list; to fix, compute the Set
of configured keys once at the top of batchArguments (after effectiveSSHOptions
= backgroundSSHOptions(...)) and pass that Set into sshSupervisionArguments (add
an overload or new helper parameter) and use the same Set for the
StrictHostKeyChecking check instead of calling hasSSHOptionKey again; update
sshSupervisionArguments and/or provide an overload that accepts the precomputed
Set so both places reuse the one-pass result.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@Sources/WorkspaceRemoteSSHBatchCommandBuilder.swift`:
- Around line 96-101: batchArguments currently calls backgroundSSHOptions then
calls sshSupervisionArguments which scans effectiveSSHOptions to build a Set,
and later calls hasSSHOptionKey which rescans the same list; to fix, compute the
Set of configured keys once at the top of batchArguments (after
effectiveSSHOptions = backgroundSSHOptions(...)) and pass that Set into
sshSupervisionArguments (add an overload or new helper parameter) and use the
same Set for the StrictHostKeyChecking check instead of calling hasSSHOptionKey
again; update sshSupervisionArguments and/or provide an overload that accepts
the precomputed Set so both places reuse the one-pass result.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: c333d684-1cf2-457d-8219-b11118e443ae

📥 Commits

Reviewing files that changed from the base of the PR and between bcc960f and 2cfc03a.

📒 Files selected for processing (1)
  • Sources/WorkspaceRemoteSSHBatchCommandBuilder.swift

@kays0x

kays0x commented Jun 10, 2026

Copy link
Copy Markdown
Contributor Author

Addressed the outside-diff finding from the latest CodeRabbit review in cec94b5: added the Set-accepting sshSupervisionArguments(configuredKeys:) overload plus a shared configuredSSHOptionKeys helper, and both batchArguments and sshCommonArguments now parse the option keys once and reuse the Set for the supervision defaults and the StrictHostKeyChecking check. The array-accepting wrapper stays for sshForegroundAuthCommand (single scan, no reuse opportunity) and the existing tests.

hhsw2015 pushed a commit to hhsw2015/cmux that referenced this pull request Jun 11, 2026
hhsw2015 pushed a commit to hhsw2015/cmux that referenced this pull request Jun 11, 2026
kays0x added 2 commits June 13, 2026 21:15
Adds failing coverage for the daemon-transport batch builder: the keepalive
defaults must be overridable by user SSH options (OpenSSH is first-value-wins,
so emitting both the default and the user value silently ignores the user) and
the default ServerAliveCountMax should be 6 rather than 2.
The daemon-transport batch builder and the remote-session coordinator emitted
ConnectTimeout/ServerAliveInterval/ServerAliveCountMax unconditionally at the
front of the ssh argv, before the user's own options. OpenSSH applies the first
value seen for an option, so a user could never override these keepalives, and
the 20s interval x CountMax=2 (40s) budget tore the supervision connection down
on brief blips (the 'attempt N/20' reconnect flapping).

Guard each default with hasSSHOptionKey so it is emitted only when the user has
not set it, and raise the default ServerAliveCountMax 2 -> 6 (~120s budget).
@kays0x
kays0x force-pushed the fix-ssh-keepalive-overridable branch from cec94b5 to 71413cd Compare June 14, 2026 01:24
@kays0x

kays0x commented Jun 14, 2026

Copy link
Copy Markdown
Contributor Author

Force-pushed: rebased onto current main and reimplemented. main's package refactor (CmuxCore / CmuxRemoteSession split) removed the original WorkspaceRemoteSSHBatchCommandBuilder.swift this PR was based on and already added a shared hasSSHOptionKey, so the old 5-commit branch (which carried its own option-scan refactors) no longer applied. The fix is now two focused commits against the new layout: guard the keepalive defaults so user SSH options win, and raise the default ServerAliveCountMax 2->6. Behavior and intent are unchanged from before.

@kays0x

kays0x commented Jun 14, 2026

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@kays0x

kays0x commented Jun 14, 2026

Copy link
Copy Markdown
Contributor Author

@cubic-dev-ai review

@coderabbitai

coderabbitai Bot commented Jun 14, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@cubic-dev-ai

cubic-dev-ai Bot commented Jun 14, 2026

Copy link
Copy Markdown

@cubic-dev-ai review

@kays0x I can't start this review because your workspace has reached its free monthly review limit. cubic has reviewed 241,260 of the 240,000 allowed lines of code this month. Reviews resume on 1 July 2026 (in 17 days). Paid plans include much higher monthly review limits. Upgrade now to resume reviews.

To help optimise your usage, you can tune cubic to get the most out of your usage limits:

Learn more →

@kays0x

kays0x commented Sep 19, 2026

Copy link
Copy Markdown
Contributor Author

Closing as stale - it conflicts with main after the package split. For reference, the underlying issue is still present on main: WorkspaceRemoteConfiguration+SSHBatchCommands.swift (batchSSHArguments) and RemoteSessionCoordinator+SSHArguments.swift still prepend ConnectTimeout=6 / ServerAliveInterval=20 / ServerAliveCountMax=2 unconditionally, so user-supplied values for those keys are ignored (OpenSSH is first-value-wins). The CLI and SSHPTYAttachStartupCommandBuilder paths already guard with hasSSHOptionKey.

@kays0x kays0x closed this Sep 19, 2026
Sign up for free to 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.

1 participant