feat: ship skill and MCP workflows with signed updater for v0.0.7
This commit is contained in:
1 parent
1b52df0603
commit
a01085c656
136 files changed
+18646
-217
No files matched your search
@@ -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 {
|
||||
|
||||
Reference in new issue
Block a user