Merge remote-tracking branch 'origin/master' into session-query-tool

# Conflicts:
#	docs/architecture.i18n.yaml
This commit is contained in:
Hypatia May
2026-07-24 20:59:18 +08:00
265 changed files with 5709 additions and 1503 deletions

View File

@@ -14,7 +14,6 @@ export function extractSessionEventText(event: SessionEvent): string {
switch (event.type) {
case 'user/message':
case 'assistant/message':
case 'context/message':
case 'steering/message':
return contentText(event.data.content)
case 'prompt/blocked':

View File

@@ -44,7 +44,7 @@ describe('session-query semantic extraction', () => {
const events: SessionEvent[] = [
{ type: 'user/message', seq: 0, time: 1, data: { content: messageContent, source: { kind: 'user' } }, surfaceOp: 'append' },
{ type: 'assistant/message', seq: 1, time: 2, data: { turn: 1, step: 1, content: messageContent, provenance: { provider: 'mock', model: 'mock' } }, surfaceOp: 'append' },
{ type: 'context/message', seq: 2, time: 3, data: { content: messageContent, source: { kind: 'plugin', plugin: 'test' } }, surfaceOp: 'append' },
{ type: 'user/message', seq: 2, time: 3, data: { content: messageContent, source: { kind: 'plugin', plugin: 'test' } }, surfaceOp: 'append' },
{ type: 'steering/message', seq: 3, time: 4, data: { turn: 1, content: messageContent, source: { kind: 'user' } }, surfaceOp: 'append' },
{ type: 'prompt/blocked', seq: 4, time: 5, data: { content: [{ type: 'text', text: 'unsafe' }], source: { kind: 'user' }, reason: 'policy' } },
{ type: 'tool/call', seq: 5, time: 6, data: { turn: 1, step: 1, callId, name: 'bash', arguments: '{"cmd":"pwd"}' } },

View File

@@ -116,7 +116,7 @@ function appendTraceEvents(session: Session): void {
{ surfaceOp: { op: 'replace', start: 3, end: 3 }, sourceEventSeqs: [3, 2] },
)
session.append(
'context/message',
'user/message',
{ content: [{ type: 'text', text: 'context' }], source: { kind: 'plugin', plugin: 'test' } },
{ surfaceOp: 'append' },
)
@@ -318,14 +318,14 @@ describe('session event tracing', () => {
const live = ctx.sessions.create(durable.id, { meta: { createdAt: 1, cwd: '/same' } })
live.append('turn/start', { turn: 1, trigger: { kind: 'message', source: { kind: 'user' } } })
live.append(
'context/message',
'user/message',
{ content: [{ type: 'text', text: 'live' }], source: { kind: 'plugin', plugin: 'test' } },
{ surfaceOp: 'append' },
)
TracePersistence.listFailure = new Error('list unavailable')
TracePersistence.inspectFailure = new Error('inspect unavailable')
await expect(ctx.sessionQuery.traceEvent({ sessionId: durable.id, seq: 1 }))
.resolves.toMatchObject({ target: { type: 'context/message' } })
.resolves.toMatchObject({ target: { type: 'user/message' } })
expect([TracePersistence.listCalls, TracePersistence.inspectCalls]).toEqual([1, 1])
TracePersistence.reset([{ meta: durable, events: [appendEvent(0)] }])

View File

@@ -1194,13 +1194,16 @@ describe('workspace authority and lineage redaction', () => {
it('rejects a default self read when its same-id observation moved after caller capture', async () => {
const mounted = await mount()
const secret = mounted.caller.append(
const appendLegacy = mounted.caller.append.bind(mounted.caller) as unknown as (
type: string,
data: unknown,
) => Session['events'][number]
const secret = appendLegacy(
'context/message',
{
content: [{ type: 'text', text: 'same-id moved secret' }],
source: { kind: 'plugin', plugin: 'test' },
},
{ surfaceOp: 'append' },
)
const window = await mounted.ctx.sessionQuery.readEvent({
sessionId: mounted.caller.id,
@@ -1963,7 +1966,7 @@ describe('trace and exact read rendering', () => {
expect(text(result)).toContain(new Date(session.events[0]?.time ?? 0).toISOString())
})
it('renders unabridged fenced target JSON and readable semantic neighbor summaries', async () => {
it('renders unabridged fenced target JSON and readable semantic or log-only neighbor summaries', async () => {
const mounted = await mount()
const session = createSession(mounted.ctx, 'read', '/work')
session.append(
@@ -1981,10 +1984,13 @@ describe('trace and exact read rendering', () => {
},
{ surfaceOp: 'append' },
)
session.append(
const appendLegacy = session.append.bind(session) as unknown as (
type: string,
data: unknown,
) => Session['events'][number]
appendLegacy(
'context/message',
{ content: [{ type: 'text', text: 'after semantic text' }], source: { kind: 'plugin', plugin: 'test' } },
{ surfaceOp: 'append' },
)
const result = await mounted.call('session_event_read', {
session_id: session.id,
@@ -1996,7 +2002,9 @@ describe('trace and exact read rendering', () => {
expect(output).toContain('```json')
expect(output).toContain('"text": "target full text"')
expect(output).toContain('before semantic text')
expect(output).toContain('after semantic text')
expect(output).toContain('seq 2 | context/message')
expect(output).toContain('(no semantic text)')
expect(output).not.toContain('after semantic text')
expect(output).not.toContain('truncated')
})