Sfoglia il codice sorgente

test(session): cover composed canonical and PTC restoration

Tianyi Cui 3 settimane fa
parent
commit
756b10fcfe

+ 1 - 1
benchmarks/agent-continuation/synthetic-history.bench.ts

@@ -24,7 +24,7 @@ for (const [name, generate] of [
     session.append('step/start', { turn, step: 1 })
     const replacement = session.append('system/message', {
       turn, step: 1, message: createSystemMessage('Next synthetic prompt', '@deepseek-ai/dsh-system-prompt'),
-    }, { surfaceOp: { op: 'replace', start: head, end: head }, sourceEventSeqs: [head] })
+    }, { surfaceOp: { op: 'replace', startSeq: head, endSeq: head }, sourceEventSeqs: [head] })
     const restored = Session.create(SessionId(header.id), parseSessionLog([
       JSON.stringify(header), ...session.snapshotEvents().map(event => JSON.stringify(event)),
     ].join('\n')))

+ 2 - 2
packages/client/ui-conversation/tests/system-prompt.client.spec.ts

@@ -6,12 +6,12 @@ function system(seq: number, text: string, replaces?: number): SessionEvent {
   return {
     seq, time: seq, type: 'system/message',
     data: { turn: 1, step: seq, message: { role: 'system', content: [{ type: 'text', text }] } },
-    surfaceOp: replaces === undefined ? 'append' : { op: 'replace', start: replaces, end: replaces },
+    surfaceOp: replaces === undefined ? 'append' : { op: 'replace', startSeq: replaces, endSeq: replaces },
   } as SessionEvent
 }
 
 function replace(seq: number, start: number, end: number): SessionEvent {
-  return { seq, time: seq, type: 'user/message', surfaceOp: { op: 'replace', start, end } } as SessionEvent
+  return { seq, time: seq, type: 'user/message', surfaceOp: { op: 'replace', startSeq: start, endSeq: end } } as SessionEvent
 }
 
 function fold(events: readonly SessionEvent[]): SystemPromptState | undefined {

+ 1 - 1
packages/compaction/compaction-basic/tests/compaction-loop-repro.spec.ts

@@ -337,7 +337,7 @@ describe('token pressure after loop-admitted system prompts', () => {
           turn,
           step,
           message: createSystemMessage('retry guidance', '@deepseek-ai/dsh-system-prompt'),
-        }, { surfaceOp: { op: 'replace', start: node, end: node }, sourceEventSeqs: [node] })
+        }, { surfaceOp: { op: 'replace', startSeq: node, endSeq: node }, sourceEventSeqs: [node] })
         return { kind: 'retry' }
       })
       const agent = await ctx.agentLoop.create(SessionId('prompt-pressure'), { provider: 'mock', model: 'mock' })

+ 1 - 1
packages/core/agent-loop/tests/request-freeze.spec.ts

@@ -110,7 +110,7 @@ describe('loop-owned request freezing', () => {
     const replacement = session.append('user/message', {
       ...userEvent.data, content: [{ type: 'text', text: 'compacted' }],
     }, {
-      surfaceOp: { op: 'replace', start: nodes[0]!, end: nodes[1]! },
+      surfaceOp: { op: 'replace', startSeq: nodes[0]!, endSeq: nodes[1]! },
       sourceEventSeqs: [nodes[0]!, nodes[1]!],
     })
     await send(agent, 'third')

+ 4 - 4
packages/core/agent-loop/tests/system-prompt-admission.spec.ts

@@ -87,7 +87,7 @@ describe('prepared-route prompt admission', () => {
     expect(clearEvents).toHaveLength(3)
     for (const event of clearEvents) {
       expect(event.data.message.content).toEqual([])
-      expect(event.surfaceOp).toEqual({ op: 'replace', start: event.sourceEventSeqs?.[0], end: event.sourceEventSeqs?.[0] })
+      expect(event.surfaceOp).toEqual({ op: 'replace', startSeq: event.sourceEventSeqs?.[0], endSeq: event.sourceEventSeqs?.[0] })
     }
     const count = h.agent.session.snapshotEvents().filter(event => event.type === 'system/message').length
     await send(h.agent, 'still clear')
@@ -152,7 +152,7 @@ describe('prepared-route prompt admission', () => {
         const replaced = nodes.slice(nodes.indexOf(start), nodes.indexOf(latest) + 1)
         h.agent.session.append('user/message', createUserMessage({
           content: [{ type: 'text', text: 'compacted history' }], source: { kind: 'plugin', plugin: 'test-compaction' },
-        }), { surfaceOp: { op: 'replace', start, end: latest }, sourceEventSeqs: replaced })
+        }), { surfaceOp: { op: 'replace', startSeq: start, endSeq: latest }, sourceEventSeqs: replaced })
         // A retry must retain the assembly accepted for this step, not pick up new sections.
         h.setPrompt('not admitted until next step')
       }
@@ -188,7 +188,7 @@ describe('prepared-route prompt admission', () => {
     expect(replacements).toHaveLength(2)
     expect(replacements[0]?.type === 'system/message' && replacements[0].data.message.content).toEqual([])
     for (const event of replacements) {
-      expect(event.surfaceOp).toEqual({ op: 'replace', start: event.sourceEventSeqs?.[0], end: event.sourceEventSeqs?.[0] })
+      expect(event.surfaceOp).toEqual({ op: 'replace', startSeq: event.sourceEventSeqs?.[0], endSeq: event.sourceEventSeqs?.[0] })
     }
     await send(h.agent, 'fourth')
     expect(h.agent.session.snapshotEvents().filter(event => event.type === 'system/message')).toHaveLength(4)
@@ -237,7 +237,7 @@ describe('prepared-route prompt admission', () => {
         const seq = agent.session.surface.nodes.find(seq => agent.session.eventAt(seq)?.type === 'user/message')!
         agent.session.append('user/message', createUserMessage({
           content: [{ type: 'text', text: 'compacted history' }], source: { kind: 'plugin', plugin: 'test-compaction' },
-        }), { surfaceOp: { op: 'replace', start: seq, end: seq }, sourceEventSeqs: [seq] })
+        }), { surfaceOp: { op: 'replace', startSeq: seq, endSeq: seq }, sourceEventSeqs: [seq] })
       }
       return next()
     })

+ 1 - 1
packages/core/session/tests/canonical-envelopes.spec.ts

@@ -112,7 +112,7 @@ describe('canonical event payload acceptance', () => {
       requestEvent({ header: { config, extra: { nested: [true, null] } }, reason: 'initial', extra: ['retained'] }),
       { type: 'system/message', seq: SessionSeq(0), time: 1, surfaceOp: 'append', data: {
         turn: 1, step: 1, message: { ...message, source: { ...message.source, extra: { nested: true } } }, extra: ['retained'],
-      } } as SessionEvent,
+      } } as unknown as SessionEvent,
     ]
     for (const event of events) {
       for (const [path, accept] of Object.entries(entryPaths)) {

+ 1 - 1
packages/llm/token-meter/tests/token-meter.spec.ts

@@ -43,7 +43,7 @@ function replaceSystem(session: Session, node: SessionSeqType, text: string): Se
     turn: 1,
     step: 1,
     message: createSystemMessage(text, SYSTEM_PLUGIN),
-  }, { surfaceOp: { op: 'replace', start: node, end: node }, sourceEventSeqs: [node] }).seq
+  }, { surfaceOp: { op: 'replace', startSeq: node, endSeq: node }, sourceEventSeqs: [node] }).seq
 }
 
 const READ_TOOL = { name: 'read', description: 'read', parameters: { type: 'object' as const } }

+ 1 - 1
packages/llm/token-meter/tests/token-usage-projection.spec.ts

@@ -495,7 +495,7 @@ describe('contextPressure session projection', () => {
       const target = endpoint === 'start' ? last : first
       session.append('user/message', createUserMessage({
         content: [{ type: 'text', text: 'summary' }], source: { kind: 'plugin', plugin: 'test' },
-      }), { surfaceOp: { op: 'replace', start: target, end: target }, sourceEventSeqs: [target] })
+      }), { surfaceOp: { op: 'replace', startSeq: target, endSeq: target }, sourceEventSeqs: [target] })
       expect(() => pressure(ctx, session)).toThrow('has no adjacent shadow price')
     } finally {
       await ctx.fiber.dispose()

+ 168 - 0
packages/session/session-format-v2-to-v3/tests/combined-migration.spec.ts

@@ -0,0 +1,168 @@
+import { describe, expect, it } from 'vitest'
+import { sessionFormatCatalog } from '@deepseek-ai/dsh-session-format-catalog'
+import { SessionFormatEventCollector, SessionFormatUnsupportedMigrationError } from '@deepseek-ai/dsh-session-format'
+import type { SessionFormatEvent, SessionFormatJsonObject } from '@deepseek-ai/dsh-session-format'
+import { releasedV3SessionFormatCodec, restoreReleasedV3Artifact } from '../src/index.ts'
+
+const header = { type: 'session', version: 2, id: 'combined', createdAt: 1, isSeeded: false, delegationDepth: 0 }
+const config = { provider: 'mock', model: 'mock' }
+const message = {
+  id: 'tools-code-mode:message', role: 'user', source: { kind: 'plugin', plugin: 'tools-code-mode' },
+  content: [{ type: 'text', text: 'tool/code-dispatch tools-code-mode' }],
+}
+const outer = { rootCallId: 'tools-code-mode:root', parentCallId: 'tools-code-mode:root', subCallId: 'tools-code-mode:child', name: 'run_code', arguments: {} }
+const inner = { ...outer, parentCallId: outer.subCallId, subCallId: 'tools-ptc:child', name: 'read', arguments: { path: 'tools-code-mode' } }
+function event(type: string, seq: number, data: SessionFormatEvent['data'], fields = {}): SessionFormatEvent {
+  return { type, seq, time: seq + 1, data, ...fields }
+}
+const source = [
+  event('turn/start', 0, { turn: 1 }),
+  event('step/start', 1, { turn: 1, step: 1 }),
+  event('user/message', 2, message, { surfaceOp: 'append' }),
+  event('request/header', 3, { reason: 'initial', header: { config, system: 'prompt', tools: [], adapterDefaults: {} } }),
+  event('tool/code-dispatch-start', 4, outer),
+  event('tool/code-dispatch-start', 5, inner),
+  event('tool/code-dispatch', 6, { ...inner, isError: false, content: message.content }),
+  event('tool/code-dispatch', 7, { ...outer, isError: false, content: message.content }),
+  event('compaction/prune', 8, { shadowedRange: { start: 2, end: 2 }, shadowedSeqs: [2], shadowedTokenCount: 17 }),
+  event('user/message', 9, { ...message, id: 'tools-ptc:message' }, { surfaceOp: { op: 'replace', start: 2, end: 2 }, sourceEventSeqs: [2] }),
+  event('request/header', 10, { reason: 'change', header: { config, system: '', tools: [], adapterDefaults: {} } }),
+  event('step/end', 11, { turn: 1, step: 1 }),
+  event('turn/end', 12, { turn: 1, reason: { kind: 'completed' } }),
+]
+
+function assertComposite(events: readonly SessionFormatEvent[]): void {
+  const systems = events.filter(row => row.type === 'system/message')
+  expect(systems.map(row => ({
+    seq: row.seq, surfaceOp: row['surfaceOp'], sourceEventSeqs: row['sourceEventSeqs'],
+    content: ((row.data as SessionFormatJsonObject)['message'] as SessionFormatJsonObject)['content'],
+  }))).toEqual([
+    { seq: 2, surfaceOp: 'append', sourceEventSeqs: undefined, content: [] },
+    { seq: 4, surfaceOp: { op: 'replace', startSeq: 2, endSeq: 2 }, sourceEventSeqs: [2], content: [{ type: 'text', text: 'prompt' }] },
+    { seq: 12, surfaceOp: { op: 'replace', startSeq: 4, endSeq: 4 }, sourceEventSeqs: [4], content: [] },
+  ])
+  expect(events.filter(row => row.type !== 'system/message').slice(0, source.length)).toEqual(source.map(row => ({
+    ...row,
+    seq: row.seq + (row.seq < 2 ? 0 : row.seq < 3 ? 1 : row.seq < 10 ? 2 : 3),
+    type: row.type === 'tool/code-dispatch-start' ? 'tool/ptc-dispatch-start' : row.type === 'tool/code-dispatch' ? 'tool/ptc-dispatch' : row.type,
+    ...(row.type === 'user/message' ? { data: { ...row.data as SessionFormatJsonObject, source: { kind: 'plugin', plugin: 'tools-ptc' } } } : {}),
+    ...(row.type === 'request/header' ? { data: { ...row.data as SessionFormatJsonObject, header: { config } } } : {}),
+    ...(row.type === 'compaction/prune' ? { data: { shadowedRange: { start: 3, end: 3 }, shadowedSeqs: [3], shadowedTokenCount: 17 } } : {}),
+    ...(row.seq === 9 ? { surfaceOp: { op: 'replace', startSeq: 3, endSeq: 3 }, sourceEventSeqs: [3] } : {}),
+  })))
+}
+
+describe('combined structural, canonical-envelope and PTC catalog migration', () => {
+  it('inserts and clears system prompts while remapping replacement and nested PTC history without rewriting identities', () => {
+    const before = JSON.stringify(source)
+    const reader = sessionFormatCatalog.createRestore(header, { recovery: 'strict', validation: 'current' })
+    for (const row of source) reader.decodeRow(row)
+    const target = reader.finish()
+    expect(target.header.version).toBe(3)
+    expect(target.events).toHaveLength(source.length + 3)
+    assertComposite(target.events)
+    expect(restoreReleasedV3Artifact(target, new Set())).toBe(target)
+    expect(JSON.stringify(source)).toBe(before)
+    const native = sessionFormatCatalog.createRestore({ ...header, version: 3 }, { recovery: 'strict', validation: 'current' })
+    for (const row of target.events) native.decodeRow(releasedV3SessionFormatCodec.encodeEvent(row))
+    expect(native.finish()).toEqual(target)
+    const mismatched = target.events.map(row => row.type === 'tool/ptc-dispatch' && (row.data as SessionFormatJsonObject)['subCallId'] === inner.subCallId
+      ? { ...row, data: { ...inner, parentCallId: 'missing', isError: false, content: [] } } : row)
+    expect(() => restoreReleasedV3Artifact({ ...target, events: mismatched }, new Set())).toThrow(/parentCallId/)
+  })
+
+  it('composes header and scalar preset renames with every structural and canonical transformation', () => {
+    const reader = sessionFormatCatalog.createRestore({ ...header, agentPreset: 'code' }, { recovery: 'strict', validation: 'current' })
+    const selection = event('agent-preset/selected', source.length, { agentPreset: 'code' })
+    for (const row of [...source, selection]) reader.decodeRow(row)
+    const target = reader.finish()
+    expect(target.header).toMatchObject({ version: 3, agentPreset: 'ptc' })
+    expect(target.events.at(-1)).toEqual({ ...selection, seq: source.length + 3, data: { agentPreset: 'ptc' } })
+    assertComposite(target.events)
+    expect(restoreReleasedV3Artifact(target, new Set())).toBe(target)
+  })
+
+  it('refuses unaudited V2 preset extensions but preserves native nested preset data', () => {
+    const selection = event('agent-preset/selected', source.length, { agentPreset: 'code', extension: { agentPreset: 'code' } })
+    const reader = sessionFormatCatalog.createRestore(header, { recovery: 'strict', validation: 'current' })
+    for (const row of source) reader.decodeRow(row)
+    expect(() => { reader.decodeRow(selection) }).toThrow(/unexpected field extension/)
+    const native = sessionFormatCatalog.createRestore({ ...header, version: 3 }, { recovery: 'strict', validation: 'current' })
+    const row = { ...selection, seq: 0 }
+    native.decodeRow(row)
+    expect(native.finish().events).toEqual([row])
+  })
+
+  it.each([
+    ['old replacement fields', source[9]!, /exact replace fields/],
+    ['old PTC tag', source[4]!, /unknown event type/],
+  ])('rejects %s in native V3 encoding, decoding, and restoration', (_name, row, error) => {
+    expect(() => releasedV3SessionFormatCodec.encodeEvent(row)).toThrow(error)
+    const logicalHeader = releasedV3SessionFormatCodec.decodeHeader({ ...header, version: 3 })
+    expect(() => restoreReleasedV3Artifact({ header: logicalHeader, inheritedEventCount: 0, events: [row] }, new Set())).toThrow(error)
+    const reader = sessionFormatCatalog.createRestore({ ...header, version: 3 }, { recovery: 'strict', validation: 'transformed' })
+    for (let seq = 0; seq < row.seq; seq++) reader.decodeRow(event('external/event', seq, {}, { ignorable: true }))
+    expect(() => { reader.decodeRow(row) }).toThrow(error)
+  })
+
+  it.each(['tool/code-dispatch-start', 'tool/code-dispatch'])('refuses required obsolete %s during recoverable decoding', (type) => {
+    const decoder = releasedV3SessionFormatCodec.createDecoder({ ...header, version: 3 }, 'recoverable')
+    const output = new SessionFormatEventCollector()
+    const first = event('turn/start', 0, { turn: 1 })
+    decoder.decodeRow(first, output)
+    expect(() => { decoder.decodeRow(event(type, 1, outer), output) }).toThrow(SessionFormatUnsupportedMigrationError)
+    expect(output.values).toEqual([first])
+  })
+
+  it('refuses unsupported admission after a canonical semantic-tail error', () => {
+    const decoder = releasedV3SessionFormatCodec.createDecoder({ ...header, version: 3 }, 'recoverable')
+    const output = new SessionFormatEventCollector()
+    decoder.decodeRow(event('turn/start', 0, { turn: 1 }), output)
+    decoder.decodeRow(event('user/message', 1, message), output)
+    expect(() => { decoder.decodeRow(event('tool/code-dispatch-start', 2, outer), output) })
+      .toThrow(SessionFormatUnsupportedMigrationError)
+  })
+
+  it('withholds a malformed canonical tail without advancing the accepted inherited cut', () => {
+    const decoder = releasedV3SessionFormatCodec.createDecoder({ ...header, version: 3, isSeeded: true }, 'recoverable')
+    const output = new SessionFormatEventCollector()
+    const first = event('external/event', 0, {}, { ignorable: true })
+    const marker = event('session/end-seed', 1, { inherited: true })
+    decoder.decodeRow(first, output)
+    decoder.decodeRow(marker, output)
+    decoder.decodeRow({ ...source[9]!, seq: 2, sourceEventSeqs: [0], surfaceOp: { op: 'replace', start: 0, end: 0 } }, output)
+    decoder.decodeRow(event('session/end-seed', 3, { inherited: true }), output)
+    expect(decoder.finish(output)).toBe(1)
+    expect(output.values).toEqual([first, marker])
+    expect(() => { decoder.decodeRow(event('turn/end', 4, { turn: 1, reason: { kind: 'completed' } }), output) }).toThrow(/exact replace fields/)
+  })
+
+  it.each([undefined, 0, 1, 2, 4])('preserves historical delivery generation %s while remapping its envelope and inherited cut', (version) => {
+    const reader = sessionFormatCatalog.createRestore({ ...header, isSeeded: true, parentSession: 'parent' }, { recovery: 'strict', validation: 'current' })
+    const marker = event('session-log-deepseek/delivery-accepted', source.length, {
+      sessionId: 'parent', throughSeq: source.length - 1, ...(version === undefined ? {} : { sessionFormatVersion: version }),
+    })
+    const cut = event('session/end-seed', source.length + 1, { inherited: true })
+    for (const row of [...source, marker, cut]) reader.decodeRow(row)
+    const target = reader.finish()
+    expect(target.events.at(-2)).toEqual({ ...marker, seq: source.length + 3 })
+    expect(target.events.at(-2)?.data).toEqual(marker.data)
+    expect(target.inheritedEventCount).toBe(source.length + 4)
+    expect(target.events.at(-1)).toEqual({ ...cut, seq: target.inheritedEventCount })
+    assertComposite(target.events)
+    const reopened = sessionFormatCatalog.createRestore(releasedV3SessionFormatCodec.encodeHeader(target.header, target.inheritedEventCount), { recovery: 'strict', validation: 'current' })
+    for (const row of target.events) reopened.decodeRow(releasedV3SessionFormatCodec.encodeEvent(row))
+    expect(reopened.finish()).toEqual(target)
+  })
+
+  it('refuses target V3 delivery activation after replacement and PTC migration', () => {
+    const reader = sessionFormatCatalog.createRestore(header, { recovery: 'strict', validation: 'current' })
+    for (const row of source) reader.decodeRow(row)
+    expect(() => {
+      reader.decodeRow(event('session-log-deepseek/delivery-accepted', source.length, {
+        sessionId: header.id, throughSeq: source.length - 1, sessionFormatVersion: 3,
+      }))
+      reader.finish()
+    }).toThrow(/format v2 delivery marker claims target format v3/)
+  })
+})

+ 2 - 3
packages/session/session-log-deepseek/tests/upload.spec.ts

@@ -108,9 +108,8 @@ describe('incremental DeepSeek session-log upload', () => {
 
   it('uploads system append and replacement placement with unchanged data and provenance', async () => {
     const { ctx, session } = await harness('wire-system')
-    const head = session.append('system/message', {
-      turn: 1, step: 1, message: createSystemMessage('head', 'fixture'), extra: { retained: true },
-    }, { surfaceOp: 'append' })
+    const headData = { turn: 1, step: 1, message: createSystemMessage('head', 'fixture'), extra: { retained: true } }
+    const head = session.append('system/message', headData, { surfaceOp: 'append' })
     session.append('system/message', {
       turn: 1, step: 2, message: createSystemMessage('later', 'fixture'),
     }, { surfaceOp: 'append' })

+ 7 - 1
packages/session/session-persistence-jsonl/tests/v3-event-admission.spec.ts

@@ -104,7 +104,13 @@ describe('native V3 event admission at EOF', () => {
     expect((await readFile(path)).subarray(0, bytes.length)).toEqual(bytes)
   })
 
-  it.each(['{not json', 'null'])('still recovers an ordinary malformed EOF row: %s', async (tail) => {
+  it.each([
+    '{not json',
+    'null',
+    JSON.stringify({ type: 'user/message', seq: 1, time: 2, data: {
+      id: 'missing-surface-op', role: 'user', content: [{ type: 'text', text: 'malformed canonical tail' }],
+    } }),
+  ])('still recovers an ordinary malformed EOF row: %s', async (tail) => {
     const bytes = Buffer.from(prefix + tail + '\n')
     expect(scanLog(bytes)).toMatchObject({ events: [start], committedBytes: Buffer.byteLength(prefix) })
     const path = await store(bytes)

+ 8 - 8
scripts/snapshots/python-sdk-single-exe/advanced/result.json

@@ -551,8 +551,8 @@
       ],
       "surfaceOp": {
         "op": "replace",
-        "start": 7,
-        "end": 7
+        "startSeq": 7,
+        "endSeq": 7
       }
     },
     {
@@ -1350,8 +1350,8 @@
       ],
       "surfaceOp": {
         "op": "replace",
-        "start": 25,
-        "end": 25
+        "startSeq": 25,
+        "endSeq": 25
       }
     },
     {
@@ -2269,8 +2269,8 @@
           ],
           "surfaceOp": {
             "op": "replace",
-            "start": 7,
-            "end": 7
+            "startSeq": 7,
+            "endSeq": 7
           }
         }
       }
@@ -4171,8 +4171,8 @@
           ],
           "surfaceOp": {
             "op": "replace",
-            "start": 25,
-            "end": 25
+            "startSeq": 25,
+            "endSeq": 25
           }
         }
       }

+ 2 - 2
scripts/snapshots/python-sdk-single-exe/advanced/session.v3.jsonl

@@ -24,7 +24,7 @@
 {"type":"tool/result","data":{"turn":1,"step":2,"message":{"source":{"kind":"tool","callId":"advanced-run"},"content":[{"type":"tool-result","toolCallId":"advanced-run","content":[{"type":"text","text":"snap-1/pkg-1 is running (run-1)."}],"isError":false}],"role":"user","id":"{{messageId}}"},"meta":{"pluginId":"snap-1","packageId":"pkg-1","pluginRunId":"run-1"}},"sourceEventSeqs":[21],"surfaceOp":"append"}
 {"type":"step/end","data":{"turn":1,"step":2}}
 {"type":"step/start","data":{"turn":1,"step":3}}
-{"type":"system/message","data":{"turn":1,"step":3,"message":{"role":"system","content":[{"type":"text","text":"{{system}}"}],"source":{"kind":"plugin","plugin":"@deepseek-ai/dsh-system-prompt"},"id":"{{messageId}}"}},"sourceEventSeqs":[7],"surfaceOp":{"op":"replace","start":7,"end":7}}
+{"type":"system/message","data":{"turn":1,"step":3,"message":{"role":"system","content":[{"type":"text","text":"{{system}}"}],"source":{"kind":"plugin","plugin":"@deepseek-ai/dsh-system-prompt"},"id":"{{messageId}}"}},"sourceEventSeqs":[7],"surfaceOp":{"op":"replace","startSeq":7,"endSeq":7}}
 {"type":"request/header","data":{"header":{"config":{"provider":"deepseek-official","model":"smoke-model","maxTokens":256000,"reasoningEffort":"high"},"adapterDefaults":{"reasoningEffort":true,"maxTokens":true},"tools":["cordis_define","cordis_inspect_list","cordis_inspect_query","cordis_inspect_self","cordis_run","cordis_stop","cordis_undefine","job_kill","job_list","job_output","run_code","snapshot_double","subagent","workflow"]},"reason":"change","startsSeries":true}}
 {"type":"session-log-deepseek/delivery-accepted","data":{"sessionId":"{{parent}}","sessionFormatVersion":3,"throughSeq":26}}
 {"type":"assistant/message","data":{"turn":1,"step":3,"message":{"role":"assistant","content":[{"type":"tool-call","id":"advanced-code","name":"run_code","arguments":"{\"code\": \"return await tools.snapshot_double({ value: 21 })\", \"description\": \"Run the temporary Plugin tool\"}"}],"source":{"kind":"model","provider":"deepseek-official","model":"smoke-model"},"id":"{{messageId}}"},"usage":{"inputTokens":3,"outputTokens":3,"totalTokens":6},"stream":[{"type":"chunk","time":0,"chunk":{"type":"block-start","index":0,"blockType":"tool-call"}},{"type":"tool-call-chunks","time0":0,"index":0,"dt":[],"id":"advanced-code","name":"run_code","args":["{\"code\": \"return await tools.snapshot_double({ value: 21 })\", \"description\": \"Run the temporary Plugin tool\"}"]},{"type":"chunk","time":0,"chunk":{"type":"block-end","index":0,"block":{"type":"tool-call","id":"advanced-code","name":"run_code","arguments":"{\"code\": \"return await tools.snapshot_double({ value: 21 })\", \"description\": \"Run the temporary Plugin tool\"}"}}},{"type":"chunk","time":0,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3,"totalTokens":6}}},{"type":"chunk","time":0,"chunk":{"type":"finish","reason":{"kind":"tool-calls"}}}]},"surfaceOp":"append"}
@@ -56,7 +56,7 @@
 {"type":"tool/result","data":{"turn":1,"step":6,"message":{"source":{"kind":"tool","callId":"advanced-undefine"},"content":[{"type":"tool-result","toolCallId":"advanced-undefine","content":[{"type":"text","text":"Removed dynamic Plugin snap-1 and all of its Packages."}],"isError":false}],"role":"user","id":"{{messageId}}"}},"sourceEventSeqs":[53],"surfaceOp":"append"}
 {"type":"step/end","data":{"turn":1,"step":6}}
 {"type":"step/start","data":{"turn":1,"step":7}}
-{"type":"system/message","data":{"turn":1,"step":7,"message":{"role":"system","content":[{"type":"text","text":"{{system}}"}],"source":{"kind":"plugin","plugin":"@deepseek-ai/dsh-system-prompt"},"id":"{{messageId}}"}},"sourceEventSeqs":[25],"surfaceOp":{"op":"replace","start":25,"end":25}}
+{"type":"system/message","data":{"turn":1,"step":7,"message":{"role":"system","content":[{"type":"text","text":"{{system}}"}],"source":{"kind":"plugin","plugin":"@deepseek-ai/dsh-system-prompt"},"id":"{{messageId}}"}},"sourceEventSeqs":[25],"surfaceOp":{"op":"replace","startSeq":25,"endSeq":25}}
 {"type":"request/header","data":{"header":{"config":{"provider":"deepseek-official","model":"smoke-model","maxTokens":256000,"reasoningEffort":"high"},"adapterDefaults":{"reasoningEffort":true,"maxTokens":true},"tools":["cordis_define","cordis_inspect_list","cordis_inspect_query","cordis_inspect_self","cordis_run","cordis_stop","cordis_undefine","job_kill","job_list","job_output","run_code","subagent","workflow"]},"reason":"change","startsSeries":true}}
 {"type":"session-log-deepseek/delivery-accepted","data":{"sessionId":"{{parent}}","sessionFormatVersion":3,"throughSeq":58}}
 {"type":"assistant/message","data":{"turn":1,"step":7,"message":{"role":"assistant","content":[{"type":"text","text":"ADVANCED_EXECUTABLE_OK"}],"source":{"kind":"model","provider":"deepseek-official","model":"smoke-model"},"id":"{{message:1}}"},"usage":{"inputTokens":3,"outputTokens":3,"totalTokens":6},"stream":[{"type":"chunk","time":0,"chunk":{"type":"block-start","index":0,"blockType":"text"}},{"type":"text-chunks","time0":0,"index":0,"dt":[],"texts":["ADVANCED_EXECUTABLE_OK"]},{"type":"chunk","time":0,"chunk":{"type":"block-end","index":0,"block":{"type":"text","text":"ADVANCED_EXECUTABLE_OK"}}},{"type":"chunk","time":0,"chunk":{"type":"usage","usage":{"inputTokens":3,"outputTokens":3,"totalTokens":6}}},{"type":"chunk","time":0,"chunk":{"type":"finish","reason":{"kind":"stop"}}}]},"surfaceOp":"append"}