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

# Conflicts:
#	docs/architecture.i18n.yaml
#	packages/client/ui-sidebar/tests/sidebar-root.spec.tsx
#	packages/session-persistence/session-persistence-jsonl/src/index.ts
#	packages/session-persistence/session-persistence/README.md
This commit is contained in:
Hypatia May
2026-07-23 21:13:29 +08:00
461 changed files with 21288 additions and 6015 deletions
@@ -45,6 +45,7 @@ ctx.tools.register({
name: 'crash_tool',
description: 'records an external effect and never returns',
parameters: {},
output: { schema: { type: 'null' }, render: () => [] },
async execute() {
await writeFile(failpoint, 'tool-side-effect')
return waitForCrash()
@@ -122,7 +122,8 @@ describe('session-checkpoint-policy tool and step boundaries', () => {
})
ctx.tools.register({
name: 'write', description: 'side effect', parameters: {},
execute: async () => { order.push('tool'); return [] },
output: { schema: { type: 'null' }, render: () => [] },
execute: async () => { order.push('tool'); return null },
})
const pending = ctx.tools.execute({
@@ -150,7 +151,8 @@ describe('session-checkpoint-policy tool and step boundaries', () => {
})
ctx.tools.register({
name: 'write', description: 'side effect', parameters: {},
execute: async () => { order.push('tool'); return [] },
output: { schema: { type: 'null' }, render: () => [] },
execute: async () => { order.push('tool'); return null },
})
const pending = ctx.tools.execute({
@@ -165,7 +167,10 @@ describe('session-checkpoint-policy tool and step boundaries', () => {
await expect(pending).resolves.toEqual({
content: [{ type: 'text', text: 'Error: tool call aborted before dispatch' }],
isError: true,
error: { name: 'AbortError', code: TOOL_ABORTED_BEFORE_DISPATCH },
error: {
message: 'tool call aborted before dispatch',
info: { name: 'AbortError', code: TOOL_ABORTED_BEFORE_DISPATCH },
},
})
expect(order).toEqual(['flush:start', 'flush:end'])
})
@@ -178,7 +183,8 @@ describe('session-checkpoint-policy tool and step boundaries', () => {
ctx.on('session/flush', () => Promise.reject(new Error('disk unavailable')))
ctx.tools.register({
name: 'write', description: 'side effect', parameters: {},
execute: async () => { ran = true; return [] },
output: { schema: { type: 'null' }, render: () => [] },
execute: async () => { ran = true; return null },
})
const result = await ctx.tools.execute({
callId: CallId('write-2'), name: 'write', arguments: {}, agent,
@@ -195,7 +201,11 @@ describe('session-checkpoint-policy tool and step boundaries', () => {
const agent = { session } as Agent
let flushes = 0
ctx.on('session/flush', () => { flushes += 1 })
ctx.tools.register({ name: 'nested', description: 'nested', parameters: {}, execute: async () => [] })
ctx.tools.register({
name: 'nested', description: 'nested', parameters: {},
output: { schema: { type: 'null' }, render: () => [] },
execute: async () => null,
})
await ctx.tools.execute({
callId: CallId('nested-1'), name: 'nested', arguments: {}, agent,
parent: Symbol('outer') as never,