fix(btw): stop the boundary from outliving the session it applies to
Review catch: `promoteBtwSession` removes the btw metadata, but the boundary instruction is persisted on every message the session sent while it was a side conversation, and there is no API to delete a message part after the fact. A promoted session therefore keeps reading "no sub-agents, do not touch the workspace" out of its own history, in a session that is no longer a side conversation. Promotion cannot delete those lines, so it answers them instead: `withoutBtwSessionMarker` now leaves `openchamber.btwPromoted`, and the composer sends `BTW_PROMOTION_NOTICE` with every message in a session carrying it — stating that the session is now the main thread and the usual tool, sub-agent and workspace permissions are in force. It rides with every send for the same reason the boundary does: the instructions it revokes are re-read on every turn, so a one-shot notice would lose its position relative to them as the conversation grows. `btwPromoted` is additive and optional. A session that never went through `/btw` never has it, and one promoted before this change simply keeps the old behavior.
This commit is contained in:
@@ -8,6 +8,7 @@ import {
|
||||
withBtwSessionLink,
|
||||
withBtwSessionMarker,
|
||||
withoutBtwSessionLink,
|
||||
wasPromotedBtwSession,
|
||||
withoutBtwSessionMarker,
|
||||
} from './sessionBtwMetadata';
|
||||
|
||||
@@ -64,11 +65,20 @@ describe('fork marker', () => {
|
||||
expect(getBtwBoundaryMessageID(review)).toBeNull();
|
||||
});
|
||||
|
||||
test('withoutBtwSessionMarker strips the marker and keeps other keys', () => {
|
||||
test('withoutBtwSessionMarker strips the marker, keeps other keys, and records the promotion', () => {
|
||||
const marked = { openchamber: { kind: 'btw', originalSessionID: 'parent-1', btwBoundaryMessageID: 'msg-9', btwSessionID: 'nested' } };
|
||||
expect(withoutBtwSessionMarker(marked)).toEqual({ openchamber: { btwSessionID: 'nested' } });
|
||||
expect(withoutBtwSessionMarker({ openchamber: { kind: 'btw', originalSessionID: 'parent-1' } })).toEqual({});
|
||||
expect(withoutBtwSessionMarker(marked)).toEqual({ openchamber: { btwSessionID: 'nested', btwPromoted: true } });
|
||||
expect(withoutBtwSessionMarker({ openchamber: { kind: 'btw', originalSessionID: 'parent-1' } })).toEqual({ openchamber: { btwPromoted: true } });
|
||||
const plain = { openchamber: { kind: 'review' } };
|
||||
expect(withoutBtwSessionMarker(plain)).toBe(plain);
|
||||
});
|
||||
|
||||
test('wasPromotedBtwSession only reports a session that went through promotion', () => {
|
||||
expect(wasPromotedBtwSession(sessionWith({ openchamber: { btwPromoted: true } }))).toBe(true);
|
||||
// Still a live btw fork: the boundary applies, the notice must not.
|
||||
expect(wasPromotedBtwSession(sessionWith({ openchamber: { kind: 'btw', originalSessionID: 'p-1' } }))).toBe(false);
|
||||
expect(wasPromotedBtwSession(sessionWith({ openchamber: {} }))).toBe(false);
|
||||
expect(wasPromotedBtwSession(sessionWith(undefined))).toBe(false);
|
||||
expect(wasPromotedBtwSession(null)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user