Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: NVIDIA/OpenShell
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v0.0.29
Choose a base ref
...
head repository: NVIDIA/OpenShell
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v0.0.30
Choose a head ref
  • 7 commits
  • 50 files changed
  • 4 contributors

Commits on Apr 14, 2026

  1. Configuration menu
    Copy the full SHA
    60035c6 View commit details
    Browse the repository at this point in the history
  2. fix(inference): prevent silent truncation of large streaming responses (

    #834)
    
    * fix(inference): prevent silent truncation of large streaming responses
    
    The L7 inference proxy silently dropped tool_calls from large streaming
    responses due to an aggressive 30s per-chunk idle timeout and a reqwest
    total-request timeout that capped the entire body stream. Reasoning models
    that pause during "thinking" phases triggered these timeouts, producing
    valid-looking but truncated HTTP responses with no client-visible error.
    
    - Extract prepare_backend_request() helper and create a streaming variant
      that omits the total request timeout; body stream liveness is now
      enforced solely by the per-chunk idle timeout
    - Add 30s connect_timeout to the reqwest Client builder
    - Increase CHUNK_IDLE_TIMEOUT from 30s to 120s for reasoning models
    - Inject SSE error events (proxy_stream_error) before the HTTP chunked
      terminator on all truncation paths so clients can detect data loss
    - Wrap the streaming relay in BufWriter to reduce per-chunk TLS flush
      overhead
    - Bump OCSF severity for streaming truncation from Low to Medium
    
    Closes #829
    
    * fix(inference): drop BufWriter to preserve SSE incremental delivery
    
    The BufWriter introduced in the previous commit buffered SSE frames until
    the 16KB capacity filled or the stream ended, defeating incremental token
    delivery and potentially reintroducing client-visible timeouts on healthy
    streams. Revert to per-chunk write_all+flush but keep the single
    format_chunk() call that coalesces framing into one write.
    
    Also fix the streaming integration test: add a 3s mock delay that exceeds
    the 1s route timeout so the test actually validates that the streaming
    path omits the total request timeout. Previously the mock responded
    immediately, passing regardless of timeout behavior.
    johntmyers authored Apr 14, 2026
    Configuration menu
    Copy the full SHA
    355d845 View commit details
    Browse the repository at this point in the history

Commits on Apr 15, 2026

  1. Configuration menu
    Copy the full SHA
    0bf4216 View commit details
    Browse the repository at this point in the history
  2. fix(sandbox): preserve ownership for existing read_write paths (#827)

    Closes #783
    
    Only chown read_write paths that the supervisor creates at startup, and leave pre-existing image paths with their original ownership. Add sandbox tests for creation, symlink rejection, and existing-path ownership preservation, and update architecture docs to match the new behavior.
    
    Co-authored-by: John Myers <[email protected]>
    johntmyers and johntmyers authored Apr 15, 2026
    Configuration menu
    Copy the full SHA
    e0db01e View commit details
    Browse the repository at this point in the history
  3. feat(policy): add deny rules to network policy schema (#822)

    * feat(policy): add deny rules to network policy schema
    
    Closes #565
    
    Add L7 deny rules that block specific requests even when allowed by
    access presets or explicit allow rules. Deny rules mirror the full
    capability set of allow rules (method, path, query params, SQL command)
    and take precedence -- if a request matches any deny rule, it is blocked
    regardless of allow rules.
    
    This enables the "allow everything except these specific operations"
    pattern without enumerating every allowed endpoint. For example, granting
    read-write access to GitHub while blocking PR approvals, branch
    protection changes, and ruleset modifications.
    
    * fix(policy): deny query matching fails closed, mirror allow-side validation
    
    Addresses PR review findings P1 and P3:
    
    P1: Deny-side query matching now uses fail-closed semantics. If ANY
    value for a query key matches the deny matcher, the deny fires. The
    previous implementation reused allow-side "all values must match"
    logic which allowed ?force=true&force=false to bypass a deny on
    force=true.
    
    P3: Deny-side query validation now mirrors the full allow-side checks:
    empty any lists, non-string matcher values, glob+any mutual exclusion,
    glob type checks, and glob syntax warnings are all validated.
    johntmyers authored Apr 15, 2026
    Configuration menu
    Copy the full SHA
    28e1ff7 View commit details
    Browse the repository at this point in the history
  4. fix(sandbox): disable child core dumps (#821)

    Signed-off-by: John Myers <[email protected]>
    johntmyers authored Apr 15, 2026
    Configuration menu
    Copy the full SHA
    28db08e View commit details
    Browse the repository at this point in the history
  5. fix(sandbox): escape control characters in format_sse_error (#842)

    format_sse_error only escaped `\` and `"`, leaving two problems:
    
    1. Control characters (`\n`, `\r`, `\t`, and all `\u0000-\u001F`) in
       `reason` produce output that fails `serde_json::from_str` — defeating
       #834's goal of giving clients a parseable SSE truncation signal.
    
    2. An unescaped `\n\n` inside `reason` splits the single error event
       into two SSE frames, letting a misbehaving upstream inject a forged
       frame (e.g. a fake tool_calls delta) into the client's stream. Latent
       today since all in-tree callers pass static strings, but a footgun
       for any future caller passing upstream error text, and the function's
       docstring already invites dynamic reasons.
    
    Replace the manual escape with `serde_json::to_writer` (already a
    workspace dep of `openshell-sandbox`). Add unit tests for control
    character escaping and SSE event-boundary injection.
    
    Closes #840
    
    Signed-off-by: mjamiv <[email protected]>
    mjamiv authored Apr 15, 2026
    Configuration menu
    Copy the full SHA
    1a57519 View commit details
    Browse the repository at this point in the history
Loading