FE-737: Web shell over the same host (M3)#147
Conversation
|
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
| } | ||
|
|
||
| function websocketHandshakeResponse(key: string): string { | ||
| const accept = createHash("sha1") |
There was a problem hiding this comment.
The use of a weak cryptographic algorithm (e.g., SHA-1 or MD5) has been identified. These algorithms are considered insecure due to vulnerabilities that make them susceptible to collision attacks, allowing attackers to compromise data integrity or security. Replace SHA-1 or MD5 with secure hashing algorithms, such as: SHA-256 or higher (e.g., SHA-3).
⭐ Fixed in commit ec2f985 ⭐
PR SummaryMedium Risk Overview Transcript and session reads are centralized on a canonical Brunch session envelope ( Shared Reviewed by Cursor Bugbot for commit eab91df. Bugbot is set up for automated code reviews on this repo. Configure here. |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit eab91df. Configure here.
|
|
||
| function hasRequiredSessionEntryShape(value: unknown): value is SessionEntry { | ||
| return isTranscriptEntry(value) && hasStringOrNullParentId(value) | ||
| } |
There was a problem hiding this comment.
Identical function duplicated within same file
Low Severity
hasRequiredSessionEntryShape and isSessionEntry in brunch-session-envelope.ts have identical implementations — both return isTranscriptEntry(value) && hasStringOrNullParentId(value). One of them is unnecessary and risks diverging silently if only one is updated in the future.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit eab91df. Configure here.
| (value as { parentId?: unknown }).parentId === null || | ||
| typeof (value as { parentId?: unknown }).parentId === "string" | ||
| ) | ||
| } |
There was a problem hiding this comment.
Transcript entry helpers duplicated across two files
Low Severity
isTranscriptEntry, isSessionEntry, and hasStringOrNullParentId are identically copy-pasted as private functions in both brunch-session-envelope.ts and elicitation-exchange.ts. Since elicitation-exchange.ts already imports from brunch-session-envelope.ts, these helpers could be shared rather than duplicated, reducing the risk of future divergence.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit eab91df. Configure here.
🤖 Augment PR SummarySummary: This PR introduces the M3 “web shell” as a native React UI served by the Brunch host, using a single WebSocket-backed JSON-RPC transport (no REST read model). Changes:
Technical Notes: Session-consuming reads now treat transport connections as ephemeral attachments; explicit 🤖 Was this summary useful? React with 👍 or 👎 |
|
|
||
| const response = JSON.parse(chunks.join("")) as JsonRpcResponse<T> | ||
| if (response.error) { | ||
| if ("error" in response) { |
There was a problem hiding this comment.
src/fixture-capture.ts:164 — Since response comes from JSON.parse without runtime validation, a malformed frame that lacks both error and result will now fall through and return undefined, which can mask protocol failures during fixture capture.
Severity: medium
⏳ Generating Fix in Augment link...
🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.



FE-737: Start web shell frontier
FE-737 reject non-linear transcript JSONL
FE-737 fail fast on non-linear session RPC
FE-737 block TUI branch flows