refactor(agent-loop): separate injected context from turns
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
|
||||
import { Context, Service } from 'cordis'
|
||||
import z from 'schemastery'
|
||||
import type { Agent, HookContext } from '@deepseek-ai/dsh-agent'
|
||||
import type { AdditionalContext, Agent } from '@deepseek-ai/dsh-agent'
|
||||
import type { ContentBlock } from '@deepseek-ai/dsh-llm'
|
||||
import type { SessionId } from '@deepseek-ai/dsh-session'
|
||||
import type { SessionSurfaceSnapshot } from '@deepseek-ai/dsh-session-query'
|
||||
@@ -148,7 +148,7 @@ export class SessionReferenceService extends Service {
|
||||
* @param content - already host-normalized readable message content.
|
||||
* @param references - structured source sessions in mention order.
|
||||
* @param signal - optional cancellation boundary for host request teardown.
|
||||
* @returns detached content and zero or one prepared contexts.
|
||||
* @returns detached content and optional referenced-session context.
|
||||
*/
|
||||
async prepare(
|
||||
agent: Agent,
|
||||
@@ -158,7 +158,7 @@ export class SessionReferenceService extends Service {
|
||||
): Promise<PreparedReferencedMessage> {
|
||||
const acceptedContent = structuredClone(content)
|
||||
const inputs = normalizeReferences(agent.id, references, this.config.maxReferences)
|
||||
if (inputs.length === 0) return { content: acceptedContent, contexts: [] }
|
||||
if (inputs.length === 0) return { content: acceptedContent }
|
||||
assertNotCancelled(signal)
|
||||
let prepared: PreparedSource[]
|
||||
try {
|
||||
@@ -192,12 +192,11 @@ export class SessionReferenceService extends Service {
|
||||
inputIndex: index,
|
||||
})),
|
||||
}
|
||||
const context: HookContext = {
|
||||
const additionalContext: AdditionalContext = {
|
||||
source,
|
||||
content: [{ type: 'text', text: prompt }],
|
||||
placement: 'prompt-prefix',
|
||||
}
|
||||
return { content: acceptedContent, contexts: [context] }
|
||||
return { content: acceptedContent, additionalContext }
|
||||
}
|
||||
|
||||
private renderSources(sources: readonly PreparedSource[]): RenderedSource[] {
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/** Current-surface projection and byte-bounded rendering. */
|
||||
|
||||
import { isCompactCheckpointSource } from '@deepseek-ai/dsh-compact'
|
||||
import { displayPromptContent } from '@deepseek-ai/dsh-session'
|
||||
import type { SessionSurfaceSnapshot } from '@deepseek-ai/dsh-session-query'
|
||||
import { assertNever } from '@deepseek-ai/dsh-llm'
|
||||
import { TextRetainer } from '@deepseek-ai/dsh-retention'
|
||||
@@ -41,13 +40,13 @@ function projectSessionConversation(snapshot: SessionSurfaceSnapshot): Projected
|
||||
case 'user/message': {
|
||||
const checkpoint = isCompactCheckpointSource(event.data.source)
|
||||
if (!checkpoint && event.data.source.kind !== 'user') break
|
||||
const text = textContent(displayPromptContent(event.data))
|
||||
const text = textContent(event.data.content)
|
||||
if (text !== '') conversation.push({ role: 'user', text, checkpoint, originalText: text, omittedBytes: 0 })
|
||||
break
|
||||
}
|
||||
case 'steering/message': {
|
||||
if (event.data.source.kind !== 'user') break
|
||||
const text = textContent(displayPromptContent(event.data))
|
||||
const text = textContent(event.data.content)
|
||||
if (text !== '') conversation.push({ role: 'user', text, checkpoint: false, originalText: text, omittedBytes: 0 })
|
||||
break
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/** Public session-reference request, candidate, and preparation records. */
|
||||
|
||||
import type { HookContext } from '@deepseek-ai/dsh-agent'
|
||||
import type { AdditionalContext } from '@deepseek-ai/dsh-agent'
|
||||
import type { ContentBlock } from '@deepseek-ai/dsh-llm'
|
||||
import type { SessionId } from '@deepseek-ai/dsh-session'
|
||||
|
||||
@@ -48,12 +48,12 @@ export interface SessionReferenceCandidate {
|
||||
createdAt: number
|
||||
}
|
||||
|
||||
/** Message payload and the zero-or-one durable snapshot contexts bound to it. */
|
||||
/** Direct message content and optional referenced-session context. */
|
||||
export interface PreparedReferencedMessage {
|
||||
/** Readable message content after host mention tokens are removed. */
|
||||
content: ContentBlock[]
|
||||
/** Empty without references; otherwise one aggregated untrusted context. */
|
||||
contexts: HookContext[]
|
||||
/** Aggregated untrusted snapshot, absent when the message has no references. */
|
||||
additionalContext?: AdditionalContext
|
||||
}
|
||||
|
||||
/** Text-only projected conversation item. */
|
||||
|
||||
Reference in New Issue
Block a user