From b4ee251273e997f7d0caabeac8d30dd2bed13a39 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Sun, 4 Oct 2026 05:08:01 -0700 Subject: [PATCH] refactor(native-chat): the client's outbox settlement gets a name the host's send settlement doesn't share --- ...ured-agent-session-outbox-carried-notes.ts | 2 +- ...tructured-agent-session-outbox-dispatch.ts | 26 +++++++------- ...agent-session-outbox-journal-settlement.ts | 10 +++--- ...-agent-session-outbox-unconfirmed-probe.ts | 2 +- ...gent-launch-prompt-in-flight-dispatches.ts | 4 +-- ...tured-agent-session-draft-hand-off.test.ts | 2 +- ...d-agent-session-outbox-settlement.test.ts} | 22 ++++++------ ...ctured-agent-session-outbox-settlement.ts} | 34 ++++++++++--------- ...ed-agent-session-outbox-stop-withdrawal.ts | 2 +- ...gent-session-outbox.queue-delivery.test.ts | 6 ++-- src/shared/structured-agent-session-outbox.ts | 4 +-- 11 files changed, 58 insertions(+), 56 deletions(-) rename src/shared/{structured-agent-session-send-settlement.test.ts => structured-agent-session-outbox-settlement.test.ts} (96%) rename src/shared/{structured-agent-session-send-settlement.ts => structured-agent-session-outbox-settlement.ts} (94%) diff --git a/src/renderer/src/components/native-chat/structured-agent-session-outbox-carried-notes.ts b/src/renderer/src/components/native-chat/structured-agent-session-outbox-carried-notes.ts index 414f3dfbc93..47bdc73777c 100644 --- a/src/renderer/src/components/native-chat/structured-agent-session-outbox-carried-notes.ts +++ b/src/renderer/src/components/native-chat/structured-agent-session-outbox-carried-notes.ts @@ -4,7 +4,7 @@ // it never can, so the hold lapses on its own. import type { StructuredAgentSessionOutboxEntry } from '../../../../shared/structured-agent-session-outbox' -import { structuredAgentSessionEntryHostWindowEndsAt } from '../../../../shared/structured-agent-session-send-settlement' +import { structuredAgentSessionEntryHostWindowEndsAt } from '../../../../shared/structured-agent-session-outbox-settlement' type CarriedNote = { key: string; windowEndsAt: number } diff --git a/src/renderer/src/components/native-chat/structured-agent-session-outbox-dispatch.ts b/src/renderer/src/components/native-chat/structured-agent-session-outbox-dispatch.ts index 7b143006b74..89d69cc6f5f 100644 --- a/src/renderer/src/components/native-chat/structured-agent-session-outbox-dispatch.ts +++ b/src/renderer/src/components/native-chat/structured-agent-session-outbox-dispatch.ts @@ -1,6 +1,6 @@ // The one sender of an outbox entry, for the open chat's drain and a launch prompt alike, and the // one place an answer changes the outbox: through the shared settlement -// (structured-agent-session-send-settlement). +// (structured-agent-session-outbox-settlement). import type { AgentSessionMutationResult, @@ -11,12 +11,12 @@ import { readAgentSessionErrorRefusal } from '../../../../shared/agent-session-write-failure' import { - applyStructuredAgentSessionSendSettlement, + applyStructuredAgentSessionOutboxSettlement, settleStructuredAgentSessionSendAnswer, type StructuredAgentSessionSendAnswer, - type StructuredAgentSessionSendSettlement, + type StructuredAgentSessionOutboxSettlement, type StructuredAgentSessionSettledOutbox -} from '../../../../shared/structured-agent-session-send-settlement' +} from '../../../../shared/structured-agent-session-outbox-settlement' import type { RuntimeClientTarget } from '@/runtime/runtime-rpc-client' import { RuntimeRpcCallError } from '@/runtime/runtime-rpc-result' import { callStructuredAgentSession } from '@/runtime/structured-agent-session-client' @@ -116,7 +116,7 @@ export function commitStructuredAgentSessionSettledOutbox( export function sayStructuredAgentSessionSettlement( sessionId: string, clientMessageId: string, - settlement: StructuredAgentSessionSendSettlement + settlement: StructuredAgentSessionOutboxSettlement ): void { if (settlement.kind === 'unanswered') { if (settlement.words) { @@ -131,7 +131,7 @@ export function sayStructuredAgentSessionSettlement( /** How a settlement ends its entry for whoever waits on it, or null while it has not ended. */ export function structuredAgentSessionSettlementEnding( - settlement: StructuredAgentSessionSendSettlement + settlement: StructuredAgentSessionOutboxSettlement ): StructuredAgentSessionEntryEnding | null { switch (settlement.kind) { case 'recorded': @@ -149,7 +149,7 @@ export function structuredAgentSessionSettlementEnding( export function settleStructuredAgentSessionOutboxEntry( sessionId: string, clientMessageId: string, - settlement: StructuredAgentSessionSendSettlement + settlement: StructuredAgentSessionOutboxSettlement ): void { const current = getStructuredAgentSessionOutbox(sessionId) const entry = current.find((candidate) => candidate.clientMessageId === clientMessageId) @@ -164,7 +164,7 @@ export function settleStructuredAgentSessionOutboxEntry( : settlement commitStructuredAgentSessionSettledOutbox( sessionId, - applyStructuredAgentSessionSendSettlement(current, clientMessageId, kept), + applyStructuredAgentSessionOutboxSettlement(current, clientMessageId, kept), () => { if (ending) { endStructuredAgentSessionEntry(entry, ending) @@ -238,10 +238,10 @@ export async function sendStructuredAgentSessionOutboxEntry(args: { beforeSettle?: () => void /** Whether the loaded journal holds a row for the id; absent where no journal is loaded. */ journalHasRow?: (clientMessageId: string) => boolean -}): Promise { +}): Promise { const { next } = args const sessionId = next.sessionId - const settle = (settlement: StructuredAgentSessionSendSettlement): void => { + const settle = (settlement: StructuredAgentSessionOutboxSettlement): void => { args.beforeSettle?.() settleStructuredAgentSessionOutboxEntry(sessionId, next.clientMessageId, settlement) } @@ -255,7 +255,7 @@ export async function sendStructuredAgentSessionOutboxEntry(args: { if (!commitStructuredAgentSessionOutbox(sessionId, staged, { onlyIfSaved: true })) { // Unsaved, a send could go out that a reload never settles, and handing it back could repeat // one an earlier attempt landed: it waits, and the probe tries again. - const unsaved: StructuredAgentSessionSendSettlement = { + const unsaved: StructuredAgentSessionOutboxSettlement = { kind: 'unanswered', words: ['messageNotSaved', 'stillSending'] } @@ -297,8 +297,8 @@ export function dispatchStructuredAgentSessionOutboxEntry(args: { dispatchGenerationRef: MutableRef inFlightIdRef: MutableRef journalHasRow: (clientMessageId: string) => boolean -}): { promise: Promise; started: boolean } { - const start = async (): Promise => { +}): { promise: Promise; started: boolean } { + const start = async (): Promise => { args.inFlightIdRef.current = args.next.clientMessageId const isCurrent = (): boolean => args.dispatchGenerationRef.current === args.dispatchGeneration const release = (): void => { diff --git a/src/renderer/src/components/native-chat/structured-agent-session-outbox-journal-settlement.ts b/src/renderer/src/components/native-chat/structured-agent-session-outbox-journal-settlement.ts index cef54900e17..37af7b5e541 100644 --- a/src/renderer/src/components/native-chat/structured-agent-session-outbox-journal-settlement.ts +++ b/src/renderer/src/components/native-chat/structured-agent-session-outbox-journal-settlement.ts @@ -4,13 +4,13 @@ import type { StructuredAgentSessionOutboxEntry } from '../../../../shared/structured-agent-session-outbox' import { structuredAgentSessionEntryAwaitsSettlement } from '../../../../shared/structured-agent-session-outbox-admission' import { - applyStructuredAgentSessionSendSettlement, + applyStructuredAgentSessionOutboxSettlement, settleStructuredAgentSessionEntryFromJournal, structuredAgentSessionEntryHostWindowEndsAt, type StructuredAgentSessionJournalReading, - type StructuredAgentSessionSendSettlement, + type StructuredAgentSessionOutboxSettlement, type StructuredAgentSessionSettledOutbox -} from '../../../../shared/structured-agent-session-send-settlement' +} from '../../../../shared/structured-agent-session-outbox-settlement' import { commitStructuredAgentSessionOutbox, getStructuredAgentSessionOutbox @@ -35,12 +35,12 @@ export function settleStructuredAgentSessionOutboxFromJournal( const returned: NonNullable[] = [] const settled: { entry: StructuredAgentSessionOutboxEntry - settlement: StructuredAgentSessionSendSettlement + settlement: StructuredAgentSessionOutboxSettlement }[] = [] for (const entry of current) { const settlement = settleStructuredAgentSessionEntryFromJournal(entry, reading) if (settlement) { - const next = applyStructuredAgentSessionSendSettlement( + const next = applyStructuredAgentSessionOutboxSettlement( entries, entry.clientMessageId, settlement diff --git a/src/renderer/src/components/native-chat/use-structured-agent-session-outbox-unconfirmed-probe.ts b/src/renderer/src/components/native-chat/use-structured-agent-session-outbox-unconfirmed-probe.ts index 89cf7834a5a..31aa573f707 100644 --- a/src/renderer/src/components/native-chat/use-structured-agent-session-outbox-unconfirmed-probe.ts +++ b/src/renderer/src/components/native-chat/use-structured-agent-session-outbox-unconfirmed-probe.ts @@ -6,7 +6,7 @@ import { structuredAgentSessionEntryResendsUnconfirmed } from '../../../../share import { STRUCTURED_AGENT_SESSION_SEND_UNCONFIRMED_WORDS, structuredAgentSessionEntryOutlivedHostWindow -} from '../../../../shared/structured-agent-session-send-settlement' +} from '../../../../shared/structured-agent-session-outbox-settlement' import { commitStructuredAgentSessionOutbox, getStructuredAgentSessionOutbox diff --git a/src/renderer/src/lib/structured-agent-launch-prompt-in-flight-dispatches.ts b/src/renderer/src/lib/structured-agent-launch-prompt-in-flight-dispatches.ts index dd2ab2a2abc..351841194b9 100644 --- a/src/renderer/src/lib/structured-agent-launch-prompt-in-flight-dispatches.ts +++ b/src/renderer/src/lib/structured-agent-launch-prompt-in-flight-dispatches.ts @@ -2,11 +2,11 @@ // launch settlement runs; both own the same persisted entry, so they share one in-flight send // instead of issuing two RPCs. -import type { StructuredAgentSessionSendSettlement } from '../../../shared/structured-agent-session-send-settlement' +import type { StructuredAgentSessionOutboxSettlement } from '../../../shared/structured-agent-session-outbox-settlement' /** How the send settled, or null when nothing was sent. */ export type StructuredAgentLaunchPromptDispatch = - Promise + Promise const inFlightDispatches = new Map() diff --git a/src/shared/structured-agent-session-draft-hand-off.test.ts b/src/shared/structured-agent-session-draft-hand-off.test.ts index 5e4ab11d025..0058a80f4b0 100644 --- a/src/shared/structured-agent-session-draft-hand-off.test.ts +++ b/src/shared/structured-agent-session-draft-hand-off.test.ts @@ -8,7 +8,7 @@ import { type StructuredAgentSessionOutboxEntry } from './structured-agent-session-outbox' import { reconcileStructuredAgentSessionOutboxWithQueue } from './structured-agent-session-draft-hand-off' -import { settleStructuredAgentSessionSendAnswer } from './structured-agent-session-send-settlement' +import { settleStructuredAgentSessionSendAnswer } from './structured-agent-session-outbox-settlement' import { hasUnsentStructuredAgentSessionOutboxEntry } from './structured-agent-session-outbox-stop-withdrawal' const entry: StructuredAgentSessionOutboxEntry = { diff --git a/src/shared/structured-agent-session-send-settlement.test.ts b/src/shared/structured-agent-session-outbox-settlement.test.ts similarity index 96% rename from src/shared/structured-agent-session-send-settlement.test.ts rename to src/shared/structured-agent-session-outbox-settlement.test.ts index c0ef5ef3f51..e8abc6cc996 100644 --- a/src/shared/structured-agent-session-send-settlement.test.ts +++ b/src/shared/structured-agent-session-outbox-settlement.test.ts @@ -7,13 +7,13 @@ import { type StructuredAgentSessionOutboxEntry } from './structured-agent-session-outbox' import { - applyStructuredAgentSessionSendSettlement, + applyStructuredAgentSessionOutboxSettlement, settleStructuredAgentSessionEntryFromJournal, settleStructuredAgentSessionSendAnswer, structuredAgentSessionEntryOutlivedHostWindow, type StructuredAgentSessionSendAnswer, - type StructuredAgentSessionSendSettlementContext -} from './structured-agent-session-send-settlement' + type StructuredAgentSessionOutboxSettlementContext +} from './structured-agent-session-outbox-settlement' import { AGENT_SESSION_MAX_OPERATION_REPLAY_AGE_MS } from './agent-session-host-authority' import { DISPATCH_REJECTED_CANCELLED } from './structured-agent-session-dispatch-rejection' import { @@ -87,16 +87,16 @@ function refused( } } -const FIRST: StructuredAgentSessionSendSettlementContext = { +const FIRST: StructuredAgentSessionOutboxSettlementContext = { firstAttempt: true, answersProve: true, journalHasRow: false } -const RESEND_PROVING: StructuredAgentSessionSendSettlementContext = { +const RESEND_PROVING: StructuredAgentSessionOutboxSettlementContext = { ...FIRST, firstAttempt: false } -const RESEND_OLD_HOST: StructuredAgentSessionSendSettlementContext = { +const RESEND_OLD_HOST: StructuredAgentSessionOutboxSettlementContext = { ...RESEND_PROVING, answersProve: false } @@ -588,18 +588,18 @@ describe('entries an older build saved are migrated, never sent again', () => { describe('applying a settlement', () => { it('records and returns leave the outbox; only a return hands the entry back, with its words', () => { const outbox = [entry(), entry({ clientMessageId: 'next' })] - expect(applyStructuredAgentSessionSendSettlement(outbox, ID, { kind: 'recorded' })).toEqual({ + expect(applyStructuredAgentSessionOutboxSettlement(outbox, ID, { kind: 'recorded' })).toEqual({ entries: [outbox[1]], returned: null }) expect( - applyStructuredAgentSessionSendSettlement(outbox, ID, { + applyStructuredAgentSessionOutboxSettlement(outbox, ID, { kind: 'returned', words: ['tryAgain'] }) ).toEqual({ entries: [outbox[1]], returned: { entry: outbox[0], words: ['tryAgain'] } }) expect( - applyStructuredAgentSessionSendSettlement(outbox, ID, { kind: 'withdrawn' }).returned + applyStructuredAgentSessionOutboxSettlement(outbox, ID, { kind: 'withdrawn' }).returned ).toEqual({ entry: outbox[0], words: null @@ -609,10 +609,10 @@ describe('applying a settlement', () => { it('no answer keeps it under the same id, in doubt; pending keeps it dispatching', () => { const outbox = [entry({ state: 'dispatching' })] expect( - applyStructuredAgentSessionSendSettlement(outbox, ID, { kind: 'unanswered' }).entries[0] + applyStructuredAgentSessionOutboxSettlement(outbox, ID, { kind: 'unanswered' }).entries[0] ).toMatchObject({ clientMessageId: ID, state: 'unconfirmed' }) expect( - applyStructuredAgentSessionSendSettlement(outbox, ID, { kind: 'pending' }).entries[0] + applyStructuredAgentSessionOutboxSettlement(outbox, ID, { kind: 'pending' }).entries[0] ).toMatchObject({ clientMessageId: ID, state: 'dispatching' }) }) }) diff --git a/src/shared/structured-agent-session-send-settlement.ts b/src/shared/structured-agent-session-outbox-settlement.ts similarity index 94% rename from src/shared/structured-agent-session-send-settlement.ts rename to src/shared/structured-agent-session-outbox-settlement.ts index a768212221e..da2f43c237f 100644 --- a/src/shared/structured-agent-session-send-settlement.ts +++ b/src/shared/structured-agent-session-outbox-settlement.ts @@ -27,7 +27,7 @@ import { structuredAgentSessionStillSendingWords } from './structured-agent-sess import type { StructuredAgentSessionOutboxEntry } from './structured-agent-session-outbox' import { structuredAgentSessionEntryAwaitsSettlement } from './structured-agent-session-outbox-admission' -export type StructuredAgentSessionSendSettlement = +export type StructuredAgentSessionOutboxSettlement = /** Case 1: the host's row (or card) holds the message from here. */ | { kind: 'recorded' } /** Case 1, not final yet: the host wrote the row and has not handed it to the agent. The entry @@ -48,7 +48,7 @@ export type StructuredAgentSessionSendAnswer = * carried, if any, and the RPC error code. */ | { kind: 'thrown'; refusal: AgentSessionWriteRefusal | undefined; rpcCode: string | undefined } -export type StructuredAgentSessionSendSettlementContext = { +export type StructuredAgentSessionOutboxSettlementContext = { /** No earlier attempt under this id went out from anywhere, so nothing can hold it but this * attempt. Only an older host needs it: it may refuse a resent id before looking it up. */ firstAttempt: boolean @@ -64,13 +64,15 @@ export type StructuredAgentSessionSendSettlementContext = { export const STRUCTURED_AGENT_SESSION_SEND_UNCONFIRMED_WORDS: readonly AgentSessionWriteNoticePart[] = ['sendOutcomeLost'] -function returnedFor(refusal: AgentSessionWriteRefusal): StructuredAgentSessionSendSettlement { +function returnedFor(refusal: AgentSessionWriteRefusal): StructuredAgentSessionOutboxSettlement { return { kind: 'returned', words: agentSessionWriteNoticeParts(refusal, 'composer-send') } } /** Case 3 for a refusal that proves nothing here: why it is held, and that Orca keeps sending it. * "Outcome unknown" is doubt like any lost answer, so it says nothing, thrown or returned. */ -function stillSendingFor(refusal: AgentSessionWriteRefusal): StructuredAgentSessionSendSettlement { +function stillSendingFor( + refusal: AgentSessionWriteRefusal +): StructuredAgentSessionOutboxSettlement { return refusal.code === 'agent_session_operation_unknown' ? { kind: 'unanswered' } : { kind: 'unanswered', words: structuredAgentSessionStillSendingWords(refusal) } @@ -78,8 +80,8 @@ function stillSendingFor(refusal: AgentSessionWriteRefusal): StructuredAgentSess /** Words for an id no resend can settle: what an earlier attempt left, if anything, is in the chat. */ function settledByJournal( - context: StructuredAgentSessionSendSettlementContext -): StructuredAgentSessionSendSettlement { + context: StructuredAgentSessionOutboxSettlementContext +): StructuredAgentSessionOutboxSettlement { return context.journalHasRow ? { kind: 'recorded' } : { kind: 'returned', words: [...STRUCTURED_AGENT_SESSION_SEND_UNCONFIRMED_WORDS] } @@ -87,8 +89,8 @@ function settledByJournal( function refusalSettlement( refusal: AgentSessionWriteRefusal, - context: StructuredAgentSessionSendSettlementContext -): StructuredAgentSessionSendSettlement { + context: StructuredAgentSessionOutboxSettlementContext +): StructuredAgentSessionOutboxSettlement { const reason = refusal.details?.reason if (refusal.code === 'agent_session_operation_unknown') { // A rewind the host refused before writing anything is settled; every other unknown is doubt. @@ -120,8 +122,8 @@ function refusalSettlement( * and only on a first attempt: an earlier one may have landed before the host turned this away. */ function thrownSettlement( answer: Extract, - context: StructuredAgentSessionSendSettlementContext -): StructuredAgentSessionSendSettlement { + context: StructuredAgentSessionOutboxSettlementContext +): StructuredAgentSessionOutboxSettlement { if (answer.refusal) { return stillSendingFor(answer.refusal) } @@ -136,8 +138,8 @@ function thrownSettlement( export function settleStructuredAgentSessionSendAnswer( answer: StructuredAgentSessionSendAnswer, clientMessageId: string, - context: StructuredAgentSessionSendSettlementContext -): StructuredAgentSessionSendSettlement { + context: StructuredAgentSessionOutboxSettlementContext +): StructuredAgentSessionOutboxSettlement { if (answer.kind === 'thrown') { return thrownSettlement(answer, context) } @@ -188,7 +190,7 @@ export function structuredAgentSessionEntryOutlivedHostWindow( /** A row the host holds for the send. */ function settleStructuredAgentSessionSendRow( submission: AgentJournalSubmission -): StructuredAgentSessionSendSettlement { +): StructuredAgentSessionOutboxSettlement { if (submission.dispatchState === 'pending') { return { kind: 'pending' } } @@ -243,7 +245,7 @@ function readThrough( export function settleStructuredAgentSessionEntryFromJournal( entry: StructuredAgentSessionOutboxEntry, reading: StructuredAgentSessionJournalReading -): StructuredAgentSessionSendSettlement | null { +): StructuredAgentSessionOutboxSettlement | null { // The host handed it off as a queued draft, in whatever state: the card carries it. if ( reading.submissions.some((candidate) => candidate.queuedMessageId === entry.clientMessageId) @@ -298,10 +300,10 @@ export type StructuredAgentSessionSettledOutbox = { } | null } -export function applyStructuredAgentSessionSendSettlement( +export function applyStructuredAgentSessionOutboxSettlement( entries: readonly StructuredAgentSessionOutboxEntry[], clientMessageId: string, - settlement: StructuredAgentSessionSendSettlement + settlement: StructuredAgentSessionOutboxSettlement ): StructuredAgentSessionSettledOutbox { const entry = entries.find((candidate) => candidate.clientMessageId === clientMessageId) if (!entry) { diff --git a/src/shared/structured-agent-session-outbox-stop-withdrawal.ts b/src/shared/structured-agent-session-outbox-stop-withdrawal.ts index aeabb975deb..e557c2b6209 100644 --- a/src/shared/structured-agent-session-outbox-stop-withdrawal.ts +++ b/src/shared/structured-agent-session-outbox-stop-withdrawal.ts @@ -26,7 +26,7 @@ function goesOutOnItsOwn( * - A message that never went out is withdrawn here; its text goes back to the composer. * - One already on its way is stamped with the Stop's own id and never sent again: a resend onto the * session the user stopped could start a turn. Its own answer, its journal row or the Stop's - * answer settles it (structured-agent-session-send-settlement). + * answer settles it (structured-agent-session-outbox-settlement). * - One the host holds a row for is the journal's to settle. */ export function stopStructuredAgentSessionOutbox( diff --git a/src/shared/structured-agent-session-outbox.queue-delivery.test.ts b/src/shared/structured-agent-session-outbox.queue-delivery.test.ts index e75fd2d399d..18dcade0de3 100644 --- a/src/shared/structured-agent-session-outbox.queue-delivery.test.ts +++ b/src/shared/structured-agent-session-outbox.queue-delivery.test.ts @@ -15,9 +15,9 @@ import { import { admitStructuredAgentSessionOutboxEntry } from './structured-agent-session-outbox-admission' import { structuredAgentSessionEntryAttempt } from './structured-agent-session-outbox-delivery' import { - applyStructuredAgentSessionSendSettlement, + applyStructuredAgentSessionOutboxSettlement, settleStructuredAgentSessionSendAnswer -} from './structured-agent-session-send-settlement' +} from './structured-agent-session-outbox-settlement' import { stopStructuredAgentSessionOutbox } from './structured-agent-session-outbox-stop-withdrawal' function entry(sentDelivery?: 'queue-if-active') { @@ -151,7 +151,7 @@ describe('outbox queue delivery', () => { ) const stopped = stopStructuredAgentSessionOutbox([staged], [], 'client-1', 'stop-1').entries for (const entries of [stopped, [staged]]) { - const settled = applyStructuredAgentSessionSendSettlement(entries, 'client-1', settlement) + const settled = applyStructuredAgentSessionOutboxSettlement(entries, 'client-1', settlement) expect(settled.entries).toEqual([]) expect(settled.returned?.entry.clientMessageId).toBe('client-1') } diff --git a/src/shared/structured-agent-session-outbox.ts b/src/shared/structured-agent-session-outbox.ts index 46bad5eef7d..734560c4616 100644 --- a/src/shared/structured-agent-session-outbox.ts +++ b/src/shared/structured-agent-session-outbox.ts @@ -14,7 +14,7 @@ import { parseStructuredAgentSessionOutboxQueueFields } from './structured-agent /** `queued`: waits to go out. `dispatching`: out, or held by the host as a row it has not handed * to the agent yet. `unconfirmed`: no answer yet, so the same id goes again - * (structured-agent-session-send-settlement). */ + * (structured-agent-session-outbox-settlement). */ export type StructuredAgentSessionOutboxState = 'queued' | 'dispatching' | 'unconfirmed' /** The Stop that outran a send already on its way: by its own id, and where the host's journal @@ -147,7 +147,7 @@ export function stageStructuredAgentSessionOutboxEntryForSend( /** * The outbox as the journal reads it: an entry the host holds a row for leaves once that row has * settled (the row shows it from there), and stays out while it is pending. A view's reading; the - * outbox hook settles the stored copy (structured-agent-session-send-settlement). + * outbox hook settles the stored copy (structured-agent-session-outbox-settlement). */ export function reconcileStructuredAgentSessionOutbox( entries: readonly StructuredAgentSessionOutboxEntry[],