feat: ship skill and MCP workflows with signed updater for v0.0.7

This commit is contained in:
xiaohan.yuan committed 2026-10-21 00:04:17 +08:00
1 parent 1b52df0603
commit a01085c656
136 files changed
+18646 -217

No files matched your search

+81 -1
View File
@@ -121,6 +121,26 @@ const server = createServer((req, res) => {
connection: 'keep-alive'
})
const id = `msg_kernel_${requests.length}`
if (latestContent.includes('APPEND_ACTIVE_SMOKE')) {
setTimeout(() => { if (!res.destroyed) plainText(res, id, 'Initial append turn.') }, 400)
return
}
if (userText.includes('APPEND_GUIDE_A') || userText.includes('APPEND_GUIDE_B')) {
plainText(res, id, 'Appended answer.')
return
}
if (latestContent.includes('HOLD_SMOKE')) {
setTimeout(() => { if (!res.destroyed) plainText(res, id, 'Held response.') }, 500)
return
}
if (latestContent.includes('AFTER_CANCEL_SMOKE')) {
plainText(res, id, 'After cancellation.')
return
}
if (userText.includes('AFTER_COMPACT_SMOKE')) {
plainText(res, id, 'After compaction.')
return
}
if (userText.includes('Write the title in the predominant language')) {
plainText(res, id, 'Plan Smoke')
return
@@ -300,11 +320,71 @@ try {
assert.ok(resumedRequest)
assert.ok(resumedRequest.userText.includes('ASK_SMOKE'))
assert.ok(resumedRequest.userText.includes('PLAN_SMOKE'))
const beforeSummary = requests.length
const summary = await resumed.getContextSummary()
assert.ok(summary && summary.categories.length > 0, 'native summary must return actual structured categories')
assert.equal(requests.length, beforeSummary, 'summary must not call the model or per-category count API')
const controller = new AbortController()
const held = resumed.runTurn(request('HOLD_SMOKE', randomUUID(), controller))
const rejection = assert.rejects(held, /取消/)
for (let index = 0; index < 500 && !requests.some(item => item.userText.includes('HOLD_SMOKE')); index++) {
await new Promise(resolve => setTimeout(resolve, 10))
}
assert.ok(requests.some(item => item.userText.includes('HOLD_SMOKE')))
controller.abort()
await rejection
const afterCancel = await resumed.runTurn(request('AFTER_CANCEL_SMOKE', randomUUID(), new AbortController()))
assert.equal(afterCancel.content, 'After cancellation.', 'cancelled producer must not settle the next run')
const groups: string[][] = []
const segmentResults: string[] = []
const appendController = new AbortController()
const appendRun = resumed.runTurn({ ...request('APPEND_ACTIVE_SMOKE', randomUUID(), appendController),
onSegmentComplete: async result => { segmentResults.push(result.content) },
onSegmentStart: async inputs => { groups.push(inputs.map(input => input.userMessageId)) }
})
void appendRun.catch(() => {})
for (let index = 0; index < 500 && !requests.some(item => JSON.stringify(item.body.messages ?? []).includes('APPEND_ACTIVE_SMOKE')); index++) await new Promise(resolve => setTimeout(resolve, 10))
assert.ok(requests.some(item => JSON.stringify(item.body.messages ?? []).includes('APPEND_ACTIVE_SMOKE')))
const guideA = randomUUID(), guideB = randomUUID()
let acknowledged = false
const appended = Promise.all([
resumed.appendInput({ userMessageId: guideA, prompt: 'APPEND_GUIDE_A' }),
resumed.appendInput({ userMessageId: guideB, prompt: 'APPEND_GUIDE_B' })
]).then(() => { acknowledged = true })
assert.equal(acknowledged, false, 'pushing into the input stream is not delivery acknowledgement')
const appendResult = await appendRun
await appended
assert.equal(appendResult.content, 'Appended answer.')
assert.deepEqual(segmentResults, ['Initial append turn.'], 'first result must not settle appended inputs')
assert.deepEqual(groups.flat(), [guideA, guideB], 'native merged UUIDs must be associated exactly once')
assert.equal(appendController.signal.aborted, false, 'guidance must not cancel the active run')
await assert.rejects(resumed.appendInput({ userMessageId: randomUUID(), prompt: 'idle' }), error => (error as { submitted?: boolean }).submitted === false)
if (process.env.CLAUDE_PROTOCOL_PROBE === '1') {
const observed: Array<Record<string, unknown>> = []
const target = resumed as unknown as { handleMessage(message: unknown): Promise<void> }
const original = target.handleMessage.bind(target)
target.handleMessage = message => { observed.push(message as Record<string, unknown>); return original(message) }
const compact = await resumed.runTurn({ ...request('/compact', randomUUID(), new AbortController()), command: 'compact' })
console.log(JSON.stringify({ probe: 'compact', status: compact.status,
frames: observed.map(frame => ({ type: frame.type, subtype: frame.subtype, promptId: frame.prompt_id, ids: frame.user_message_uuids })),
boundary: observed.some(frame => frame.subtype === 'compact_boundary') }))
assert.ok(observed.some(frame => frame.subtype === 'compact_boundary'), 'native compaction must emit its boundary')
assert.equal(compact.content, '上下文压缩完成')
const postCompact = await resumed.runTurn(request('AFTER_COMPACT_SMOKE', randomUUID(), new AbortController()))
if (postCompact.content !== 'After compaction.') console.error(JSON.stringify({ postCompact, requests: requests.slice(-3).map(item => ({ url: item.url, userText: item.userText.slice(-1200) })), frames: observed.map(frame => ({ type: frame.type, subtype: frame.subtype, ids: frame.user_message_uuids })) }))
assert.equal(postCompact.content, 'After compaction.')
const postRequest = requests.findLast(item => item.userText.includes('AFTER_COMPACT_SMOKE'))
assert.ok(postRequest)
assert.equal(postRequest.userText.includes('ASK_SMOKE'), false, 'native compaction must replace old full inputs on the next upstream request')
}
console.log(JSON.stringify({
result: 'PASS',
requests: requests.length,
events: events.length,
turns: 3,
turns: process.env.CLAUDE_PROTOCOL_PROBE === '1' ? 9 : 7,
basePath: requests.find((item) => item.url.includes('/v1/messages'))?.url
}))
} finally {