Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
028feb4
docs: design embedded Hermes agent selection
Cyb3rb1ade Aug 1, 2026
cc31e07
docs: plan embedded Hermes agent selection
Cyb3rb1ade Aug 1, 2026
8623c68
feat(hermes): define embedded profile routing
Cyb3rb1ade Aug 1, 2026
30c7e31
fix(hermes): isolate embedded routing
Cyb3rb1ade Aug 1, 2026
043f9cf
feat(hermes): launch owned isolated sidecars
Cyb3rb1ade Aug 1, 2026
428bcd9
fix(hermes): harden sidecar ownership checks
Cyb3rb1ade Aug 1, 2026
e04059f
fix(hermes): preserve wrapped sidecar identity
Cyb3rb1ade Aug 1, 2026
c7217a6
feat(hermes): add authenticated gateway client
Cyb3rb1ade Aug 1, 2026
a977485
fix(hermes): fail closed on unknown rpc ids
Cyb3rb1ade Aug 1, 2026
1a66a17
fix(hermes): bound gateway rpc ids
Cyb3rb1ade Aug 1, 2026
e7037d2
fix(hermes): close socket on client deinit
Cyb3rb1ade Aug 1, 2026
9844709
feat(hermes): connect profiles and native sessions
Cyb3rb1ade Aug 1, 2026
e9f199c
fix(hermes): guard stale gateway operations
Cyb3rb1ade Aug 1, 2026
30491db
fix(hermes): release disconnected gateway resources
Cyb3rb1ade Aug 1, 2026
ba83d3e
test(hermes): silence lifetime reference warnings
Cyb3rb1ade Aug 1, 2026
b68f5e0
feat(hermes): guard cross-process session ownership
Cyb3rb1ade Aug 1, 2026
dab8b52
fix(hermes): parse native active session leases
Cyb3rb1ade Aug 1, 2026
099eb4c
feat(hermes): handle native agent events and prompts
Cyb3rb1ade Aug 1, 2026
0b661bd
fix(hermes): harden native event and response handling
Cyb3rb1ade Aug 1, 2026
6446b6c
fix(hermes): deduplicate auto approval responses
Cyb3rb1ade Aug 1, 2026
523169c
fix(hermes): queue ambiguous auto approvals
Cyb3rb1ade Aug 1, 2026
f081ed7
fix(hermes): fail closed approval responses
Cyb3rb1ade Aug 1, 2026
2e3698c
fix(hermes): arbitrate pending request FIFO
Cyb3rb1ade Aug 1, 2026
ec1aef7
docs: plan Hermes approval recovery repair
Cyb3rb1ade Aug 1, 2026
0f417d4
fix(hermes): preserve blocked approval recovery
Cyb3rb1ade Aug 1, 2026
2d05209
fix(hermes): scope approval recovery to session
Cyb3rb1ade Aug 1, 2026
039ca24
fix(hermes): retain recovery across failed reconnects
Cyb3rb1ade Aug 1, 2026
fd27cc4
feat(app): embed Hermes profile sessions
Cyb3rb1ade Aug 1, 2026
5acff57
fix(hermes): guard embedded request lifecycle
Cyb3rb1ade Aug 1, 2026
9b9278b
fix(hermes): recognize installed console sidecar
Cyb3rb1ade Aug 1, 2026
15fef77
fix(app): keep embedded Hermes launch isolated
Cyb3rb1ade Aug 1, 2026
63d15f8
fix(hermes): fail closed without ownership registry
Cyb3rb1ade Aug 1, 2026
cd550aa
fix(hermes): permit fresh session without registry
Cyb3rb1ade Aug 1, 2026
b1b3f1e
fix(hermes): harden fresh session ownership
Cyb3rb1ade Aug 1, 2026
50300c7
fix(hermes): persist external profile selection
Cyb3rb1ade Aug 1, 2026
8f99a72
feat(settings): configure Hermes profile
Cyb3rb1ade Aug 1, 2026
d52ebdc
fix(hermes): enable first-prompt composer
Cyb3rb1ade Aug 2, 2026
d8443d2
fix(hermes): bound live session cache retention
Cyb3rb1ade Aug 2, 2026
2eba067
fix(hermes): force TUI provider override for embedded launches
Cyb3rb1ade Aug 2, 2026
8b5f612
fix(hermes): tolerate explicitly empty base_url in profile routing
Cyb3rb1ade Aug 3, 2026
1ee411a
Merge remote-tracking branch 'upstream/main' into codex/embedded-herm…
Cyb3rb1ade Aug 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -306,6 +306,26 @@ public struct MTPLXAppConfiguration: Codable, Equatable, Sendable {
self.hfEndpoint = hfEndpoint
}

/// Records the app-owned embedded Hermes session to offer on the next
/// overlay visit. This deliberately leaves the generic daemon launch
/// target alone: embedded Hermes is not a `mtplx start hermes` handoff.
public mutating func rememberEmbeddedHermesSession(_ reference: HermesSessionReference) {
lastHermesProfile = reference.profileName
lastHermesSessionID = reference.sessionID
lastHermesSessionTitle = reference.title
}

/// Persists profile-only navigation independently from the generic launch
/// target. A session belongs to its profile, so crossing that boundary
/// must discard the old resume identity while reselecting the same profile
/// keeps its remembered session intact.
public mutating func rememberHermesProfileSelection(_ profileName: String) {
guard lastHermesProfile != profileName else { return }
lastHermesProfile = profileName
lastHermesSessionID = nil
lastHermesSessionTitle = nil
}

/// Fresh installs must be portable. Installed local copies are discovered
/// by the model catalog; the default configuration should never point at
/// a developer machine path.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
public enum HermesComposerPolicy {
/// The composer may accept text for an existing writable session or for a
/// selected profile that can create a fresh session on first send.
public static func acceptsInput(
gatewayReady: Bool,
hasPendingRequest: Bool,
activeSessionWritable: Bool,
hasActiveSession: Bool,
hasAvailableProfile: Bool
) -> Bool {
guard gatewayReady, !hasPendingRequest else { return false }
if activeSessionWritable { return true }
return !hasActiveSession && hasAvailableProfile
}
}
Loading