1
0

workspace-context-compaction.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import type { Context } from '@deepseek-ai/cordis'
  2. import type {} from '@deepseek-ai/dsh-agent'
  3. import { CompactionId, compactCheckpointSource } from '@deepseek-ai/dsh-compaction'
  4. import { createUserMessage } from '@deepseek-ai/dsh-llm'
  5. import type {} from '@deepseek-ai/dsh-tools'
  6. export const name = 'workspace-context-compaction'
  7. /** Replace the visible workspace baseline after the first touch is fully projected. */
  8. export function apply(ctx: Context): void {
  9. ctx.on('tools/post-execute', async (exec, result, next) => {
  10. const downstream = await next()
  11. if (result.isError
  12. || exec.agent === undefined
  13. || exec.name !== 'read'
  14. || typeof exec.arguments !== 'object'
  15. || exec.arguments === null
  16. || !('file_path' in exec.arguments)
  17. || exec.arguments.file_path !== 'nested/task.txt') return downstream
  18. const agent = exec.agent
  19. const baseline = agent.session.surface.nodes
  20. .map(seq => agent.session.snapshotEvents()[seq])
  21. .find(event => event?.type === 'user/message'
  22. && event.data.source.kind === 'agent-instructions'
  23. && event.data.source.baseline === true)
  24. if (baseline === undefined) throw new Error('workspace baseline missing before snapshot compaction')
  25. const openTurn = agent.session.snapshotEvents().findLast(event => event.type === 'turn/start')
  26. if (openTurn?.type !== 'turn/start') throw new Error('workspace snapshot compaction has no open turn')
  27. const compactionId = CompactionId('workspace-context-fixture')
  28. const content = [{ type: 'text' as const, text: 'Earlier context was compacted for this snapshot.' }]
  29. agent.session.append('compaction/start', { compactionId, turn: openTurn.data.turn })
  30. agent.session.append('compaction/summary', {
  31. compactionId,
  32. summary: content,
  33. shadowedRange: { start: baseline.seq, end: baseline.seq },
  34. shadowedSeqs: [baseline.seq],
  35. shadowedTokenCount: 1,
  36. provider: 'snapshot',
  37. model: 'snapshot',
  38. })
  39. agent.session.append('user/message', createUserMessage({
  40. content,
  41. source: compactCheckpointSource(compactionId),
  42. }), {
  43. surfaceOp: { op: 'replace', startSeq: baseline.seq, endSeq: baseline.seq },
  44. sourceEventSeqs: [baseline.seq],
  45. })
  46. agent.session.append('compaction/end', { compactionId, turn: openTurn.data.turn })
  47. return downstream
  48. })
  49. }