@linnlabs/linnkit 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +1 -1
  3. package/README.zh-CN.md +1 -1
  4. package/bin/linnkit.cjs +7 -0
  5. package/dist/{agentSpec-EkmviZjy.d.cts → agentSpec-Du4Iye0q.d.cts} +16 -1
  6. package/dist/{agentSpec-EkmviZjy.d.ts → agentSpec-Du4Iye0q.d.ts} +16 -1
  7. package/dist/cli.cjs +234 -91
  8. package/dist/cli.cjs.map +1 -1
  9. package/dist/cli.js +234 -91
  10. package/dist/cli.js.map +1 -1
  11. package/dist/context-manager.cjs +230 -32
  12. package/dist/context-manager.cjs.map +1 -1
  13. package/dist/context-manager.d.cts +52 -15
  14. package/dist/context-manager.d.ts +52 -15
  15. package/dist/context-manager.js +230 -33
  16. package/dist/context-manager.js.map +1 -1
  17. package/dist/{context-trace-HE2qY5Q-.d.cts → context-trace-BHKDS-eq.d.cts} +2 -2
  18. package/dist/{context-trace-DRi5M4lX.d.ts → context-trace-CHbqHmyE.d.ts} +2 -2
  19. package/dist/contracts.cjs +3 -1
  20. package/dist/contracts.cjs.map +1 -1
  21. package/dist/contracts.d.cts +3 -3
  22. package/dist/contracts.d.ts +3 -3
  23. package/dist/contracts.js +3 -1
  24. package/dist/contracts.js.map +1 -1
  25. package/dist/{defaultGraphExecutor-BBswR8wn.d.ts → defaultGraphExecutor-B29_qTHy.d.ts} +16 -15
  26. package/dist/{defaultGraphExecutor-BIjJj7WF.d.cts → defaultGraphExecutor-C2E59v_R.d.cts} +16 -15
  27. package/dist/{index-Cm-JbzTH.d.cts → index-BAaUP9yU.d.cts} +38 -15
  28. package/dist/{index-DRBWi1fy.d.ts → index-BaVpVNi2.d.ts} +38 -15
  29. package/dist/{index-DO4dQgf2.d.cts → index-BnYCS8Zg.d.cts} +2 -2
  30. package/dist/{index-CJeWHopy.d.ts → index-C0DAjsdX.d.ts} +2 -2
  31. package/dist/{index-Dl5PLgAv.d.cts → index-CKQzzZ5Y.d.cts} +2 -2
  32. package/dist/{index-CHqwkvGp.d.ts → index-D0mKxTR5.d.ts} +2 -2
  33. package/dist/index.cjs +327 -110
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +10 -10
  36. package/dist/index.d.ts +10 -10
  37. package/dist/index.js +327 -110
  38. package/dist/index.js.map +1 -1
  39. package/dist/{ports-DnLuKfpE.d.ts → ports-DpPTFhSd.d.ts} +2 -2
  40. package/dist/{ports-DaatKJXp.d.cts → ports-s-tSp3sB.d.cts} +2 -2
  41. package/dist/quickstart.cjs +232 -88
  42. package/dist/quickstart.cjs.map +1 -1
  43. package/dist/quickstart.d.cts +7 -7
  44. package/dist/quickstart.d.ts +7 -7
  45. package/dist/quickstart.js +232 -88
  46. package/dist/quickstart.js.map +1 -1
  47. package/dist/{runAgent-CPj_9e58.d.ts → runAgent-C6F-399C.d.ts} +5 -5
  48. package/dist/{runAgent-HYKlXbVr.d.cts → runAgent-ilEj66Ik.d.cts} +5 -5
  49. package/dist/{runHandle-D3gPsD7B.d.cts → runHandle-BNOqS-Bl.d.cts} +3 -3
  50. package/dist/{runHandle-CyXvzgzk.d.ts → runHandle-BdLXOFqF.d.ts} +3 -3
  51. package/dist/runtime-kernel/events.cjs +1 -0
  52. package/dist/runtime-kernel/events.cjs.map +1 -1
  53. package/dist/runtime-kernel/events.d.cts +4 -4
  54. package/dist/runtime-kernel/events.d.ts +4 -4
  55. package/dist/runtime-kernel/events.js +1 -0
  56. package/dist/runtime-kernel/events.js.map +1 -1
  57. package/dist/runtime-kernel.cjs +318 -103
  58. package/dist/runtime-kernel.cjs.map +1 -1
  59. package/dist/runtime-kernel.d.cts +8 -8
  60. package/dist/runtime-kernel.d.ts +8 -8
  61. package/dist/runtime-kernel.js +315 -104
  62. package/dist/runtime-kernel.js.map +1 -1
  63. package/dist/testkit.cjs +331 -116
  64. package/dist/testkit.cjs.map +1 -1
  65. package/dist/testkit.d.cts +8 -8
  66. package/dist/testkit.d.ts +8 -8
  67. package/dist/testkit.js +331 -116
  68. package/dist/testkit.js.map +1 -1
  69. package/dist/{todo-B1PmDlp3.d.cts → todo-Ca8llpRQ.d.cts} +1 -1
  70. package/dist/{todo-B1PmDlp3.d.ts → todo-Ca8llpRQ.d.ts} +1 -1
  71. package/dist/{toolContracts-CLkQmhTG.d.cts → toolContracts-Bm3EZ1UM.d.cts} +13 -2
  72. package/dist/{toolContracts-Blll0241.d.ts → toolContracts-f8lzZBNa.d.ts} +13 -2
  73. package/docs/integration/README.md +1 -1
  74. package/docs/integration/agent-registration-guide.md +1 -1
  75. package/docs/integration/child-runs.md +4 -1
  76. package/docs/integration/context-engineering.md +30 -15
  77. package/docs/integration/context-fences.md +32 -3
  78. package/docs/integration/llm-provider.md +1 -1
  79. package/docs/integration/persistence.md +1 -0
  80. package/docs/integration/run-supervisor.md +3 -0
  81. package/docs/integration/tool-development-guide.md +7 -5
  82. package/docs/integration/tool-history.md +43 -17
  83. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context-manager/shared/MessageFormatter.ts","../src/shared/checkpointMarker.ts","../src/context-manager/shared/policies/MustKeepPolicy.ts","../src/context-manager/shared/agentSpecAdapter.ts","../src/contracts/messages.ts","../src/contracts/contextPolicy.ts","../src/contracts/agentSpec.ts","../src/contracts/audit.ts","../src/contracts/events.ts","../src/contracts/constants.ts","../src/contracts/execution.ts","../src/contracts/sse.ts","../src/context-manager/shared/contextPolicyMerge.ts","../src/context-manager/shared/context-trace.ts","../src/context-manager/shared/preprocessors/base.ts","../src/context-manager/shared/preprocessors/historyPurification.ts","../src/context-manager/shared/preprocessors/fenceLifetimeManager.ts","../src/context-manager/shared/providers/base.ts","../src/shared/TokenCalculator.ts","../src/context-manager/shared/summarization/SummarizationTrigger.ts","../src/context-manager/shared/summarization/SummarizationCandidateSelector.ts","../src/context-manager/shared/summarization/AISummaryGenerator.ts","../src/shared/ids.ts","../src/context-manager/shared/summarization/SummarizationStateUtils.ts","../src/context-manager/shared/providers/SummarizationProvider.ts","../src/context-manager/shared/providers/registry.ts","../src/context-manager/shared/fences/FenceRegistry.ts","../src/context-manager/profiles/agent/contracts.ts","../src/context-manager/profiles/agent/config.ts","../src/context-manager/profiles/agent/context/config.ts","../src/context-manager/profiles/agent/context/index.ts","../src/context-manager/profiles/agent/context/providers/base.ts","../src/context-manager/profiles/agent/context/providers/AgentCoreContextProvider.ts","../src/context-manager/profiles/agent/utils/toolInteractionGroup.ts","../src/context-manager/profiles/agent/context/providers/working-memory/ToolPairMatcher.ts","../src/context-manager/profiles/agent/utils/toolOutputSummarizer.ts","../src/context-manager/profiles/agent/context/providers/working-memory/ToolPairTruncator.ts","../src/context-manager/profiles/agent/context/providers/working-memory/ReplacementSourceTagger.ts","../src/context-manager/profiles/agent/context/providers/working-memory/HistoricalToolCandidates.ts","../src/context-manager/profiles/agent/context/providers/working-memory/PostToolCallRetention.ts","../src/context-manager/profiles/agent/context/providers/working-memory/TextConversationRetention.ts","../src/context-manager/profiles/agent/context/providers/working-memory/ToolGroupKeeper.ts","../src/context-manager/profiles/agent/context/providers/working-memory/CurrentToolInteractionRetention.ts","../src/context-manager/profiles/agent/context/providers/working-memory/HistoricalToolInteractionRetention.ts","../src/context-manager/profiles/agent/context/providers/AgentWorkingMemoryProvider.ts","../src/shared/logger.ts","../src/context-manager/profiles/agent/context/providers/CheckpointSummarizationProvider.ts","../src/context-manager/profiles/agent/context/providers/index.ts","../src/shared/defaultTokenizerPort.ts","../src/context-manager/shared/context-pipeline.ts","../src/context-manager/shared/context-manager-base.ts","../src/context-manager/shared/context-result.ts","../src/context-manager/profiles/agent/context/AgentContextManager.ts","../src/context-manager/profiles/agent/context/ConversationSession.ts","../src/context-manager/profiles/agent/orchestration/index.ts","../src/context-manager/profiles/agent/preprocessors/index.ts","../src/context-manager/profiles/agent/preprocessors/base.ts","../src/context-manager/profiles/agent/preprocessors/toolHistoryCompressor.ts","../src/context-manager/profiles/agent/preprocessors/toolReplayProtocolGuard.ts","../src/shared/llmTelemetryContext.ts","../src/runtime-kernel/system-reminder/helpers.ts","../src/runtime-kernel/system-reminder/templates.ts","../src/runtime-kernel/system-reminder/triggers.ts","../src/runtime-kernel/system-reminder/registry.ts","../src/runtime-kernel/events/agentEvents.ts","../src/runtime-kernel/events/provider-sidecar.ts","../src/runtime-kernel/events/agent-to-runtime.ts","../src/runtime-kernel/events/runtime-to-ai-message.ts","../src/runtime-kernel/events/sse-projection.ts","../src/runtime-kernel/events/eventMappers.ts","../src/runtime-kernel/events/index.ts","../src/runtime-kernel/events/eventGovernance.ts","../src/runtime-kernel/audit/consoleAudit.ts","../src/context-manager/profiles/agent/utils/eventConverter.ts","../src/context-manager/profiles/agent/orchestration/AgentMessageOrchestrator.ts","../src/context-manager/profiles/agent/tasks/index.ts","../src/context-manager/profiles/agent/tasks/BaseAgentTask.ts","../src/context-manager/profiles/agent/tools/index.ts","../src/context-manager/profiles/agent/tools/ToolManager.ts","../src/context-manager/profiles/agent/utils/index.ts","../src/context-manager/profiles/chat/context/config.ts","../src/context-manager/profiles/chat/context/providers/base.ts","../src/context-manager/profiles/chat/context/providers/CoreContextProvider.ts","../src/context-manager/profiles/chat/context/providers/WorkingMemoryProvider.ts","../src/context-manager/profiles/chat/context/providers/index.ts","../src/context-manager/profiles/chat/utils/messageAdapters.ts","../src/context-manager/profiles/chat/context/ContextManager.ts","../src/context-manager/profiles/chat/preprocessors/base.ts","../src/context-manager/profiles/chat/preprocessors/userQuoteLifetime.ts","../src/context-manager/profiles/chat/preprocessors/toolHistoryFilter.ts","../src/context-manager/profiles/chat/preprocessors/index.ts","../src/context-manager/profiles/chat/request-adapters.ts","../src/context-manager/profiles/chat/orchestration/MessageOrchestrator.ts","../src/context-manager/profiles/chat/tasks/BaseConversationalTask.ts","../src/context-manager/profiles/chat/utils/eventConverter.ts"],"names":["z","JsonRecord","get_encoding","normalizeNonNegativeInteger","AgentBuildPhase","AgentMessagePriority","BaseContextProvider","ContextProviderRegistry","groupIndex","group","item","markWorkingMemory","CHECKPOINT_TOOL_NAME","summarizationThreshold","summarizationTokenThreshold","BasePreprocessor","processedMessages","AsyncLocalStorage","isRecord","isHistorySummaryEvent","findLastIndex","tools_exports","PreprocessorRegistry","PreprocessorPipeline","readOptionalStringProperty"],"mappings":"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","file":"context-manager.cjs","sourcesContent":["import type { AiMessage } from '../../contracts';\nimport type { FenceRegistry } from './fences';\nimport type { ChatMessage } from './contracts/chatLineMessage';\n\nexport interface MessageFormatOptions {\n nativeTools?: boolean;\n mode?: 'agent' | 'chat';\n fenceRegistry?: FenceRegistry;\n}\n\nexport interface MessageFormatterOptions {\n fenceRegistry?: FenceRegistry;\n}\n\nexport type NativeToolCallingMessage =\n | { role: 'system' | 'user'; content: string }\n | { role: 'assistant'; content: string; reasoning_details?: unknown[]; provider_empty_replay_field?: true }\n | { role: 'assistant'; content: string | null; tool_calls: unknown[]; reasoning_details?: unknown[]; provider_empty_replay_field?: true }\n | { role: 'tool'; tool_call_id: string; content: string };\n\nclass MessageFormatter {\n private readonly fenceRegistry?: FenceRegistry;\n\n constructor(options: MessageFormatterOptions = {}) {\n this.fenceRegistry = options.fenceRegistry;\n }\n\n public format(\n messages: AiMessage[],\n options: { nativeTools: true; mode?: 'agent' | 'chat' },\n ): NativeToolCallingMessage[];\n public format(\n messages: AiMessage[],\n options?: { nativeTools?: false; mode?: 'agent' | 'chat' },\n ): ChatMessage[];\n public format(messages: AiMessage[], options: MessageFormatOptions = {}): (ChatMessage | NativeToolCallingMessage)[] {\n const processedMessages = options.mode === 'agent' ? messages : this.mergeThoughtAndAnswer(messages);\n return processedMessages\n .map((msg) => this.formatSingleMessage(msg, options))\n .filter((msg): msg is ChatMessage | NativeToolCallingMessage => msg !== null);\n }\n\n private mergeThoughtAndAnswer(messages: AiMessage[]): AiMessage[] {\n const processedMessages: AiMessage[] = [];\n for (let i = 0; i < messages.length; i++) {\n const currentMsg = messages[i];\n const nextMsg = messages[i + 1];\n if (this.shouldMergeWithNext(currentMsg, nextMsg)) {\n processedMessages.push(this.performMerge(currentMsg, nextMsg));\n i++;\n continue;\n }\n processedMessages.push(currentMsg);\n }\n return processedMessages;\n }\n\n private shouldMergeWithNext(current: AiMessage, next: AiMessage | undefined): boolean {\n if (!next) {\n return false;\n }\n return current.role === 'assistant' && next.role === 'assistant' && current.type === 'thought' && next.type === 'final_answer';\n }\n\n private performMerge(thought: AiMessage, answer: AiMessage): AiMessage {\n return {\n id: answer.id,\n role: 'assistant',\n type: 'final_answer',\n content: `<think>${thought.content}</think>${answer.content}`,\n timestamp: answer.timestamp,\n metadata: {\n ...answer.metadata,\n ...thought.metadata,\n isMergedMessage: true,\n originalIds: [thought.id, answer.id],\n },\n };\n }\n\n private formatSingleMessage(\n message: AiMessage,\n options: MessageFormatOptions,\n ): ChatMessage | NativeToolCallingMessage | null {\n const { role, type, content, metadata } = message;\n const fenceRegistry = options.fenceRegistry ?? this.fenceRegistry;\n\n if (options.nativeTools) {\n if (role === 'assistant' && type === 'tool_calls' && metadata?.tool_calls) {\n const toolCallsRaw = metadata.tool_calls;\n const toolCalls = Array.isArray(toolCallsRaw) ? toolCallsRaw : [];\n const reasoningDetailsRaw = metadata.reasoning_details;\n const reasoningDetails = Array.isArray(reasoningDetailsRaw) ? reasoningDetailsRaw : undefined;\n const shouldUseProviderEmptyReplayField = metadata.provider_empty_replay_field === true;\n return {\n role: 'assistant',\n content: content || null,\n tool_calls: toolCalls,\n ...(reasoningDetails && reasoningDetails.length > 0 ? { reasoning_details: reasoningDetails } : {}),\n ...(shouldUseProviderEmptyReplayField ? { provider_empty_replay_field: true as const } : {}),\n };\n }\n\n if (role === 'assistant' && type === 'final_answer') {\n const reasoningDetailsRaw = metadata?.reasoning_details;\n const reasoningDetails = Array.isArray(reasoningDetailsRaw) ? reasoningDetailsRaw : undefined;\n const shouldUseProviderEmptyReplayField = metadata?.provider_empty_replay_field === true;\n return {\n role: 'assistant',\n content,\n ...(reasoningDetails && reasoningDetails.length > 0 ? { reasoning_details: reasoningDetails } : {}),\n ...(shouldUseProviderEmptyReplayField ? { provider_empty_replay_field: true as const } : {}),\n };\n }\n\n if (role === 'tool' && type === 'tool_output' && metadata?.tool_call_id) {\n return {\n role: 'tool',\n tool_call_id: metadata.tool_call_id,\n content,\n };\n }\n }\n\n if (type === 'tool_output') {\n return null;\n }\n if (role !== 'user' && role !== 'assistant' && role !== 'system') {\n return null;\n }\n\n switch (type) {\n case 'system_prompt':\n case 'user_input':\n case 'final_answer':\n return { role, content };\n case 'context_injection': {\n const fenceKind = metadata?.fenceKind;\n if (!fenceKind) {\n console.warn('[MessageFormatter] context_injection missing metadata.fenceKind, skipping.');\n return null;\n }\n const descriptor = fenceRegistry?.get(fenceKind);\n if (!descriptor) {\n console.warn(`[MessageFormatter] Fence kind \"${fenceKind}\" is not registered, skipping.`);\n return null;\n }\n return {\n role: descriptor.llmRole,\n content: descriptor.formatter(content, metadata?.fenceAttrs ?? {}),\n };\n }\n case 'history_summary':\n return { role: 'system', content };\n case 'thought':\n return { role, content: content.includes('<think>') ? content : `<think>${content}</think>` };\n case 'tool_calls': {\n const toolCalls = metadata?.tool_calls;\n if (Array.isArray(toolCalls) && toolCalls.length > 0) {\n const firstToolCall = toolCalls[0];\n const toolName = firstToolCall.function?.name;\n const toolArgs = firstToolCall.function?.arguments;\n if (toolName && toolArgs) {\n const call = {\n name: toolName,\n arguments: typeof toolArgs === 'string' ? JSON.parse(toolArgs) : toolArgs,\n };\n return { role, content: `<tool_code>${JSON.stringify(call)}</tool_code>` };\n }\n }\n return null;\n }\n case 'tool_code': {\n const { tool_name, args } = metadata || {};\n if (tool_name && args) {\n return { role, content: `<tool_code>${JSON.stringify({ name: tool_name, arguments: args })}</tool_code>` };\n }\n return null;\n }\n case 'task_request':\n case 'task_completion':\n return { role, content };\n default:\n console.warn(`[MessageFormatter] Unhandled message type for chat history: \"${type}\", skipping.`);\n return null;\n }\n }\n\n}\n\nexport const messageFormatter = new MessageFormatter();\nexport function createMessageFormatter(options: MessageFormatterOptions = {}): MessageFormatter {\n return new MessageFormatter(options);\n}\nexport function formatAgentLlmMessages(\n messages: AiMessage[],\n options: Pick<MessageFormatOptions, 'fenceRegistry'> = {},\n): NativeToolCallingMessage[] {\n return messageFormatter.format(messages, { nativeTools: true, mode: 'agent', ...options });\n}\nexport type LlmMessage = ChatMessage | NativeToolCallingMessage;\n","/**\n * @file shared/checkpointMarker.ts\n * @description 上下文 checkpoint 的跨模块共享协议常量。\n */\n\nexport const CHECKPOINT_MARKER_TYPE = 'context_checkpoint' as const;\nexport const DEFAULT_CONTEXT_CHECKPOINT_TOOL_NAME = CHECKPOINT_MARKER_TYPE;\n","import type { AiMessage } from '../../../contracts';\n\nexport interface MustKeepTruncationRule {\n messageType?: AiMessage['type'] | string;\n metadataFragmentType?: string;\n fenceKind?: string;\n maxBudgetFraction: number;\n strategyName: string;\n}\n\nexport interface MustKeepPolicy {\n alwaysKeepTypes: Array<AiMessage['type'] | string>;\n alwaysKeepFenceKinds: string[];\n truncationRules: MustKeepTruncationRule[];\n}\n\nexport const DEFAULT_MUST_KEEP_POLICY: MustKeepPolicy = {\n alwaysKeepTypes: ['system_prompt', 'user_input'],\n alwaysKeepFenceKinds: [],\n truncationRules: [],\n};\n\nexport function findMatchingTruncationRule(\n message: AiMessage,\n policy: MustKeepPolicy,\n): MustKeepTruncationRule | undefined {\n return policy.truncationRules.find((rule) => {\n if (rule.messageType !== undefined && rule.messageType !== message.type) {\n return false;\n }\n if (rule.metadataFragmentType !== undefined && message.metadata?.fragmentType !== rule.metadataFragmentType) {\n return false;\n }\n if (rule.fenceKind !== undefined && message.metadata?.fenceKind !== rule.fenceKind) {\n return false;\n }\n return true;\n });\n}\n","import type {\n AgentSpec,\n AgentSpecCheckpointPolicy,\n AgentSpecContextPolicy,\n AgentSpecContextTracePolicy,\n AgentSpecProviderReplayPolicy,\n AgentSpecSummarizationPolicy,\n AgentSpecSystemReminderPolicy,\n AgentSpecToolOutputPolicy,\n} from '../../contracts';\nimport {\n DEFAULT_MUST_KEEP_POLICY,\n type MustKeepPolicy,\n} from './policies';\n\nexport interface AgentContextBuilderConfigOverrides {\n DEFAULT_MAX_TOKENS?: number;\n RESERVED_FOR_RESPONSE?: number;\n WORKING_MEMORY_BUDGET_PERCENTAGE?: number;\n SUMMARIZATION_TRIGGER_THRESHOLD?: number;\n SUMMARY_BUDGET_PERCENTAGE?: number;\n SUMMARY_OLDEST_MESSAGES_PERCENTAGE?: number;\n MAX_THOUGHTS_TO_KEEP?: number;\n TOOL_PAIRING_SEARCH_RANGE?: number;\n MAX_TOOL_PAIR_TOKENS?: number;\n MAX_TOOL_OUTPUT_SUMMARY_TOKENS?: number;\n MIN_TOOL_INTERACTIONS_TO_KEEP?: number;\n MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP?: number;\n MAX_TOOL_INTERACTION_GROUPS_TO_KEEP?: number;\n AVG_CHARS_PER_TOKEN?: number;\n TOOL_CALL_OVERHEAD_TOKENS?: number;\n TOKEN_ENCODING_NAME?: string;\n}\n\nexport interface AgentSpecPreprocessorOptions {\n toolHistory?: {\n strategy?: 'per-pair' | 'per-run' | 'none';\n keepLatestToolPairs?: number;\n keepLatestRuns?: number;\n maxInteractionGroups?: number;\n overflowStrategy?: 'keep-latest' | 'fail-fast';\n maxPairTokens?: number;\n maxOutputSummaryTokens?: number;\n };\n providerReplay?: AgentSpecProviderReplayPolicy;\n}\n\nexport interface AgentSpecProviderOptions {\n mustKeep?: MustKeepPolicy;\n checkpoint?: AgentSpecCheckpointPolicy;\n summarization?: Pick<AgentSpecSummarizationPolicy, 'agentId' | 'failureBehavior'>;\n contextTrace?: AgentSpecContextTracePolicy;\n}\n\nexport interface AgentSpecExecutionOptions {\n toolOutput?: AgentSpecToolOutputPolicy;\n}\n\nexport interface AgentSpecRuntimeOptions {\n contextBuilderConfig: AgentContextBuilderConfigOverrides;\n preprocessorOptions: AgentSpecPreprocessorOptions;\n providerOptions: AgentSpecProviderOptions;\n executionOptions: AgentSpecExecutionOptions;\n systemReminder?: AgentSpecSystemReminderPolicy;\n}\n\n/**\n * 把 AgentSpec 的上下文策略转换成 AgentContextManager 能识别的配置覆盖。\n * 注意:profileId 只用于宿主路由,这里不消费。\n */\nexport function agentSpecToContextBuilderConfig(\n spec: AgentSpec,\n): AgentContextBuilderConfigOverrides {\n return contextPolicyToContextBuilderConfig(spec.contextPolicy);\n}\n\nexport function contextPolicyToContextBuilderConfig(\n policy: AgentSpecContextPolicy,\n): AgentContextBuilderConfigOverrides {\n const config: AgentContextBuilderConfigOverrides = {};\n const {\n budget,\n summarization,\n toolHistory,\n workingMemory,\n reasoningRetention,\n tokenEstimation,\n } = policy;\n\n if (budget?.maxTokens !== undefined) {\n config.DEFAULT_MAX_TOKENS = budget.maxTokens;\n }\n if (budget?.reservedForResponse !== undefined) {\n config.RESERVED_FOR_RESPONSE = budget.reservedForResponse;\n }\n if (budget?.workingMemoryBudgetPercentage !== undefined) {\n config.WORKING_MEMORY_BUDGET_PERCENTAGE = budget.workingMemoryBudgetPercentage;\n }\n if (summarization?.triggerThreshold !== undefined) {\n config.SUMMARIZATION_TRIGGER_THRESHOLD = summarization.triggerThreshold;\n }\n if (summarization?.budgetPercentage !== undefined) {\n config.SUMMARY_BUDGET_PERCENTAGE = summarization.budgetPercentage;\n }\n if (summarization?.oldestMessagesPercentage !== undefined) {\n config.SUMMARY_OLDEST_MESSAGES_PERCENTAGE = summarization.oldestMessagesPercentage;\n }\n if (toolHistory?.maxPairTokens !== undefined) {\n config.MAX_TOOL_PAIR_TOKENS = toolHistory.maxPairTokens;\n }\n if (toolHistory?.maxOutputSummaryTokens !== undefined) {\n config.MAX_TOOL_OUTPUT_SUMMARY_TOKENS = toolHistory.maxOutputSummaryTokens;\n }\n if (toolHistory?.maxInteractionGroups !== undefined) {\n config.MAX_TOOL_INTERACTION_GROUPS_TO_KEEP = toolHistory.maxInteractionGroups;\n }\n if (workingMemory?.maxRecentToolInteractions !== undefined) {\n config.MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP = workingMemory.maxRecentToolInteractions;\n }\n if (workingMemory?.minToolInteractionsToKeep !== undefined) {\n config.MIN_TOOL_INTERACTIONS_TO_KEEP = workingMemory.minToolInteractionsToKeep;\n }\n if (workingMemory?.toolPairingSearchRange !== undefined) {\n config.TOOL_PAIRING_SEARCH_RANGE = workingMemory.toolPairingSearchRange;\n }\n if (reasoningRetention?.keepLatestThoughts !== undefined) {\n config.MAX_THOUGHTS_TO_KEEP = reasoningRetention.keepLatestThoughts;\n }\n if (tokenEstimation?.avgCharsPerToken !== undefined) {\n config.AVG_CHARS_PER_TOKEN = tokenEstimation.avgCharsPerToken;\n }\n if (tokenEstimation?.toolCallOverhead !== undefined) {\n config.TOOL_CALL_OVERHEAD_TOKENS = tokenEstimation.toolCallOverhead;\n }\n if (tokenEstimation?.encoding !== undefined) {\n config.TOKEN_ENCODING_NAME = tokenEstimation.encoding;\n }\n\n return config;\n}\n\n/**\n * 把 contextPolicy.toolHistory 原样转成交给 agent preprocessor registry 的配置。\n */\nexport function contextPolicyToPreprocessorOptions(\n policy: AgentSpecContextPolicy | undefined,\n): AgentSpecPreprocessorOptions {\n const options: AgentSpecPreprocessorOptions = {};\n\n if (policy?.toolHistory) {\n options.toolHistory = {\n ...policy.toolHistory,\n };\n }\n\n const providerReplay = pickDefinedProviderReplayOptions(policy?.providerReplay);\n if (providerReplay) {\n options.providerReplay = providerReplay;\n }\n\n return options;\n}\n\n/**\n * 提供给后续 provider registry 重建链路使用。\n * F1.2 只做映射,不在这里创建 provider,避免 shared 层反向依赖 agent profile 实现。\n */\nexport function contextPolicyToProviderOptions(\n policy: AgentSpecContextPolicy | undefined,\n): AgentSpecProviderOptions {\n if (!policy) {\n return {};\n }\n\n return {\n mustKeep: contextPolicyToMustKeepPolicy(policy),\n checkpoint: policy.checkpoint,\n summarization: pickDefinedSummarizationOptions(policy.summarization),\n contextTrace: policy.contextTrace,\n };\n}\n\nexport function contextPolicyToMustKeepPolicy(\n policy: AgentSpecContextPolicy | undefined,\n): MustKeepPolicy | undefined {\n if (!policy?.mustKeep) {\n return undefined;\n }\n\n return {\n alwaysKeepTypes: policy.mustKeep.alwaysKeepTypes ?? DEFAULT_MUST_KEEP_POLICY.alwaysKeepTypes,\n alwaysKeepFenceKinds: policy.mustKeep.alwaysKeepFenceKinds ?? DEFAULT_MUST_KEEP_POLICY.alwaysKeepFenceKinds,\n truncationRules: policy.mustKeep.truncationRules ?? DEFAULT_MUST_KEEP_POLICY.truncationRules,\n };\n}\n\nexport function contextPolicyToSystemReminderOptions(\n policy: AgentSpecContextPolicy | undefined,\n): AgentSpecSystemReminderPolicy | undefined {\n return policy?.systemReminder;\n}\n\nexport function contextPolicyToExecutionOptions(\n policy: AgentSpecContextPolicy | undefined,\n): AgentSpecExecutionOptions {\n if (!policy?.toolOutput) {\n return {};\n }\n\n return {\n toolOutput: {\n ...policy.toolOutput,\n observationGovernance: policy.toolOutput.observationGovernance\n ? { ...policy.toolOutput.observationGovernance }\n : undefined,\n },\n };\n}\n\nexport function agentSpecToRuntimeOptions(spec: AgentSpec): AgentSpecRuntimeOptions {\n return contextPolicyToRuntimeOptions(spec.contextPolicy);\n}\n\nexport function contextPolicyToRuntimeOptions(\n policy: AgentSpecContextPolicy,\n): AgentSpecRuntimeOptions {\n return {\n contextBuilderConfig: contextPolicyToContextBuilderConfig(policy),\n preprocessorOptions: contextPolicyToPreprocessorOptions(policy),\n providerOptions: contextPolicyToProviderOptions(policy),\n executionOptions: contextPolicyToExecutionOptions(policy),\n systemReminder: contextPolicyToSystemReminderOptions(policy),\n };\n}\n\nfunction pickDefinedProviderReplayOptions(\n providerReplay: AgentSpecProviderReplayPolicy | undefined,\n): AgentSpecPreprocessorOptions['providerReplay'] {\n if (!providerReplay) {\n return undefined;\n }\n const result: AgentSpecProviderReplayPolicy = {};\n if (providerReplay.provider !== undefined) {\n result.provider = providerReplay.provider;\n }\n if (providerReplay.requiresReasoningDetailsForToolReplay !== undefined) {\n result.requiresReasoningDetailsForToolReplay = providerReplay.requiresReasoningDetailsForToolReplay;\n }\n if (providerReplay.missingSidecarBehavior !== undefined) {\n result.missingSidecarBehavior = providerReplay.missingSidecarBehavior;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction pickDefinedSummarizationOptions(\n summarization: AgentSpecSummarizationPolicy | undefined,\n): AgentSpecProviderOptions['summarization'] {\n if (!summarization) {\n return undefined;\n }\n const result: AgentSpecProviderOptions['summarization'] = {};\n if (summarization.agentId !== undefined) {\n result.agentId = summarization.agentId;\n }\n if (summarization.failureBehavior !== undefined) {\n result.failureBehavior = summarization.failureBehavior;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n","import { z } from 'zod';\n\nexport const ProviderReasoningDetails = z.array(z.unknown());\nexport type ProviderReasoningDetails = z.infer<typeof ProviderReasoningDetails>;\n\nexport const ToolCallExtraContent = z.object({\n google: z.object({\n thought_signature: z.string().optional(),\n }).passthrough().optional(),\n}).passthrough();\n\nexport type ToolCallExtraContent = z.infer<typeof ToolCallExtraContent>;\n\nexport const ToolCallWire = z.object({\n id: z.string(),\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n extra_content: ToolCallExtraContent.optional(),\n}).passthrough();\n\nexport type ToolCallWire = z.infer<typeof ToolCallWire>;\n\nexport const HistorySummaryMeta = z.object({\n messageType: z.literal('summary'),\n originalMessageCount: z.number().int().positive(),\n compressionRatio: z.number().min(0).max(1).optional(),\n includedOldSummary: z.boolean(),\n replacedMessageIds: z.array(z.string()),\n summarySeq: z.number().int().nonnegative(),\n});\n\nexport type HistorySummaryMeta = z.infer<typeof HistorySummaryMeta>;\n\nexport const ToolCallsMeta = z.object({\n tool_calls: z.array(ToolCallWire),\n reasoning_details: ProviderReasoningDetails.optional(),\n});\n\nexport type ToolCallsMeta = z.infer<typeof ToolCallsMeta>;\n\nexport const ToolOutputMeta = z.object({\n tool_name: z.string(),\n args: z.record(z.unknown()).optional(),\n tool_call_id: z.string(),\n});\n\nexport type ToolOutputMeta = z.infer<typeof ToolOutputMeta>;\n\nexport const ImageInfoMeta = z.object({\n url: z.string().optional(),\n width: z.number().int().positive().optional(),\n height: z.number().int().positive().optional(),\n format: z.string().optional(),\n size: z.number().int().nonnegative().optional(),\n});\n\nexport type ImageInfoMeta = z.infer<typeof ImageInfoMeta>;\n\nexport const TaskTrackingMeta = z.object({\n taskType: z.string().optional(),\n taskId: z.string().optional(),\n taskStatus: z.enum(['requested', 'in_progress', 'completed', 'failed']).optional(),\n taskTrackingInfo: z.object({\n startTime: z.number().optional(),\n endTime: z.number().optional(),\n duration: z.number().optional(),\n retryCount: z.number().int().nonnegative().optional(),\n lastError: z.string().optional(),\n }).optional(),\n});\n\nexport type TaskTrackingMeta = z.infer<typeof TaskTrackingMeta>;\n\nexport const PersistentMetadata = z.object({\n messageType: z.literal('summary').optional(),\n originalMessageCount: z.number().int().positive().optional(),\n compressionRatio: z.number().min(0).max(1).optional(),\n includedOldSummary: z.boolean().optional(),\n replacedMessageIds: z.array(z.string()).optional(),\n summarySeq: z.number().int().nonnegative().optional(),\n tool_calls: z.array(ToolCallWire).optional(),\n reasoning_details: ProviderReasoningDetails.optional(),\n tool_name: z.string().optional(),\n args: z.record(z.unknown()).optional(),\n tool_call_id: z.string().optional(),\n raw_output: z.string().optional(),\n image_info: ImageInfoMeta.optional(),\n taskType: z.string().optional(),\n taskId: z.string().optional(),\n taskStatus: z.enum(['requested', 'in_progress', 'completed', 'failed']).optional(),\n taskTrackingInfo: z.object({\n startTime: z.number().optional(),\n endTime: z.number().optional(),\n duration: z.number().optional(),\n retryCount: z.number().int().nonnegative().optional(),\n lastError: z.string().optional(),\n }).optional(),\n fenceKind: z.string().optional(),\n fenceAttrs: z.record(z.unknown()).optional(),\n fencePlacement: z.string().optional(),\n}).passthrough();\n\nexport type PersistentMetadata = z.infer<typeof PersistentMetadata>;\n\nconst BaseMessage = z.object({\n id: z.string(),\n content: z.string(),\n timestamp: z.number().int().nonnegative(),\n metadata: PersistentMetadata.optional(),\n});\n\nexport const SystemMessage = BaseMessage.extend({\n role: z.literal('system'),\n type: z.enum(['system_prompt', 'history_summary', 'context_injection']),\n});\n\nexport type SystemMessage = z.infer<typeof SystemMessage>;\n\nexport const UserMessage = BaseMessage.extend({\n role: z.literal('user'),\n type: z.enum([\n 'user_input',\n 'context_injection',\n 'context_before',\n 'context_after',\n 'document_fragment',\n 'task_request',\n 'image',\n ]),\n});\n\nexport type UserMessage = z.infer<typeof UserMessage>;\n\nexport const AssistantMessage = BaseMessage.extend({\n role: z.literal('assistant'),\n type: z.enum([\n 'thought',\n 'final_answer',\n 'tool_code',\n 'tool_calls',\n 'task_completion',\n ]),\n});\n\nexport type AssistantMessage = z.infer<typeof AssistantMessage>;\n\nexport const ToolMessage = BaseMessage.extend({\n role: z.literal('tool'),\n type: z.literal('tool_output'),\n});\n\nexport type ToolMessage = z.infer<typeof ToolMessage>;\n\nexport const AiMessage = z.discriminatedUnion('role', [\n SystemMessage,\n UserMessage,\n AssistantMessage,\n ToolMessage,\n]);\n\nexport type AiMessage = z.infer<typeof AiMessage>;\n\nexport function createSystemMessage(\n type: SystemMessage['type'],\n content: string,\n metadata?: PersistentMetadata,\n): SystemMessage {\n return {\n id: crypto.randomUUID(),\n role: 'system',\n type,\n content,\n timestamp: Date.now(),\n metadata,\n };\n}\n\nexport function createUserMessage(\n type: UserMessage['type'],\n content: string,\n metadata?: PersistentMetadata,\n): UserMessage {\n return {\n id: crypto.randomUUID(),\n role: 'user',\n type,\n content,\n timestamp: Date.now(),\n metadata,\n };\n}\n\nexport function createAssistantMessage(\n type: AssistantMessage['type'],\n content: string,\n metadata?: PersistentMetadata,\n): AssistantMessage {\n return {\n id: crypto.randomUUID(),\n role: 'assistant',\n type,\n content,\n timestamp: Date.now(),\n metadata,\n };\n}\n\nexport function createToolMessage(\n content: string,\n toolCallId: string,\n toolName: string,\n metadata?: PersistentMetadata,\n): ToolMessage {\n return {\n id: crypto.randomUUID(),\n role: 'tool',\n type: 'tool_output',\n content,\n timestamp: Date.now(),\n metadata: {\n ...metadata,\n tool_call_id: toolCallId,\n tool_name: toolName,\n },\n };\n}\n\nexport function createHistorySummaryMessage(\n content: string,\n summaryMeta: HistorySummaryMeta,\n): SystemMessage {\n return {\n id: crypto.randomUUID(),\n role: 'system',\n type: 'history_summary',\n content,\n timestamp: Date.now(),\n metadata: summaryMeta,\n };\n}\n\nexport function validateAiMessage(data: unknown): z.SafeParseReturnType<unknown, AiMessage> {\n return AiMessage.safeParse(data);\n}\n\nexport function validateHistorySummaryMeta(\n data: unknown,\n): z.SafeParseReturnType<unknown, HistorySummaryMeta> {\n return HistorySummaryMeta.safeParse(data);\n}\n\nexport function isSystemMessage(message: AiMessage): message is SystemMessage {\n return message.role === 'system';\n}\n\nexport function isUserMessage(message: AiMessage): message is UserMessage {\n return message.role === 'user';\n}\n\nexport function isAssistantMessage(message: AiMessage): message is AssistantMessage {\n return message.role === 'assistant';\n}\n\nexport function isToolMessage(message: AiMessage): message is ToolMessage {\n return message.role === 'tool';\n}\n\nexport function isHistorySummaryMessage(message: AiMessage): message is SystemMessage {\n return message.role === 'system'\n && message.type === 'history_summary'\n && message.metadata?.messageType === 'summary';\n}\n\nexport function hasToolCalls(message: AiMessage): boolean {\n return message.role === 'assistant'\n && Array.isArray(message.metadata?.tool_calls)\n && message.metadata.tool_calls.length > 0;\n}\n","import { z } from 'zod';\n\ntype SerializableJsonValue =\n | string\n | number\n | boolean\n | null\n | SerializableJsonValue[]\n | { [key: string]: SerializableJsonValue };\n\nconst SerializableJsonValueSchema: z.ZodType<SerializableJsonValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(SerializableJsonValueSchema),\n z.record(z.string(), SerializableJsonValueSchema),\n ]),\n);\n\nconst SerializableJsonRecord = z.record(z.string(), SerializableJsonValueSchema);\n\nexport const AgentSpecMessageType = z.enum([\n 'system_prompt',\n 'history_summary',\n 'context_injection',\n 'user_input',\n 'context_before',\n 'context_after',\n 'document_fragment',\n 'task_request',\n 'image',\n 'thought',\n 'final_answer',\n 'tool_code',\n 'tool_calls',\n 'task_completion',\n 'tool_output',\n]);\nexport type AgentSpecMessageType = z.infer<typeof AgentSpecMessageType>;\n\nexport const AgentSpecBudgetPolicy = z.object({\n maxTokens: z.number().int().positive().optional(),\n reservedForResponse: z.number().int().nonnegative().optional(),\n workingMemoryBudgetPercentage: z.number().min(0).max(1).optional(),\n});\nexport type AgentSpecBudgetPolicy = z.infer<typeof AgentSpecBudgetPolicy>;\n\nexport const AgentSpecToolHistoryPolicy = z.object({\n strategy: z.enum(['per-pair', 'per-run', 'none']).optional(),\n keepLatestToolPairs: z.number().int().nonnegative().optional(),\n keepLatestRuns: z.number().int().nonnegative().optional(),\n maxInteractionGroups: z.number().int().nonnegative().optional(),\n overflowStrategy: z.enum(['keep-latest', 'fail-fast']).optional(),\n maxPairTokens: z.number().int().nonnegative().optional(),\n maxOutputSummaryTokens: z.number().int().nonnegative().optional(),\n});\nexport type AgentSpecToolHistoryPolicy = z.infer<typeof AgentSpecToolHistoryPolicy>;\n\nexport const AgentSpecToolObservationGovernancePolicy = z.object({\n enabled: z.boolean().optional(),\n maxChars: z.number().int().positive().optional(),\n maxLines: z.number().int().positive().optional(),\n});\nexport type AgentSpecToolObservationGovernancePolicy = z.infer<typeof AgentSpecToolObservationGovernancePolicy>;\n\nexport const AgentSpecToolOutputPolicy = z.object({\n observationGovernance: AgentSpecToolObservationGovernancePolicy.optional(),\n});\nexport type AgentSpecToolOutputPolicy = z.infer<typeof AgentSpecToolOutputPolicy>;\n\nexport const AgentSpecProviderReplayPolicy = z.object({\n provider: z.string().min(1).optional(),\n requiresReasoningDetailsForToolReplay: z.boolean().optional(),\n missingSidecarBehavior: z.enum(['allow', 'degrade_to_text', 'provider_empty_replay_field']).optional(),\n});\nexport type AgentSpecProviderReplayPolicy = z.infer<typeof AgentSpecProviderReplayPolicy>;\n\nexport const AgentSpecSummarizationPolicy = z.object({\n triggerThreshold: z.number().min(0).max(1).optional(),\n budgetPercentage: z.number().min(0).max(1).optional(),\n oldestMessagesPercentage: z.number().min(0).max(1).optional(),\n agentId: z.string().min(1).optional(),\n failureBehavior: z.enum(['fail-fast', 'continue-if-within-budget']).optional(),\n});\nexport type AgentSpecSummarizationPolicy = z.infer<typeof AgentSpecSummarizationPolicy>;\n\nexport const AgentSpecMustKeepTruncationRule = z.object({\n fenceKind: z.string().min(1),\n maxBudgetFraction: z.number().gt(0).max(1),\n strategyName: z.string().min(1),\n});\nexport type AgentSpecMustKeepTruncationRule = z.infer<typeof AgentSpecMustKeepTruncationRule>;\n\nexport const AgentSpecMustKeepPolicy = z.object({\n alwaysKeepTypes: z.array(AgentSpecMessageType).optional(),\n alwaysKeepFenceKinds: z.array(z.string().min(1)).optional(),\n truncationRules: z.array(AgentSpecMustKeepTruncationRule).optional(),\n});\nexport type AgentSpecMustKeepPolicy = z.infer<typeof AgentSpecMustKeepPolicy>;\n\nexport const AgentSpecWorkingMemoryPolicy = z.object({\n maxRecentToolInteractions: z.number().int().nonnegative().optional(),\n minToolInteractionsToKeep: z.number().int().nonnegative().optional(),\n toolPairingSearchRange: z.number().int().positive().optional(),\n});\nexport type AgentSpecWorkingMemoryPolicy = z.infer<typeof AgentSpecWorkingMemoryPolicy>;\n\nexport const AgentSpecCheckpointPolicy = z.object({\n keepPairsBefore: z.number().int().nonnegative().optional(),\n triggerToolName: z.string().min(1).optional(),\n});\nexport type AgentSpecCheckpointPolicy = z.infer<typeof AgentSpecCheckpointPolicy>;\n\nexport const AgentSpecReasoningRetentionPolicy = z.object({\n keepLatestThoughts: z.number().int().nonnegative().optional(),\n});\nexport type AgentSpecReasoningRetentionPolicy = z.infer<typeof AgentSpecReasoningRetentionPolicy>;\n\nexport const AgentSpecTokenEstimationPolicy = z.object({\n encoding: z.string().min(1).optional(),\n avgCharsPerToken: z.number().positive().optional(),\n toolCallOverhead: z.number().int().nonnegative().optional(),\n});\nexport type AgentSpecTokenEstimationPolicy = z.infer<typeof AgentSpecTokenEstimationPolicy>;\n\nexport const SYSTEM_REMINDER_BUILTIN_TRIGGER_KINDS = [\n 'phase-equals',\n 'remaining-steps-leq',\n 'step-count-modulo',\n 'tool-call-streak',\n 'budget-warning',\n 'agent-has-tool',\n] as const;\n\nexport const AgentSpecSystemReminderTrigger = z.object({\n kind: z.string().min(1),\n threshold: z.number().nonnegative().optional(),\n value: z.union([z.string(), z.number(), z.boolean()]).optional(),\n moduloStep: z.boolean().optional(),\n toolName: z.string().min(1).optional(),\n period: z.number().int().positive().optional(),\n minStep: z.number().int().nonnegative().optional(),\n ratio: z.number().min(0).max(1).optional(),\n config: SerializableJsonRecord.optional(),\n});\nexport type AgentSpecSystemReminderTrigger = z.infer<typeof AgentSpecSystemReminderTrigger>;\n\nexport const AgentSpecSystemReminderExtraRule = z.object({\n id: z.string().min(1),\n trigger: AgentSpecSystemReminderTrigger,\n contentTemplate: z.string().min(1),\n contentArgs: SerializableJsonRecord.optional(),\n});\nexport type AgentSpecSystemReminderExtraRule = z.infer<typeof AgentSpecSystemReminderExtraRule>;\n\nexport const AgentSpecSystemReminderPolicy = z.object({\n enabledRuleIds: z.array(z.string().min(1)).nullable().optional(),\n disabledRuleIds: z.array(z.string().min(1)).optional(),\n thresholds: z.object({\n toolCallStreak: z.number().int().nonnegative().optional(),\n taskstateReflectionPeriod: z.number().int().positive().optional(),\n budgetWarningRatio: z.number().min(0).max(1).optional(),\n lastStepsHintThreshold: z.number().int().nonnegative().optional(),\n }).optional(),\n extraRules: z.array(AgentSpecSystemReminderExtraRule).optional(),\n}).superRefine((value, ctx) => {\n if (value.enabledRuleIds !== undefined && value.enabledRuleIds !== null && value.disabledRuleIds?.length) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['disabledRuleIds'],\n message: 'enabledRuleIds and disabledRuleIds cannot be configured at the same time',\n });\n }\n});\nexport type AgentSpecSystemReminderPolicy = z.infer<typeof AgentSpecSystemReminderPolicy>;\n\nexport const AgentSpecContextTracePolicy = z.object({\n enabled: z.boolean().optional(),\n includeMessageIds: z.boolean().optional(),\n includeTokenBreakdown: z.boolean().optional(),\n maxTraceEvents: z.number().int().positive().optional(),\n});\nexport type AgentSpecContextTracePolicy = z.infer<typeof AgentSpecContextTracePolicy>;\n\nexport const AgentSpecContextPolicy = z.object({\n profileId: z.string().min(1),\n budget: AgentSpecBudgetPolicy.optional(),\n toolHistory: AgentSpecToolHistoryPolicy.optional(),\n toolOutput: AgentSpecToolOutputPolicy.optional(),\n providerReplay: AgentSpecProviderReplayPolicy.optional(),\n summarization: AgentSpecSummarizationPolicy.optional(),\n mustKeep: AgentSpecMustKeepPolicy.optional(),\n workingMemory: AgentSpecWorkingMemoryPolicy.optional(),\n checkpoint: AgentSpecCheckpointPolicy.optional(),\n reasoningRetention: AgentSpecReasoningRetentionPolicy.optional(),\n tokenEstimation: AgentSpecTokenEstimationPolicy.optional(),\n systemReminder: AgentSpecSystemReminderPolicy.optional(),\n contextTrace: AgentSpecContextTracePolicy.optional(),\n});\nexport type AgentSpecContextPolicy = z.infer<typeof AgentSpecContextPolicy>;\n\nexport type AgentSpecContextPolicyInput = Omit<z.input<typeof AgentSpecContextPolicy>, 'profileId'> & {\n profileId?: string;\n};\n\nconst DEFAULT_CONTEXT_POLICY: Required<AgentSpecContextPolicy> = {\n profileId: 'agent',\n budget: {\n maxTokens: 120000,\n reservedForResponse: 2400,\n workingMemoryBudgetPercentage: 0.7,\n },\n toolHistory: {\n strategy: 'per-run',\n keepLatestToolPairs: 2,\n keepLatestRuns: 1,\n maxInteractionGroups: 12,\n overflowStrategy: 'keep-latest',\n maxPairTokens: 6000,\n maxOutputSummaryTokens: 1000,\n },\n toolOutput: {\n observationGovernance: {\n enabled: true,\n maxChars: 20_000,\n maxLines: 1_200,\n },\n },\n providerReplay: {},\n summarization: {\n triggerThreshold: 0.7,\n budgetPercentage: 0.12,\n oldestMessagesPercentage: 0.75,\n failureBehavior: 'fail-fast',\n },\n mustKeep: {\n alwaysKeepTypes: ['system_prompt', 'user_input'],\n alwaysKeepFenceKinds: [],\n truncationRules: [],\n },\n workingMemory: {\n maxRecentToolInteractions: 2,\n minToolInteractionsToKeep: 2,\n toolPairingSearchRange: 10,\n },\n checkpoint: {\n keepPairsBefore: 2,\n triggerToolName: 'context_checkpoint',\n },\n reasoningRetention: {\n keepLatestThoughts: 1,\n },\n tokenEstimation: {\n encoding: 'cl100k_base',\n avgCharsPerToken: 2.0,\n toolCallOverhead: 50,\n },\n systemReminder: {\n enabledRuleIds: null,\n disabledRuleIds: [],\n thresholds: {\n toolCallStreak: 10,\n taskstateReflectionPeriod: 30,\n budgetWarningRatio: 0.9,\n lastStepsHintThreshold: 0,\n },\n extraRules: [],\n },\n contextTrace: {\n enabled: false,\n includeMessageIds: true,\n includeTokenBreakdown: true,\n maxTraceEvents: 200,\n },\n};\n\n/**\n * 创建完整 contextPolicy。\n *\n * 中文备注:\n * - schema 保持 optional,避免现有 host 的 `{ profileId: 'agent' }` 类型大面积变红;\n * - 需要完整默认值时走这个 helper,后续 F1.2/F1.3 的 adapter 与 fallback 会复用它。\n */\nexport function defineContextPolicy(input: AgentSpecContextPolicyInput = {}): AgentSpecContextPolicy {\n const merged: Required<AgentSpecContextPolicy> = {\n profileId: input.profileId ?? DEFAULT_CONTEXT_POLICY.profileId,\n budget: { ...DEFAULT_CONTEXT_POLICY.budget, ...input.budget },\n toolHistory: { ...DEFAULT_CONTEXT_POLICY.toolHistory, ...input.toolHistory },\n toolOutput: {\n ...DEFAULT_CONTEXT_POLICY.toolOutput,\n ...input.toolOutput,\n observationGovernance: {\n ...DEFAULT_CONTEXT_POLICY.toolOutput.observationGovernance,\n ...input.toolOutput?.observationGovernance,\n },\n },\n providerReplay: { ...DEFAULT_CONTEXT_POLICY.providerReplay, ...input.providerReplay },\n summarization: { ...DEFAULT_CONTEXT_POLICY.summarization, ...input.summarization },\n mustKeep: { ...DEFAULT_CONTEXT_POLICY.mustKeep, ...input.mustKeep },\n workingMemory: { ...DEFAULT_CONTEXT_POLICY.workingMemory, ...input.workingMemory },\n checkpoint: { ...DEFAULT_CONTEXT_POLICY.checkpoint, ...input.checkpoint },\n reasoningRetention: { ...DEFAULT_CONTEXT_POLICY.reasoningRetention, ...input.reasoningRetention },\n tokenEstimation: { ...DEFAULT_CONTEXT_POLICY.tokenEstimation, ...input.tokenEstimation },\n systemReminder: {\n ...DEFAULT_CONTEXT_POLICY.systemReminder,\n ...input.systemReminder,\n thresholds: {\n ...DEFAULT_CONTEXT_POLICY.systemReminder.thresholds,\n ...input.systemReminder?.thresholds,\n },\n extraRules: input.systemReminder?.extraRules ?? DEFAULT_CONTEXT_POLICY.systemReminder.extraRules,\n },\n contextTrace: { ...DEFAULT_CONTEXT_POLICY.contextTrace, ...input.contextTrace },\n };\n\n return AgentSpecContextPolicy.parse(merged);\n}\n","import { z } from 'zod';\nimport { AgentSpecContextPolicy } from './contextPolicy';\n\nconst JsonRecord = z.record(z.string(), z.unknown());\n\n/**\n * 工具参数 schema 在 AgentSpec 里是可序列化契约,不是运行时 zod 对象。\n * 这里主动拦截 zod-like 对象,避免把 `z.any()` 一类实现细节混进协议层。\n */\nconst ToolArgsSchemaSpec = JsonRecord.superRefine((value, ctx) => {\n const parse = value['parse'];\n const safeParse = value['safeParse'];\n const definition = value['_def'];\n if (typeof parse === 'function' && typeof safeParse === 'function' && definition !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'argsSchema must be a serializable record, not a runtime zod schema',\n });\n }\n});\n\nexport const AgentCapability = z.string().min(1);\nexport type AgentCapability = z.infer<typeof AgentCapability>;\n\nexport const ToolBindingSpec = z.object({\n toolId: z.string().min(1),\n bindingId: z.string().min(1).optional(),\n argsSchema: ToolArgsSchemaSpec.optional(),\n config: JsonRecord.optional(),\n metadata: JsonRecord.optional(),\n});\nexport type ToolBindingSpec = z.infer<typeof ToolBindingSpec>;\n\nexport const AgentSpecModelHints = z.object({\n preferredProviders: z.array(z.string().min(1)).optional(),\n preferredModels: z.array(z.string().min(1)).optional(),\n fallbackChain: z.array(z.string().min(1)).optional(),\n});\nexport type AgentSpecModelHints = z.infer<typeof AgentSpecModelHints>;\n\nexport const AgentSpecAuditConfig = z.object({\n redactionLevel: z.enum(['none', 'standard', 'strict']).optional(),\n pii: z.boolean().optional(),\n});\nexport type AgentSpecAuditConfig = z.infer<typeof AgentSpecAuditConfig>;\n\nexport const AgentSpec = z.object({\n id: z.string().min(1),\n version: z.string().min(1),\n role: z.string().optional(),\n description: z.string().optional(),\n capabilities: z.array(AgentCapability),\n tools: z.array(ToolBindingSpec),\n contextPolicy: AgentSpecContextPolicy,\n modelHints: AgentSpecModelHints.optional(),\n audit: AgentSpecAuditConfig.optional(),\n metadata: JsonRecord.optional(),\n});\nexport type AgentSpec = z.infer<typeof AgentSpec>;\n","import { z } from 'zod';\n\nconst JsonRecord = z.record(z.string(), z.unknown());\n\nexport const AUDIT_ACTIONS = [\n 'model.select',\n 'model.fallback',\n 'tool.allow',\n 'tool.deny',\n 'wait_user.request',\n 'sandbox.decide',\n 'run.cancel',\n 'run.pause',\n 'run.resume',\n 'memory.write',\n] as const;\n\nexport const AUDIT_DECISION_OUTCOMES = [\n 'allowed',\n 'denied',\n 'fallback',\n 'retry',\n 'cancelled',\n 'paused',\n 'resumed',\n 'requested',\n 'recorded',\n] as const;\n\nexport const AuditActor = z.object({\n kind: z.enum(['system', 'host', 'agent', 'model', 'tool', 'user']),\n id: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n});\nexport type AuditActor = z.infer<typeof AuditActor>;\n\nexport const AuditDecision = z.object({\n outcome: z.enum(AUDIT_DECISION_OUTCOMES),\n reason: z.string().optional(),\n policy: z.string().optional(),\n metadata: JsonRecord.optional(),\n});\nexport type AuditDecision = z.infer<typeof AuditDecision>;\n\nexport const AuditEvidence = z.object({\n kind: z.string().min(1),\n ref: z.string().min(1).optional(),\n summary: z.string().optional(),\n metadata: JsonRecord.optional(),\n});\nexport type AuditEvidence = z.infer<typeof AuditEvidence>;\n\nexport const AuditCostDelta = z.object({\n tokensInput: z.number().int().nonnegative().optional(),\n tokensOutput: z.number().int().nonnegative().optional(),\n totalCostUsd: z.number().nonnegative().optional(),\n latencyMs: z.number().nonnegative().optional(),\n});\nexport type AuditCostDelta = z.infer<typeof AuditCostDelta>;\n\nexport const AuditScope = z.object({\n conversationId: z.string().min(1).optional(),\n runId: z.string().min(1).optional(),\n parentRunId: z.string().min(1).optional(),\n turnId: z.string().min(1).optional(),\n traceId: z.string().min(1).optional(),\n agentSpecId: z.string().min(1).optional(),\n toolCallId: z.string().min(1).optional(),\n toolName: z.string().min(1).optional(),\n modelId: z.string().min(1).optional(),\n nodeId: z.string().min(1).optional(),\n metadata: JsonRecord.optional(),\n});\nexport type AuditScope = z.infer<typeof AuditScope>;\n\n/**\n * 标准审计信封。\n *\n * 中文备注:\n * - action 保持 string,以便 host 扩展自己的动作名;\n * - decision/evidence/costDelta 都是可选事实片段,避免把所有审计场景压成同一种形状;\n * - envelope 必须追加只读,更新/撤回应追加新的补偿 envelope。\n */\nexport const AuditEnvelope = z.object({\n envelopeId: z.string().min(1),\n runId: z.string().min(1),\n parentRunId: z.string().min(1).optional(),\n ts: z.number().int().nonnegative(),\n actor: AuditActor,\n action: z.string().min(1),\n decision: AuditDecision.optional(),\n evidence: z.array(AuditEvidence).optional(),\n costDelta: AuditCostDelta.optional(),\n scope: AuditScope.optional(),\n});\nexport type AuditEnvelope = z.infer<typeof AuditEnvelope>;\n","import { z } from 'zod';\nimport { AuditEnvelope } from './audit';\n\nexport const BaseEvent = z.object({\n id: z.string(),\n conversation_id: z.string(),\n timestamp: z.number(),\n metadata: z.record(z.unknown()).optional(),\n version: z.literal(1).default(1),\n turn_id: z.string(),\n ephemeral: z.boolean().optional(),\n});\n\nexport const ToolCallPhase = z.enum(['start', 'update', 'complete', 'error']);\nexport const Status = z.enum(['loading', 'success', 'error']);\nexport const AgentTodoStatus = z.enum(['pending', 'in_progress', 'completed', 'cancelled']);\n\nexport const AgentTodoItem = z.object({\n id: z.string(),\n content: z.string(),\n status: AgentTodoStatus,\n});\n\nexport const ProviderReasoningDetailsPayload = z.array(z.unknown());\nexport type ProviderReasoningDetailsPayload = z.infer<typeof ProviderReasoningDetailsPayload>;\n\nexport const ToolCallDecisionPayload = z.object({\n args: z.record(z.any()).optional(),\n tool_calls: z.array(z.unknown()).optional(),\n /**\n * 不透明 provider reasoning replay blocks。\n *\n * RuntimeEvent 层的标准位置是 assistant 产出事件携带 reasoning_details;\n * context-manager 会把它回放到 AiMessage.metadata.reasoning_details。\n */\n reasoning_details: ProviderReasoningDetailsPayload.optional(),\n}).passthrough();\n\nexport type ToolCallDecisionPayload = z.infer<typeof ToolCallDecisionPayload>;\n\nexport const RuntimeEvent = z.discriminatedUnion('type', [\n BaseEvent.extend({\n type: z.literal('user_input'),\n content: z.string(),\n raw_content: z.string().optional(),\n source: z.enum(['user', 'editor', 'system']).default('user'),\n }),\n BaseEvent.extend({\n type: z.literal('thought'),\n content: z.string(),\n thought_message_id: z.string().optional(),\n delta: z.string().optional(),\n is_complete: z.boolean().default(false),\n }),\n BaseEvent.extend({\n type: z.literal('tool_call_decision'),\n tool_name: z.string(),\n tool_call_id: z.string(),\n phase: ToolCallPhase,\n status: Status,\n args: z.record(z.any()).optional(),\n payload: ToolCallDecisionPayload.optional(),\n parent_tool_call_id: z.string().optional(),\n meta: z.record(z.any()).optional(),\n }),\n BaseEvent.extend({\n type: z.literal('tool_process'),\n tool_name: z.string(),\n tool_call_id: z.string(),\n phase: ToolCallPhase,\n status: Status,\n args: z.record(z.any()).optional(),\n payload: z.record(z.any()).optional(),\n parent_tool_call_id: z.string().optional(),\n meta: z.record(z.any()).optional(),\n }),\n BaseEvent.extend({\n type: z.literal('tool_output'),\n tool_name: z.string(),\n tool_call_id: z.string(),\n status: z.enum(['success', 'error']),\n output: z.any().optional(),\n payload: z.record(z.any()).optional(),\n error: z.string().optional(),\n duration_ms: z.number().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('todo_updated'),\n todo_list_id: z.string(),\n todo_list_version: z.number().int().nonnegative(),\n items: z.array(AgentTodoItem),\n }),\n BaseEvent.extend({\n type: z.literal('subrun_trace'),\n parent_tool_call_id: z.string(),\n subrun_id: z.string(),\n subrun_parent_id: z.string().optional(),\n kind: z.enum([\n 'thought_delta',\n 'thought_complete',\n 'tool_call_decision',\n 'tool_process',\n 'tool_output',\n 'final_answer_chunk',\n 'final_answer',\n ]),\n delta: z.string().optional(),\n content: z.string().optional(),\n tool_name: z.string().optional(),\n tool_call_id: z.string().optional(),\n phase: ToolCallPhase.optional(),\n status: Status.optional(),\n args: z.unknown().optional(),\n output: z.unknown().optional(),\n duration_ms: z.number().optional(),\n meta: z.record(z.unknown()).optional(),\n }),\n BaseEvent.extend({\n type: z.literal('requires_user_interaction'),\n form: z.any().optional(),\n interaction_type: z.string().optional(),\n prompt: z.string().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('audit_envelope'),\n envelope: AuditEnvelope,\n }),\n BaseEvent.extend({\n type: z.literal('final_answer'),\n answer_id: z.string(),\n content: z.string(),\n is_complete: z.boolean().default(true),\n reasoning_details: ProviderReasoningDetailsPayload.optional(),\n meta: z.record(z.any()).optional(),\n }),\n BaseEvent.extend({\n type: z.literal('final_answer_chunk'),\n answer_id: z.string(),\n seq: z.number().int().nonnegative(),\n content: z.string(),\n is_last: z.boolean().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('history_summary'),\n content: z.string(),\n replaced_message_ids: z.array(z.string()),\n summary_seq: z.number().int().nonnegative(),\n original_message_count: z.number().int().nonnegative().optional(),\n compression_ratio: z.number().min(0).max(1).optional(),\n included_old_summary: z.boolean().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('error'),\n error: z.string(),\n details: z.any().optional(),\n error_code: z.string().optional(),\n retryable: z.boolean().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('control'),\n op: z.enum(['truncate_after', 'replace', 'redo', 'branch']),\n target_id: z.string().optional(),\n reason: z.string().optional(),\n meta: z.any().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('stream_end'),\n reason: z.enum(['complete', 'error', 'interrupted', 'timeout']).optional(),\n reason_message: z.string().optional(),\n stats: z.object({\n total_events: z.number().optional(),\n duration_ms: z.number().optional(),\n error_count: z.number().optional(),\n }).optional(),\n }),\n]);\n\nexport type RuntimeEvent = z.infer<typeof RuntimeEvent>;\nexport type UserInputEvent = Extract<RuntimeEvent, { type: 'user_input' }>;\nexport type ThoughtEvent = Extract<RuntimeEvent, { type: 'thought' }>;\nexport type ToolCallDecisionEvent = Extract<RuntimeEvent, { type: 'tool_call_decision' }>;\nexport type ToolProcessEvent = Extract<RuntimeEvent, { type: 'tool_process' }>;\nexport type ToolOutputEvent = Extract<RuntimeEvent, { type: 'tool_output' }>;\nexport type TodoUpdatedEvent = Extract<RuntimeEvent, { type: 'todo_updated' }>;\nexport type SubRunTraceEvent = Extract<RuntimeEvent, { type: 'subrun_trace' }>;\nexport type RequiresUserInteractionEvent = Extract<RuntimeEvent, { type: 'requires_user_interaction' }>;\nexport type AuditEnvelopeEvent = Extract<RuntimeEvent, { type: 'audit_envelope' }>;\nexport type FinalAnswerEvent = Extract<RuntimeEvent, { type: 'final_answer' }>;\nexport type FinalAnswerChunkEvent = Extract<RuntimeEvent, { type: 'final_answer_chunk' }>;\nexport type HistorySummaryEvent = Extract<RuntimeEvent, { type: 'history_summary' }>;\nexport type ErrorEvent = Extract<RuntimeEvent, { type: 'error' }>;\nexport type ControlEvent = Extract<RuntimeEvent, { type: 'control' }>;\nexport type StreamEndEvent = Extract<RuntimeEvent, { type: 'stream_end' }>;\n\nexport const validateRuntimeEvent = (event: unknown) => RuntimeEvent.safeParse(event);\nexport const validateRuntimeEvents = (events: unknown[]) => z.array(RuntimeEvent).safeParse(events);\n\nexport const createUserInputEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n content: string,\n options: Partial<UserInputEvent> = {},\n): UserInputEvent => ({\n type: 'user_input',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n content,\n source: 'user',\n ...options,\n});\n\nexport const createThoughtEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n content: string,\n options: Partial<ThoughtEvent> = {},\n): ThoughtEvent => ({\n type: 'thought',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n content,\n is_complete: false,\n ...options,\n});\n\nexport const createToolCallDecisionEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n options: Partial<ToolCallDecisionEvent> = {},\n): ToolCallDecisionEvent => ({\n type: 'tool_call_decision',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n tool_name: toolName,\n tool_call_id: toolCallId,\n phase: 'start',\n status: 'loading',\n ...options,\n});\n\nexport const createToolProcessEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n options: Partial<ToolProcessEvent> = {},\n): ToolProcessEvent => ({\n type: 'tool_process',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n tool_name: toolName,\n tool_call_id: toolCallId,\n phase: 'start',\n status: 'loading',\n ...options,\n});\n\nexport const createSubRunTraceEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n parentToolCallId: string,\n subrunId: string,\n kind: SubRunTraceEvent['kind'],\n options: Partial<SubRunTraceEvent> = {},\n): SubRunTraceEvent => ({\n type: 'subrun_trace',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n ephemeral: true,\n parent_tool_call_id: parentToolCallId,\n subrun_id: subrunId,\n kind,\n ...options,\n});\n\nexport const createToolOutputEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n output: unknown,\n status: 'success' | 'error' = 'success',\n options: Partial<ToolOutputEvent> = {},\n): ToolOutputEvent => ({\n type: 'tool_output',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n tool_name: toolName,\n tool_call_id: toolCallId,\n status,\n output,\n ...options,\n});\n\nexport const createTodoUpdatedEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n todoListId: string,\n todoListVersion: number,\n items: TodoUpdatedEvent['items'],\n options: Partial<TodoUpdatedEvent> = {},\n): TodoUpdatedEvent => ({\n type: 'todo_updated',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n todo_list_id: todoListId,\n todo_list_version: todoListVersion,\n items,\n ...options,\n});\n\nexport const createFinalAnswerEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n answerId: string,\n content: string,\n options: Partial<FinalAnswerEvent> = {},\n): FinalAnswerEvent => ({\n type: 'final_answer',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n answer_id: answerId,\n content,\n is_complete: true,\n ...options,\n});\n\nexport const createAuditEnvelopeEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n envelope: AuditEnvelopeEvent['envelope'],\n options: Partial<AuditEnvelopeEvent> = {},\n): AuditEnvelopeEvent => ({\n type: 'audit_envelope',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: envelope.ts,\n version: 1,\n envelope,\n metadata: {\n audit_action: envelope.action,\n run_context: {\n runId: envelope.runId,\n parentId: envelope.parentRunId,\n traceId: envelope.scope?.traceId,\n },\n },\n ...options,\n});\n\nexport const createFinalAnswerChunkEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n answerId: string,\n seq: number,\n content: string,\n options: Partial<FinalAnswerChunkEvent> = {},\n): FinalAnswerChunkEvent => ({\n type: 'final_answer_chunk',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n answer_id: answerId,\n seq,\n content,\n ...options,\n});\n\nexport const createHistorySummaryEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n content: string,\n replacedMessageIds: string[],\n summarySeq: number,\n options: Partial<HistorySummaryEvent> = {},\n): HistorySummaryEvent => ({\n type: 'history_summary',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n content,\n replaced_message_ids: replacedMessageIds,\n summary_seq: summarySeq,\n ...options,\n});\n\nexport const createErrorEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n error: string,\n options: Partial<ErrorEvent> = {},\n): ErrorEvent => ({\n type: 'error',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n error,\n ...options,\n});\n\nexport const createStreamEndEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n options: Partial<StreamEndEvent> = {},\n): StreamEndEvent => ({\n type: 'stream_end',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n ...options,\n});\n","export const DEFAULT_MAX_STEPS = 80;\n","import { z } from 'zod';\n\nexport const ExecutionTraceContext = z.object({\n execution_id: z.string().describe('The unique identifier for a single, complete execution flow.'),\n trace_id: z.string().optional().describe('An optional trace ID for correlating logs in an APM system.'),\n});\n\nconst EventEnvelopeSchema = z.object({\n seq: z.number().int().nonnegative().describe('A monotonically increasing sequence number within a single execution.'),\n timestamp: z.number().describe('The high-precision timestamp of when the event occurred.'),\n trace: ExecutionTraceContext,\n source: z.string().describe(\"The origin of the event, e.g., 'ai', 'tool:file_reader', 'system:summary'.\"),\n payload: z.unknown(),\n render_hint: z.object({\n card: z.enum(['normal', 'collapsible', 'none', 'image', 'interactive']).optional().describe('Hint for how the UI card should be rendered.'),\n content: z.enum(['markdown', 'text', 'json', 'image_url', 'code']).default('text').describe('Hint for how the content itself should be interpreted.'),\n }).optional(),\n run_location: z.enum(['frontend', 'backend']).optional().describe('Specifies where a tool action should be or was executed.'),\n});\n\nexport const EventEnvelope = EventEnvelopeSchema;\n\ntype EventEnvelopeBase = z.infer<typeof EventEnvelopeSchema>;\n\nexport type EventEnvelope<TPayload = unknown> = Omit<EventEnvelopeBase, 'payload'> & {\n payload: TPayload;\n};\n\nexport type ExecutionTraceContext = z.infer<typeof ExecutionTraceContext>;\n","import { z } from 'zod';\n\nexport const BaseSSEEvent = z.object({\n id: z.string(),\n timestamp: z.number(),\n conversation_id: z.string(),\n turn_id: z.string(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport type BaseSSEEvent = z.infer<typeof BaseSSEEvent>;\n\nexport const SSEThoughtEvent = BaseSSEEvent.extend({\n type: z.literal('thought'),\n thought_message_id: z.string().optional(),\n delta: z.string().optional(),\n content: z.string().optional(),\n is_complete: z.boolean().default(false),\n});\n\nexport type SSEThoughtEvent = z.infer<typeof SSEThoughtEvent>;\n\nexport const SSEFinalAnswerChunkEvent = BaseSSEEvent.extend({\n type: z.literal('final_answer_chunk'),\n answer_id: z.string(),\n seq: z.number().int().nonnegative(),\n chunk: z.string(),\n is_last: z.boolean().optional(),\n});\n\nexport type SSEFinalAnswerChunkEvent = z.infer<typeof SSEFinalAnswerChunkEvent>;\n\nexport const SSEFinalAnswerEvent = BaseSSEEvent.extend({\n type: z.literal('final_answer'),\n answer_id: z.string(),\n content: z.string(),\n meta: z.record(z.any()).optional(),\n});\n\nexport type SSEFinalAnswerEvent = z.infer<typeof SSEFinalAnswerEvent>;\n\nexport const SSEMarkdownChunkEvent = BaseSSEEvent.extend({\n type: z.literal('markdown_chunk'),\n content_type: z.enum(['text', 'code', 'table', 'image']).default('text'),\n text: z.string(),\n seq: z.number().optional(),\n});\n\nexport type SSEMarkdownChunkEvent = z.infer<typeof SSEMarkdownChunkEvent>;\n\nconst BaseSSEToolLifecycleEvent = BaseSSEEvent.extend({\n tool_name: z.string(),\n tool_call_id: z.string(),\n phase: z.enum(['start', 'update', 'complete', 'error']),\n status: z.enum(['loading', 'success', 'error']),\n args: z.any().optional(),\n payload: z.any().optional(),\n meta: z.record(z.any()).optional(),\n});\n\nexport const SSEToolCallDecisionEvent = BaseSSEToolLifecycleEvent.extend({\n type: z.literal('tool_call_decision'),\n});\n\nexport type SSEToolCallDecisionEvent = z.infer<typeof SSEToolCallDecisionEvent>;\n\nexport const SSEToolProcessEvent = BaseSSEToolLifecycleEvent.extend({\n type: z.literal('tool_process'),\n});\n\nexport type SSEToolProcessEvent = z.infer<typeof SSEToolProcessEvent>;\n\nexport const SSEToolOutputEvent = BaseSSEEvent.extend({\n type: z.literal('tool_output'),\n tool_name: z.string(),\n tool_call_id: z.string(),\n status: z.enum(['success', 'error']),\n output: z.any().optional(),\n payload: z.record(z.any()).optional(),\n duration_ms: z.number().optional(),\n});\n\nexport type SSEToolOutputEvent = z.infer<typeof SSEToolOutputEvent>;\n\nexport const SSETodoUpdatedEvent = BaseSSEEvent.extend({\n type: z.literal('todo_updated'),\n todo_list_id: z.string(),\n todo_list_version: z.number().int().nonnegative(),\n items: z.array(z.object({\n id: z.string(),\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed', 'cancelled']),\n })),\n});\n\nexport type SSETodoUpdatedEvent = z.infer<typeof SSETodoUpdatedEvent>;\n\nexport const SSESubRunTraceEvent = BaseSSEEvent.extend({\n type: z.literal('subrun_trace'),\n parent_tool_call_id: z.string(),\n subrun_id: z.string(),\n subrun_parent_id: z.string().optional(),\n kind: z.enum([\n 'thought_delta',\n 'thought_complete',\n 'tool_call_decision',\n 'tool_process',\n 'tool_output',\n 'final_answer_chunk',\n 'final_answer',\n ]),\n delta: z.string().optional(),\n content: z.string().optional(),\n tool_name: z.string().optional(),\n tool_call_id: z.string().optional(),\n phase: z.enum(['start', 'update', 'complete', 'error']).optional(),\n status: z.enum(['loading', 'success', 'error']).optional(),\n args: z.unknown().optional(),\n output: z.unknown().optional(),\n duration_ms: z.number().optional(),\n meta: z.record(z.unknown()).optional(),\n});\n\nexport type SSESubRunTraceEvent = z.infer<typeof SSESubRunTraceEvent>;\n\nexport const SSERequiresUserInteractionEvent = BaseSSEEvent.extend({\n type: z.literal('requires_user_interaction'),\n form: z.any().optional(),\n interaction_type: z.string().optional(),\n prompt: z.string().optional(),\n});\n\nexport type SSERequiresUserInteractionEvent = z.infer<typeof SSERequiresUserInteractionEvent>;\n\nexport const SSEErrorEvent = BaseSSEEvent.extend({\n type: z.literal('error'),\n error: z.string(),\n details: z.any().optional(),\n error_code: z.string().optional(),\n retryable: z.boolean().optional(),\n});\n\nexport type SSEErrorEvent = z.infer<typeof SSEErrorEvent>;\n\nexport const SSEStreamEndEvent = BaseSSEEvent.extend({\n type: z.literal('stream_end'),\n reason: z.enum(['complete', 'error', 'interrupted', 'timeout']).optional(),\n reason_message: z.string().optional(),\n stats: z.object({\n total_events: z.number().optional(),\n duration_ms: z.number().optional(),\n error_count: z.number().optional(),\n benchmark: z.record(z.unknown()).optional(),\n }).optional(),\n});\n\nexport type SSEStreamEndEvent = z.infer<typeof SSEStreamEndEvent>;\n\nexport const SSEHistorySummaryEvent = BaseSSEEvent.extend({\n type: z.literal('history_summary'),\n summary_id: z.string(),\n content: z.string(),\n original_message_count: z.number().int().nonnegative(),\n summary_seq: z.number().int().nonnegative(),\n});\n\nexport type SSEHistorySummaryEvent = z.infer<typeof SSEHistorySummaryEvent>;\n\nexport const SSESummarizationStartEvent = BaseSSEEvent.extend({\n type: z.literal('summarization_start'),\n originalMessages: z.number().optional(),\n});\n\nexport type SSESummarizationStartEvent = z.infer<typeof SSESummarizationStartEvent>;\n\nexport const SSESummarizationEndEvent = BaseSSEEvent.extend({\n type: z.literal('summarization_end'),\n originalMessages: z.number().optional(),\n compressedMessages: z.number().optional(),\n compressionRatio: z.string().optional(),\n timeSaved: z.string().optional(),\n});\n\nexport type SSESummarizationEndEvent = z.infer<typeof SSESummarizationEndEvent>;\n\nexport const SSESummarizationErrorEvent = BaseSSEEvent.extend({\n type: z.literal('summarization_error'),\n error: z.string(),\n});\n\nexport type SSESummarizationErrorEvent = z.infer<typeof SSESummarizationErrorEvent>;\n\nexport const SSEEvent = z.discriminatedUnion('type', [\n SSEThoughtEvent,\n SSEFinalAnswerChunkEvent,\n SSEFinalAnswerEvent,\n SSEMarkdownChunkEvent,\n SSEToolCallDecisionEvent,\n SSEToolProcessEvent,\n SSEToolOutputEvent,\n SSETodoUpdatedEvent,\n SSESubRunTraceEvent,\n SSERequiresUserInteractionEvent,\n SSEErrorEvent,\n SSEStreamEndEvent,\n SSEHistorySummaryEvent,\n SSESummarizationStartEvent,\n SSESummarizationEndEvent,\n SSESummarizationErrorEvent,\n]);\n\nexport type SSEEvent = z.infer<typeof SSEEvent>;\n\nexport const validateSSEEvent = (event: unknown) => SSEEvent.safeParse(event);\n\nexport const createSSEThoughtEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n options: { thought_message_id?: string; delta?: string; content?: string; is_complete?: boolean } = {},\n): SSEThoughtEvent => ({\n type: 'thought',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n is_complete: false,\n ...options,\n});\n\nexport const createSSEFinalAnswerChunkEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n answerId: string,\n seq: number,\n chunk: string,\n options: { is_last?: boolean } = {},\n): SSEFinalAnswerChunkEvent => ({\n type: 'final_answer_chunk',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n answer_id: answerId,\n seq,\n chunk,\n ...options,\n});\n\nexport const createSSEFinalAnswerEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n answerId: string,\n content: string,\n options: Partial<SSEFinalAnswerEvent> = {},\n): SSEFinalAnswerEvent => ({\n type: 'final_answer',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n answer_id: answerId,\n content,\n ...options,\n});\n\nexport const createSSEMarkdownChunkEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n text: string,\n options: Partial<SSEMarkdownChunkEvent> = {},\n): SSEMarkdownChunkEvent => ({\n type: 'markdown_chunk',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n text,\n content_type: 'text',\n ...options,\n});\n\nexport const createSSEToolCallDecisionEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n phase: SSEToolCallDecisionEvent['phase'],\n status: SSEToolCallDecisionEvent['status'],\n options: Partial<SSEToolCallDecisionEvent> = {},\n): SSEToolCallDecisionEvent => ({\n type: 'tool_call_decision',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n tool_name: toolName,\n tool_call_id: toolCallId,\n phase,\n status,\n ...options,\n});\n\nexport const createSSEToolProcessEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n phase: SSEToolProcessEvent['phase'],\n status: SSEToolProcessEvent['status'],\n options: Partial<SSEToolProcessEvent> = {},\n): SSEToolProcessEvent => ({\n type: 'tool_process',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n tool_name: toolName,\n tool_call_id: toolCallId,\n phase,\n status,\n ...options,\n});\n\nexport const createSSEToolOutputEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n status: SSEToolOutputEvent['status'],\n output: unknown,\n options: Partial<SSEToolOutputEvent> = {},\n): SSEToolOutputEvent => ({\n type: 'tool_output',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n tool_name: toolName,\n tool_call_id: toolCallId,\n status,\n output,\n ...options,\n});\n\nexport const createSSETodoUpdatedEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n todoListId: string,\n todoListVersion: number,\n items: SSETodoUpdatedEvent['items'],\n options: Partial<SSETodoUpdatedEvent> = {},\n): SSETodoUpdatedEvent => ({\n type: 'todo_updated',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n todo_list_id: todoListId,\n todo_list_version: todoListVersion,\n items,\n ...options,\n});\n\nexport const createSSESubRunTraceEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n parentToolCallId: string,\n subrunId: string,\n kind: SSESubRunTraceEvent['kind'],\n options: Partial<SSESubRunTraceEvent> = {},\n): SSESubRunTraceEvent => ({\n type: 'subrun_trace',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n parent_tool_call_id: parentToolCallId,\n subrun_id: subrunId,\n kind,\n ...options,\n});\n\nexport const createSSERequiresUserInteractionEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n options: Partial<SSERequiresUserInteractionEvent> = {},\n): SSERequiresUserInteractionEvent => ({\n type: 'requires_user_interaction',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n ...options,\n});\n\nexport const createSSEErrorEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n error: string,\n options: Partial<SSEErrorEvent> = {},\n): SSEErrorEvent => ({\n type: 'error',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n error,\n ...options,\n});\n\nexport const createSSEStreamEndEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n options: Partial<SSEStreamEndEvent> = {},\n): SSEStreamEndEvent => ({\n type: 'stream_end',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n ...options,\n});\n\nexport const createSSEHistorySummaryEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n summaryId: string,\n content: string,\n originalMessageCount: number,\n summarySeq: number,\n options: Partial<SSEHistorySummaryEvent> = {},\n): SSEHistorySummaryEvent => ({\n type: 'history_summary',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n summary_id: summaryId,\n content,\n original_message_count: originalMessageCount,\n summary_seq: summarySeq,\n ...options,\n});\n","import {\n AgentSpecContextPolicy,\n type AgentSpecContextPolicyInput,\n defineContextPolicy,\n} from '../../contracts';\n\nexport interface MergeContextPolicyParams {\n frameworkDefault?: AgentSpecContextPolicyInput;\n hostFallback?: AgentSpecContextPolicyInput;\n agentSpec?: AgentSpecContextPolicyInput;\n}\n\n/**\n * 合并三层 contextPolicy。\n *\n * 中文备注:\n * - 优先级:frameworkDefault < hostFallback < agentSpec;\n * - 按分组做字段级合并;\n * - 数组字段整体替换,不做 concat,避免 host/agent 的规则顺序变得不可预测。\n */\nexport function mergeContextPolicy(params: MergeContextPolicyParams): AgentSpecContextPolicy {\n const merged = mergePolicyLayer(\n mergePolicyLayer(params.frameworkDefault, params.hostFallback),\n params.agentSpec,\n );\n\n return defineContextPolicy(merged);\n}\n\nfunction mergePolicyLayer(\n base: AgentSpecContextPolicyInput | undefined,\n override: AgentSpecContextPolicyInput | undefined,\n): AgentSpecContextPolicyInput {\n if (!base && !override) {\n return {};\n }\n if (!override) {\n return { ...base };\n }\n if (!base) {\n return { ...override };\n }\n\n return {\n ...base,\n ...override,\n budget: mergeObject(base.budget, override.budget),\n toolHistory: mergeObject(base.toolHistory, override.toolHistory),\n toolOutput: mergeToolOutput(base.toolOutput, override.toolOutput),\n providerReplay: mergeObject(base.providerReplay, override.providerReplay),\n summarization: mergeObject(base.summarization, override.summarization),\n mustKeep: mergeObject(base.mustKeep, override.mustKeep),\n workingMemory: mergeObject(base.workingMemory, override.workingMemory),\n checkpoint: mergeObject(base.checkpoint, override.checkpoint),\n reasoningRetention: mergeObject(base.reasoningRetention, override.reasoningRetention),\n tokenEstimation: mergeObject(base.tokenEstimation, override.tokenEstimation),\n systemReminder: mergeSystemReminder(base.systemReminder, override.systemReminder),\n contextTrace: mergeObject(base.contextTrace, override.contextTrace),\n };\n}\n\nfunction mergeObject<T extends object>(\n base: T | undefined,\n override: T | undefined,\n): T | undefined {\n if (!base && !override) {\n return undefined;\n }\n return {\n ...base,\n ...override,\n } as T;\n}\n\nfunction mergeSystemReminder(\n base: AgentSpecContextPolicyInput['systemReminder'],\n override: AgentSpecContextPolicyInput['systemReminder'],\n): AgentSpecContextPolicyInput['systemReminder'] {\n if (!base && !override) {\n return undefined;\n }\n return {\n ...base,\n ...override,\n thresholds: mergeObject(base?.thresholds, override?.thresholds),\n extraRules: override?.extraRules ?? base?.extraRules,\n };\n}\n\nfunction mergeToolOutput(\n base: AgentSpecContextPolicyInput['toolOutput'],\n override: AgentSpecContextPolicyInput['toolOutput'],\n): AgentSpecContextPolicyInput['toolOutput'] {\n if (!base && !override) {\n return undefined;\n }\n return {\n ...base,\n ...override,\n observationGovernance: mergeObject(base?.observationGovernance, override?.observationGovernance),\n };\n}\n","import type {\n AgentSpecContextPolicy,\n AgentSpecContextTracePolicy,\n AiMessage,\n} from '../../contracts';\nimport type { MessageProcessingState } from './providers/base';\n\nexport type ContextTraceEvent =\n | ContextTraceProviderEvent\n | ContextTraceMessageDecisionEvent;\n\nexport interface ContextTraceProviderEvent {\n kind: 'provider';\n providerName: string;\n skipped: boolean;\n durationMs: number;\n beforeTokens: number;\n afterTokens: number;\n tokenDelta: number;\n tokensUsed: number;\n beforeKeptCount: number;\n afterKeptCount: number;\n strategiesApplied: string[];\n remainingBudget: number;\n}\n\nexport interface ContextTraceMessageDecisionEvent {\n kind: 'message-decision';\n originalIndex: number;\n messageId?: string;\n role: AiMessage['role'];\n type: AiMessage['type'];\n action: MessageProcessingState['action'];\n phase?: string;\n tokens: number;\n kept: boolean;\n reason: string;\n replacementSourceIds?: string[];\n}\n\nexport interface ContextTrace {\n enabled: true;\n includeMessageIds: boolean;\n includeTokenBreakdown: boolean;\n maxTraceEvents: number;\n overflowed: boolean;\n effectivePolicy?: AgentSpecContextPolicy;\n totalBudget: number;\n originalCount: number;\n finalCount: number;\n finalTokens: number;\n truncated: boolean;\n events: ContextTraceEvent[];\n}\n\ninterface ContextTraceCollectorOptions {\n policy?: AgentSpecContextTracePolicy;\n effectivePolicy?: AgentSpecContextPolicy;\n totalBudget: number;\n originalCount: number;\n}\n\ninterface ProviderSnapshot {\n tokens: number;\n keptCount: number;\n}\n\ninterface ProviderTraceInput {\n providerName: string;\n skipped: boolean;\n durationMs: number;\n beforeStates: ReadonlyArray<MessageProcessingState>;\n afterStates: ReadonlyArray<MessageProcessingState>;\n tokensUsed: number;\n strategiesApplied: readonly string[];\n remainingBudget: number;\n}\n\n/**\n * ContextTrace 的最小采集器。\n *\n * 中文备注:\n * - trace 只描述“本次上下文构建如何选择消息”,不进入 LLM 输入;\n * - 采集器内部做 maxTraceEvents 限流,避免观测数据反过来膨胀。\n */\nexport class ContextTraceCollector {\n private readonly includeMessageIds: boolean;\n private readonly includeTokenBreakdown: boolean;\n private readonly maxTraceEvents: number;\n private readonly effectivePolicy?: AgentSpecContextPolicy;\n private readonly totalBudget: number;\n private readonly originalCount: number;\n private readonly events: ContextTraceEvent[] = [];\n private overflowed = false;\n\n private constructor(options: Required<Pick<ContextTraceCollectorOptions, 'totalBudget' | 'originalCount'>> & {\n policy?: AgentSpecContextTracePolicy;\n effectivePolicy?: AgentSpecContextPolicy;\n }) {\n this.includeMessageIds = options.policy?.includeMessageIds ?? true;\n this.includeTokenBreakdown = options.policy?.includeTokenBreakdown ?? true;\n this.maxTraceEvents = options.policy?.maxTraceEvents ?? 200;\n this.effectivePolicy = options.effectivePolicy;\n this.totalBudget = options.totalBudget;\n this.originalCount = options.originalCount;\n }\n\n static create(options: ContextTraceCollectorOptions): ContextTraceCollector | undefined {\n if (options.policy?.enabled !== true) {\n return undefined;\n }\n return new ContextTraceCollector(options);\n }\n\n recordProvider(input: ProviderTraceInput): void {\n const before = snapshotStates(input.beforeStates);\n const after = snapshotStates(input.afterStates);\n this.push({\n kind: 'provider',\n providerName: input.providerName,\n skipped: input.skipped,\n durationMs: input.durationMs,\n beforeTokens: this.includeTokenBreakdown ? before.tokens : 0,\n afterTokens: this.includeTokenBreakdown ? after.tokens : 0,\n tokenDelta: this.includeTokenBreakdown ? after.tokens - before.tokens : 0,\n tokensUsed: this.includeTokenBreakdown ? input.tokensUsed : 0,\n beforeKeptCount: before.keptCount,\n afterKeptCount: after.keptCount,\n strategiesApplied: [...input.strategiesApplied],\n remainingBudget: input.remainingBudget,\n });\n }\n\n recordMessageDecisions(states: ReadonlyArray<MessageProcessingState>): void {\n for (const state of states) {\n const kept = state.action.startsWith('keep_');\n this.push({\n kind: 'message-decision',\n originalIndex: state.originalIndex,\n ...(this.includeMessageIds ? { messageId: state.message.id } : {}),\n role: state.message.role,\n type: state.message.type,\n action: state.action,\n ...(state.phase ? { phase: state.phase } : {}),\n tokens: this.includeTokenBreakdown ? state.tokens : 0,\n kept,\n reason: buildDecisionReason(state, kept),\n ...(state.replacementSourceIds ? { replacementSourceIds: [...state.replacementSourceIds] } : {}),\n });\n }\n }\n\n build(finalMessages: ReadonlyArray<AiMessage>, finalTokens: number): ContextTrace {\n return {\n enabled: true,\n includeMessageIds: this.includeMessageIds,\n includeTokenBreakdown: this.includeTokenBreakdown,\n maxTraceEvents: this.maxTraceEvents,\n overflowed: this.overflowed,\n ...(this.effectivePolicy ? { effectivePolicy: this.effectivePolicy } : {}),\n totalBudget: this.totalBudget,\n originalCount: this.originalCount,\n finalCount: finalMessages.length,\n finalTokens,\n truncated: this.originalCount !== finalMessages.length,\n events: [...this.events],\n };\n }\n\n private push(event: ContextTraceEvent): void {\n if (this.events.length >= this.maxTraceEvents) {\n this.overflowed = true;\n return;\n }\n this.events.push(event);\n }\n}\n\nfunction snapshotStates(states: ReadonlyArray<MessageProcessingState>): ProviderSnapshot {\n return states.reduce<ProviderSnapshot>(\n (acc, state) => {\n if (state.action.startsWith('keep_')) {\n acc.tokens += state.tokens;\n acc.keptCount += 1;\n }\n return acc;\n },\n { tokens: 0, keptCount: 0 },\n );\n}\n\nfunction buildDecisionReason(state: MessageProcessingState, kept: boolean): string {\n if (kept) {\n return state.phase ? `kept_by_${state.phase}` : `kept_by_${state.action}`;\n }\n if (state.phase) {\n return `dropped_by_${state.phase}`;\n }\n return 'dropped_by_budget_or_priority';\n}\n","import type { AiMessage } from '../../../contracts';\n\nexport interface ToolSummaryProvider {\n getTool(toolName: string): {\n getExecutionSummary?: (output: string) => string;\n } | undefined;\n}\n\nexport interface PreprocessorContext {\n debugMode?: boolean;\n model?: string;\n toolSummaryProvider?: ToolSummaryProvider;\n}\n\nexport interface PreprocessorResult {\n messages: AiMessage[];\n stats: {\n originalCount: number;\n processedCount: number;\n removedCount: number;\n modifiedCount: number;\n };\n appliedStrategies: string[];\n}\n\nexport interface IPreprocessor {\n readonly name: string;\n readonly description: string;\n readonly priority: number;\n\n process(\n messages: AiMessage[],\n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean;\n}\n\nexport abstract class BasePreprocessor implements IPreprocessor {\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly priority: number;\n\n abstract process(\n messages: AiMessage[],\n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean {\n return false;\n }\n\n protected createResult(\n originalMessages: AiMessage[],\n processedMessages: AiMessage[],\n appliedStrategies: string[],\n modifiedCount: number = 0\n ): PreprocessorResult {\n const removedCount = originalMessages.length - processedMessages.length;\n\n return {\n messages: processedMessages,\n stats: {\n originalCount: originalMessages.length,\n processedCount: processedMessages.length,\n removedCount,\n modifiedCount,\n },\n appliedStrategies,\n };\n }\n\n protected debug(message: string, data?: Record<string, unknown>, context?: PreprocessorContext): void {\n if (context?.debugMode) {\n console.log(`[${this.name}] ${message}`, data);\n }\n }\n}\n","import {\n BasePreprocessor,\n type PreprocessorContext,\n type PreprocessorResult,\n} from './base';\nimport type { AiMessage } from '../../../contracts';\n\nexport interface HistoryPurificationConfig {\n logPrefix?: string;\n}\n\nexport class HistoryPurificationPreprocessor extends BasePreprocessor {\n readonly name = 'HistoryPurificationPreprocessor';\n readonly description = '基于摘要ID列表的历史净化处理器';\n readonly priority = 1;\n\n private logPrefix: string;\n\n constructor(config: HistoryPurificationConfig = {}) {\n super();\n this.logPrefix = config.logPrefix || 'HistoryPurification';\n }\n\n async process(messages: AiMessage[], context: PreprocessorContext): Promise<PreprocessorResult> {\n this.debug('🧹 开始历史净化处理', { 原始消息数: messages.length }, context);\n\n const cleanedMessages = this.cleanHistoryWithSummaryReplacement(messages, context);\n const removedCount = messages.length - cleanedMessages.length;\n const appliedStrategies = removedCount > 0 ? ['summary_replacement_cleanup'] : [];\n\n this.debug(\n '✅ 历史净化完成',\n {\n 原始消息: messages.length,\n 净化后消息: cleanedMessages.length,\n 移除消息: removedCount,\n },\n context,\n );\n\n return this.createResult(messages, cleanedMessages, appliedStrategies, 0);\n }\n\n shouldSkip(messages: AiMessage[], context: PreprocessorContext): boolean {\n const hasSummaryMessages = messages.some((msg) => msg.type === 'history_summary');\n if (!hasSummaryMessages) {\n this.debug('⏭️ 无摘要消息,跳过历史净化', {}, context);\n return true;\n }\n return false;\n }\n\n private findLatestSummary(summaryMessages: AiMessage[]): AiMessage {\n return summaryMessages.reduce((latest, current) => {\n const latestSeq = latest.metadata?.summarySeq ?? -1;\n const currentSeq = current.metadata?.summarySeq ?? -1;\n return currentSeq > latestSeq ? current : latest;\n }, summaryMessages[0]);\n }\n\n private cleanHistoryWithSummaryReplacement(\n messages: AiMessage[],\n context: PreprocessorContext,\n ): AiMessage[] {\n const summaryMessages = messages.filter((m) => m.type === 'history_summary');\n\n console.log(`[${this.logPrefix}] 🧹 开始历史净化(基于ID列表)`);\n console.log(`[${this.logPrefix}] 📊 总消息数: ${messages.length}, 摘要消息数: ${summaryMessages.length}`);\n\n this.debug(\n '🧹 开始历史净化',\n {\n 总消息数: messages.length,\n 摘要消息数: summaryMessages.length,\n },\n context,\n );\n\n if (summaryMessages.length === 0) {\n console.log(`[${this.logPrefix}] ⚠️ 未发现摘要消息,但不应该跳过(shouldSkip没有触发?)`);\n this.debug('⚠️ 未发现摘要消息', {}, context);\n return messages;\n }\n\n const latestSummary = this.findLatestSummary(summaryMessages);\n\n console.log(`[${this.logPrefix}] 📋 最新摘要:`, {\n id: latestSummary.id,\n summarySeq: latestSummary.metadata?.summarySeq,\n hasReplacedIds: Array.isArray(latestSummary.metadata?.replacedMessageIds),\n replacedCount: latestSummary.metadata?.replacedMessageIds?.length || 0,\n });\n\n this.debug(\n '📋 最新摘要',\n {\n id: latestSummary.id,\n summarySeq: latestSummary.metadata?.summarySeq,\n hasReplacedIds: Array.isArray(latestSummary.metadata?.replacedMessageIds),\n replacedCount: latestSummary.metadata?.replacedMessageIds?.length || 0,\n },\n context,\n );\n\n if (!latestSummary?.metadata?.replacedMessageIds || latestSummary.metadata.replacedMessageIds.length === 0) {\n this.debug('⏭️ 最新摘要缺少 replacedMessageIds,跳过净化', { summaryId: latestSummary?.id }, context);\n return messages;\n }\n\n const idsToRemove = new Set(latestSummary.metadata.replacedMessageIds);\n\n const summariesInInput = messages.filter((m) => m.type === 'history_summary');\n console.log(`[${this.logPrefix}] 📥 收到的消息列表:`, {\n 总消息数: messages.length,\n 摘要消息数: summariesInInput.length,\n 摘要ID列表: summariesInInput.map((s) => ({ id: s.id, seq: s.metadata?.summarySeq })),\n 消息类型分布: messages.reduce((acc, m) => {\n acc[m.type] = (acc[m.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n });\n\n const summaryIdsInRemoveList = summariesInInput.filter((s) => idsToRemove.has(s.id || ''));\n console.log(`[${this.logPrefix}] ⚠️ 摘要ID检查:`, {\n 摘要是否在移除列表: summaryIdsInRemoveList.length > 0,\n 被误标记的摘要: summaryIdsInRemoveList.map((s) => ({ id: s.id, seq: s.metadata?.summarySeq })),\n });\n\n console.log(`[${this.logPrefix}] 🎯 执行ID列表净化`, {\n 要移除的ID数量: idsToRemove.size,\n 示例ID: Array.from(idsToRemove).slice(0, 3),\n });\n\n this.debug(\n '🎯 执行ID列表净化',\n {\n 要移除的ID数量: idsToRemove.size,\n 示例ID: Array.from(idsToRemove).slice(0, 3),\n },\n context,\n );\n\n const removedMessages: AiMessage[] = [];\n const finalMessages = messages.filter((msg) => {\n if (msg.id === latestSummary.id) {\n return true;\n }\n\n if (idsToRemove.has(msg.id)) {\n removedMessages.push(msg);\n return false;\n }\n\n const sourceIds = msg.metadata?.replacementSourceIds as string[] | undefined;\n if (sourceIds && Array.isArray(sourceIds)) {\n for (const sourceId of sourceIds) {\n if (idsToRemove.has(sourceId)) {\n removedMessages.push(msg);\n return false;\n }\n }\n }\n\n return true;\n });\n\n const removedCount = messages.length - finalMessages.length;\n const coveredRemovedIds = new Set<string>();\n for (const removedMessage of removedMessages) {\n if (typeof removedMessage.id === 'string' && idsToRemove.has(removedMessage.id)) {\n coveredRemovedIds.add(removedMessage.id);\n }\n const sourceIds = removedMessage.metadata?.replacementSourceIds;\n if (Array.isArray(sourceIds)) {\n for (const sourceId of sourceIds) {\n if (typeof sourceId === 'string' && idsToRemove.has(sourceId)) {\n coveredRemovedIds.add(sourceId);\n }\n }\n }\n }\n\n if (coveredRemovedIds.size !== idsToRemove.size) {\n const missingIds = Array.from(idsToRemove).filter((id) => !coveredRemovedIds.has(id));\n console.log(`[${this.logPrefix}] 🔍 移除差异详情`, {\n 缺失ID数量: missingIds.length,\n 缺失ID示例: missingIds.slice(0, 5),\n });\n }\n\n const summariesAfterClean = finalMessages.filter((m) => m.type === 'history_summary');\n console.log(`[${this.logPrefix}] 📤 净化后的消息列表:`, {\n 净化后消息数: finalMessages.length,\n 摘要消息数: summariesAfterClean.length,\n 摘要ID列表: summariesAfterClean.map((s) => ({ id: s.id, seq: s.metadata?.summarySeq })),\n 消息类型分布: finalMessages.reduce((acc, m) => {\n acc[m.type] = (acc[m.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n });\n\n console.log(`[${this.logPrefix}] ✅ 净化完成: ${messages.length} → ${finalMessages.length} (移除了 ${removedCount} 条消息)`);\n console.log(\n `[${this.logPrefix}] 📊 要移除的ID数量: ${idsToRemove.size}, 实际移除消息: ${removedCount}, 覆盖source ids: ${coveredRemovedIds.size}`,\n );\n\n this.debug(\n '✅ 净化完成',\n {\n 原始消息: messages.length,\n 净化后消息: finalMessages.length,\n 实际移除: removedCount,\n 预期移除: idsToRemove.size,\n 覆盖sourceIds: coveredRemovedIds.size,\n },\n context,\n );\n\n if (coveredRemovedIds.size !== idsToRemove.size) {\n console.log(`[${this.logPrefix}] ⚠️ 移除数量不匹配`, {\n 预期: idsToRemove.size,\n 实际覆盖: coveredRemovedIds.size,\n 差异: idsToRemove.size - coveredRemovedIds.size,\n });\n\n this.debug(\n '⚠️ 移除数量不匹配',\n {\n 预期: idsToRemove.size,\n 实际覆盖: coveredRemovedIds.size,\n 差异: idsToRemove.size - coveredRemovedIds.size,\n },\n context,\n );\n }\n\n return finalMessages;\n }\n}\n","import type { AiMessage } from '../../../contracts';\nimport type { FenceRegistry } from '../fences';\nimport { BasePreprocessor, type PreprocessorContext, type PreprocessorResult } from './base';\n\nexport interface FenceLifetimePreprocessorOptions {\n fenceRegistry: FenceRegistry;\n}\n\nexport class FenceLifetimePreprocessor extends BasePreprocessor {\n readonly name = 'FenceLifetimePreprocessor';\n readonly description = 'Removes expired turn-only context injection messages from history';\n readonly priority = 15;\n\n private readonly fenceRegistry: FenceRegistry;\n\n constructor(options: FenceLifetimePreprocessorOptions) {\n super();\n this.fenceRegistry = options.fenceRegistry;\n }\n\n async process(\n messages: AiMessage[],\n context: PreprocessorContext,\n ): Promise<PreprocessorResult> {\n const latestUserInputIndex = findLastIndex(messages, message => {\n return message.role === 'user' && message.type === 'user_input';\n });\n let modifiedCount = 0;\n const processedMessages: AiMessage[] = [];\n\n for (let index = 0; index < messages.length; index++) {\n const message = messages[index];\n if (message.type !== 'context_injection') {\n processedMessages.push(message);\n continue;\n }\n\n const fenceKind = message.metadata?.fenceKind;\n if (!fenceKind) {\n processedMessages.push(message);\n continue;\n }\n\n const descriptor = this.fenceRegistry.get(fenceKind);\n if (!descriptor) {\n this.debug(`Fence kind \"${fenceKind}\" is not registered; keeping message.`, { messageId: message.id }, context);\n processedMessages.push(message);\n continue;\n }\n\n const isHistorical = latestUserInputIndex === -1 || index < latestUserInputIndex;\n if (descriptor.lifetime === 'turn-only' && isHistorical) {\n modifiedCount++;\n continue;\n }\n\n processedMessages.push(message);\n }\n\n return this.createResult(\n messages,\n processedMessages,\n modifiedCount > 0 ? ['fence_lifetime'] : [],\n modifiedCount,\n );\n }\n}\n\nfunction findLastIndex<T>(items: T[], predicate: (item: T) => boolean): number {\n for (let index = items.length - 1; index >= 0; index--) {\n if (predicate(items[index])) {\n return index;\n }\n }\n return -1;\n}\n","import type {\n GenerateRequest,\n GenerateResponse,\n} from '../contracts/chatLineMessage';\nimport type { AiMessage, RuntimeEvent } from '../../../contracts';\n\nexport interface MessageProcessingState {\n message: AiMessage;\n originalIndex: number;\n action: 'keep_core' | 'keep_working_memory' | 'summarize' | 'skip';\n tokens: number;\n processedContent?: string;\n contentType?: 'full' | 'final_answer_only' | 'thinking_only';\n phase?: string;\n replacementSourceIds?: string[];\n}\n\nexport interface SummarizationCallbacks {\n onSummarizationStart?: () => void;\n onSummarizationEnd?: (info: {\n originalMessageCount: number;\n summaryTokenCount?: number;\n newSummaryId?: string;\n summaryEvent?: RuntimeEvent;\n }) => void;\n onSummarizationError?: (error: Error) => void;\n}\n\nexport interface ProviderContext<TConfig = unknown> {\n totalBudget: number;\n config: TConfig;\n debugMode: boolean;\n estimateTokens: (message: AiMessage) => number;\n summarizationCallbacks?: SummarizationCallbacks;\n /**\n * Host 注入的注册式 AI 调用入口。\n *\n * 中文备注:调用方必须通过 request.promptKey / agentId 解析已注册 agent/chat;\n * framework 不应在 Provider 内直接发起裸 LLM call。\n */\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>;\n}\n\nexport interface ProviderResult {\n states: MessageProcessingState[];\n tokensUsed: number;\n strategiesApplied: string[];\n stats: {\n processedCount: number;\n skippedCount: number;\n addedCount: number;\n };\n events?: RuntimeEvent[];\n}\n\nexport const TOOL_HISTORY_OVERFLOW_ERROR_CODE = 'TOOL_HISTORY_OVERFLOW' as const;\nexport const SUMMARIZATION_FAILED_ERROR_CODE = 'SUMMARIZATION_FAILED' as const;\n\nexport type ContextProviderErrorCode =\n | 'context_provider_failed'\n | typeof SUMMARIZATION_FAILED_ERROR_CODE\n | typeof TOOL_HISTORY_OVERFLOW_ERROR_CODE;\n\nexport interface ContextProviderErrorOptions {\n code: ContextProviderErrorCode;\n fatal?: boolean;\n providerName: string;\n message: string;\n cause?: unknown;\n}\n\n/**\n * Provider 内部向 pipeline 传递的结构化错误。\n *\n * 中文备注:\n * - pipeline 只能依赖 code/fatal 这类稳定字段做控制流判断;\n * - message 只用于日志和用户可见错误,不再承担协议语义。\n */\nexport class ContextProviderError extends Error {\n readonly code: ContextProviderErrorCode;\n readonly fatal: boolean;\n readonly providerName: string;\n readonly cause?: unknown;\n\n constructor(options: ContextProviderErrorOptions) {\n super(options.message);\n this.name = 'ContextProviderError';\n this.code = options.code;\n this.fatal = options.fatal ?? false;\n this.providerName = options.providerName;\n this.cause = options.cause;\n }\n}\n\nexport function isContextProviderError(error: unknown): error is ContextProviderError {\n return error instanceof ContextProviderError;\n}\n\nexport interface IContextProvider<TConfig = unknown> {\n readonly name: string;\n readonly description: string;\n readonly priority: number;\n\n provide(\n states: MessageProcessingState[],\n availableBudget: number,\n context: ProviderContext<TConfig>,\n ): Promise<ProviderResult>;\n\n shouldSkip?(\n states: MessageProcessingState[],\n availableBudget: number,\n context: ProviderContext<TConfig>,\n ): boolean;\n}\n\nexport abstract class BaseContextProvider<TConfig = unknown>\n implements IContextProvider<TConfig>\n{\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly priority: number;\n\n abstract provide(\n states: MessageProcessingState[],\n availableBudget: number,\n context: ProviderContext<TConfig>,\n ): Promise<ProviderResult>;\n\n shouldSkip(\n _states: MessageProcessingState[],\n availableBudget: number,\n _context: ProviderContext<TConfig>,\n ): boolean {\n return availableBudget <= 0;\n }\n\n protected debug(\n message: string,\n data?: Record<string, unknown>,\n context?: ProviderContext<TConfig>,\n ): void {\n if (context?.debugMode) {\n console.log(`[${this.name}] ${message}`, data);\n }\n }\n\n protected createResult(\n states: MessageProcessingState[],\n tokensUsed = 0,\n strategiesApplied: string[] = [],\n stats = { processedCount: 0, skippedCount: 0, addedCount: 0 },\n events: RuntimeEvent[] = [],\n ): ProviderResult {\n return {\n states,\n tokensUsed,\n strategiesApplied,\n stats,\n ...(events.length > 0 && { events }),\n };\n }\n}\n","import { get_encoding, Tiktoken } from 'tiktoken';\nimport type { LlmRequestMessage } from '../ports';\n\nexport type TokenEncodingName = Parameters<typeof get_encoding>[0];\n\nexport interface TokenEstimateOptions {\n /**\n * tiktoken encoding 名称,或历史兼容的模型标识。\n *\n * 中文说明:如果传入的是 `gpt-4o` / `claude` 这类模型名,会按旧逻辑映射到 encoding;\n * 如果传入的是 `cl100k_base` / `o200k_base`,则直接使用对应 encoding。\n */\n encoding?: string;\n /** tiktoken 不可用或未指定 encoding 时的字符/token 兜底比。 */\n avgCharsPerToken?: number;\n /** 单个 tool_call 的额外 token 开销估算。 */\n toolCallOverhead?: number;\n}\n\nexport class TokenCalculator {\n private static readonly BYTES_PER_TOKEN_LATIN = 4;\n private static readonly BYTES_PER_TOKEN_CJK = 3;\n private static readonly OVERHEAD_PER_MESSAGE = 5;\n private static readonly OVERHEAD_PER_TOOL_CALL = 10;\n private static encoderCache = new Map<TokenEncodingName, Tiktoken>();\n private static readonly DEFAULT_ENCODING: TokenEncodingName = 'cl100k_base';\n private static readonly SUPPORTED_ENCODINGS = [\n 'gpt2',\n 'r50k_base',\n 'p50k_base',\n 'p50k_edit',\n 'cl100k_base',\n 'o200k_base',\n ] as const satisfies readonly TokenEncodingName[];\n\n private static resolveEncodingFromModelIdentifier(modelIdentifier: string): TokenEncodingName {\n const normalized = (modelIdentifier || '').trim().toLowerCase();\n\n if (this.isSupportedEncodingName(normalized)) {\n return normalized;\n }\n\n if (normalized.includes('deepseek')) {\n return 'cl100k_base';\n }\n\n if (normalized.includes('gpt-4o') || normalized.startsWith('o1')) {\n return 'o200k_base';\n }\n\n if (normalized.includes('gemini') || normalized.includes('claude')) {\n return 'cl100k_base';\n }\n\n return this.DEFAULT_ENCODING;\n }\n\n private static isSupportedEncodingName(value: string): value is TokenEncodingName {\n return this.SUPPORTED_ENCODINGS.some(encoding => encoding === value);\n }\n\n private static getEncoder(modelIdentifierOrEncoding: string): Tiktoken {\n const encodingName = this.resolveEncodingFromModelIdentifier(modelIdentifierOrEncoding);\n const cached = this.encoderCache.get(encodingName);\n if (cached) {\n return cached;\n }\n\n const encoder = get_encoding(encodingName);\n this.encoderCache.set(encodingName, encoder);\n return encoder;\n }\n\n public static estimateTokensRough(text: string | null | undefined, _modelIdentifier?: string): number {\n if (!text) return 0;\n\n const hasCJK = /[\\u4e00-\\u9fa5]|[\\u3040-\\u30ff]|[\\uac00-\\ud7af]/.test(text);\n const ratio = hasCJK ? this.BYTES_PER_TOKEN_CJK : this.BYTES_PER_TOKEN_LATIN;\n const byteLength = new TextEncoder().encode(text).length;\n\n return Math.ceil(byteLength / ratio);\n }\n\n public static estimateTokens(text: string | null | undefined, options: TokenEstimateOptions = {}): number {\n if (!text) return 0;\n\n if (options.encoding) {\n try {\n return this.estimateTokensPrecise(text, options.encoding);\n } catch {\n // 中文备注:tiktoken 运行时不可用时退回声明式 avgCharsPerToken,保证上下文构建不中断。\n }\n }\n\n const avgCharsPerToken = normalizePositiveNumber(options.avgCharsPerToken, 2);\n return Math.ceil(text.length / avgCharsPerToken);\n }\n\n public static estimateTokensPrecise(text: string | null | undefined, modelIdentifier: string): number {\n if (!text) return 0;\n const encoder = this.getEncoder(modelIdentifier);\n return encoder.encode(text).length;\n }\n\n public static estimateMessageTokens(\n message: LlmRequestMessage,\n options: TokenEstimateOptions = {},\n ): number {\n let totalTokens = this.OVERHEAD_PER_MESSAGE;\n\n if (message.content) {\n totalTokens += this.estimateTokens(String(message.content), options);\n }\n\n const toolCalls = this.extractToolCallsForTokenEstimate(message);\n const toolCallOverhead = normalizeNonNegativeInteger(options.toolCallOverhead, this.OVERHEAD_PER_TOOL_CALL);\n for (const toolCall of toolCalls) {\n totalTokens += toolCallOverhead;\n const fn = toolCall['function'];\n if (fn && typeof fn === 'object' && !Array.isArray(fn)) {\n const fnRecord = fn as Record<string, unknown>;\n totalTokens += this.estimateTokens(String(fnRecord['name'] ?? ''), options);\n totalTokens += this.estimateTokens(String(fnRecord['arguments'] ?? ''), options);\n }\n }\n\n const toolCallId = this.extractToolCallIdForTokenEstimate(message);\n if (toolCallId) {\n totalTokens += this.estimateTokens(toolCallId, options);\n }\n\n return totalTokens;\n }\n\n public static estimateMessageTokensPrecise(message: LlmRequestMessage, modelIdentifier: string): number {\n return this.estimateMessageTokens(message, {\n encoding: modelIdentifier,\n toolCallOverhead: this.OVERHEAD_PER_TOOL_CALL,\n });\n }\n\n public static estimateMessagesTokensPrecise(messages: LlmRequestMessage[], modelIdentifier: string): number {\n return messages.reduce((total, msg) => total + this.estimateMessageTokensPrecise(msg, modelIdentifier), 0);\n }\n\n private static extractToolCallsForTokenEstimate(message: LlmRequestMessage): unknown[] {\n const direct = 'tool_calls' in message ? message.tool_calls : undefined;\n if (Array.isArray(direct)) return direct;\n\n const metadata = 'metadata' in message ? message.metadata : undefined;\n if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) return [];\n const metadataRecord = metadata as Record<string, unknown>;\n const metadataToolCalls = metadataRecord['tool_calls'];\n return Array.isArray(metadataToolCalls) ? metadataToolCalls : [];\n }\n\n private static extractToolCallIdForTokenEstimate(message: LlmRequestMessage): string | undefined {\n if ('tool_call_id' in message && typeof message.tool_call_id === 'string') {\n return message.tool_call_id;\n }\n\n const metadata = 'metadata' in message ? message.metadata : undefined;\n if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) return undefined;\n const metadataRecord = metadata as Record<string, unknown>;\n const toolCallId = metadataRecord['tool_call_id'];\n return typeof toolCallId === 'string' ? toolCallId : undefined;\n }\n\n public static truncateTextByTokens(\n text: string,\n maxTokens: number,\n modelIdentifier: string,\n strategy: 'start' | 'end' | 'middle' = 'end',\n ): string {\n if (!text || maxTokens <= 0) return '';\n\n const encoder = this.getEncoder(modelIdentifier);\n const tokens = encoder.encode(text);\n\n if (tokens.length <= maxTokens) {\n return text;\n }\n\n let truncatedTokens: Uint32Array;\n const ellipsis = '...';\n\n switch (strategy) {\n case 'start':\n truncatedTokens = tokens.slice(0, maxTokens);\n return encoder.decode(truncatedTokens) + ellipsis;\n case 'end':\n truncatedTokens = tokens.slice(tokens.length - maxTokens);\n return ellipsis + encoder.decode(truncatedTokens);\n case 'middle': {\n const half = Math.floor(maxTokens / 2);\n const head = tokens.slice(0, half);\n const tail = tokens.slice(tokens.length - (maxTokens - half));\n return encoder.decode(head) + ellipsis + encoder.decode(tail);\n }\n default:\n truncatedTokens = tokens.slice(0, maxTokens);\n return encoder.decode(truncatedTokens) + ellipsis;\n }\n }\n\n public static cleanup(): void {\n for (const encoder of this.encoderCache.values()) {\n encoder.free();\n }\n this.encoderCache.clear();\n }\n}\n\nfunction normalizePositiveNumber(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return fallback;\n }\n return Math.max(0, Math.floor(value));\n}\n","import type { MessageProcessingState } from '../providers/base';\nimport { TokenCalculator } from '../../../shared/TokenCalculator';\nimport type { SummarizationProviderContext } from './config';\n\nexport class SummarizationTrigger {\n static shouldSkip(\n states: MessageProcessingState[],\n availableBudget: number,\n context: SummarizationProviderContext\n ): boolean {\n const usedTokens = this.calculateUsedTokens(states);\n const usagePercentage = usedTokens / availableBudget;\n return usagePercentage < context.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n }\n\n static shouldTriggerSummarization(\n states: MessageProcessingState[],\n remainingBudget: number,\n totalBudget: number,\n context: SummarizationProviderContext,\n debugFn: (\n message: string,\n data: Record<string, unknown>,\n context: SummarizationProviderContext,\n ) => void,\n ): boolean {\n const usedTokensRough = this.calculateUsedTokens(states);\n const threshold = totalBudget * context.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n const lowerBound = threshold * 0.9;\n if (usedTokensRough < lowerBound) {\n return false;\n }\n\n debugFn('📝 估算Token接近摘要阈值,切换到精确计算', {\n usedTokensRough,\n threshold,\n }, context);\n\n const messagesToKeep = states\n .filter((s) => s.action.startsWith('keep_'))\n .map((s) => s.message);\n const modelIdentifier = context.config.TOKEN_ENCODING_NAME;\n const usedTokensPrecise = messagesToKeep.reduce(\n (total, msg) => total + TokenCalculator.estimateTokensPrecise(msg.content, modelIdentifier),\n 0\n );\n\n debugFn('📊 精确计算结果', {\n usedTokensPrecise,\n threshold,\n shouldTrigger: usedTokensPrecise >= threshold,\n }, context);\n\n return usedTokensPrecise >= threshold;\n }\n\n static calculateUsedTokens(states: MessageProcessingState[]): number {\n return states\n .filter((s) => s.action.startsWith('keep_'))\n .reduce((total, state) => total + state.tokens, 0);\n }\n}\n","import type { MessageProcessingState } from '../providers/base';\nimport type { SummarizationProviderContext } from './config';\n\nexport class SummarizationCandidateSelector {\n static identifySummarizationCandidates(\n workingMemoryStates: MessageProcessingState[],\n context: SummarizationProviderContext,\n options: { fullStateList?: MessageProcessingState[] } = {}\n ): {\n allCandidates: MessageProcessingState[];\n coreCandidates: MessageProcessingState[];\n } {\n const { fullStateList } = options;\n const isValuable = (state: MessageProcessingState) => {\n if (state.message.type === 'system_prompt' || state.message.type === 'context_injection') {\n return false;\n }\n return true;\n };\n\n const allScopeStates = fullStateList ?? workingMemoryStates;\n const allValuableMessages = allScopeStates.filter(isValuable);\n const workingValuableMessages = workingMemoryStates.filter(isValuable);\n const coreMessages = workingValuableMessages.filter((state) => {\n return state.message.type === 'user_input'\n || state.message.type === 'final_answer'\n || state.message.type === 'history_summary';\n });\n\n console.log('[SummarizationCandidateSelector] 🔍 筛选消息(两步):', {\n 输入消息数: workingMemoryStates.length,\n 摘要范围候选: allValuableMessages.length,\n 核心对话消息: coreMessages.length,\n 所有消息类型分布: allValuableMessages.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n 核心消息类型分布: coreMessages.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n });\n\n if (coreMessages.length <= 4) {\n return { allCandidates: [], coreCandidates: [] };\n }\n\n const sortedCoreMessages = coreMessages.sort((a, b) => {\n if (a.message.type === 'history_summary' && b.message.type !== 'history_summary') {\n return -1;\n }\n if (b.message.type === 'history_summary' && a.message.type !== 'history_summary') {\n return 1;\n }\n return a.originalIndex - b.originalIndex;\n });\n\n const summarizationCount = Math.ceil(sortedCoreMessages.length * context.config.SUMMARY_OLDEST_MESSAGES_PERCENTAGE);\n const lastUserInputIndex = sortedCoreMessages.map((s) => s.message.type).lastIndexOf('user_input');\n const maxSummarizationCount = lastUserInputIndex >= 0\n ? lastUserInputIndex\n : Math.max(0, sortedCoreMessages.length - 2);\n const actualSummarizationCount = Math.min(summarizationCount, maxSummarizationCount);\n\n if (actualSummarizationCount <= 0) {\n return { allCandidates: [], coreCandidates: [] };\n }\n\n const coreCandidatesSlice = sortedCoreMessages.slice(0, actualSummarizationCount);\n const coreCandidatesForPrompt = this.selectCompleteConversationPairs(coreCandidatesSlice, workingMemoryStates);\n const coreIndices = coreCandidatesForPrompt.map((s) => s.originalIndex);\n const minIndex = Math.min(...coreIndices);\n const maxIndex = Math.max(...coreIndices);\n\n console.log('[SummarizationCandidateSelector] 📐 计算替换范围:', {\n 核心候选数: coreCandidatesForPrompt.length,\n minIndex,\n maxIndex,\n 范围大小: maxIndex - minIndex + 1,\n });\n\n const allCandidatesInRange = allValuableMessages.filter((state) => {\n return state.originalIndex >= minIndex && state.originalIndex <= maxIndex;\n });\n\n console.log('[SummarizationCandidateSelector] ✅ 最终候选消息:', {\n 所有候选数: allCandidatesInRange.length,\n 核心候选数: coreCandidatesForPrompt.length,\n 所有候选类型: allCandidatesInRange.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n });\n\n return {\n allCandidates: allCandidatesInRange,\n coreCandidates: coreCandidatesForPrompt,\n };\n }\n\n static selectCompleteConversationPairs(\n candidates: MessageProcessingState[],\n workingSet: MessageProcessingState[]\n ): MessageProcessingState[] {\n const result: MessageProcessingState[] = [];\n let i = 0;\n\n while (i < candidates.length) {\n const current = candidates[i];\n if (current.message.type === 'history_summary') {\n result.push(current);\n i++;\n continue;\n }\n if (current.message.type === 'user_input') {\n result.push(current);\n if (i + 1 < candidates.length && candidates[i + 1].message.type === 'final_answer') {\n result.push(candidates[i + 1]);\n i += 2;\n } else {\n i++;\n }\n continue;\n }\n if (current.message.type === 'final_answer') {\n result.push(current);\n i++;\n continue;\n }\n i++;\n }\n\n return result;\n }\n}\n","/**\n * @file AISummaryGenerator.ts\n * @description AI摘要生成器 - 负责与AI模型交互生成摘要\n */\n\nimport type { MessageProcessingState } from '../providers/base';\nimport type {\n GenerateRequest,\n GenerateResponse,\n} from '../contracts/chatLineMessage';\nimport type { AiMessage } from '../../../contracts';\nimport type { SummarizationProviderContext } from './config';\n\nexport interface SummarizationOptions {\n maxSummaryTokens: number;\n targetCompressionRatio?: number;\n /**\n * 执行摘要的已注册 agent/chat ID。\n *\n * 中文备注:linnkit 不持有 prompt 正文,也不直接决定模型调用;这里只携带注册引用,\n * 真正的 prompt 构建与模型策略由 host 的注册表解释。\n */\n agentId: string;\n modelId: string | null;\n fallbackModelId?: string | null;\n language: 'zh' | 'en' | 'auto';\n failureBehavior?: 'fail-fast' | 'continue-if-within-budget';\n /** 内部调参与测试注入,默认保持生产重试行为。 */\n maxRetries?: number;\n /** 内部调参与测试注入,默认 1000ms。 */\n retryDelayMs?: number;\n}\n\nexport class AISummaryGenerator {\n private readonly defaultOptions: SummarizationOptions;\n private readonly fallbackModelId: string | null;\n private readonly MAX_RETRIES: number;\n private readonly RETRY_DELAY_MS: number;\n\n constructor(options: SummarizationOptions) {\n this.defaultOptions = options;\n this.fallbackModelId = options.fallbackModelId ?? null;\n this.MAX_RETRIES = normalizePositiveInteger(options.maxRetries, 3);\n this.RETRY_DELAY_MS = normalizeNonNegativeInteger(options.retryDelayMs, 1000);\n }\n\n async generateHistorySummary(\n candidates: MessageProcessingState[],\n context: SummarizationProviderContext,\n debugFn: (\n message: string,\n data: Record<string, unknown>,\n context: SummarizationProviderContext,\n ) => void,\n ): Promise<string> {\n const effectiveGenerate = context.generate;\n if (!effectiveGenerate) {\n throw new Error(\n '[AISummaryGenerator] ProviderContext.generate is required. ' +\n 'Inject summarization generation from host or profile orchestration.'\n );\n }\n\n if (!this.defaultOptions.modelId) {\n throw new Error(\n '[AISummaryGenerator] No summarization model configured. ' +\n 'Inject model selection from product/provider assembly.'\n );\n }\n\n const conversationText = this.formatMessagesForSummary(candidates.map((c) => c.message));\n\n debugFn('开始AI摘要生成', {\n messageCount: candidates.length,\n textLength: conversationText.length,\n primaryModel: this.defaultOptions.modelId,\n fallbackModel: this.fallbackModelId,\n }, context);\n\n const primaryResult = await this.tryGenerateSummaryWithRetries(\n effectiveGenerate,\n conversationText,\n this.defaultOptions.modelId,\n this.MAX_RETRIES,\n context,\n debugFn\n );\n\n if (primaryResult.success) {\n return primaryResult.summary!;\n }\n\n if (!this.fallbackModelId) {\n throw new Error(`摘要生成失败(无可用降级模型)。主模型(${this.defaultOptions.modelId})错误: ${primaryResult.error}`);\n }\n\n debugFn('⚠️ 主模型摘要失败,尝试降级到备用模型', {\n primaryModel: this.defaultOptions.modelId,\n fallbackModel: this.fallbackModelId,\n primaryError: primaryResult.error,\n }, context);\n\n const fallbackResult = await this.tryGenerateSummaryWithRetries(\n effectiveGenerate,\n conversationText,\n this.fallbackModelId,\n this.MAX_RETRIES,\n context,\n debugFn\n );\n\n if (fallbackResult.success) {\n return fallbackResult.summary!;\n }\n\n debugFn('❌ 主模型和备用模型均失败,摘要化终止', {\n primaryModel: this.defaultOptions.modelId,\n fallbackModel: this.fallbackModelId,\n primaryError: primaryResult.error,\n fallbackError: fallbackResult.error,\n }, context);\n\n throw new Error(\n `摘要生成完全失败。主模型(${this.defaultOptions.modelId})错误: ${primaryResult.error}; ` +\n `备用模型(${this.fallbackModelId})错误: ${fallbackResult.error}`\n );\n }\n\n private async tryGenerateSummaryWithRetries(\n generate: (request: GenerateRequest) => Promise<GenerateResponse>,\n conversationText: string,\n modelId: string,\n maxRetries: number,\n context: SummarizationProviderContext,\n debugFn: (\n message: string,\n data: Record<string, unknown>,\n context: SummarizationProviderContext,\n ) => void,\n ): Promise<{ success: true; summary: string } | { success: false; error: string }> {\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n debugFn(`🔄 尝试生成摘要 (模型: ${modelId}, 第${attempt}/${maxRetries}次)`, {\n modelId,\n attempt,\n maxRetries,\n }, context);\n\n const summaryRequest: GenerateRequest = {\n promptKey: this.defaultOptions.agentId,\n modelId,\n prompt: conversationText,\n };\n\n const response = await generate(summaryRequest);\n const summary = response.generatedText;\n\n if (!summary.trim()) {\n throw new Error('AI返回了空的摘要内容');\n }\n\n debugFn('✅ 摘要生成成功', {\n modelId,\n attempt,\n summaryLength: summary.length,\n }, context);\n\n return { success: true, summary: summary.trim() };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n debugFn(`❌ 摘要生成失败 (模型: ${modelId}, 第${attempt}/${maxRetries}次)`, {\n modelId,\n attempt,\n error: lastError.message,\n }, context);\n\n if (attempt < maxRetries) {\n await this.sleep(attempt * this.RETRY_DELAY_MS);\n }\n }\n }\n\n return {\n success: false,\n error: lastError?.message || 'Unknown error',\n };\n }\n\n private formatMessagesForSummary(messages: AiMessage[]): string {\n return messages\n .map((message) => `${message.role}: ${message.content}`)\n .join('\\n\\n');\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n return Math.floor(value);\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return fallback;\n }\n return Math.max(0, Math.floor(value));\n}\n","/**\n * Isomorphic ID generators.\n *\n * 设计约束:\n * - linnkit 是同构 package(既会被 Node-side host 使用,也会被前端 renderer 通过\n * `linnkit/runtime-kernel/events` 等子入口透传 transitive import 拖入 bundle)。\n * - 因此本文件不允许 `import { randomUUID } from 'crypto'`:那会触发 vite\n * `__vite-browser-external` shim,构建时 named import 解析失败。\n * - 改用 Web Crypto API(`globalThis.crypto.randomUUID`),它在所有现代浏览器\n * 与 Node 19+ 上都内置;老 Node 也可通过 `globalThis.crypto.randomUUID` 访问\n * (Node 14.17+ 在 `node:crypto` 暴露了 `webcrypto`,并自 19 起把 `crypto`\n * 挂到 globalThis)。\n * - 极端 fallback:若运行环境同时缺 Web Crypto,则降级为 Math.random RFC4122 v4\n * 生成器;这些 ID 仅用于会话/消息/run/exec/trace 内部去重展示,不承担加密\n * 强度要求,降级在语义上是安全的。\n */\n\ntype WebCryptoLike = { randomUUID?: () => string };\n\nfunction isoRandomUUID(): string {\n const c = (globalThis as unknown as { crypto?: WebCryptoLike }).crypto;\n if (c && typeof c.randomUUID === 'function') {\n return c.randomUUID();\n }\n // Fallback RFC4122 v4(非加密强度)\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (ch) => {\n const r = (Math.random() * 16) | 0;\n const v = ch === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nfunction shortRandomId(prefix: string): string {\n return `${prefix}-${isoRandomUUID().replace(/-/g, '').slice(0, 12)}`;\n}\n\nexport function generateMessageId(): string {\n return shortRandomId('msg');\n}\n\nexport function generateConversationId(): string {\n return shortRandomId('conv');\n}\n\nexport function generateRunId(): string {\n return shortRandomId('run');\n}\n\nexport function generateAuditEnvelopeId(): string {\n return shortRandomId('audit');\n}\n\nexport function generateAuditEnvelopeEventId(): string {\n return shortRandomId('audit_evt');\n}\n\nexport function generateExecutionId(): string {\n return shortRandomId('exec');\n}\n\nexport function generateTraceId(): string {\n return shortRandomId('trace');\n}\n","import type { MessageProcessingState, ProviderContext } from '../providers/base';\nimport { generateMessageId } from '../../../shared/ids';\nimport {\n createHistorySummaryEvent,\n type AiMessage,\n type RuntimeEvent,\n} from '../../../contracts';\n\nexport type ReplacedIdRange = {\n startId: string;\n endId: string;\n};\n\nexport class SummarizationStateUtils {\n static collectReplacedIds(candidates: MessageProcessingState[]): string[] {\n const allReplacedIds = new Set<string>();\n for (const candidate of candidates) {\n allReplacedIds.add(candidate.message.id);\n if (Array.isArray(candidate.replacementSourceIds)) {\n for (const sourceId of candidate.replacementSourceIds) {\n allReplacedIds.add(sourceId);\n }\n }\n const metadataSources = candidate.message.metadata?.replacementSourceIds;\n if (Array.isArray(metadataSources)) {\n for (const sourceId of metadataSources) {\n allReplacedIds.add(sourceId);\n }\n }\n if (candidate.message.type === 'history_summary' && candidate.message.metadata?.replacedMessageIds) {\n for (const oldId of candidate.message.metadata.replacedMessageIds) {\n allReplacedIds.add(oldId);\n }\n }\n }\n return Array.from(allReplacedIds);\n }\n\n static generateSummarySeq(allMessages: AiMessage[]): number {\n let seq = 0;\n for (const msg of allMessages) {\n if (msg.type === 'history_summary') {\n seq = Math.max(seq, msg.metadata?.summarySeq || 0);\n }\n }\n return seq + 1;\n }\n\n static createSummaryMessageState(\n summary: string,\n candidates: MessageProcessingState[],\n context: ProviderContext,\n allMessages: AiMessage[],\n includedOldSummary: boolean = false\n ): { state: MessageProcessingState; event: RuntimeEvent } {\n const summaryId = generateMessageId();\n const timestamp = Date.now();\n const replacedMessageIds = this.collectReplacedIds(candidates);\n const originalMessageCount = candidates.length;\n const summarySeq = this.generateSummarySeq(allMessages);\n\n const description = includedOldSummary\n ? `[历史对话摘要(更新版) - 合并压缩了${originalMessageCount}条消息,包括旧摘要]`\n : `[历史对话摘要 - 压缩了${originalMessageCount}条消息]`;\n const fullContent = `${description}\\n\\n${summary}`;\n\n const summaryMessage: AiMessage = {\n id: summaryId,\n role: 'system',\n type: 'history_summary',\n content: fullContent,\n timestamp,\n metadata: {\n messageType: 'summary',\n originalMessageCount,\n compressionRatio: 0,\n includedOldSummary,\n replacedMessageIds,\n summarySeq,\n },\n };\n\n const tokens = context.estimateTokens(summaryMessage);\n if (summaryMessage.metadata) {\n const originalTokens = this.calculateOriginalTokens(candidates);\n summaryMessage.metadata.compressionRatio = originalTokens > 0 ? tokens / originalTokens : 0;\n }\n\n const summaryState: MessageProcessingState = {\n message: summaryMessage,\n originalIndex: -1,\n action: 'keep_core' as const,\n tokens,\n processedContent: summaryMessage.content,\n contentType: 'full' as const,\n phase: 'SUMMARIZATION' as const,\n };\n\n const summaryEvent = createHistorySummaryEvent(\n summaryId,\n '',\n '',\n fullContent,\n replacedMessageIds,\n summarySeq,\n {\n timestamp,\n original_message_count: originalMessageCount,\n compression_ratio: summaryMessage.metadata?.compressionRatio,\n included_old_summary: includedOldSummary,\n }\n );\n\n return { state: summaryState, event: summaryEvent };\n }\n\n static replaceWithSummary(\n allStates: MessageProcessingState[],\n candidatesForSummarization: MessageProcessingState[],\n summaryState: MessageProcessingState\n ): MessageProcessingState[] {\n const remainingStates = allStates.filter((s) => !candidatesForSummarization.includes(s));\n const insertIndex = Math.min(3, remainingStates.length);\n return [\n ...remainingStates.slice(0, insertIndex),\n summaryState,\n ...remainingStates.slice(insertIndex),\n ];\n }\n\n static calculateOriginalTokens(candidates: MessageProcessingState[]): number {\n return candidates.reduce((total, state) => total + state.tokens, 0);\n }\n}\n","/**\n * @file src/agent/context-manager/shared/providers/SummarizationProvider.ts\n * @description 统一摘要化处理层Provider - Chat 和 Agent 通用\n */\n\nimport {\n BaseContextProvider,\n ContextProviderError,\n SUMMARIZATION_FAILED_ERROR_CODE,\n ProviderResult,\n MessageProcessingState,\n} from './base';\nimport {\n SummarizationTrigger,\n SummarizationCandidateSelector,\n AISummaryGenerator,\n SummarizationOptions,\n SummarizationStateUtils,\n} from '../summarization';\nimport type { SummarizationConfig, SummarizationProviderContext } from '../summarization/config';\n\nexport type { SummarizationOptions } from '../summarization';\n\nexport class SummarizationProvider extends BaseContextProvider<SummarizationConfig> {\n readonly name = 'SummarizationProvider';\n readonly description = '摘要化处理层 - 核心对话压缩,聚焦用户意图与AI回答';\n readonly priority = 3;\n\n private aiGenerator: AISummaryGenerator;\n private readonly failureBehavior: NonNullable<SummarizationOptions['failureBehavior']>;\n\n constructor(options: SummarizationOptions) {\n super();\n this.aiGenerator = new AISummaryGenerator(options);\n this.failureBehavior = options.failureBehavior ?? 'fail-fast';\n }\n\n async provide(\n states: MessageProcessingState[],\n availableBudget: number,\n context: SummarizationProviderContext\n ): Promise<ProviderResult> {\n const usedTokens = SummarizationTrigger.calculateUsedTokens(states);\n const remainingBudget = availableBudget - usedTokens;\n\n const shouldSummarize = SummarizationTrigger.shouldTriggerSummarization(\n states,\n remainingBudget,\n context.totalBudget,\n context,\n this.debug.bind(this)\n );\n\n if (!shouldSummarize) {\n return this.createResult(states, 0, [], {\n processedCount: 0,\n skippedCount: 0,\n addedCount: 0,\n });\n }\n\n const workingMemoryStates = states.filter((s) => s.action.startsWith('keep_working') || s.action.startsWith('keep_'));\n\n this.debug('📊 工作记忆状态统计', {\n 总消息数: workingMemoryStates.length,\n 消息类型分布: workingMemoryStates.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n }, context);\n\n const { allCandidates: candidatesToReplace, coreCandidates: candidatesForPrompt } =\n SummarizationCandidateSelector.identifySummarizationCandidates(\n workingMemoryStates,\n context,\n { fullStateList: states }\n );\n\n this.debug('🔥 步骤2完成 - 识别摘要候选', {\n 所有候选数: candidatesToReplace.length,\n 核心候选数: candidatesForPrompt.length,\n 所有候选类型分布: candidatesToReplace.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n 核心候选类型分布: candidatesForPrompt.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n 所有候选ID列表: candidatesToReplace.map((s) => `${s.message.type}:${s.message.id}`).slice(0, 5),\n }, context);\n\n if (candidatesToReplace.length === 0 || candidatesForPrompt.length === 0) {\n return this.createResult(states, 0, [], {\n processedCount: 0,\n skippedCount: 0,\n addedCount: 0,\n });\n }\n\n context.summarizationCallbacks?.onSummarizationStart?.();\n\n try {\n const summaryResult = await this.aiGenerator.generateHistorySummary(\n candidatesForPrompt,\n context,\n this.debug.bind(this)\n );\n\n const includedOldSummary = candidatesToReplace.some(\n (candidate) => candidate.message.type === 'history_summary'\n );\n\n this.debug('🔥 步骤4完成 - 准备创建摘要消息', {\n 替换块消息数: candidatesToReplace.length,\n 包含旧摘要: includedOldSummary,\n }, context);\n\n const allMessages = states.map((s) => s.message);\n const { state: summaryState, event: summaryEvent } = SummarizationStateUtils.createSummaryMessageState(\n summaryResult,\n candidatesToReplace,\n context,\n allMessages,\n includedOldSummary\n );\n\n const updatedStates = SummarizationStateUtils.replaceWithSummary(states, candidatesToReplace, summaryState);\n const tokensUsed = summaryState.tokens;\n\n context.summarizationCallbacks?.onSummarizationEnd?.({\n originalMessageCount: candidatesToReplace.length,\n summaryEvent,\n });\n\n this.debug('✨ 摘要化处理完成', {\n originalMessages: candidatesToReplace.length,\n summaryTokens: tokensUsed,\n compressionRatio: `${((tokensUsed / SummarizationStateUtils.calculateOriginalTokens(candidatesToReplace)) * 100).toFixed(1)}%`,\n remainingBudget: availableBudget - usedTokens - tokensUsed,\n }, context);\n\n return this.createResult(\n updatedStates,\n tokensUsed,\n ['ai_history_summarization'],\n {\n processedCount: candidatesToReplace.length,\n skippedCount: 0,\n addedCount: 1,\n },\n [summaryEvent]\n );\n } catch (error) {\n this.debug('❌ 摘要化处理失败', { error }, context);\n\n if (context.summarizationCallbacks?.onSummarizationError) {\n const err = error instanceof Error ? error : new Error(String(error));\n context.summarizationCallbacks.onSummarizationError(err);\n }\n\n if (this.failureBehavior === 'continue-if-within-budget' && usedTokens <= availableBudget) {\n this.debug('⚠️ 摘要失败,但当前上下文仍在预算内,按配置继续使用原上下文', {\n usedTokens,\n availableBudget,\n }, context);\n return this.createResult(states, 0, ['ai_history_summarization_failed_continue'], {\n processedCount: 0,\n skippedCount: 0,\n addedCount: 0,\n });\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ContextProviderError({\n code: SUMMARIZATION_FAILED_ERROR_CODE,\n fatal: true,\n providerName: this.name,\n message: `历史对话摘要失败,无法继续: ${errorMessage}`,\n cause: error,\n });\n }\n }\n\n shouldSkip(\n states: MessageProcessingState[],\n availableBudget: number,\n context: SummarizationProviderContext\n ): boolean {\n return SummarizationTrigger.shouldSkip(states, availableBudget, context);\n }\n}\n","import type { IContextProvider } from './base';\n\nexport class ContextProviderRegistry<TConfig = unknown> {\n private providers: Map<string, IContextProvider<TConfig>> = new Map();\n\n register(provider: IContextProvider<TConfig>): void {\n this.providers.set(provider.name, provider);\n }\n\n getAllProviders(): IContextProvider<TConfig>[] {\n return Array.from(this.providers.values()).sort((a, b) => a.priority - b.priority);\n }\n\n getProvider(name: string): IContextProvider<TConfig> | undefined {\n return this.providers.get(name);\n }\n\n clear(): void {\n this.providers.clear();\n }\n}\n","export type FenceLlmRole = 'user' | 'system';\nexport type FencePlacement =\n | 'after-system'\n | 'before-current-user'\n | 'after-current-user'\n | 'after-last-tool-result';\nexport type FenceLifetime = 'turn-only' | 'persisted';\n\nexport interface FenceDescriptor {\n kind: string;\n llmRole: FenceLlmRole;\n placement: FencePlacement;\n lifetime: FenceLifetime;\n mustKeep?: boolean;\n maxBudgetFraction?: number;\n formatter: (content: string, attrs: Record<string, unknown>) => string;\n}\n\nexport interface FenceInjection {\n kind: string;\n content: string;\n attrs?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nexport interface FenceRegistry {\n register(descriptor: FenceDescriptor): void;\n get(kind: string): FenceDescriptor | undefined;\n list(): FenceDescriptor[];\n}\n\nconst FENCE_KIND_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;\n\nclass DefaultFenceRegistry implements FenceRegistry {\n private readonly descriptors = new Map<string, FenceDescriptor>();\n\n register(descriptor: FenceDescriptor): void {\n validateDescriptor(descriptor);\n if (this.descriptors.has(descriptor.kind)) {\n throw new Error(`Fence kind \"${descriptor.kind}\" is already registered.`);\n }\n this.descriptors.set(descriptor.kind, descriptor);\n }\n\n get(kind: string): FenceDescriptor | undefined {\n return this.descriptors.get(kind);\n }\n\n list(): FenceDescriptor[] {\n return [...this.descriptors.values()];\n }\n}\n\nexport function createFenceRegistry(descriptors: FenceDescriptor[] = []): FenceRegistry {\n const registry = new DefaultFenceRegistry();\n for (const descriptor of descriptors) {\n registry.register(descriptor);\n }\n return registry;\n}\n\nfunction validateDescriptor(descriptor: FenceDescriptor): void {\n if (!FENCE_KIND_PATTERN.test(descriptor.kind)) {\n throw new Error(`Fence kind \"${descriptor.kind}\" must be kebab-case.`);\n }\n\n const fraction = descriptor.maxBudgetFraction;\n if (fraction !== undefined && (fraction <= 0 || fraction > 1)) {\n throw new Error('Fence maxBudgetFraction must be within (0, 1].');\n }\n}\n","/**\n * @file src/agent/context-manager/profiles/agent/contracts.ts\n */\n\nimport type { AiMessage } from '../../../contracts';\nimport type { FenceInjection } from '../../shared/fences';\n\n/**\n * Minimal request contract used by package-neutral agent profile code.\n * Product-specific invoke requests can extend this shape.\n */\nexport interface AgentProfileRequest {\n query: string;\n promptKey: string;\n model_id?: string;\n modelId?: string;\n availableTools?: string[];\n conversationHistory?: AiMessage[];\n fences?: FenceInjection[];\n}\n","import { AGENT_CONTEXT_BUILDER_CONFIG } from './context/config';\nimport { DEFAULT_MAX_STEPS } from '../../../contracts';\n\nexport const AGENT_CONSTANTS = {\n DEFAULT_MAX_STEPS,\n DEFAULT_TIMEOUT_MS: 300000,\n DEFAULT_MAX_RETRIES: 3,\n DEFAULT_RETRY_DELAY_MS: 1000,\n} as const;\n\nexport interface AgentConfig {\n defaultModelId: string;\n maxSteps: number;\n defaultTools: string[];\n timeoutMs: number;\n debug: boolean;\n maxHistoryLength: number;\n tokenBudget: {\n maxTokens: number;\n reservedForResponse: number;\n };\n contextProcessingTimeoutMs: number;\n retry: {\n maxRetries: number;\n enableEmptyResponseRetry: boolean;\n retryDelayMs: number;\n };\n}\n\nexport const DEFAULT_AGENT_CONFIG: AgentConfig = {\n defaultModelId: 'default',\n maxSteps: AGENT_CONSTANTS.DEFAULT_MAX_STEPS,\n defaultTools: [],\n timeoutMs: AGENT_CONSTANTS.DEFAULT_TIMEOUT_MS,\n debug: false,\n maxHistoryLength: 100,\n tokenBudget: {\n maxTokens: AGENT_CONTEXT_BUILDER_CONFIG.DEFAULT_MAX_TOKENS,\n reservedForResponse: AGENT_CONTEXT_BUILDER_CONFIG.RESERVED_FOR_RESPONSE,\n },\n contextProcessingTimeoutMs: AGENT_CONTEXT_BUILDER_CONFIG.PROCESSING_TIMEOUT_MS,\n retry: {\n maxRetries: AGENT_CONSTANTS.DEFAULT_MAX_RETRIES,\n enableEmptyResponseRetry: true,\n retryDelayMs: AGENT_CONSTANTS.DEFAULT_RETRY_DELAY_MS,\n },\n};\n","/**\n * @file src/agent/context/config.ts\n * @description Agent上下文构建策略配置 - Agent专用三阶段智能填充配置中心\n * \n * 🎯 目的: 为Agent的ContextManager提供所有策略参数的可配置中心\n * 📖 详情: 实现Agent README中描述的3阶段上下文构建策略,专注于工具交互优化\n * 🔧 特色: P1-P4优先级填充策略,工具调用配对保留机制\n */\n\n/**\n * Agent上下文构建器核心配置\n * \n * 🎯 统一管理Agent专用的Token限制、触发条件和策略参数\n * 🔧 特别针对工具交互场景进行优化\n */\nexport const AGENT_CONTEXT_BUILDER_CONFIG = {\n // === 绝对Token限制设置 ===\n \n /** 默认最大Token预算上限 */\n DEFAULT_MAX_TOKENS: 120000,\n \n /** 响应预留Token数 */\n RESERVED_FOR_RESPONSE: 2400,\n \n // === Agent专用工作记忆填充策略 ===\n \n /**\n * 工作记忆填充目标百分比\n * - **基准**: 可用上下文总预算\n * - **说明**: Agent工作记忆层会尽力填充到此百分比,为摘要预留空间\n */\n WORKING_MEMORY_BUDGET_PERCENTAGE: 0.70,\n \n /**\n * 摘要触发阈值百分比\n * - **基准**: 可用上下文总预算\n * - **说明**: 当已用Token总量超过此百分比时,将触发摘要机制\n */\n SUMMARIZATION_TRIGGER_THRESHOLD: 0.70,\n \n // === Agent专用优先级配置 ===\n \n /**\n * P1优先级:工具交互配对保留\n * - 工具调用(tool_calls)和工具结果(tool)必须配对保留\n * - 最高优先级,确保工具交互完整性\n */\n P1_TOOL_INTERACTION_PRIORITY: 1,\n \n /**\n * P2优先级:纯文本对话\n * - 不包含工具调用的user和assistant消息\n * - 按时间倒序填充\n */\n P2_TEXT_CONVERSATION_PRIORITY: 2,\n \n /**\n * P3优先级:历史工具交互\n * - 较旧的工具调用记录\n * - 仍然需要配对保留\n */\n P3_HISTORICAL_TOOL_PRIORITY: 3,\n \n /**\n * P4优先级:循环填充\n * - 剩余预算的循环填充策略\n */\n P4_CIRCULAR_FILL_PRIORITY: 4,\n \n /**\n * P2优先级:工作记忆中保留的最近'thought'消息数量\n */\n MAX_THOUGHTS_TO_KEEP: 1,\n \n // === 摘要策略设置 ===\n \n /**\n * 摘要消息长度上限百分比\n * - **基准**: 可用上下文总预算\n * - **说明**: AI生成的摘要文本Token长度限制\n */\n SUMMARY_BUDGET_PERCENTAGE: 0.12,\n \n /**\n * 选取摘要候选消息的比例\n * - **基准**: 符合摘要条件的消息数量\n * - **说明**: 选取最老的多少比例消息进行摘要\n */\n SUMMARY_OLDEST_MESSAGES_PERCENTAGE: 0.75,\n \n // === 工具交互特殊配置 ===\n \n /**\n * 工具调用配对搜索范围\n * - 在多少条消息范围内搜索工具调用的配对\n */\n TOOL_PAIRING_SEARCH_RANGE: 10,\n \n /**\n * 单个工具交互对的最大Token数\n *\n * 中文说明:\n * - 这里是上下文构建期的 token 预算兜底,作用对象是整组 `tool_calls + tool_output`;\n * - 它不负责工具执行后的原始 observation 落盘预览;\n * - 执行期落盘阈值在 ToolNode observation governance 中维护,二者不要混成一个配置。\n */\n MAX_TOOL_PAIR_TOKENS: 6000,\n\n /**\n * 工具输出(tool_output)在“工作记忆层截断”时的摘要长度上限(Token)\n * - 该值用于控制 `ToolOutputSummarizer` 生成摘要的“信息密度”,避免摘要过短导致信息丢失\n * - 仅影响:超大工具交互对触发截断时(tool_output 会被摘要替换)\n */\n MAX_TOOL_OUTPUT_SUMMARY_TOKENS: 1000,\n \n /**\n * 工具交互保留的最小数量\n * - 即使预算不足,也要保留最近的几组工具交互\n */\n MIN_TOOL_INTERACTIONS_TO_KEEP: 2,\n\n /**\n * P1:最近工具交互(原始 tool_calls/tool_output)的最大保留组数\n * - 目的:只让“最近的行动链”以原始结构进入上下文,避免工具消息膨胀\n * - 注意:这里只统计“工具交互组”(一组 = 一次 tool_calls ↔ tool_output 配对)\n */\n MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP: 2,\n\n /**\n * P1+P3:工作记忆层最多保留的工具交互组总数(超过则直接丢弃)\n * - 目的:对 user 之前的“历史工具交互”做硬上限,避免工具历史过长污染上下文\n * - 注意:这里的“工具交互组”既包括原始 tool_calls/tool_output 配对,也包括被预处理压缩成\n * assistant 文本的“工具执行记录摘要”(metadata.isCompressedToolHistory === true)\n */\n MAX_TOOL_INTERACTION_GROUPS_TO_KEEP: 12,\n \n // === 消息类型优先级定义 ===\n \n /** 核心上下文保留层消息类型 - 第一阶段 */\n CORE_MESSAGE_TYPES: ['system_prompt', 'user_input'] as const,\n \n /** P1优先级内容类型 - Agent专用 */\n P1_CONTENT_TYPES: ['tool_calls', 'tool_output'] as const,\n \n /** P2优先级内容类型 - Agent专用 */\n P2_CONTENT_TYPES: ['final_answer', 'user_input'] as const,\n \n /** P3优先级内容类型 - Agent专用 */\n P3_CONTENT_TYPES: ['historical_tool_calls', 'historical_tool_result'] as const,\n \n // === Token估算配置 ===\n \n /** 平均每个字符的token估算比例 */\n AVG_CHARS_PER_TOKEN: 2.0,\n \n /** 工具调用的额外Token开销估算 */\n TOOL_CALL_OVERHEAD_TOKENS: 50,\n \n // === 模型配置 ===\n \n /**\n * Token 精确估算用的“模型标识”(用于映射到 tiktoken encoding)\n *\n * 说明:\n * - 这里只用于 `TokenCalculator.estimateTokensPrecise(...)` 的 encoding 选择,不用于真实 LLM 调用;\n * - 为避免把某个具体业务模型写死在这里,统一使用 tiktoken 的默认 encoding:cl100k_base。\n */\n TOKEN_ENCODING_NAME: 'cl100k_base',\n \n // === 性能与调试配置 ===\n \n /** 是否启用详细的构建统计 */\n ENABLE_BUILD_STATS: true,\n \n /** 是否启用阶段执行时间统计 */\n ENABLE_TIMING_STATS: true,\n \n /** 上下文构建超时阈值 (毫秒) */\n PROCESSING_TIMEOUT_MS: 1500,\n \n /** 工具交互配对失败警告阈值 */\n TOOL_PAIRING_FAILURE_WARNING_THRESHOLD: 3,\n \n};\n\n/**\n * Agent上下文构建策略配置的类型定义\n */\nexport interface AgentContextBuilderConfig {\n // === 绝对Token限制设置 ===\n DEFAULT_MAX_TOKENS: number;\n RESERVED_FOR_RESPONSE: number;\n \n // === Agent专用工作记忆填充策略 ===\n WORKING_MEMORY_BUDGET_PERCENTAGE: number;\n SUMMARIZATION_TRIGGER_THRESHOLD: number;\n \n // === Agent专用优先级配置 ===\n P1_TOOL_INTERACTION_PRIORITY: number;\n P2_TEXT_CONVERSATION_PRIORITY: number;\n P3_HISTORICAL_TOOL_PRIORITY: number;\n P4_CIRCULAR_FILL_PRIORITY: number;\n MAX_THOUGHTS_TO_KEEP: number;\n \n // === 摘要策略设置 ===\n SUMMARY_BUDGET_PERCENTAGE: number;\n SUMMARY_OLDEST_MESSAGES_PERCENTAGE: number;\n \n // === 工具交互特殊配置 ===\n TOOL_PAIRING_SEARCH_RANGE: number;\n MAX_TOOL_PAIR_TOKENS: number;\n MAX_TOOL_OUTPUT_SUMMARY_TOKENS: number;\n MIN_TOOL_INTERACTIONS_TO_KEEP: number;\n MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP: number;\n MAX_TOOL_INTERACTION_GROUPS_TO_KEEP: number;\n \n // === 消息类型优先级定义 ===\n CORE_MESSAGE_TYPES: readonly string[];\n P1_CONTENT_TYPES: readonly string[];\n P2_CONTENT_TYPES: readonly string[];\n P3_CONTENT_TYPES: readonly string[];\n \n // === Token估算配置 ===\n AVG_CHARS_PER_TOKEN: number;\n TOOL_CALL_OVERHEAD_TOKENS: number;\n \n // === 模型配置 ===\n TOKEN_ENCODING_NAME: string;\n \n // === 性能与调试配置 ===\n ENABLE_BUILD_STATS: boolean;\n ENABLE_TIMING_STATS: boolean;\n PROCESSING_TIMEOUT_MS: number;\n TOOL_PAIRING_FAILURE_WARNING_THRESHOLD: number;\n}\n\n/**\n * Agent专用阶段执行优先级枚举\n */\nexport enum AgentBuildPhase {\n /** 阶段1: 核心上下文保留层 */\n CORE_CONTEXT = 1,\n \n /** 阶段2: 工作记忆填充层 (P1-P4优先级) */\n WORKING_MEMORY = 2,\n \n /** 阶段3: 历史摘要触发层 */\n SUMMARIZATION = 3\n}\n\n/**\n * Agent专用消息优先级枚举\n */\nexport enum AgentMessagePriority {\n /** P1: 工具交互 - 最高优先级 */\n TOOL_INTERACTION = 1,\n \n /** P2: 纯文本对话 - 高优先级 */\n TEXT_CONVERSATION = 2,\n \n /** P3: 历史工具交互 - 中优先级 */\n HISTORICAL_TOOL = 3,\n \n /** P4: 循环填充 - 低优先级 */\n CIRCULAR_FILL = 4\n}\n\n/**\n * Agent上下文构建统计接口\n */\nexport interface AgentContextBuildStats {\n /** 构建开始时间 */\n startTime: number;\n \n /** 各阶段执行时间 */\n phaseTiming: Record<AgentBuildPhase, number>;\n \n /** 各阶段token使用情况 */\n phaseTokenUsage: Record<AgentBuildPhase, { used: number; percentage: number }>;\n \n /** 消息数量统计 */\n messageStats: {\n original: number;\n afterCoreContext: number;\n afterWorkingMemory: number;\n afterSummarization: number;\n };\n \n /** 优先级处理统计 */\n priorityStats: {\n p1ToolInteractions: number;\n p2TextConversations: number;\n p3HistoricalTools: number;\n p4CircularFill: number;\n };\n \n /** 工具交互统计 */\n toolStats: {\n totalToolCalls: number;\n pairedToolCalls: number;\n unpairedToolCalls: number;\n toolPairingSuccessRate: number;\n };\n \n /** 是否触发了摘要机制 */\n summarizationTriggered: boolean;\n \n /** 被摘要的消息数量 */\n summarizedCount?: number;\n \n /** 文档片段是否被截断 */\n documentTruncated: boolean;\n \n /** 总构建时间 */\n totalTime: number;\n}\n\n/**\n * 创建自定义Agent上下文构建配置的辅助函数\n */\nexport function createAgentContextBuilderConfig(\n overrides: Partial<AgentContextBuilderConfig>\n): AgentContextBuilderConfig {\n return {\n ...AGENT_CONTEXT_BUILDER_CONFIG,\n ...overrides\n } as AgentContextBuilderConfig;\n}\n\n// 已移除预算自适应逻辑,统一使用 AGENT_CONTEXT_BUILDER_CONFIG\n\n/**\n * 获取Agent可用Token预算的辅助函数\n */\nexport function getAgentAvailableTokenBudget(totalBudget?: number): number {\n const budget = totalBudget || AGENT_CONTEXT_BUILDER_CONFIG.DEFAULT_MAX_TOKENS;\n return Math.max(0, budget - AGENT_CONTEXT_BUILDER_CONFIG.RESERVED_FOR_RESPONSE);\n}\n\n/**\n * Agent专用摘要触发条件检查函数\n */\nexport function shouldTriggerAgentSummarization(\n currentTokenUsage: number, \n totalBudget: number, \n config?: AgentContextBuilderConfig\n): boolean {\n const activeConfig = config || AGENT_CONTEXT_BUILDER_CONFIG;\n const threshold = totalBudget * activeConfig.SUMMARIZATION_TRIGGER_THRESHOLD;\n return currentTokenUsage >= threshold;\n}\n\n/**\n * 检查工具交互是否需要配对保留\n */\nexport function shouldPairToolInteraction(\n messageRole: string,\n hasToolMetadata: boolean\n): boolean {\n return (messageRole === 'assistant' && hasToolMetadata) || messageRole === 'tool';\n}\n\n/**\n * 验证Agent配置有效性的辅助函数\n */\nexport function validateAgentConfig(config: AgentContextBuilderConfig): boolean {\n // 检查绝对Token限制\n if (config.DEFAULT_MAX_TOKENS <= 0) {\n console.warn('DEFAULT_MAX_TOKENS must be positive');\n return false;\n }\n \n if (config.RESERVED_FOR_RESPONSE <= 0 || config.RESERVED_FOR_RESPONSE >= config.DEFAULT_MAX_TOKENS) {\n console.warn('RESERVED_FOR_RESPONSE must be positive and less than DEFAULT_MAX_TOKENS');\n return false;\n }\n \n // 检查百分比配置是否合理\n if (config.WORKING_MEMORY_BUDGET_PERCENTAGE <= 0 || config.WORKING_MEMORY_BUDGET_PERCENTAGE > 1) {\n console.warn('WORKING_MEMORY_BUDGET_PERCENTAGE should be between 0 and 1');\n return false;\n }\n \n if (config.SUMMARIZATION_TRIGGER_THRESHOLD <= 0 || config.SUMMARIZATION_TRIGGER_THRESHOLD > 1) {\n console.warn('SUMMARIZATION_TRIGGER_THRESHOLD should be between 0 and 1');\n return false;\n }\n \n if (config.SUMMARY_BUDGET_PERCENTAGE <= 0 || config.SUMMARY_BUDGET_PERCENTAGE > 0.5) {\n console.warn('SUMMARY_BUDGET_PERCENTAGE should be between 0 and 0.5');\n return false;\n }\n \n // 检查工具相关配置\n if (config.TOOL_PAIRING_SEARCH_RANGE <= 0) {\n console.warn('TOOL_PAIRING_SEARCH_RANGE should be positive');\n return false;\n }\n \n if (config.MAX_TOOL_PAIR_TOKENS <= 0) {\n console.warn('MAX_TOOL_PAIR_TOKENS should be positive');\n return false;\n }\n\n if (config.MAX_TOOL_OUTPUT_SUMMARY_TOKENS <= 0) {\n console.warn('MAX_TOOL_OUTPUT_SUMMARY_TOKENS should be positive');\n return false;\n }\n\n if (config.MAX_TOOL_OUTPUT_SUMMARY_TOKENS > config.MAX_TOOL_PAIR_TOKENS) {\n console.warn('MAX_TOOL_OUTPUT_SUMMARY_TOKENS should not exceed MAX_TOOL_PAIR_TOKENS');\n return false;\n }\n \n if (config.MIN_TOOL_INTERACTIONS_TO_KEEP < 0) {\n console.warn('MIN_TOOL_INTERACTIONS_TO_KEEP should be non-negative');\n return false;\n }\n\n if (config.MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP < 0) {\n console.warn('MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP should be non-negative');\n return false;\n }\n\n if (config.MAX_TOOL_INTERACTION_GROUPS_TO_KEEP <= 0) {\n console.warn('MAX_TOOL_INTERACTION_GROUPS_TO_KEEP should be positive');\n return false;\n }\n\n if (config.MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP > config.MAX_TOOL_INTERACTION_GROUPS_TO_KEEP) {\n console.warn('MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP should not exceed MAX_TOOL_INTERACTION_GROUPS_TO_KEEP');\n return false;\n }\n\n if (config.AVG_CHARS_PER_TOKEN <= 0) {\n console.warn('AVG_CHARS_PER_TOKEN should be positive');\n return false;\n }\n\n if (config.TOOL_CALL_OVERHEAD_TOKENS < 0) {\n console.warn('TOOL_CALL_OVERHEAD_TOKENS should be non-negative');\n return false;\n }\n\n if (config.TOKEN_ENCODING_NAME.trim().length === 0) {\n console.warn('TOKEN_ENCODING_NAME should not be empty');\n return false;\n }\n \n return true;\n}\n\n/**\n * 获取Agent默认Token配置\n */\nexport function getAgentDefaultTokenConfig(): {\n maxTokens: number;\n reservedForResponse: number;\n availableForContext: number;\n workingMemoryBudget: number;\n} {\n const config = AGENT_CONTEXT_BUILDER_CONFIG;\n const availableForContext = getAgentAvailableTokenBudget();\n \n return {\n maxTokens: config.DEFAULT_MAX_TOKENS,\n reservedForResponse: config.RESERVED_FOR_RESPONSE,\n availableForContext,\n workingMemoryBudget: Math.floor(availableForContext * config.WORKING_MEMORY_BUDGET_PERCENTAGE)\n };\n}\n","export { AgentContextManager } from './AgentContextManager';\nexport type { ContextBuildResult } from './AgentContextManager';\n\nexport {\n AGENT_CONTEXT_BUILDER_CONFIG,\n AgentBuildPhase,\n AgentMessagePriority,\n createAgentContextBuilderConfig,\n validateAgentConfig,\n} from './config';\nexport type { AgentContextBuildStats, AgentContextBuilderConfig } from './config';\n\nexport { ConversationSession } from './ConversationSession';\nexport * from './providers';\n","import type { AgentContextBuilderConfig } from '../config';\nimport {\n BaseContextProvider as SharedBaseContextProvider,\n type IContextProvider as SharedIContextProvider,\n type MessageProcessingState,\n type ProviderContext as SharedProviderContext,\n type ProviderResult,\n type SummarizationCallbacks,\n} from '../../../../shared/providers/base';\n\nexport type {\n MessageProcessingState,\n ProviderResult,\n SummarizationCallbacks,\n} from '../../../../shared/providers/base';\n\nexport type ProviderContext = SharedProviderContext<AgentContextBuilderConfig>;\nexport interface IContextProvider extends SharedIContextProvider<AgentContextBuilderConfig> {}\nexport abstract class BaseContextProvider\n extends SharedBaseContextProvider<AgentContextBuilderConfig>\n implements IContextProvider {}\n","/**\n * @file src/agent/context/providers/AgentCoreContextProvider.ts\n * @description Agent专用核心上下文保留层Provider - 第一阶段上下文构建\n * \n * 🎯 职责: 识别并保留必须保留的核心消息(Agent专用逻辑)\n * 📖 规则: 系统提示词、工具描述、最新用户输入、注入的上下文始终无条件保留\n * ✨ Agent特性: 支持宿主通过 MustKeepPolicy 声明必保留 fence,确保工具调用上下文的完整性\n * 🔧 工具优先: 优先保留工具调用相关的核心消息\n * \n * 🏗️ 架构优化: 工具描述现在由 AgentContextManager 统一管理,而不是在 MessageFormatter 中特殊处理\n * 这确保了架构的一致性和调试的透明性\n */\n\nimport { BaseContextProvider, MessageProcessingState, ProviderContext, ProviderResult } from './base';\nimport type { AiMessage } from '../../../../../contracts';\nimport {\n DEFAULT_MUST_KEEP_POLICY,\n findMatchingTruncationRule,\n type MustKeepPolicy,\n} from '../../../../shared/policies';\n\nexport interface AgentCoreContextProviderOptions {\n mustKeepPolicy?: MustKeepPolicy;\n}\n\n/**\n * Agent专用核心上下文保留层Provider\n * \n * 实现Agent README中描述的第一阶段:核心上下文保留层 (Must-Keep)\n * 内容包括:系统提示词、用户当前请求、宿主显式声明的必保留 fence。\n */\nexport class AgentCoreContextProvider extends BaseContextProvider {\n readonly name = 'AgentCoreContextProvider';\n readonly description = 'Agent核心上下文保留层 - 识别并保留系统提示词、最新用户输入和注入的上下文';\n readonly priority = 1; // 最高优先级\n\n private readonly mustKeepPolicy: MustKeepPolicy;\n\n constructor(options: AgentCoreContextProviderOptions = {}) {\n super();\n this.mustKeepPolicy = options.mustKeepPolicy ?? DEFAULT_MUST_KEEP_POLICY;\n }\n\n async provide(\n states: MessageProcessingState[], \n availableBudget: number, \n context: ProviderContext\n ): Promise<ProviderResult> {\n this.debug('🚀 开始核心上下文保留层处理', {\n totalMessages: states.length,\n availableBudget,\n }, context);\n\n let coreTokens = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n \n // 获取所有原始消息,用于判断最新用户输入\n const allMessages = states.map(s => s.message);\n \n for (let i = 0; i < states.length; i++) {\n const state = states[i];\n const msg = state.message;\n \n // 检查是否为核心消息\n if (this.isCoreMessage(msg, i, allMessages)) {\n let processedContent = msg.content;\n let contentType: MessageProcessingState['contentType'] = 'full';\n const truncationRule = findMatchingTruncationRule(msg, this.mustKeepPolicy);\n \n if (truncationRule) {\n const originalTokens = context.estimateTokens(msg);\n const maxAllowedTokens = Math.floor(context.totalBudget * truncationRule.maxBudgetFraction);\n \n if (originalTokens > maxAllowedTokens) {\n processedContent = this.truncateContent(msg.content, maxAllowedTokens, context.config.AVG_CHARS_PER_TOKEN);\n strategiesApplied.push(truncationRule.strategyName);\n \n this.debug('📄 核心注入消息被截断', {\n id: msg.id,\n originalTokens,\n maxAllowedTokens,\n truncatedTokens: context.estimateTokens({ ...msg, content: processedContent })\n }, context);\n }\n }\n \n // 标记为核心消息\n state.action = 'keep_core';\n state.processedContent = processedContent;\n state.contentType = contentType;\n state.phase = 'CORE_CONTEXT';\n \n // 重新计算Token数量(基于可能被截断的内容)\n state.tokens = context.estimateTokens({ ...msg, content: processedContent });\n coreTokens += state.tokens;\n processedCount++;\n \n this.debug(`✅ 标记为核心消息`, {\n index: i,\n id: msg.id,\n type: msg.type,\n tokens: state.tokens,\n totalCoreTokens: coreTokens\n }, context);\n } else {\n this.debug(`⏭️ 跳过非核心消息`, { \n index: i, \n id: msg.id, \n type: msg.type \n }, context);\n }\n }\n \n this.debug('📊 核心上下文保留层处理完成', {\n coreMessages: processedCount,\n coreTokens,\n remainingBudget: availableBudget - coreTokens\n }, context);\n\n return this.createResult(\n states,\n coreTokens,\n strategiesApplied,\n {\n processedCount,\n skippedCount: states.length - processedCount,\n addedCount: 0\n }\n );\n }\n\n /**\n * 判断是否为核心消息 - Agent专用逻辑\n * \n * 🎯 Agent核心上下文保留规则:\n * 1. 保留 system_prompt(系统级消息)\n * 2. 保留最新的 user 消息 (current_user_request)\n * 3. 保留 MustKeepPolicy 指定的 fence\n * 4. 对命中的 MustKeepPolicy.truncationRules 做 Token 截断\n */\n private isCoreMessage(msg: AiMessage, index: number, allMessages: AiMessage[]): boolean {\n // 规则1: 系统提示词始终无条件保留\n if (this.mustKeepPolicy.alwaysKeepTypes.includes(msg.type) && msg.type !== 'user_input') {\n return true;\n }\n \n // 规则2: 保留最新的用户输入消息 (current_user_request)\n if (msg.type === 'user_input') {\n const lastUserIndex = allMessages.map(m => m.type).lastIndexOf('user_input');\n return index === lastUserIndex;\n }\n \n const fenceKind = msg.metadata?.fenceKind;\n if (fenceKind && this.mustKeepPolicy.alwaysKeepFenceKinds.includes(fenceKind)) {\n return true;\n }\n \n // 🚨 重要:history_summary 不在此处保留,让其进入后续的处理流程\n // 这是解决\"循环累积\"问题的关键 - 旧摘要必须能被新摘要替换\n if (msg.type === 'history_summary') {\n return false;\n }\n \n return false;\n }\n\n /**\n * 内容截断 - 保持完整词汇\n * 复用ContextManager中的逻辑\n */\n private truncateContent(content: string, maxTokens: number, avgCharsPerToken: number): string {\n const maxChars = maxTokens * avgCharsPerToken;\n if (content.length <= maxChars) {\n return content;\n }\n\n // 找到最接近的词汇边界\n const truncated = content.substring(0, maxChars);\n const lastSpaceIndex = truncated.lastIndexOf(' ');\n const result = lastSpaceIndex > maxChars * 0.8 \n ? truncated.substring(0, lastSpaceIndex)\n : truncated;\n \n return result + '...';\n }\n}\n","import type { MessageProcessingState } from '../context/providers/base';\nimport type { AiMessage } from '../../../../contracts';\n\nconst CHECKPOINT_TOOL_NAME = 'context_checkpoint';\n\ntype IndexedEntry<T> = {\n value: T;\n originalIndex: number;\n message: AiMessage;\n};\n\ntype ToolCallRecord = {\n id: string;\n type?: string;\n function?: {\n name?: string;\n arguments?: string;\n };\n};\n\ninterface ToolInteractionGroupBuildOptions {\n /**\n * 工具调用与工具结果允许相隔的最大消息数。\n *\n * 中文备注:超过窗口的 tool_output 不再配对,避免很旧的 tool_calls 被远处结果误粘连。\n */\n maxPairingDistance?: number;\n /** 识别 checkpoint 工具组的工具名。默认保持 0.5.x 的 context_checkpoint。 */\n checkpointToolName?: string;\n}\n\nexport interface ToolInteractionGroupItem<T> {\n toolCallId: string;\n toolName: string;\n toolArgs: Record<string, unknown>;\n toolCall: ToolCallRecord;\n toolOutputs: T[];\n toolOutputMessages: AiMessage[];\n rawOutputs: string[];\n}\n\nexport interface ToolInteractionGroup<T> {\n anchorId: string;\n /** 工具组所属的用户轮次序号:0 表示第一条 user_input 之前,之后每遇到一条 user_input 递增。 */\n runOrdinal: number;\n assistantState: T;\n assistantMessage: AiMessage;\n assistantIndex: number;\n toolOutputs: T[];\n toolOutputMessages: AiMessage[];\n toolOutputIndexes: number[];\n toolCallIds: string[];\n toolNames: string[];\n sourceMessageIds: string[];\n messageIndexes: number[];\n startIndex: number;\n endIndex: number;\n isCheckpointGroup: boolean;\n isComplete: boolean;\n isCompressed: boolean;\n items: ToolInteractionGroupItem<T>[];\n messages: T[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isToolCallRecord(value: unknown): value is ToolCallRecord {\n if (!isRecord(value)) {\n return false;\n }\n return typeof value.id === 'string' && value.id.trim().length > 0;\n}\n\nfunction getToolCalls(message: AiMessage): ToolCallRecord[] {\n const toolCalls = message.metadata?.tool_calls;\n if (!Array.isArray(toolCalls)) {\n return [];\n }\n return toolCalls.filter(isToolCallRecord);\n}\n\nfunction safeParseArgs(rawArgs: string | undefined): Record<string, unknown> {\n if (typeof rawArgs !== 'string' || rawArgs.trim().length === 0) {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(rawArgs);\n return isRecord(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction getRawOutput(message: AiMessage): string {\n const rawOutput = message.metadata?.raw_output;\n if (typeof rawOutput === 'string' && rawOutput.trim().length > 0) {\n return rawOutput;\n }\n return message.content;\n}\n\nfunction hasCheckpointMarker(message: AiMessage): boolean {\n const rawOutput = message.metadata?.raw_output;\n return typeof rawOutput === 'string' && rawOutput.includes('\"context_checkpoint\"');\n}\n\nfunction buildToolInteractionGroups<T>(\n entries: IndexedEntry<T>[],\n options: ToolInteractionGroupBuildOptions = {},\n): ToolInteractionGroup<T>[] {\n type MutableGroup = {\n anchorId: string;\n assistantState: T;\n assistantMessage: AiMessage;\n assistantIndex: number;\n toolOutputs: Array<{ value: T; message: AiMessage; index: number }>;\n sourceMessageIds: Set<string>;\n runOrdinal: number;\n startIndex: number;\n endIndex: number;\n isCheckpointGroup: boolean;\n isCompressed: boolean;\n items: Array<{\n toolCallId: string;\n toolName: string;\n toolArgs: Record<string, unknown>;\n toolCall: ToolCallRecord;\n toolOutputs: Array<{ value: T; message: AiMessage; index: number }>;\n rawOutputs: string[];\n }>;\n };\n\n const groups: MutableGroup[] = [];\n const activeToolCallIdToGroupIndex = new Map<string, number>();\n let currentRunOrdinal = 0;\n const checkpointToolName = options.checkpointToolName ?? CHECKPOINT_TOOL_NAME;\n\n for (const entry of entries) {\n const { message } = entry;\n if (message.role === 'user' && message.type === 'user_input') {\n currentRunOrdinal += 1;\n }\n\n if (message.role === 'assistant' && message.type === 'tool_calls') {\n const toolCalls = getToolCalls(message);\n if (toolCalls.length === 0) {\n continue;\n }\n const groupIndex = groups.length;\n const itemList = toolCalls.map((toolCall) => {\n const toolName =\n typeof toolCall.function?.name === 'string' && toolCall.function.name.trim().length > 0\n ? toolCall.function.name\n : 'unknown_tool';\n return {\n toolCallId: toolCall.id,\n toolName,\n toolArgs: safeParseArgs(toolCall.function?.arguments),\n toolCall,\n toolOutputs: [] as Array<{ value: T; message: AiMessage; index: number }>,\n rawOutputs: [] as string[],\n };\n });\n\n const group: MutableGroup = {\n anchorId: message.id,\n assistantState: entry.value,\n assistantMessage: message,\n assistantIndex: entry.originalIndex,\n toolOutputs: [],\n sourceMessageIds: new Set<string>(message.id ? [message.id] : []),\n runOrdinal: currentRunOrdinal,\n startIndex: entry.originalIndex,\n endIndex: entry.originalIndex,\n isCheckpointGroup: itemList.some((item) => item.toolName === checkpointToolName),\n isCompressed: false,\n items: itemList,\n };\n\n groups.push(group);\n for (const item of itemList) {\n activeToolCallIdToGroupIndex.set(item.toolCallId, groupIndex);\n }\n continue;\n }\n\n if (message.role !== 'tool' || message.type !== 'tool_output') {\n continue;\n }\n\n const toolCallId = message.metadata?.tool_call_id;\n if (typeof toolCallId !== 'string' || toolCallId.trim().length === 0) {\n continue;\n }\n\n const groupIndex = activeToolCallIdToGroupIndex.get(toolCallId);\n if (groupIndex === undefined) {\n continue;\n }\n\n const group = groups[groupIndex];\n if (\n options.maxPairingDistance !== undefined &&\n entry.originalIndex - group.assistantIndex > options.maxPairingDistance\n ) {\n continue;\n }\n const item = group.items.find((candidate) => candidate.toolCallId === toolCallId);\n if (!item) {\n continue;\n }\n\n const outputEntry = { value: entry.value, message, index: entry.originalIndex };\n item.toolOutputs.push(outputEntry);\n item.rawOutputs.push(getRawOutput(message));\n group.toolOutputs.push(outputEntry);\n if (message.id) {\n group.sourceMessageIds.add(message.id);\n }\n group.endIndex = Math.max(group.endIndex, entry.originalIndex);\n if (item.toolName === CHECKPOINT_TOOL_NAME || hasCheckpointMarker(message)) {\n group.isCheckpointGroup = true;\n }\n }\n\n return groups.map((group) => {\n const sortedOutputs = [...group.toolOutputs].sort((left, right) => left.index - right.index);\n const sortedItems = group.items.map((item) => {\n const itemOutputs = [...item.toolOutputs].sort((left, right) => left.index - right.index);\n return {\n toolCallId: item.toolCallId,\n toolName: item.toolName,\n toolArgs: item.toolArgs,\n toolCall: item.toolCall,\n toolOutputs: itemOutputs.map((output) => output.value),\n toolOutputMessages: itemOutputs.map((output) => output.message),\n rawOutputs: [...item.rawOutputs],\n };\n });\n\n return {\n anchorId: group.anchorId,\n runOrdinal: group.runOrdinal,\n assistantState: group.assistantState,\n assistantMessage: group.assistantMessage,\n assistantIndex: group.assistantIndex,\n toolOutputs: sortedOutputs.map((output) => output.value),\n toolOutputMessages: sortedOutputs.map((output) => output.message),\n toolOutputIndexes: sortedOutputs.map((output) => output.index),\n toolCallIds: sortedItems.map((item) => item.toolCallId),\n toolNames: sortedItems.map((item) => item.toolName),\n sourceMessageIds: Array.from(group.sourceMessageIds),\n messageIndexes: [group.assistantIndex, ...sortedOutputs.map((output) => output.index)],\n startIndex: group.startIndex,\n endIndex: group.endIndex,\n isCheckpointGroup: group.isCheckpointGroup,\n isComplete: sortedItems.every((item) => item.toolOutputs.length > 0),\n isCompressed: group.isCompressed,\n items: sortedItems,\n messages: [group.assistantState, ...sortedOutputs.map((output) => output.value)],\n };\n });\n}\n\nexport function collectToolInteractionGroups<T extends MessageProcessingState>(\n states: T[],\n): ToolInteractionGroup<T>[] {\n const entries: IndexedEntry<T>[] = states.map((value, index) => ({\n value,\n originalIndex: index,\n message: value.message,\n }));\n\n return buildToolInteractionGroups(entries);\n}\n\nexport function buildToolInteractionGroupsFromMessages(\n messages: AiMessage[],\n options: {\n startIndex?: number;\n endIndexExclusive?: number;\n } = {},\n): ToolInteractionGroup<AiMessage>[] {\n const startIndex = Math.max(0, options.startIndex ?? 0);\n const endIndexExclusive = Math.min(messages.length, options.endIndexExclusive ?? messages.length);\n const entries = messages.slice(startIndex, endIndexExclusive).map((message, orderIndex) => ({\n value: message,\n originalIndex: startIndex + orderIndex,\n message,\n }));\n return buildToolInteractionGroups(entries);\n}\n\nexport function buildToolInteractionGroupsFromStates(\n states: MessageProcessingState[],\n options: ToolInteractionGroupBuildOptions = {},\n): ToolInteractionGroup<MessageProcessingState>[] {\n const normalizedPositions = getNormalizedStatePositions(states);\n const entries = states.map((state, orderIndex) => ({\n value: state,\n originalIndex: normalizedPositions[orderIndex],\n message: state.message,\n }));\n return buildToolInteractionGroups(entries, options);\n}\n\nexport function findCurrentRunStartIndex(messages: AiMessage[]): number {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role === 'user' && message.type === 'user_input') {\n return index;\n }\n }\n return messages.length;\n}\n\n/** @deprecated 使用 findCurrentRunStartIndex。旧名保留一个 sprint,避免下游 deep import 立刻断裂。 */\nexport const findCurrentRoundStartIndex = findCurrentRunStartIndex;\n\nexport function findLastUserInputOriginalIndex(states: MessageProcessingState[]): number | null {\n const normalizedPositions = getNormalizedStatePositions(states);\n let result: number | null = null;\n for (let orderIndex = 0; orderIndex < states.length; orderIndex += 1) {\n const state = states[orderIndex];\n if (state.message.role !== 'user' || state.message.type !== 'user_input') {\n continue;\n }\n const currentIndex = normalizedPositions[orderIndex];\n result = result === null ? currentIndex : Math.max(result, currentIndex);\n }\n return result;\n}\n\nfunction getNormalizedStatePositions(states: MessageProcessingState[]): number[] {\n const positions: number[] = [];\n let lastPosition = -1;\n for (let orderIndex = 0; orderIndex < states.length; orderIndex += 1) {\n const state = states[orderIndex];\n const rawPosition = typeof state.originalIndex === 'number' ? state.originalIndex : orderIndex;\n if (rawPosition > lastPosition) {\n positions.push(rawPosition);\n lastPosition = rawPosition;\n continue;\n }\n const nextPosition = lastPosition + 1;\n positions.push(nextPosition);\n lastPosition = nextPosition;\n }\n return positions;\n}\n","import type { AgentContextBuilderConfig } from '../../config';\nimport type { MessageProcessingState } from '../base';\nimport type { ToolPairFitResult, DebugFn } from './types';\nimport {\n buildToolInteractionGroupsFromStates,\n type ToolInteractionGroup,\n} from '../../../utils/toolInteractionGroup';\nimport type { AiMessage } from '../../../../../../contracts';\n\n/**\n * 工具对配对器\n *\n * 负责工具调用与工具结果的配对匹配,确保工具交互的完整性\n */\nexport class ToolPairMatcher {\n constructor(private readonly config: AgentContextBuilderConfig) {}\n\n /**\n * 判断是否为\"预处理阶段压缩的工具历史摘要消息\"\n * - 该类消息不再是 tool_calls/tool_output 的原始结构,而是 assistant 的自然语言记录\n * - 但它本质上仍代表一个工具交互组,应该在 P3(历史工具交互)阶段被优先/受限地纳入上下文\n */\n isCompressedToolHistoryMessage(message: AiMessage): boolean {\n const meta = message.metadata;\n return (\n message.role === 'assistant' &&\n message.type === 'final_answer' &&\n typeof meta?.['isCompressedToolHistory'] === 'boolean' &&\n meta['isCompressedToolHistory'] === true\n );\n }\n\n /**\n * 查找工具调用的配对消息\n * 从 assistant 消息向后查找对应的 tool 消息\n */\n findToolCallPair(\n assistantState: MessageProcessingState,\n allStates: MessageProcessingState[]\n ): ToolInteractionGroup<MessageProcessingState> | null {\n return this.findGroupByAnchorId(assistantState.message.id, allStates);\n }\n\n /**\n * 查找工具结果的配对消息\n * 从 tool 消息向前反向查找对应的 assistant 消息\n */\n findToolResultPair(\n toolState: MessageProcessingState,\n allStates: MessageProcessingState[]\n ): ToolInteractionGroup<MessageProcessingState> | null {\n const toolCallId = toolState.message.metadata?.tool_call_id;\n if (!toolCallId) {\n return null;\n }\n const groups = buildToolInteractionGroupsFromStates(allStates);\n for (let index = groups.length - 1; index >= 0; index -= 1) {\n const group = groups[index];\n if (group.toolCallIds.includes(toolCallId) && group.toolOutputs.some((state) => state.message.id === toolState.message.id)) {\n return group;\n }\n }\n return null;\n }\n\n /**\n * 检查工具配对是否能在预算内保留\n */\n canFitToolPair(\n group: ToolInteractionGroup<MessageProcessingState>,\n currentTokens: number,\n budgetLimit: number,\n debugFn?: DebugFn\n ): ToolPairFitResult {\n const pair = group.messages;\n const pairTokens = pair.reduce((sum, state) => sum + state.tokens, 0);\n\n // 检查预算限制\n if (currentTokens + pairTokens > budgetLimit) {\n return {\n canFit: false,\n needsTruncation: true,\n group,\n pair: pair,\n totalTokens: pairTokens,\n reason: 'budget_exceeded'\n };\n }\n\n // 检查单个工具交互对的最大Token限制\n if (pairTokens > this.config.MAX_TOOL_PAIR_TOKENS) {\n debugFn?.('⚠️ 工具交互对超过最大Token限制', {\n pairTokens,\n maxAllowed: this.config.MAX_TOOL_PAIR_TOKENS\n });\n return {\n canFit: false,\n needsTruncation: true,\n group,\n pair: pair,\n totalTokens: pairTokens,\n reason: 'pair_too_large'\n };\n }\n\n return {\n canFit: true,\n needsTruncation: false,\n group,\n pair: pair,\n totalTokens: pairTokens\n };\n }\n\n private findGroupByAnchorId(\n anchorId: string,\n allStates: MessageProcessingState[],\n ): ToolInteractionGroup<MessageProcessingState> | null {\n if (!anchorId) {\n return null;\n }\n const groups = buildToolInteractionGroupsFromStates(allStates);\n return groups.find((group) => group.anchorId === anchorId) ?? null;\n }\n}\n","import type { ToolSummaryProvider } from '../../../shared/preprocessors/base';\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport interface SummarizerConfig {\n fullContentThreshold: number;\n textPreviewLength: number;\n arrayPreviewCount: number;\n objectPreviewFieldCount: number;\n}\n\nexport const DEFAULT_SUMMARIZER_CONFIG: SummarizerConfig = {\n fullContentThreshold: 400,\n textPreviewLength: 200,\n arrayPreviewCount: 3,\n objectPreviewFieldCount: 5,\n};\n\nexport class ToolOutputSummarizer {\n private config: SummarizerConfig;\n\n constructor(config: Partial<SummarizerConfig> = {}) {\n this.config = { ...DEFAULT_SUMMARIZER_CONFIG, ...config };\n }\n\n getSummary(\n toolName: string,\n output: string,\n toolSummaryProvider?: ToolSummaryProvider,\n toolArgs?: UnknownRecord,\n ): string {\n if (!output) {\n return '无输出';\n }\n if (output.length <= this.config.fullContentThreshold) {\n return output;\n }\n if (toolSummaryProvider) {\n const toolSummary = this.tryToolSpecificSummary(toolName, output, toolSummaryProvider, toolArgs);\n if (toolSummary) {\n return toolSummary;\n }\n }\n return this.createGenericSummary(output);\n }\n\n formatToolArgs(args: UnknownRecord): string {\n if (!args || Object.keys(args).length === 0) {\n return '';\n }\n\n return Object.entries(args)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${key}=${JSON.stringify(value)}`)\n .join(', ');\n }\n\n private tryToolSpecificSummary(\n toolName: string,\n output: string,\n toolSummaryProvider: ToolSummaryProvider,\n toolArgs?: UnknownRecord,\n ): string | null {\n if (toolName === 'text_to_image' && toolArgs) {\n const n = typeof toolArgs.n === 'number' ? toolArgs.n : 1;\n return `生成了 ${n} 张图片。`;\n }\n\n try {\n const tool = toolSummaryProvider.getTool(toolName);\n if (tool && typeof tool.getExecutionSummary === 'function') {\n return tool.getExecutionSummary(output);\n }\n } catch (error) {\n console.error(`[ToolOutputSummarizer] Tool '${toolName}' getExecutionSummary failed:`, error);\n }\n\n return null;\n }\n\n private createGenericSummary(output: string): string {\n try {\n const parsed = JSON.parse(output);\n if (Array.isArray(parsed)) {\n return this.summarizeArray(parsed);\n }\n if (typeof parsed === 'object' && parsed !== null) {\n return this.summarizeObject(parsed as UnknownRecord);\n }\n } catch {\n // fall through to text summary\n }\n\n return this.summarizeText(output);\n }\n\n private summarizeArray(parsed: unknown[]): string {\n if (parsed.length === 0) {\n return '返回了空数组';\n }\n\n const preview = parsed\n .slice(0, this.config.arrayPreviewCount)\n .map((item) => {\n const itemStr = JSON.stringify(item);\n return itemStr.length > 30 ? `${itemStr.slice(0, 30)}...` : itemStr;\n })\n .join(', ');\n\n return `返回了${parsed.length}个结果, 前几个是: [${preview}${parsed.length > this.config.arrayPreviewCount ? '...' : ''}]`;\n }\n\n private summarizeObject(parsed: UnknownRecord): string {\n const keys = Object.keys(parsed);\n if (keys.length === 0) {\n return '返回了空对象';\n }\n if (parsed.observation && typeof parsed.observation === 'string') {\n return this.createGenericSummary(parsed.observation);\n }\n const previewKeys = keys.slice(0, this.config.objectPreviewFieldCount).join(', ');\n return `返回了包含[${previewKeys}${keys.length > this.config.objectPreviewFieldCount ? '...' : ''}]等${keys.length}个字段的对象`;\n }\n\n private summarizeText(output: string): string {\n const previewStart = output.slice(0, this.config.textPreviewLength);\n const previewEnd = output.slice(-this.config.textPreviewLength);\n return `返回了${output.length}字符的文本, 开头是: \"${previewStart}...\", 结尾是: \"...${previewEnd}\"`;\n }\n}\n\nexport const createDefaultToolOutputSummarizer = (\n config?: Partial<SummarizerConfig>,\n): ToolOutputSummarizer => new ToolOutputSummarizer(config);\n\nexport const summarizeToolOutput = (\n toolName: string,\n output: string,\n toolSummaryProvider?: ToolSummaryProvider,\n toolArgs?: UnknownRecord,\n config?: Partial<SummarizerConfig>,\n): string => {\n const summarizer = createDefaultToolOutputSummarizer(config);\n return summarizer.getSummary(toolName, output, toolSummaryProvider, toolArgs);\n};\n","import type { AgentContextBuilderConfig } from '../../config';\nimport type { TruncationResult, DebugFn } from './types';\nimport {\n createDefaultToolOutputSummarizer,\n type SummarizerConfig,\n} from '../../../utils/toolOutputSummarizer';\nimport type { ToolInteractionGroup } from '../../../utils/toolInteractionGroup';\nimport type { MessageProcessingState } from '../base';\nimport type { AiMessage } from '../../../../../../contracts';\n\n/**\n * 工具对截断器\n *\n * 负责超大工具对的智能截断,通过摘要技术压缩 tool_output\n */\nexport class ToolPairTruncator {\n constructor(private readonly config: AgentContextBuilderConfig) {}\n\n /**\n * 智能截断超大的工具对\n *\n * 🔥 核心功能:当工具对因尺寸过大无法装入上下文时,\n * 通过智能摘要技术对 tool_output 进行压缩,\n * 确保 Agent 不会丢失关键的工具执行信息\n */\n truncate(\n group: ToolInteractionGroup<MessageProcessingState>,\n estimateTokens: (message: AiMessage) => number,\n debugFn?: DebugFn\n ): TruncationResult {\n if (group.toolOutputs.length === 0) {\n debugFn?.('❌ 截断失败:工具组内没有可截断的 tool_output', {\n anchorId: group.anchorId,\n });\n return { success: false, tokensSaved: 0 };\n }\n const summarizer = createDefaultToolOutputSummarizer(this.createToolOutputSummaryConfig());\n let tokensSaved = 0;\n\n for (const item of group.items) {\n for (let index = 0; index < item.toolOutputs.length; index += 1) {\n const toolOutputState = item.toolOutputs[index];\n const toolOutputMessage = toolOutputState.message;\n const originalOutput = item.rawOutputs[index] ?? toolOutputMessage.content;\n const originalTokens = toolOutputState.tokens;\n const summary = summarizer.getSummary(\n item.toolName,\n originalOutput,\n undefined,\n item.toolArgs,\n );\n\n toolOutputMessage.content = summary;\n toolOutputMessage.metadata = {\n ...toolOutputMessage.metadata,\n truncated: true,\n originalLength: originalOutput.length,\n truncatedLength: summary.length,\n };\n toolOutputState.tokens = estimateTokens(toolOutputMessage);\n tokensSaved += originalTokens - toolOutputState.tokens;\n }\n }\n\n debugFn?.('✅ 工具组截断成功', {\n 锚点消息: group.anchorId,\n 工具数量: group.items.length,\n toolOutput数量: group.toolOutputs.length,\n 节省Token: tokensSaved,\n });\n\n return { success: tokensSaved > 0, tokensSaved };\n }\n\n /**\n * 基于 Agent 配置生成工具输出摘要器配置\n * - 目标:让截断后的 tool_output 摘要长度接近 MAX_TOOL_OUTPUT_SUMMARY_TOKENS\n * - 原则:依然保持\"首尾预览\"结构,提升信息量,但避免无上限膨胀\n */\n private createToolOutputSummaryConfig(): Partial<SummarizerConfig> {\n const maxSummaryChars = Math.floor(this.config.MAX_TOOL_OUTPUT_SUMMARY_TOKENS * this.config.AVG_CHARS_PER_TOKEN);\n // 文本摘要格式包含固定前缀/引号/省略号等,预留一定空间,避免超出目标\n const wrapperReserveChars = 160;\n const previewChars = Math.max(200, Math.floor((maxSummaryChars - wrapperReserveChars) / 2));\n\n return {\n textPreviewLength: previewChars,\n };\n }\n}\n","/**\n * @file src/agent/context-manager/profiles/agent/context/providers/working-memory/ReplacementSourceTagger.ts\n * @description 替换源标记器 - 负责管理消息的替换源ID追踪\n *\n * 🎯 职责:\n * - 为工具组标记替换源ID\n * - 添加替换源ID到消息状态\n *\n * 🔥 核心作用:\n * - 确保在摘要化时能够正确追溯被替换的原始消息ID\n * - 实现精确的历史净化机制\n */\n\nimport type { MessageProcessingState } from '../base';\n\n/**\n * 替换源标记器\n *\n * 负责管理消息的替换源ID追踪,确保摘要化时能够正确追溯被替换的原始消息\n */\nexport class ReplacementSourceTagger {\n /**\n * 为工具组标记替换源\n *\n * 只收集当前工具组中真实被替代的消息 ID,\n * 严禁再向相邻的 user_input / final_answer 扩散,避免后续摘要把无关消息吞掉。\n */\n tagReplacementSources(\n pair: MessageProcessingState[],\n _statePool: MessageProcessingState[]\n ): void {\n const ids = Array.from(new Set(pair.map(state => state.message.id).filter(Boolean)));\n if (ids.length === 0) {\n return;\n }\n\n // 为工具对中的每个消息添加替换源ID\n pair.forEach(state => this.addReplacementSources(state, ids));\n }\n\n /**\n * 添加替换源ID到消息状态\n *\n * 将新的ID合并到现有的 replacementSourceIds 列表中,自动去重\n */\n addReplacementSources(state: MessageProcessingState, ids: string[]): void {\n const existing = state.replacementSourceIds ?? [];\n const merged = new Set<string>([...existing, ...ids]);\n state.replacementSourceIds = Array.from(merged);\n }\n\n /**\n * 查找相邻状态\n *\n * 从指定索引开始,按指定方向查找满足条件的第一个状态\n *\n * @param stateMap 索引到状态的映射\n * @param startIndex 起始索引\n * @param direction 查找方向:-1 向前,1 向后\n * @param predicate 匹配条件\n */\n findAdjacentState(\n stateMap: Map<number, MessageProcessingState>,\n startIndex: number,\n direction: -1 | 1,\n predicate: (state: MessageProcessingState) => boolean\n ): MessageProcessingState | null {\n const indices = Array.from(stateMap.keys());\n if (indices.length === 0) {\n return null;\n }\n const minIndex = Math.min(...indices);\n const maxIndex = Math.max(...indices);\n\n for (let index = startIndex + direction; index >= minIndex && index <= maxIndex; index += direction) {\n const candidate = stateMap.get(index);\n if (candidate && predicate(candidate)) {\n return candidate;\n }\n }\n return null;\n }\n}\n","import type { MessageProcessingState } from '../base';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { HistoricalToolCandidate } from './types';\nimport type { ToolInteractionGroup } from '../../../utils/toolInteractionGroup';\n\n/**\n * 构造 P3 历史工具候选。\n *\n * 中文备注:\n * - compressed 工具历史摘要与 raw tool group 共享同一条“历史工具交互”预算;\n * - 候选按 originalIndex/startIndex 倒序返回,确保越新的历史越先被塞回上下文。\n */\nexport function buildHistoricalToolCandidates(params: {\n allStates: MessageProcessingState[];\n toolGroups: ToolInteractionGroup<MessageProcessingState>[];\n lastUserOriginalIndex: number;\n matcher: ToolPairMatcher;\n}): HistoricalToolCandidate[] {\n const { allStates, toolGroups, lastUserOriginalIndex, matcher } = params;\n const compressedCandidates = allStates\n .filter((state) => {\n if (!matcher.isCompressedToolHistoryMessage(state.message)) {\n return false;\n }\n return typeof state.originalIndex === 'number' && state.originalIndex <= lastUserOriginalIndex;\n })\n .map((state) => ({\n kind: 'compressed' as const,\n sortIndex: state.originalIndex,\n state,\n }));\n\n const groupCandidates = toolGroups\n .filter((group) => group.startIndex <= lastUserOriginalIndex)\n .map((group) => ({\n kind: 'group' as const,\n sortIndex: group.startIndex,\n group,\n }));\n\n return [...compressedCandidates, ...groupCandidates].sort((left, right) => right.sortIndex - left.sortIndex);\n}\n","import type { MessageProcessingState, ProviderContext } from '../base';\nimport {\n buildToolInteractionGroupsFromStates,\n} from '../../../utils/toolInteractionGroup';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { ToolPairTruncator } from './ToolPairTruncator';\nimport type { ReplacementSourceTagger } from './ReplacementSourceTagger';\nimport type { DebugFn, WorkingMemoryRetentionResult } from './types';\n\n/**\n * POST_TOOL_CALL 阶段的特殊保留策略。\n *\n * 中文备注:\n * - 工具刚执行完的下一 tick,最近工具组是模型续写最依赖的短期事实;\n * - 该策略先于常规 P1/P2/P3 执行,并通过 processedIds 防止后续重复计数。\n */\nexport function promoteMostRecentToolPair(params: {\n allStates: MessageProcessingState[];\n processedIds: Set<string>;\n currentTokens: number;\n budgetLimit: number;\n estimateTokens: ProviderContext['estimateTokens'];\n matcher: ToolPairMatcher;\n truncator: ToolPairTruncator;\n tagger: ReplacementSourceTagger;\n debug: DebugFn;\n}): WorkingMemoryRetentionResult {\n const {\n allStates,\n processedIds,\n currentTokens,\n budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n tagger,\n debug,\n } = params;\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n const toolGroups = buildToolInteractionGroupsFromStates(allStates);\n const group = [...toolGroups].reverse().find((candidate) => candidate.isComplete);\n if (!group || processedIds.has(group.anchorId)) {\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n tagger.tagReplacementSources(group.messages, allStates);\n\n const fit = matcher.canFitToolPair(group, currentTokens, budgetLimit, debug);\n if (fit.canFit) {\n for (const state of fit.pair) {\n if (state.action === 'skip') {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n tokensUsed += state.tokens;\n processedCount++;\n }\n processedIds.add(state.message.id);\n }\n strategiesApplied.push('post_tool_call_priority');\n debug('✅ POST_TOOL_CALL:优先保留最近工具交互对', { pairTokens: fit.totalTokens });\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n const truncated = truncator.truncate(group, estimateTokens, debug);\n if (!truncated.success) {\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n const fitAfterTruncation = matcher.canFitToolPair(group, currentTokens, budgetLimit, debug);\n if (!fitAfterTruncation.canFit) {\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n for (const state of fitAfterTruncation.pair) {\n if (state.action === 'skip') {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n tokensUsed += state.tokens;\n processedCount++;\n }\n processedIds.add(state.message.id);\n }\n strategiesApplied.push('post_tool_call_truncation');\n debug('✅ POST_TOOL_CALL:截断后优先保留最近工具交互对', {\n pairTokens: fitAfterTruncation.totalTokens,\n });\n\n return { tokensUsed, processedCount, strategiesApplied };\n}\n","import type { AgentContextBuilderConfig } from '../../config';\nimport type { MessageProcessingState } from '../base';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { DebugFn, WorkingMemoryRetentionResult } from './types';\n\n/**\n * P2:普通文本、历史摘要与 thought 保留策略。\n *\n * 中文备注:\n * - 这里不处理原始工具组,它们属于 P1/P3;\n * - 压缩工具历史摘要也不按普通 assistant 文本处理,避免绕过工具历史总量限制。\n */\nexport function processTextConversations(params: {\n skippedStates: MessageProcessingState[];\n processedIds: Set<string>;\n currentTokens: number;\n budgetLimit: number;\n config: AgentContextBuilderConfig;\n matcher: ToolPairMatcher;\n debug: DebugFn;\n}): WorkingMemoryRetentionResult {\n const {\n skippedStates,\n processedIds,\n currentTokens,\n budgetLimit,\n config,\n matcher,\n debug,\n } = params;\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n let thoughtsKeptCount = 0;\n\n for (let i = skippedStates.length - 1; i >= 0; i -= 1) {\n const state = skippedStates[i];\n\n if (currentTokens + tokensUsed >= budgetLimit) {\n debug('💰 达到预算限制,停止纯文本对话填充', {\n currentTokens: currentTokens + tokensUsed,\n budgetLimit,\n });\n break;\n }\n\n if (state.action !== 'skip' || processedIds.has(state.message.id)) {\n continue;\n }\n\n if (state.message.role === 'system' && state.message.type === 'history_summary') {\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n markWorkingMemory(state);\n tokensUsed += state.tokens;\n processedCount++;\n processedIds.add(state.message.id);\n strategiesApplied.push('history_summary');\n debug('✅ P2保留历史摘要', {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed,\n });\n }\n continue;\n }\n\n if (\n state.message.role === 'user' &&\n !state.message.metadata?.tool_name &&\n state.message.metadata?.fragmentType !== 'document'\n ) {\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n markWorkingMemory(state);\n tokensUsed += state.tokens;\n processedCount++;\n strategiesApplied.push('text_conversation');\n debug('✅ P2保留用户文本消息', {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed,\n });\n }\n continue;\n }\n\n if (\n state.message.role === 'assistant' &&\n !state.message.metadata?.tool_name &&\n !state.message.metadata?.tool_calls &&\n state.message.type !== 'tool_calls'\n ) {\n if (matcher.isCompressedToolHistoryMessage(state.message)) {\n continue;\n }\n\n if (state.message.type === 'thought') {\n if (thoughtsKeptCount < config.MAX_THOUGHTS_TO_KEEP) {\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n markWorkingMemory(state);\n tokensUsed += state.tokens;\n processedCount++;\n thoughtsKeptCount++;\n strategiesApplied.push('thought_processing');\n debug('✅ P2保留thought消息', {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed,\n });\n }\n }\n continue;\n }\n\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n markWorkingMemory(state);\n tokensUsed += state.tokens;\n processedCount++;\n strategiesApplied.push('text_conversation');\n debug('✅ P2保留助手文本消息', {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed,\n });\n }\n }\n }\n\n return { tokensUsed, processedCount, strategiesApplied };\n}\n\nfunction markWorkingMemory(state: MessageProcessingState): void {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n}\n","import type { MessageProcessingState, ProviderContext } from '../base';\nimport type { ToolInteractionGroup } from '../../../utils/toolInteractionGroup';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { ToolPairTruncator } from './ToolPairTruncator';\nimport type { DebugFn } from './types';\n\n/**\n * 工具组保留原语。\n *\n * 中文备注:\n * - P1、P3 都要保证 tool_call 与 tool_output 成对保留;\n * - 这里集中处理“直接装入 / 截断后装入 / 截断后仍超限”的协议细节。\n */\nexport function keepToolGroup(params: {\n group: ToolInteractionGroup<MessageProcessingState>;\n processedIds: Set<string>;\n currentTokens: number;\n budgetLimit: number;\n estimateTokens: ProviderContext['estimateTokens'];\n matcher: ToolPairMatcher;\n truncator: ToolPairTruncator;\n debug: DebugFn;\n directStrategy: string;\n truncatedStrategy: string;\n directLog: string;\n truncatedLog: string;\n truncationFailedLog: string;\n stopWhenTruncatedDoesNotFit: boolean;\n}): {\n tokensUsed: number;\n processedCount: number;\n strategiesApplied: string[];\n kept: boolean;\n stop: boolean;\n} {\n const {\n group,\n processedIds,\n currentTokens,\n budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n debug,\n } = params;\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n\n const fit = matcher.canFitToolPair(group, currentTokens, budgetLimit, debug);\n if (fit.canFit) {\n for (const pairState of fit.pair) {\n if (pairState.action === 'skip') {\n markWorkingMemory(pairState);\n tokensUsed += pairState.tokens;\n processedCount++;\n }\n processedIds.add(pairState.message.id);\n }\n strategiesApplied.push(params.directStrategy);\n debug(params.directLog, {\n anchorId: group.anchorId,\n pairSize: fit.pair.length,\n tokens: fit.totalTokens,\n });\n return { tokensUsed, processedCount, strategiesApplied, kept: true, stop: false };\n }\n\n const truncationResult = truncator.truncate(group, estimateTokens, debug);\n if (!truncationResult.success) {\n debug(params.truncationFailedLog, {\n anchorId: group.anchorId,\n pairSize: group.messages.length,\n tokens: group.messages.reduce((sum, state) => sum + state.tokens, 0),\n });\n return { tokensUsed, processedCount, strategiesApplied, kept: false, stop: false };\n }\n\n const fitAfterTruncation = matcher.canFitToolPair(group, currentTokens, budgetLimit, debug);\n if (!fitAfterTruncation.canFit) {\n if (params.stopWhenTruncatedDoesNotFit) {\n debug('💰 截断后仍无法装入预算,停止继续保留更旧工具对(保持结构一致)', {\n pairTokens: fitAfterTruncation.totalTokens,\n budgetLimit,\n });\n }\n return {\n tokensUsed,\n processedCount,\n strategiesApplied,\n kept: false,\n stop: params.stopWhenTruncatedDoesNotFit,\n };\n }\n\n for (const pairState of fitAfterTruncation.pair) {\n if (pairState.action === 'skip') {\n markWorkingMemory(pairState);\n tokensUsed += pairState.tokens;\n processedCount++;\n }\n processedIds.add(pairState.message.id);\n }\n strategiesApplied.push(params.truncatedStrategy);\n debug(params.truncatedLog, {\n anchorId: group.anchorId,\n pairSize: fitAfterTruncation.pair.length,\n tokens: fitAfterTruncation.totalTokens,\n truncatedTokens: truncationResult.tokensSaved,\n });\n return { tokensUsed, processedCount, strategiesApplied, kept: true, stop: false };\n}\n\nexport function markWorkingMemory(state: MessageProcessingState): void {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n}\n","import type { MessageProcessingState, ProviderContext } from '../base';\nimport type { ToolInteractionGroup } from '../../../utils/toolInteractionGroup';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { ToolPairTruncator } from './ToolPairTruncator';\nimport type { ReplacementSourceTagger } from './ReplacementSourceTagger';\nimport { keepToolGroup } from './ToolGroupKeeper';\nimport type { DebugFn, ToolInteractionRetentionResult } from './types';\n\n/**\n * P1:当前轮工具交互保留。\n *\n * 中文备注:\n * - 当前轮工具组优先保留,不受“历史工具组数量”上限影响;\n * - 历史工具组只在 P1 中保留最近 N 组,剩余交给 P3 统一处理。\n */\nexport function processToolInteractions(params: {\n allStates: MessageProcessingState[];\n toolGroups: ToolInteractionGroup<MessageProcessingState>[];\n processedIds: Set<string>;\n currentTokens: number;\n budgetLimit: number;\n estimateTokens: ProviderContext['estimateTokens'];\n maxToolPairsToKeep: number;\n minToolPairsToKeep: number;\n lastUserOriginalIndex: number | null;\n matcher: ToolPairMatcher;\n truncator: ToolPairTruncator;\n tagger: ReplacementSourceTagger;\n debug: DebugFn;\n}): ToolInteractionRetentionResult {\n const {\n allStates,\n toolGroups,\n processedIds,\n currentTokens,\n budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n tagger,\n debug,\n } = params;\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n let historicalToolGroupsKept = 0;\n const maxToolPairsToKeep = Math.max(0, Math.floor(params.maxToolPairsToKeep));\n const minToolPairsToKeep = Math.min(\n maxToolPairsToKeep,\n Math.max(0, Math.floor(params.minToolPairsToKeep)),\n );\n const lastUserOriginalIndex = params.lastUserOriginalIndex;\n\n for (let index = toolGroups.length - 1; index >= 0; index -= 1) {\n const group = toolGroups[index];\n const isInCurrentTurn =\n lastUserOriginalIndex === null\n ? true\n : group.startIndex > lastUserOriginalIndex;\n\n if (!isInCurrentTurn && historicalToolGroupsKept >= maxToolPairsToKeep) {\n break;\n }\n\n const shouldForceKeepForMinimum = historicalToolGroupsKept < minToolPairsToKeep;\n if (!shouldForceKeepForMinimum && currentTokens + tokensUsed >= budgetLimit) {\n debug('💰 达到预算限制,停止工具交互填充', {\n currentTokens: currentTokens + tokensUsed,\n budgetLimit,\n });\n break;\n }\n\n if (processedIds.has(group.anchorId)) {\n continue;\n }\n\n if (!group.isComplete) {\n debug('⚠️ 跳过不完整工具组,避免破坏协议顺序', {\n anchorId: group.anchorId,\n toolCallIds: group.toolCallIds,\n });\n continue;\n }\n\n tagger.tagReplacementSources(group.messages, allStates);\n const kept = keepToolGroup({\n group,\n processedIds,\n currentTokens: currentTokens + tokensUsed,\n budgetLimit: shouldForceKeepForMinimum ? Number.MAX_SAFE_INTEGER : budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n debug,\n directStrategy: 'tool_interaction_pairing',\n truncatedStrategy: 'tool_interaction_truncation',\n directLog: '✅ P1保留工具交互对',\n truncatedLog: '✅ P1截断工具交互对',\n truncationFailedLog: '❌ P1截断工具交互对失败',\n stopWhenTruncatedDoesNotFit: true,\n });\n\n tokensUsed += kept.tokensUsed;\n processedCount += kept.processedCount;\n strategiesApplied.push(...kept.strategiesApplied);\n\n if (kept.stop) {\n break;\n }\n if (kept.kept && !isInCurrentTurn) {\n historicalToolGroupsKept++;\n }\n }\n\n return { tokensUsed, processedCount, strategiesApplied, historicalToolGroupsKept };\n}\n","import type { MessageProcessingState, ProviderContext } from '../base';\nimport type { ToolInteractionGroup } from '../../../utils/toolInteractionGroup';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { ToolPairTruncator } from './ToolPairTruncator';\nimport type { ReplacementSourceTagger } from './ReplacementSourceTagger';\nimport { buildHistoricalToolCandidates } from './HistoricalToolCandidates';\nimport { keepToolGroup, markWorkingMemory } from './ToolGroupKeeper';\nimport type { DebugFn, HistoricalToolRetentionResult } from './types';\n\n/**\n * P3:历史工具交互保留。\n *\n * 中文备注:\n * - compressed 工具摘要与 raw 工具组共享 maxToolGroupsToKeep;\n * - 这里只处理最后一条 user_input 之前的历史段。\n */\nexport function processHistoricalToolInteractions(params: {\n allStates: MessageProcessingState[];\n toolGroups: ToolInteractionGroup<MessageProcessingState>[];\n processedIds: Set<string>;\n currentTokens: number;\n budgetLimit: number;\n estimateTokens: ProviderContext['estimateTokens'];\n maxToolGroupsToKeep: number;\n minToolGroupsToKeep: number;\n alreadyKeptToolGroups: number;\n lastUserOriginalIndex: number;\n matcher: ToolPairMatcher;\n truncator: ToolPairTruncator;\n tagger: ReplacementSourceTagger;\n debug: DebugFn;\n}): HistoricalToolRetentionResult {\n const {\n allStates,\n toolGroups,\n processedIds,\n currentTokens,\n budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n tagger,\n debug,\n } = params;\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n let toolGroupsKept = 0;\n const maxToolGroupsToKeep = Math.max(0, Math.floor(params.maxToolGroupsToKeep));\n const minToolGroupsToKeep = Math.min(\n params.alreadyKeptToolGroups + maxToolGroupsToKeep,\n Math.max(0, Math.floor(params.minToolGroupsToKeep)),\n );\n\n const candidates = buildHistoricalToolCandidates({\n allStates,\n toolGroups,\n lastUserOriginalIndex: params.lastUserOriginalIndex,\n matcher,\n });\n for (const candidate of candidates) {\n if (toolGroupsKept >= maxToolGroupsToKeep) {\n break;\n }\n\n const shouldForceKeepForMinimum = params.alreadyKeptToolGroups + toolGroupsKept < minToolGroupsToKeep;\n if (!shouldForceKeepForMinimum && currentTokens + tokensUsed >= budgetLimit) {\n debug('💰 达到预算限制,停止历史工具交互填充', {\n currentTokens: currentTokens + tokensUsed,\n budgetLimit,\n });\n break;\n }\n\n if (candidate.kind === 'compressed') {\n const state = candidate.state;\n if (processedIds.has(state.message.id) || state.action !== 'skip') {\n continue;\n }\n if (!shouldForceKeepForMinimum && currentTokens + tokensUsed + state.tokens > budgetLimit) {\n continue;\n }\n markWorkingMemory(state);\n tokensUsed += state.tokens;\n processedCount++;\n processedIds.add(state.message.id);\n toolGroupsKept++;\n strategiesApplied.push('compressed_tool_history');\n continue;\n }\n\n const group = candidate.group;\n if (processedIds.has(group.anchorId) || !group.isComplete) {\n continue;\n }\n\n tagger.tagReplacementSources(group.messages, allStates);\n const kept = keepToolGroup({\n group,\n processedIds,\n currentTokens: currentTokens + tokensUsed,\n budgetLimit: shouldForceKeepForMinimum ? Number.MAX_SAFE_INTEGER : budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n debug,\n directStrategy: 'historical_tool_interaction',\n truncatedStrategy: 'historical_tool_interaction_truncation',\n directLog: '✅ P3保留历史工具交互',\n truncatedLog: '✅ P3截断历史工具交互对',\n truncationFailedLog: '❌ P3截断历史工具交互对失败',\n stopWhenTruncatedDoesNotFit: false,\n });\n\n tokensUsed += kept.tokensUsed;\n processedCount += kept.processedCount;\n strategiesApplied.push(...kept.strategiesApplied);\n if (kept.kept) {\n toolGroupsKept++;\n }\n }\n\n return { tokensUsed, processedCount, strategiesApplied, toolGroupsKept };\n}\n","/**\n * @file src/agent/context/providers/AgentWorkingMemoryProvider.ts\n * @description Agent专用工作记忆填充层Provider - 第二阶段上下文构建\n *\n * 🎯 职责: 实现Agent的P1-P4优先级填充策略\n * 📖 策略: P1(工具交互) > P2(纯文本对话) > P3(历史工具交互) > P4(循环填充)\n * ✨ Agent特性: 工具调用优先级、配对保留策略\n * 🔧 核心逻辑: 保留工具调用时,必须确保其对应的另一半也被保留\n */\n\nimport { BaseContextProvider, MessageProcessingState, ProviderContext, ProviderResult } from './base';\nimport {\n createAgentContextBuilderConfig,\n type AgentContextBuilderConfig,\n} from '../config';\nimport {\n ToolPairMatcher,\n ToolPairTruncator,\n ReplacementSourceTagger,\n processHistoricalToolInteractions,\n processTextConversations,\n processToolInteractions,\n promoteMostRecentToolPair,\n} from './working-memory';\nimport type { DebugFn } from './working-memory';\nimport {\n buildToolInteractionGroupsFromStates,\n findLastUserInputOriginalIndex,\n} from '../../utils/toolInteractionGroup';\n\n/**\n * Agent专用工作记忆填充层Provider\n *\n * 实现Agent README中描述的第二阶段:工作记忆填充层 (Working Memory)\n * 工具调用为最高优先级,确保工具交互的完整性\n */\nexport class AgentWorkingMemoryProvider extends BaseContextProvider {\n readonly name = 'AgentWorkingMemoryProvider';\n readonly description = 'Agent工作记忆填充层 - 工具优先的反向填充策略,支持配对保留';\n readonly priority = 2; // 仅次于核心上下文\n\n private readonly matcher: ToolPairMatcher;\n private readonly truncator: ToolPairTruncator;\n private readonly tagger: ReplacementSourceTagger;\n private readonly config: AgentContextBuilderConfig;\n\n constructor(customConfig?: Partial<AgentContextBuilderConfig>) {\n super();\n this.config = createAgentContextBuilderConfig(customConfig ?? {});\n this.matcher = new ToolPairMatcher(this.config);\n this.truncator = new ToolPairTruncator(this.config);\n this.tagger = new ReplacementSourceTagger();\n }\n\n /**\n * 类型守卫:用于安全读取 ProviderContext 上的\"扩展字段\"\n * 注意:ProviderContext 本身是稳定契约,扩展字段来自编排层(不应污染接口定义)。\n */\n private isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n\n /**\n * 读取当前上下文阶段(如果编排层提供了 currentPhase)\n * - 禁止 any 类型断言:这里用 Record 逐层收窄。\n */\n private readCurrentPhase(context: ProviderContext): string | undefined {\n const ctx = context as unknown;\n if (!this.isRecord(ctx)) return undefined;\n const currentPhase = ctx['currentPhase'];\n if (!this.isRecord(currentPhase)) return undefined;\n const phase = currentPhase['phase'];\n return typeof phase === 'string' ? phase : undefined;\n }\n\n /**\n * 创建调试函数\n */\n private createDebugFn(context: ProviderContext): DebugFn {\n return (message: string, data?: Record<string, unknown>) => {\n this.debug(message, data, context);\n };\n }\n\n async provide(\n states: MessageProcessingState[],\n availableBudget: number,\n context: ProviderContext\n ): Promise<ProviderResult> {\n // 使用统一配置\n const config = this.config;\n\n this.debug('🧠 开始Agent工作记忆填充层处理', {\n totalMessages: states.length,\n availableBudget,\n config: {\n budgetPercentage: config.WORKING_MEMORY_BUDGET_PERCENTAGE\n }\n }, context);\n\n // 计算当前已使用的Token (核心上下文)\n const coreTokens = this.calculateUsedTokens(states);\n let workingMemoryTokens = coreTokens;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n\n // 计算工作记忆预算(使用配置中的百分比)\n const workingMemoryBudget = Math.floor(availableBudget * config.WORKING_MEMORY_BUDGET_PERCENTAGE);\n const remainingBudget = workingMemoryBudget - coreTokens;\n\n if (remainingBudget <= 0 && config.MIN_TOOL_INTERACTIONS_TO_KEEP <= 0) {\n this.debug('⚠️ 核心上下文已用尽预算,跳过工作记忆填充', {\n coreTokens,\n workingMemoryBudget\n }, context);\n return this.createResult(states, 0, [], { processedCount: 0, skippedCount: 0, addedCount: 0 });\n }\n\n // 🔥 阶段感知:POST_TOOL_CALL 优先保留\"最近一对\"工具交互(tool_calls ↔ tool_output)\n const processedIds = new Set<string>();\n const inPostToolCall = this.readCurrentPhase(context) === 'post_tool_call';\n if (inPostToolCall) {\n const pri = promoteMostRecentToolPair({\n allStates: states,\n processedIds,\n currentTokens: workingMemoryTokens,\n budgetLimit: workingMemoryBudget,\n estimateTokens: context.estimateTokens,\n matcher: this.matcher,\n truncator: this.truncator,\n tagger: this.tagger,\n debug: this.createDebugFn(context),\n });\n workingMemoryTokens += pri.tokensUsed;\n processedCount += pri.processedCount;\n strategiesApplied.push(...pri.strategiesApplied);\n }\n\n // 获取所有跳过的消息状态,用于填充\n const skippedStates = states.filter(s => s.action === 'skip');\n const toolGroups = buildToolInteractionGroupsFromStates(states, {\n maxPairingDistance: config.TOOL_PAIRING_SEARCH_RANGE,\n });\n\n // === Agent专用逻辑:工具优先填充策略 ===\n const maxToolGroupsTotal = config.MAX_TOOL_INTERACTION_GROUPS_TO_KEEP;\n const maxRecentToolPairs = config.MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP;\n let historicalToolGroupsKept = 0;\n\n // 计算\"当前轮次起点(最后一条 user_input)\"的 originalIndex\n const lastUserOriginalIndex = findLastUserInputOriginalIndex(states);\n\n // P1 优先级:工具交互(tool_calls 和 tool 消息)- 配对保留\n this.debug('🔧 P1优先级:开始处理工具交互(配对保留)', { remainingBudget: workingMemoryBudget - workingMemoryTokens });\n const p1Result = processToolInteractions({\n allStates: states,\n toolGroups,\n processedIds,\n currentTokens: workingMemoryTokens,\n budgetLimit: workingMemoryBudget,\n estimateTokens: context.estimateTokens,\n maxToolPairsToKeep: Math.min(maxRecentToolPairs, maxToolGroupsTotal),\n minToolPairsToKeep: config.MIN_TOOL_INTERACTIONS_TO_KEEP,\n lastUserOriginalIndex,\n matcher: this.matcher,\n truncator: this.truncator,\n tagger: this.tagger,\n debug: this.createDebugFn(context),\n });\n\n workingMemoryTokens += p1Result.tokensUsed;\n processedCount += p1Result.processedCount;\n strategiesApplied.push(...p1Result.strategiesApplied);\n historicalToolGroupsKept += p1Result.historicalToolGroupsKept;\n\n // P2 优先级:纯文本对话(user 和 assistant 纯文本消息)\n if (workingMemoryTokens < workingMemoryBudget) {\n this.debug('💬 P2优先级:开始处理纯文本对话', {\n remainingBudget: workingMemoryBudget - workingMemoryTokens\n });\n const p2Result = processTextConversations({\n skippedStates,\n processedIds,\n currentTokens: workingMemoryTokens,\n budgetLimit: workingMemoryBudget,\n config,\n matcher: this.matcher,\n debug: this.createDebugFn(context),\n });\n\n workingMemoryTokens += p2Result.tokensUsed;\n processedCount += p2Result.processedCount;\n strategiesApplied.push(...p2Result.strategiesApplied);\n }\n\n // P3 优先级:历史工具交互(第3组及以前的工具交互)\n if (workingMemoryTokens < workingMemoryBudget && lastUserOriginalIndex !== null) {\n this.debug('📚 P3优先级:开始处理历史工具交互', {\n remainingBudget: workingMemoryBudget - workingMemoryTokens\n });\n const remainingToolGroups = Math.max(0, maxToolGroupsTotal - historicalToolGroupsKept);\n const p3Result = processHistoricalToolInteractions({\n allStates: states,\n toolGroups,\n processedIds,\n currentTokens: workingMemoryTokens,\n budgetLimit: workingMemoryBudget,\n estimateTokens: context.estimateTokens,\n maxToolGroupsToKeep: remainingToolGroups,\n minToolGroupsToKeep: config.MIN_TOOL_INTERACTIONS_TO_KEEP,\n alreadyKeptToolGroups: historicalToolGroupsKept,\n lastUserOriginalIndex,\n matcher: this.matcher,\n truncator: this.truncator,\n tagger: this.tagger,\n debug: this.createDebugFn(context),\n });\n\n workingMemoryTokens += p3Result.tokensUsed;\n processedCount += p3Result.processedCount;\n strategiesApplied.push(...p3Result.strategiesApplied);\n }\n\n const finalTokensUsed = workingMemoryTokens - coreTokens;\n\n this.debug('📊 Agent工作记忆填充层处理完成', {\n workingMemoryMessages: processedCount,\n workingMemoryTokens: finalTokensUsed,\n totalTokensUsed: workingMemoryTokens,\n remainingBudget: availableBudget - workingMemoryTokens\n }, context);\n\n return this.createResult(\n states,\n finalTokensUsed,\n strategiesApplied,\n {\n processedCount,\n skippedCount: skippedStates.length - processedCount,\n addedCount: 0\n }\n );\n }\n\n /**\n * 计算当前已使用的Token数\n */\n private calculateUsedTokens(states: MessageProcessingState[]): number {\n return states\n .filter(s => s.action.startsWith('keep_'))\n .reduce((total, state) => total + state.tokens, 0);\n }\n\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\ntype LogPayload = Record<string, unknown> | undefined;\n\nconst DEFAULT_LEVEL = LogLevel.DEBUG;\n\nfunction formatPrefix(level: keyof Console, moduleName: string): string {\n return `[${new Date().toISOString()}] [${level.toUpperCase()}] [${moduleName}]`;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return level >= DEFAULT_LEVEL;\n}\n\nexport class Logger {\n constructor(private readonly moduleName: string) {}\n\n debug(message: string, data?: LogPayload): void {\n this.log(LogLevel.DEBUG, 'debug', message, data);\n }\n\n info(message: string, data?: LogPayload): void {\n this.log(LogLevel.INFO, 'info', message, data);\n }\n\n warn(message: string, data?: LogPayload): void {\n this.log(LogLevel.WARN, 'warn', message, data);\n }\n\n error(message: string, data?: LogPayload): void {\n this.log(LogLevel.ERROR, 'error', message, data);\n }\n\n private log(level: LogLevel, method: keyof Console, message: string, data?: LogPayload): void {\n if (!shouldLog(level)) {\n return;\n }\n const prefix = formatPrefix(method, this.moduleName);\n const fullMessage = `${prefix} ${message}`;\n if (data === undefined) {\n switch (method) {\n case 'debug':\n console.debug(fullMessage);\n break;\n case 'info':\n console.info(fullMessage);\n break;\n case 'warn':\n console.warn(fullMessage);\n break;\n case 'error':\n console.error(fullMessage);\n break;\n default:\n console.log(fullMessage);\n }\n return;\n }\n switch (method) {\n case 'debug':\n console.debug(fullMessage, data);\n break;\n case 'info':\n console.info(fullMessage, data);\n break;\n case 'warn':\n console.warn(fullMessage, data);\n break;\n case 'error':\n console.error(fullMessage, data);\n break;\n default:\n console.log(fullMessage, data);\n }\n }\n}\n","/**\n * @file src/agent/context-manager/profiles/agent/context/providers/CheckpointSummarizationProvider.ts\n * @description 上下文检查点 Provider(根因级语义修正版):\n *\n * ✅ checkpoint 是一个“正常工具调用”,必须以 tool_calls → tool_output 的形式按顺序保留在历史中,\n * 也必须按顺序进入发送给 LLM 的 messages(而不是被替换成 system history_summary 顶置到最前)。\n *\n * 🎯 checkpoint 的职责是“清理 checkpoint 之前的旧历史”,而不是“把 checkpoint 本身变成摘要”:\n * - 保留:Must-Keep(system_prompt / 最新 user_input / 必保留 fence 等)、checkpoint 工具对、\n * 以及 checkpoint 之前最近 N 对工具交互(默认 N=2)。\n * - 清理:checkpoint 之前更旧的工具对 / final_answer / thought / 旧 history_summary 等。\n *\n * ✅ 设计原则:\n * - checkpoint 只影响“本轮发给 LLM 的 messages 选择”,不生成任何 system 摘要事件;\n * - 数据库仍然落全量事实历史:裁剪不会影响持久化/回放,只影响本轮 LLM 输入。\n */\n\nimport {\n BaseContextProvider,\n type MessageProcessingState,\n type ProviderContext,\n type ProviderResult,\n} from './base';\nimport { CHECKPOINT_MARKER_TYPE } from '../../../../shared/checkpointMarker';\nimport { Logger } from '../../../../../shared/logger';\nimport {\n buildToolInteractionGroupsFromStates,\n type ToolInteractionGroup,\n} from '../../utils/toolInteractionGroup';\n\nconst logger = new Logger('CheckpointSummarizationProvider');\n\nconst CHECKPOINT_TOOL_NAME = 'context_checkpoint';\nconst DEFAULT_KEEP_PAIRS_BEFORE_CHECKPOINT = 2;\n\ntype UnknownRecord = Record<string, unknown>;\nfunction isRecord(v: unknown): v is UnknownRecord {\n return !!v && typeof v === 'object' && !Array.isArray(v);\n}\n\n/**\n * 从 tool_output 消息的 content 中尝试解析 checkpoint 标记\n * 返回 summary 字符串或 null\n */\nfunction extractCheckpointSummary(content: string): string | null {\n try {\n const parsed = JSON.parse(content) as Record<string, unknown>;\n // StructuredToolResult 格式:{ data: { _type, summary }, observation }\n const data = parsed['data'];\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const rec = data as Record<string, unknown>;\n if (rec['_type'] === CHECKPOINT_MARKER_TYPE && typeof rec['summary'] === 'string') {\n return rec['summary'];\n }\n }\n // 兼容直接格式\n if (parsed['_type'] === CHECKPOINT_MARKER_TYPE && typeof parsed['summary'] === 'string') {\n return parsed['summary'] as string;\n }\n } catch {\n // content 不是 JSON,跳过\n }\n return null;\n}\n\n/**\n * 从 tool_output 消息中提取 checkpoint summary(严格模式):\n * - 仅使用 metadata.raw_output(原始 JSON)\n * - 不解析 content,避免与 observation(给 AI 的纯文本)语义混淆\n */\nfunction extractCheckpointSummaryFromToolOutputMessage(message: {\n content?: unknown;\n metadata?: Record<string, unknown> | undefined;\n}): string | null {\n const rawOutput = message.metadata?.['raw_output'];\n if (typeof rawOutput === 'string') {\n return extractCheckpointSummary(rawOutput);\n }\n\n return null;\n}\n\nexport interface CheckpointSummarizationProviderOptions {\n /** checkpoint 之前保留的最近工具交互轮数。 */\n keepPairsBefore?: number;\n /** 触发 checkpoint 裁剪的工具名。默认 context_checkpoint。 */\n triggerToolName?: string;\n}\n\nexport class CheckpointSummarizationProvider extends BaseContextProvider {\n readonly name = 'CheckpointSummarizationProvider';\n readonly description = '上下文检查点 - 保留 checkpoint 工具对,裁剪其之前旧历史';\n readonly priority = 2.5;\n\n private readonly keepPairsBefore: number;\n private readonly triggerToolName: string;\n\n constructor(options: CheckpointSummarizationProviderOptions = {}) {\n super();\n this.keepPairsBefore = normalizeNonNegativeInteger(\n options.keepPairsBefore,\n DEFAULT_KEEP_PAIRS_BEFORE_CHECKPOINT,\n );\n this.triggerToolName = normalizeTriggerToolName(options.triggerToolName);\n }\n\n async provide(\n states: MessageProcessingState[],\n availableBudget: number,\n context: ProviderContext,\n ): Promise<ProviderResult> {\n // 1) 在 states 中搜索 context_checkpoint 的 tool_output\n const checkpointResult = this.findCheckpoint(states);\n if (!checkpointResult) {\n return this.createResult(states, 0, [], {\n processedCount: 0,\n skippedCount: 0,\n addedCount: 0,\n });\n }\n\n const { checkpointGroup } = checkpointResult;\n\n logger.info('🔄 检测到 checkpoint,开始执行 checkpoint 前历史清理', {\n totalStates: states.length,\n checkpointAnchorId: checkpointGroup.anchorId,\n triggerToolName: this.triggerToolName,\n keepPairsBefore: this.keepPairsBefore,\n });\n const keepBefore = this.findRecentToolPairIndicesBeforeCheckpoint(states, checkpointGroup.startIndex);\n\n const keepSet = new Set<number>([\n ...checkpointGroup.messageIndexes,\n ...keepBefore,\n ]);\n\n // 2.2) 强制提升保留工具交互的 action:checkpoint 与其前两对工具对必须进入最终 messages\n let promotedKeepCount = 0;\n for (const idx of keepSet) {\n const state = states[idx];\n if (!state) continue;\n if (state.action === 'skip') {\n state.action = 'keep_working_memory';\n state.phase = 'CHECKPOINT';\n promotedKeepCount++;\n }\n }\n\n // 3) 选择要裁剪的候选(仅限 checkpoint 之前)\n const candidatesToPurge: MessageProcessingState[] = [];\n for (let i = 0; i < states.length; i++) {\n if (i >= checkpointGroup.startIndex) {\n // checkpoint 本身以及之后的消息:全部不参与 purge(只做预算筛选)\n continue;\n }\n const s = states[i];\n const msg = s.message;\n\n // Must-Keep:永远不 purge(由 CoreContextProvider 标记)\n if (s.action === 'keep_core' && msg.type !== 'history_summary') {\n continue;\n }\n // 系统提示词类:永远不 purge(history_summary 除外)\n if (msg.role === 'system' && msg.type !== 'history_summary') {\n continue;\n }\n // checkpoint 前最近 N 对工具交互:不 purge\n if (keepSet.has(i)) {\n continue;\n }\n\n candidatesToPurge.push(s);\n }\n\n if (candidatesToPurge.length === 0) {\n logger.info('⏭️ 无可清理的 checkpoint 前历史,跳过 purge');\n return this.createResult(states, 0, [], {\n processedCount: 0,\n skippedCount: 0,\n addedCount: 0,\n });\n }\n\n // 4) 立即在本 tick 的 states 中应用裁剪:把候选全部降级为 skip(即不进 LLM messages)\n let demotedCount = 0;\n for (const s of candidatesToPurge) {\n if (s.action !== 'skip') {\n s.action = 'skip';\n s.phase = 'CHECKPOINT_PURGED';\n demotedCount++;\n }\n }\n\n logger.info('✅ Checkpoint 前历史裁剪完成', {\n purgedCount: candidatesToPurge.length,\n promotedKeepCount,\n demotedCount,\n });\n\n return this.createResult(\n states,\n 0,\n ['checkpoint_trim_before'],\n {\n processedCount: candidatesToPurge.length,\n skippedCount: 0,\n addedCount: 0,\n },\n );\n }\n\n /**\n * 在 states 中查找 context_checkpoint 工具的 observation\n * 返回 { summary, checkpointStateIndex } 或 null\n */\n private findCheckpoint(\n states: MessageProcessingState[],\n ): { summary: string; checkpointGroup: ToolInteractionGroup<MessageProcessingState> } | null {\n const groups = buildToolInteractionGroupsFromStates(states, {\n checkpointToolName: this.triggerToolName,\n });\n for (let index = groups.length - 1; index >= 0; index -= 1) {\n const group = groups[index];\n const summary = this.extractCheckpointSummaryFromGroup(group);\n if (summary) {\n return { summary, checkpointGroup: group };\n }\n }\n return null;\n }\n\n /**\n * 找到 checkpoint 之前最近 N 轮工具交互 indices\n * - 仅扫描 checkpoint tool_calls 之前的历史段\n */\n private findRecentToolPairIndicesBeforeCheckpoint(states: MessageProcessingState[], beforeIndexExclusive: number): number[] {\n if (this.keepPairsBefore <= 0) {\n return [];\n }\n\n const indices: number[] = [];\n const groups = buildToolInteractionGroupsFromStates(states, {\n checkpointToolName: this.triggerToolName,\n })\n .filter((group) => group.startIndex < beforeIndexExclusive && group.isComplete && !group.isCheckpointGroup)\n .slice(-this.keepPairsBefore);\n for (const group of groups) {\n indices.push(...group.messageIndexes);\n }\n return indices;\n }\n\n private extractCheckpointSummaryFromGroup(\n group: ToolInteractionGroup<MessageProcessingState>,\n ): string | null {\n if (!group.toolNames.includes(this.triggerToolName)) {\n return null;\n }\n for (const message of group.toolOutputMessages) {\n const summary = extractCheckpointSummaryFromToolOutputMessage(message);\n if (summary) {\n return summary;\n }\n }\n return null;\n }\n\n // 中文备注:这里不做“跨 tick 幂等事件锚点”,因为本 Provider 是纯裁剪逻辑,重复运行是幂等的。\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return fallback;\n }\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeTriggerToolName(value: string | undefined): string {\n const candidate = value?.trim();\n return candidate && candidate.length > 0 ? candidate : CHECKPOINT_TOOL_NAME;\n}\n","/**\n * @file src/agent/context-manager/profiles/agent/context/providers/index.ts\n * @description Agent profile provider 协议与实现导出\n */\n\nexport * from './base';\n\nexport { AgentCoreContextProvider } from './AgentCoreContextProvider';\nexport { AgentWorkingMemoryProvider } from './AgentWorkingMemoryProvider';\nexport { CheckpointSummarizationProvider } from './CheckpointSummarizationProvider';\nexport { SummarizationProvider } from '../../../../shared/providers';\nimport { ContextProviderRegistry as SharedContextProviderRegistry } from '../../../../shared/providers';\nimport type { AgentContextBuilderConfig } from '../config';\n\nexport class ContextProviderRegistry extends SharedContextProviderRegistry<AgentContextBuilderConfig> {}\n","import type { LlmRequestMessage, TokenizerPort } from '../ports';\nimport { TokenCalculator } from './TokenCalculator';\n\nexport interface DefaultTokenizerPortConfig {\n /** tiktoken encoding 名,默认沿用 TokenCalculator 的 cl100k_base 近似路径。 */\n encoding?: string;\n /** tiktoken 不可用或不指定 encoding 时的字符/token 兜底比。 */\n avgCharsPerToken?: number;\n /** 单个 tool_call 的额外 token 开销估算。 */\n toolCallOverhead?: number;\n}\n\n/**\n * linnkit 默认 tokenizer。\n *\n * 中文备注:\n * - 这是 TokenCalculator 的薄包装,保持 0.7.x 默认行为;\n * - host 不注入 TokenizerPort 时,context-manager 自动使用该实现;\n * - 只用于上下文 budget 估算,不用于计费。\n */\nexport class DefaultTokenizerPort implements TokenizerPort {\n constructor(private readonly config: DefaultTokenizerPortConfig = {}) {}\n\n estimateText(text: string, _modelId?: string): number {\n return TokenCalculator.estimateTokens(text, {\n encoding: this.config.encoding,\n avgCharsPerToken: this.config.avgCharsPerToken,\n });\n }\n\n estimateMessage(message: LlmRequestMessage, _modelId?: string): number {\n return TokenCalculator.estimateMessageTokens(message, {\n encoding: this.config.encoding,\n avgCharsPerToken: this.config.avgCharsPerToken,\n toolCallOverhead: this.config.toolCallOverhead,\n });\n }\n}\n\nexport function createDefaultTokenizerPort(config: DefaultTokenizerPortConfig = {}): TokenizerPort {\n return new DefaultTokenizerPort(config);\n}\n","import type {\n MessageProcessingState,\n ProviderContext,\n} from './providers/base';\nimport {\n SUMMARIZATION_FAILED_ERROR_CODE,\n isContextProviderError,\n} from './providers/base';\nimport type { ContextProviderRegistry } from './providers/registry';\nimport type { AiMessage, RuntimeEvent } from '../../contracts';\nimport type { ContextTraceCollector } from './context-trace';\n\nexport interface ContextPipelineStats<TPhase extends PropertyKey> {\n phaseTiming: Record<TPhase, number>;\n phaseTokenUsage: Record<TPhase, { used: number; percentage: number }>;\n messageStats: {\n original: number;\n afterCoreContext: number;\n afterWorkingMemory: number;\n afterSummarization: number;\n };\n}\n\nexport interface RunContextPipelineOptions<\n TConfig,\n TContext extends ProviderContext<TConfig>,\n TPhase extends PropertyKey,\n TStats extends ContextPipelineStats<TPhase>,\n> {\n messages: AiMessage[];\n totalBudget: number;\n buildStats: TStats;\n providerRegistry: ContextProviderRegistry<TConfig>;\n providerContext: TContext;\n estimateTokens: (message: AiMessage) => number;\n getPhaseByProviderName: (providerName: string) => TPhase | null;\n debug?: (message: string, data?: Record<string, unknown>) => void;\n contextTrace?: ContextTraceCollector;\n}\n\nexport interface RunContextPipelineResult {\n finalMessages: AiMessage[];\n finalTokens: number;\n strategiesApplied: string[];\n events: RuntimeEvent[];\n states: MessageProcessingState[];\n}\n\nexport async function runContextPipeline<\n TConfig,\n TContext extends ProviderContext<TConfig>,\n TPhase extends PropertyKey,\n TStats extends ContextPipelineStats<TPhase>,\n>(options: RunContextPipelineOptions<TConfig, TContext, TPhase, TStats>): Promise<RunContextPipelineResult> {\n const {\n messages,\n totalBudget,\n buildStats,\n providerRegistry,\n providerContext,\n estimateTokens,\n getPhaseByProviderName,\n debug,\n contextTrace,\n } = options;\n\n let states: MessageProcessingState[] = messages.map((message, index) => ({\n message,\n originalIndex: index,\n action: 'skip',\n tokens: estimateTokens(message),\n }));\n\n const providers = providerRegistry.getAllProviders();\n let availableBudget = totalBudget;\n const allStrategiesApplied: string[] = [];\n const allEvents: RuntimeEvent[] = [];\n\n debug?.('🎯 [ContextPipeline] 开始 Provider 链式处理', {\n totalProviders: providers.length,\n providerOrder: providers.map(provider => `${provider.name}(优先级:${provider.priority})`),\n });\n\n for (const provider of providers) {\n const phaseStartTime = performance.now();\n\n if (provider.shouldSkip?.(states, availableBudget, providerContext)) {\n debug?.(`⏭️ 跳过Provider: ${provider.name}`, { availableBudget });\n contextTrace?.recordProvider({\n providerName: provider.name,\n skipped: true,\n durationMs: performance.now() - phaseStartTime,\n beforeStates: states,\n afterStates: states,\n tokensUsed: 0,\n strategiesApplied: [],\n remainingBudget: availableBudget,\n });\n continue;\n }\n\n debug?.(`🔄 执行Provider: ${provider.name}`, { availableBudget });\n\n try {\n const beforeStates = cloneStatesForTrace(states);\n const result = await provider.provide(states, availableBudget, providerContext);\n\n states = result.states;\n\n if (result.events && result.events.length > 0) {\n allEvents.push(...result.events);\n debug?.('📦 收集到事件', {\n provider: provider.name,\n eventCount: result.events.length,\n eventTypes: result.events.map(event => event.type),\n });\n }\n\n availableBudget -= result.tokensUsed;\n allStrategiesApplied.push(...result.strategiesApplied);\n contextTrace?.recordProvider({\n providerName: provider.name,\n skipped: false,\n durationMs: performance.now() - phaseStartTime,\n beforeStates,\n afterStates: states,\n tokensUsed: result.tokensUsed,\n strategiesApplied: result.strategiesApplied,\n remainingBudget: availableBudget,\n });\n\n const phaseName = getPhaseByProviderName(provider.name);\n if (phaseName !== null) {\n buildStats.phaseTiming[phaseName] = performance.now() - phaseStartTime;\n buildStats.phaseTokenUsage[phaseName] = {\n used: result.tokensUsed,\n percentage: (result.tokensUsed / totalBudget) * 100,\n };\n }\n\n debug?.(`✅ Provider完成: ${provider.name}`, {\n tokensUsed: result.tokensUsed,\n remainingBudget: availableBudget,\n processedCount: result.stats.processedCount,\n strategiesApplied: result.strategiesApplied,\n });\n } catch (error) {\n debug?.(`❌ Provider失败: ${provider.name}`, { error });\n\n if (isFatalProviderError(error)) {\n throw error;\n }\n }\n }\n\n buildStats.messageStats.afterCoreContext = states.filter(state => state.action === 'keep_core').length;\n buildStats.messageStats.afterWorkingMemory = states.filter(state => state.action.startsWith('keep_')).length;\n buildStats.messageStats.afterSummarization = states.filter(state => state.action !== 'skip').length;\n\n const finalMessages = generateFinalMessages(states);\n const finalTokens = finalMessages.reduce((total, message) => total + estimateTokens(message), 0);\n contextTrace?.recordMessageDecisions(states);\n\n return {\n finalMessages,\n finalTokens,\n strategiesApplied: [...new Set(allStrategiesApplied)],\n events: allEvents,\n states,\n };\n}\n\nfunction cloneStatesForTrace(states: ReadonlyArray<MessageProcessingState>): MessageProcessingState[] {\n return states.map(state => ({ ...state }));\n}\n\nexport function generateFinalMessages(states: MessageProcessingState[]): AiMessage[] {\n const sysPromptMessages: MessageProcessingState[] = [];\n const summaryMessages: MessageProcessingState[] = [];\n const otherMessages: MessageProcessingState[] = [];\n\n for (const state of states) {\n if (!state.action.startsWith('keep_')) {\n continue;\n }\n\n if (state.message.type === 'system_prompt') {\n sysPromptMessages.push(state);\n } else if (state.message.type === 'history_summary') {\n summaryMessages.push(state);\n } else {\n otherMessages.push(state);\n }\n }\n\n sysPromptMessages.sort((a, b) => a.originalIndex - b.originalIndex);\n summaryMessages.sort((a, b) => a.originalIndex - b.originalIndex);\n otherMessages.sort((a, b) => a.originalIndex - b.originalIndex);\n\n const finalStates: MessageProcessingState[] = [\n ...sysPromptMessages,\n ...summaryMessages,\n ...otherMessages,\n ];\n\n return finalStates.map(state => {\n const { id, role, type, timestamp, metadata } = state.message;\n return {\n id,\n role,\n type,\n content: state.processedContent || state.message.content,\n timestamp,\n ...(metadata && { metadata }),\n } as AiMessage;\n });\n}\n\nfunction isFatalProviderError(error: unknown): boolean {\n return (\n isContextProviderError(error) &&\n error.code === SUMMARIZATION_FAILED_ERROR_CODE &&\n error.fatal === true\n );\n}\n","import { Logger } from '../../shared/logger';\nimport type { ContextProviderRegistry } from './providers/registry';\nimport type { ProviderContext } from './providers/base';\nimport { createDefaultTokenizerPort } from '../../shared/defaultTokenizerPort';\nimport {\n runContextPipeline,\n type ContextPipelineStats,\n type RunContextPipelineResult,\n} from './context-pipeline';\nimport type { AiMessage } from '../../contracts';\nimport type { LlmRequestMessage, TokenizerPort } from '../../ports';\nimport type { ContextTraceCollector } from './context-trace';\n\nexport interface ContextManagerBaseConfig {\n AVG_CHARS_PER_TOKEN: number;\n TOOL_CALL_OVERHEAD_TOKENS?: number;\n TOKEN_ENCODING_NAME?: string;\n}\n\nexport interface ContextManagerBaseOptions<TConfig, TRegistry> {\n debugMode?: boolean;\n customConfig?: Partial<TConfig>;\n providerRegistry?: TRegistry;\n tokenizer?: TokenizerPort;\n tokenizerModelId?: string;\n}\n\ninterface ContextManagerBaseInit<TConfig, TRegistry> {\n defaultConfig: TConfig;\n validateConfig: (config: TConfig) => boolean;\n createRegistry: () => TRegistry;\n loggerName: string;\n invalidConfigMessage: string;\n}\n\nexport abstract class ContextManagerBase<\n TConfig extends ContextManagerBaseConfig,\n TRegistry extends ContextProviderRegistry<TConfig>,\n> {\n protected config: TConfig;\n protected debugMode: boolean;\n protected providerRegistry: TRegistry;\n protected logger: Logger;\n protected tokenizer: TokenizerPort;\n protected tokenizerModelId?: string;\n private readonly validateConfigFn: (config: TConfig) => boolean;\n private readonly invalidConfigMessage: string;\n private readonly hasCustomTokenizer: boolean;\n\n protected constructor(\n options: ContextManagerBaseOptions<TConfig, TRegistry>,\n init: ContextManagerBaseInit<TConfig, TRegistry>,\n ) {\n this.debugMode = options.debugMode ?? false;\n this.config = options.customConfig\n ? { ...init.defaultConfig, ...options.customConfig }\n : init.defaultConfig;\n this.providerRegistry = options.providerRegistry ?? init.createRegistry();\n this.logger = new Logger(init.loggerName);\n this.validateConfigFn = init.validateConfig;\n this.invalidConfigMessage = init.invalidConfigMessage;\n this.hasCustomTokenizer = options.tokenizer !== undefined;\n this.tokenizer = options.tokenizer ?? this.createDefaultTokenizer();\n this.tokenizerModelId = options.tokenizerModelId;\n\n if (!this.validateConfigFn(this.config)) {\n throw new Error(this.invalidConfigMessage);\n }\n }\n\n private createDefaultTokenizer(): TokenizerPort {\n return createDefaultTokenizerPort({\n encoding: this.config.TOKEN_ENCODING_NAME,\n avgCharsPerToken: this.config.AVG_CHARS_PER_TOKEN,\n toolCallOverhead: this.config.TOOL_CALL_OVERHEAD_TOKENS,\n });\n }\n\n protected estimateTokens(message: AiMessage): number {\n return this.tokenizer.estimateMessage(message as LlmRequestMessage, this.tokenizerModelId);\n }\n\n protected debug(message: string, data?: Record<string, unknown>): void {\n if (this.debugMode) {\n this.logger.debug(message, data);\n }\n }\n\n protected runPipeline<\n TContext extends ProviderContext<TConfig>,\n TPhase extends PropertyKey,\n TStats extends ContextPipelineStats<TPhase>,\n >(options: {\n messages: AiMessage[];\n totalBudget: number;\n buildStats: TStats;\n providerContext: TContext;\n getPhaseByProviderName: (providerName: string) => TPhase | null;\n contextTrace?: ContextTraceCollector;\n }): Promise<RunContextPipelineResult> {\n return runContextPipeline({\n messages: options.messages,\n totalBudget: options.totalBudget,\n buildStats: options.buildStats,\n providerRegistry: this.providerRegistry,\n providerContext: options.providerContext,\n estimateTokens: message => this.estimateTokens(message),\n getPhaseByProviderName: options.getPhaseByProviderName,\n debug: (message, data) => this.debug(message, data),\n contextTrace: options.contextTrace,\n });\n }\n\n getConfig(): TConfig {\n return { ...this.config };\n }\n\n updateConfig(newConfig: Partial<TConfig>): void {\n this.config = { ...this.config, ...newConfig };\n if (!this.validateConfigFn(this.config)) {\n throw new Error(this.invalidConfigMessage);\n }\n if (!this.hasCustomTokenizer) {\n this.tokenizer = this.createDefaultTokenizer();\n }\n }\n\n /**\n * 更新传给 TokenizerPort 的模型 ID。\n *\n * 中文备注:同一个 context manager 被复用到不同模型时,host 必须同步更新这里;\n * AgentMessageOrchestrator 会按 request 自动处理,直接使用 ContextManager 的高级接入方才需要手动调用。\n */\n updateTokenizerModelId(modelId: string | undefined): void {\n this.tokenizerModelId = modelId;\n }\n}\n","import type { AiMessage, RuntimeEvent } from '../../contracts';\nimport type { ContextTrace } from './context-trace';\n\nexport interface RecommendationStats {\n phaseTokenUsage: Record<PropertyKey, { used: number; percentage: number }>;\n summarizationTriggered: boolean;\n summarizedCount?: number;\n documentTruncated: boolean;\n totalTime: number;\n}\n\nexport interface BuildContextResultOptions<TBuildStats> {\n finalMessages: AiMessage[];\n finalTokens: number;\n totalBudget: number;\n originalCount: number;\n strategiesApplied: string[];\n buildStats: TBuildStats;\n enableBuildStats: boolean;\n estimateTokens: (message: AiMessage) => number;\n coreTypes: readonly string[];\n recommendations: string[];\n events?: RuntimeEvent[];\n contextTrace?: ContextTrace;\n}\n\nexport function buildContextResult<TBuildStats>(\n options: BuildContextResultOptions<TBuildStats>,\n) {\n const {\n finalMessages,\n finalTokens,\n totalBudget,\n originalCount,\n strategiesApplied,\n buildStats,\n enableBuildStats,\n estimateTokens,\n coreTypes,\n recommendations,\n events = [],\n contextTrace,\n } = options;\n\n const tokenDistribution = calculateTokenDistribution(\n finalMessages,\n estimateTokens,\n coreTypes,\n );\n\n const processingStats = {\n originalCount,\n keptCount: finalMessages.length,\n truncatedCount: originalCount - finalMessages.length,\n tokenDistribution,\n strategiesApplied,\n recommendations,\n buildStats: enableBuildStats ? buildStats : undefined,\n };\n\n return {\n messages: finalMessages,\n tokenUsage: { used: finalTokens, remaining: totalBudget - finalTokens },\n processingStats,\n truncated: originalCount !== finalMessages.length,\n truncatedCount:\n originalCount > finalMessages.length\n ? originalCount - finalMessages.length\n : undefined,\n strategies: {\n applied: strategiesApplied,\n recommendations,\n },\n events,\n ...(contextTrace ? { contextTrace } : {}),\n };\n}\n\nexport function generateContextRecommendations(\n stats: RecommendationStats,\n options: {\n totalBudget: number;\n processingTimeoutMs: number;\n largeSummarizationWarningThreshold?: number;\n },\n): string[] {\n const recommendations: string[] = [];\n const usagePercentage =\n Object.values(stats.phaseTokenUsage).reduce(\n (sum, phase) => sum + phase.used,\n 0,\n ) / options.totalBudget;\n\n if (usagePercentage > 0.9) {\n recommendations.push('预算使用率较高,建议增加Token预算或减少输入长度');\n }\n\n if (stats.documentTruncated) {\n recommendations.push('文档片段被截断,建议分批处理或增加文档片段预算');\n }\n\n const summaryWarningThreshold =\n options.largeSummarizationWarningThreshold ?? 10;\n if (\n stats.summarizationTriggered &&\n (stats.summarizedCount || 0) > summaryWarningThreshold\n ) {\n recommendations.push('大量历史消息被摘要,建议定期清理对话历史');\n }\n\n if (stats.totalTime > options.processingTimeoutMs) {\n recommendations.push('上下文构建耗时较长,建议优化消息预处理流程');\n }\n\n return recommendations;\n}\n\nfunction calculateTokenDistribution(\n finalMessages: AiMessage[],\n estimateTokens: (message: AiMessage) => number,\n coreTypes: readonly string[],\n): Record<string, number> {\n const tokenDistribution: Record<string, number> = {\n core_context: 0,\n working_memory: 0,\n summarization: 0,\n };\n const lastUserIndex = finalMessages\n .map(message => message.type)\n .lastIndexOf('user_input');\n\n finalMessages.forEach((message, index) => {\n const token = estimateTokens(message);\n if (message.metadata?.messageType === 'summary') {\n tokenDistribution.summarization += token;\n } else if (\n coreTypes.includes(message.type) ||\n (message.type === 'user_input' && index === lastUserIndex)\n ) {\n tokenDistribution.core_context += token;\n } else {\n tokenDistribution.working_memory += token;\n }\n });\n\n return tokenDistribution;\n}\n","import type { AgentProfileRequest } from '../contracts';\nimport { ConversationSession } from './ConversationSession';\nimport { \n AGENT_CONTEXT_BUILDER_CONFIG,\n AgentBuildPhase,\n AgentContextBuildStats,\n validateAgentConfig,\n AgentContextBuilderConfig\n} from './config';\nimport { \n ProviderContext,\n ContextProviderRegistry,\n SummarizationCallbacks\n} from './providers';\nimport {\n ContextManagerBase,\n type ContextManagerBaseOptions,\n} from '../../../shared/context-manager-base';\nimport {\n buildContextResult,\n generateContextRecommendations,\n} from '../../../shared/context-result';\nimport { ContextTraceCollector, type ContextTrace } from '../../../shared/context-trace';\nimport type { GenerateRequest, GenerateResponse } from '../../chat/contracts';\nimport type {\n AgentSpecContextPolicy,\n AgentSpecContextTracePolicy,\n AiMessage,\n RuntimeEvent,\n} from '../../../../contracts';\nimport type { TokenizerPort } from '../../../../ports';\n\n/**\n * Agent 专用的 Provider 上下文\n * 继承自基础 ProviderContext,并添加 Agent 特有的信息\n */\nexport interface AgentProviderContext extends ProviderContext {\n agentRequest: AgentProfileRequest;\n}\n\n/**\n * 上下文构建结果接口\n */\nexport interface ContextBuildResult {\n /** 构建后的消息列表 */\n messages: AiMessage[];\n \n /** Token使用情况 */\n tokenUsage: {\n used: number;\n remaining: number;\n };\n \n /** 处理统计信息 */\n processingStats: {\n originalCount: number;\n keptCount: number;\n truncatedCount: number;\n tokenDistribution: Record<string, number>;\n strategiesApplied: string[];\n recommendations: string[];\n buildStats?: AgentContextBuildStats;\n };\n \n /** 是否进行了截断 */\n truncated: boolean;\n \n /** 截断的消息数量 */\n truncatedCount?: number;\n \n /** 应用的策略列表 */\n strategies: {\n applied: string[];\n recommendations: string[];\n };\n \n /** 🔥 新增:Provider生成的运行时事件(如摘要事件) */\n events?: RuntimeEvent[];\n\n /** ContextTrace:解释本次上下文构建如何保留/裁剪消息。 */\n contextTrace?: ContextTrace;\n}\n\n/**\n * Agent专用智能上下文管理器\n * \n * 🎯 核心职责: \n * 1. 编排Provider执行,构建优化的上下文\n * 2. 保证工具调用的完整性和配对保留\n * 3. 使用统一配置,不感知对话阶段\n * \n * 🏗️ 架构特性:\n * - Provider策略模式: 实现高内聚、低耦合\n * - 责任链模式: 按优先级编排Provider\n * - 专注于Provider编排,不负责消息构建\n */\nexport class AgentContextManager extends ContextManagerBase<\n AgentContextBuilderConfig,\n ContextProviderRegistry\n> {\n\n constructor(options: {\n debugMode?: boolean;\n customConfig?: Partial<AgentContextBuilderConfig>;\n providerRegistry?: ContextProviderRegistry;\n tokenizer?: TokenizerPort;\n tokenizerModelId?: string;\n } = {}) {\n super(options as ContextManagerBaseOptions<\n AgentContextBuilderConfig,\n ContextProviderRegistry\n >, {\n defaultConfig: AGENT_CONTEXT_BUILDER_CONFIG,\n validateConfig: validateAgentConfig,\n createRegistry: () => new ContextProviderRegistry(),\n loggerName: 'AgentContextManager',\n invalidConfigMessage: 'Invalid AgentContextManager configuration',\n });\n\n this.debug('🏗️ [Agent上下文管理器] 初始化完成', {\n providersCount: this.providerRegistry.getAllProviders().length\n });\n }\n\n /**\n * 主入口:为Agent构建智能上下文\n * 专门处理预处理过的消息,专注于上下文优化\n */\n async buildContextFromPreprocessedMessages(\n request: AgentProfileRequest,\n conversationSession: ConversationSession,\n preprocessedMessages: AiMessage[],\n totalBudget: number,\n callbacks?: SummarizationCallbacks,\n phaseOverride?: AgentBuildPhase, // 保留参数兼容性,但不再使用\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>,\n traceOptions?: {\n policy?: AgentSpecContextTracePolicy;\n effectiveContextPolicy?: AgentSpecContextPolicy;\n },\n ): Promise<ContextBuildResult> {\n // 计算摘要触发相关信息\n const summarizationThreshold = this.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n const summarizationTokenThreshold = Math.floor(totalBudget * summarizationThreshold);\n \n this.debug('🎯 [Agent上下文管理器] 开始上下文构建', { \n requestQuery: request.query.substring(0, 50),\n preprocessedMessageCount: preprocessedMessages.length,\n totalBudget,\n 摘要触发阈值: `${(summarizationThreshold * 100).toFixed(0)}%`,\n 摘要Token阈值: summarizationTokenThreshold\n });\n\n const startTime = performance.now();\n const buildStats: AgentContextBuildStats = this.initializeBuildStats(startTime, preprocessedMessages.length);\n\n try {\n // 创建 ProviderContext\n const enhancedContext: AgentProviderContext = {\n totalBudget,\n config: this.config,\n debugMode: this.debugMode,\n estimateTokens: (msg: AiMessage) => this.estimateTokens(msg),\n summarizationCallbacks: callbacks,\n generate,\n agentRequest: request\n };\n const contextTrace = ContextTraceCollector.create({\n policy: traceOptions?.policy,\n effectivePolicy: traceOptions?.effectiveContextPolicy,\n totalBudget,\n originalCount: preprocessedMessages.length,\n });\n\n // 核心流程:编排各个Provider按优先级处理预处理过的消息\n const { finalMessages, finalTokens, strategiesApplied, events } =\n await this.runPipeline({\n messages: preprocessedMessages,\n totalBudget,\n buildStats,\n providerContext: enhancedContext,\n getPhaseByProviderName: providerName => this.getPhaseByProviderName(providerName),\n contextTrace,\n });\n \n const endTime = performance.now();\n buildStats.totalTime = endTime - startTime;\n \n // 计算摘要触发相关信息\n const summarizationThreshold = this.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n const summarizationTokenThreshold = Math.floor(totalBudget * summarizationThreshold);\n \n this.debug('✅ [Agent上下文管理器] 上下文构建完成', {\n 预处理消息: preprocessedMessages.length,\n 最终消息: finalMessages.length,\n Token使用: finalTokens,\n 总预算: totalBudget,\n 使用率: `${((finalTokens / totalBudget) * 100).toFixed(1)}%`,\n 摘要触发阈值: `${(summarizationThreshold * 100).toFixed(0)}%`,\n 摘要Token阈值: summarizationTokenThreshold,\n 总耗时: `${buildStats.totalTime.toFixed(2)}ms`\n });\n\n return this.buildFinalResult(\n finalMessages, \n finalTokens, \n totalBudget, \n preprocessedMessages.length, \n strategiesApplied, \n buildStats,\n events,\n contextTrace?.build(finalMessages, finalTokens),\n );\n\n } catch (error) {\n this.debug('❌ [Agent上下文管理器] 上下文构建失败', { error });\n throw new Error(`Agent context building failed: ${error}`);\n }\n }\n\n // ------------------- 核心Provider编排方法 -------------------\n\n // ------------------- 辅助方法 -------------------\n\n /**\n * 根据Provider名称获取对应的阶段名称\n */\n private getPhaseByProviderName(providerName: string): AgentBuildPhase | null {\n const phaseMap: Record<string, AgentBuildPhase> = {\n 'CoreContextProvider': AgentBuildPhase.CORE_CONTEXT,\n 'WorkingMemoryProvider': AgentBuildPhase.WORKING_MEMORY,\n 'SummarizationProvider': AgentBuildPhase.SUMMARIZATION\n };\n return phaseMap[providerName] || null;\n }\n\n private initializeBuildStats(startTime: number, originalMessageCount: number): AgentContextBuildStats {\n return {\n startTime,\n phaseTiming: {} as Record<AgentBuildPhase, number>,\n phaseTokenUsage: {} as Record<AgentBuildPhase, { used: number; percentage: number }>,\n messageStats: {\n original: originalMessageCount,\n afterCoreContext: 0,\n afterWorkingMemory: 0,\n afterSummarization: 0\n },\n priorityStats: {\n p1ToolInteractions: 0,\n p2TextConversations: 0,\n p3HistoricalTools: 0,\n p4CircularFill: 0\n },\n toolStats: {\n totalToolCalls: 0,\n pairedToolCalls: 0,\n unpairedToolCalls: 0,\n toolPairingSuccessRate: 0\n },\n summarizationTriggered: false,\n documentTruncated: false,\n totalTime: 0\n };\n }\n\n private buildFinalResult(\n finalMessages: AiMessage[],\n finalTokens: number,\n totalBudget: number,\n originalCount: number,\n strategiesApplied: string[],\n buildStats: AgentContextBuildStats,\n events: RuntimeEvent[] = [], // 🔥 新增:事件列表\n contextTrace?: ContextTrace,\n ): ContextBuildResult {\n const recommendations = this.generateRecommendations(buildStats, totalBudget);\n return buildContextResult({\n finalMessages,\n finalTokens,\n totalBudget,\n originalCount,\n strategiesApplied,\n buildStats,\n enableBuildStats: this.config.ENABLE_BUILD_STATS,\n estimateTokens: message => this.estimateTokens(message),\n coreTypes: this.config.CORE_MESSAGE_TYPES,\n recommendations,\n events,\n contextTrace,\n });\n }\n /**\n * 生成优化建议\n */\n private generateRecommendations(stats: AgentContextBuildStats, totalBudget: number): string[] {\n return generateContextRecommendations(stats, {\n totalBudget,\n processingTimeoutMs: this.config.PROCESSING_TIMEOUT_MS,\n });\n }\n}\n","import type { AiMessage, AssistantMessage } from '../../../../contracts';\n\n/**\n * 对话会话管理类\n * \n * 单一职责:管理当前会话的消息存储和基础CRUD操作\n * - 存储和检索消息\n * - 维护对话历史的完整性\n * - 提供基础的消息查询功能\n * \n * 不负责:Token管理、智能截断、优先级分析(这些由WorkingContextManager处理)\n */\nexport class ConversationSession {\n private messages: AiMessage[];\n private systemPrompt: string;\n\n /**\n * 构造函数\n * @param systemPrompt 系统提示词\n */\n constructor(systemPrompt: string) {\n this.systemPrompt = systemPrompt;\n this.messages = []; // 初始化为空数组\n \n // 🔥 核心修复:仅当systemPrompt有实际内容时才添加系统消息\n if (systemPrompt && systemPrompt.trim()) {\n this.messages.push({\n id: `system_${Date.now()}`,\n role: 'system',\n type: 'system_prompt',\n content: systemPrompt,\n timestamp: Date.now()\n });\n }\n }\n\n /**\n * 添加消息到会话\n * @param role 消息角色\n * @param content 消息内容\n */\n addMessage(role: 'user' | 'assistant', content: string): void {\n if (role === 'user') {\n this.messages.push({\n id: `user_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'user',\n type: 'user_input',\n content,\n timestamp: Date.now()\n });\n } else {\n this.messages.push({\n id: `assistant_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'assistant',\n type: 'final_answer',\n content,\n timestamp: Date.now()\n });\n }\n }\n\n /**\n * 添加用户消息\n * @param content 用户消息内容\n * @param id 可选的消息ID,如果不提供则自动生成\n */\n addUserMessage(content: string, id?: string): void {\n this.messages.push({\n id: id || `user_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'user',\n type: 'user_input',\n content,\n timestamp: Date.now()\n });\n }\n\n /**\n * 添加助手消息,可能包含工具调用\n * @param content 文本内容(可选)\n * @param type 消息类型\n * @param metadata 消息元数据(可选)\n * @param id 可选的消息ID,如果不提供则自动生成\n */\n addAssistantMessage(\n content: string | null, \n type: AssistantMessage['type'],\n metadata?: AiMessage['metadata'],\n id?: string\n ): void {\n const message: AiMessage = {\n id: id || `assistant_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'assistant',\n type: type,\n content: content || '',\n timestamp: Date.now(),\n metadata\n };\n this.messages.push(message);\n }\n\n /**\n * 添加从历史记录加载的工具输出消息\n * @param content 消息内容\n * @param metadata 消息元数据\n */\n addToolOutputMessage(content: string, metadata: AiMessage['metadata']): void {\n const toolCallId = metadata?.tool_call_id;\n if (!toolCallId) {\n console.warn('[ConversationSession] Skipping tool output message without tool_call_id');\n return;\n }\n\n const message: AiMessage = {\n id: `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'tool',\n type: 'tool_output',\n content,\n timestamp: Date.now(),\n metadata,\n };\n this.messages.push(message);\n }\n\n /**\n * 添加工具调用的响应结果\n * @param toolCallId 工具调用的唯一ID\n * @param content 工具执行返回的结果(通常是字符串格式)\n * @param toolName 工具名称(可选)\n * @param id 可选的消息ID,如果不提供则自动生成\n */\n addToolResponse(toolCallId: string, content: string, toolName?: string, id?: string): void {\n this.messages.push({\n id: id || `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'tool',\n type: 'tool_output',\n // 🔥 新增:OpenAI 兼容字段 name,用于标识工具名\n ...(toolName ? { name: toolName } : {}),\n content,\n timestamp: Date.now(),\n metadata: {\n tool_call_id: toolCallId,\n tool_name: toolName\n }\n });\n }\n\n /**\n * 追加一条已构造完成的消息。\n *\n * 中文备注:\n * - 该方法用于回放阶段写入“已是最终形态”的消息,例如 `history_summary`;\n * - 这样 core 侧只依赖最小写入端口,不需要直接感知 `ConversationSession` 的私有字段结构。\n */\n appendMessage(message: AiMessage): void {\n this.messages.push(message);\n }\n\n /**\n * 获取完整的对话历史记录\n * @returns 消息数组\n */\n getHistory(): AiMessage[] {\n return [...this.messages]; // 返回副本,避免外部修改\n }\n\n /**\n * 清空对话历史,只保留系统提示词\n */\n clear(): void {\n this.messages = [\n {\n id: `system_${Date.now()}`,\n role: 'system',\n type: 'system_prompt',\n content: this.systemPrompt,\n timestamp: Date.now()\n }\n ];\n }\n\n /**\n * 更新系统提示词\n * @param newSystemPrompt 新的系统提示词\n */\n updateSystemPrompt(newSystemPrompt: string): void {\n this.systemPrompt = newSystemPrompt;\n \n // 更新历史记录中的系统消息\n if (this.messages.length > 0 && this.messages[0].role === 'system') {\n this.messages[0].content = newSystemPrompt;\n } else {\n // 如果第一条不是系统消息,则插入系统消息\n this.messages.unshift({\n id: `system_${Date.now()}`,\n role: 'system',\n type: 'system_prompt',\n content: newSystemPrompt,\n timestamp: Date.now()\n });\n }\n }\n\n /**\n * 获取当前系统提示词\n * @returns 系统提示词字符串\n */\n getSystemPrompt(): string {\n return this.systemPrompt;\n }\n\n /**\n * 获取消息总数(不包括系统消息)\n * @returns 消息数量\n */\n getMessageCount(): number {\n return this.messages.filter(msg => msg.role !== 'system').length;\n }\n\n /**\n * 获取最近的n条用户消息\n * @param n 消息数量\n * @returns 用户消息数组\n */\n getRecentUserMessages(n: number): AiMessage[] {\n return this.messages\n .filter(msg => msg.role === 'user')\n .slice(-n);\n }\n\n /**\n * 获取最近的n条助手消息\n * @param n 消息数量 \n * @returns 助手消息数组\n */\n getRecentAssistantMessages(n: number): AiMessage[] {\n return this.messages\n .filter(msg => msg.role === 'assistant')\n .slice(-n);\n }\n\n /**\n * 检查是否有待处理的工具调用\n * @returns 是否有未响应的工具调用\n */\n hasPendingToolCalls(): boolean {\n // 从后往前查找最近的assistant消息\n for (let i = this.messages.length - 1; i >= 0; i--) {\n const msg = this.messages[i];\n \n if (msg.role === 'assistant' && msg.metadata?.tool_calls && msg.metadata.tool_calls.length > 0) {\n // 检查这些工具调用是否都有对应的tool响应\n const toolCallIds = msg.metadata.tool_calls.map(tc => tc.id);\n const toolResponseIds = this.messages\n .slice(i + 1)\n .filter(m => m.role === 'tool')\n .map(m => m.metadata?.tool_call_id)\n .filter(id => id !== undefined);\n\n // 如果有工具调用ID没有对应的响应,说明有待处理的工具调用\n return !toolCallIds.every(id => toolResponseIds.includes(id));\n }\n \n // 如果遇到user消息,说明这一轮对话已结束\n if (msg.role === 'user') {\n break;\n }\n }\n \n return false;\n }\n\n /**\n * 获取待处理的工具调用\n * @returns 待处理的工具调用数组\n */\n getPendingToolCalls(): Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }> {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n const msg = this.messages[i];\n \n if (msg.role === 'assistant' && msg.metadata?.tool_calls && msg.metadata.tool_calls.length > 0) {\n const toolCallIds = msg.metadata.tool_calls.map(tc => tc.id);\n const toolResponseIds = this.messages\n .slice(i + 1)\n .filter(m => m.role === 'tool')\n .map(m => m.metadata?.tool_call_id)\n .filter(id => id !== undefined);\n\n // 返回没有响应的工具调用\n return msg.metadata.tool_calls.filter(tc => !toolResponseIds.includes(tc.id));\n }\n \n if (msg.role === 'user') {\n break;\n }\n }\n \n return [];\n }\n\n /**\n * 将历史记录序列化为JSON\n * @returns JSON字符串\n */\n serialize(): string {\n return JSON.stringify({\n systemPrompt: this.systemPrompt,\n messages: this.messages\n });\n }\n\n /**\n * 从JSON反序列化历史记录\n * @param json JSON字符串\n * @returns ConversationSession实例\n */\n static deserialize(json: string): ConversationSession {\n const data = JSON.parse(json);\n const session = new ConversationSession(data.systemPrompt);\n // 兼容性处理:支持旧的数据格式\n const messages = data.messages || data.history || [];\n \n // 如果没有系统消息,就使用默认的系统消息\n if (messages.length === 0 || messages[0].role !== 'system') {\n session.messages = [\n {\n id: `system_${Date.now()}`,\n role: 'system',\n type: 'system_prompt',\n content: data.systemPrompt,\n timestamp: new Date()\n },\n ...messages\n ];\n } else {\n session.messages = messages;\n }\n \n return session;\n }\n}\n\n// 🔥 优化:移除别名,统一使用ConversationSession\n// 如需向后兼容,可以在需要的地方单独导入\n","export { AgentMessageOrchestrator } from './AgentMessageOrchestrator';\nexport type { AgentOrchestratorOptions, AgentProcessingResult } from './AgentMessageOrchestrator';\n","import { \n IPreprocessor, \n PreprocessorContext, \n PreprocessorResult,\n type ToolReplayProtocolPolicy,\n} from './base';\nimport {\n FenceLifetimePreprocessor,\n HistoryPurificationPreprocessor,\n} from '../../../shared/preprocessors';\nimport type { FenceRegistry } from '../../../shared/fences';\nimport {\n ToolHistoryCompressorPreprocessor,\n type ToolHistoryCompressorOptions,\n} from './toolHistoryCompressor';\nimport { ToolReplayProtocolGuardPreprocessor } from './toolReplayProtocolGuard';\nimport type { AiMessage } from '../../../../contracts';\nimport { isContextProviderError } from '../../../shared/providers/base';\n\n// 重新导出公共接口\nexport * from './base';\nexport { FenceLifetimePreprocessor, HistoryPurificationPreprocessor } from '../../../shared/preprocessors';\nexport * from './toolHistoryCompressor';\nexport * from './toolReplayProtocolGuard';\n\nexport interface DefaultAgentPreprocessorRegistryOptions {\n fenceRegistry?: FenceRegistry;\n toolHistory?: ToolHistoryCompressorOptions;\n providerReplay?: ToolReplayProtocolPolicy;\n}\n\n/**\n * 预处理器注册表 - 管理所有预处理器及其执行顺序\n */\nexport class PreprocessorRegistry {\n private preprocessors: Map<string, IPreprocessor> = new Map();\n\n /**\n * 注册预处理器\n */\n register(preprocessor: IPreprocessor): void {\n if (this.preprocessors.has(preprocessor.name)) {\n throw new Error(`Preprocessor with name '${preprocessor.name}' is already registered`);\n }\n this.preprocessors.set(preprocessor.name, preprocessor);\n }\n\n /**\n * 获取指定名称的预处理器\n */\n getPreprocessor(name: string): IPreprocessor | undefined {\n return this.preprocessors.get(name);\n }\n\n /**\n * 获取所有预处理器,按优先级排序\n */\n getAllPreprocessors(): IPreprocessor[] {\n return Array.from(this.preprocessors.values())\n .sort((a, b) => a.priority - b.priority);\n }\n\n /**\n * 获取已注册的预处理器名称列表\n */\n getRegisteredNames(): string[] {\n return Array.from(this.preprocessors.keys());\n }\n\n /**\n * 检查是否已注册指定预处理器\n */\n isRegistered(name: string): boolean {\n return this.preprocessors.has(name);\n }\n\n /**\n * 获取注册的预处理器数量\n */\n getCount(): number {\n return this.preprocessors.size;\n }\n}\n\n/**\n * 预处理管道 - 按顺序执行所有预处理器\n */\nexport class PreprocessorPipeline {\n private registry: PreprocessorRegistry;\n private context: PreprocessorContext;\n\n constructor(\n registry: PreprocessorRegistry, \n context: PreprocessorContext = {}\n ) {\n this.registry = registry;\n this.context = context;\n }\n\n /**\n * 执行完整的预处理管道\n * \n * @param messages 输入消息列表\n * @returns 预处理管道的汇总结果\n */\n async process(messages: AiMessage[]): Promise<PreprocessorPipelineResult> {\n const startTime = performance.now();\n let currentMessages = messages;\n const pipelineResults: Array<{ preprocessor: string; result: PreprocessorResult }> = [];\n const appliedStrategies = new Set<string>();\n\n this.debug('🚀 开始Agent预处理管道', {\n 初始消息数: messages.length,\n 预处理器数量: this.registry.getCount()\n });\n\n // 获取所有预处理器,按优先级排序\n const preprocessors = this.registry.getAllPreprocessors();\n\n // 按优先级顺序执行每个预处理器\n for (const preprocessor of preprocessors) {\n this.debug(`🔄 执行预处理器: ${preprocessor.name}`, {\n 优先级: preprocessor.priority,\n 当前消息数: currentMessages.length\n });\n\n try {\n // 检查是否应该跳过\n if (preprocessor.shouldSkip?.(currentMessages, this.context)) {\n this.debug(`⏭️ 跳过预处理器: ${preprocessor.name}`, {});\n continue;\n }\n\n // 执行预处理\n const result = await preprocessor.process(currentMessages, this.context);\n \n // 记录结果\n pipelineResults.push({\n preprocessor: preprocessor.name,\n result\n });\n\n // 更新消息列表以供下一个预处理器使用\n currentMessages = result.messages;\n \n // 收集应用的策略\n result.appliedStrategies.forEach((strategy: string) => appliedStrategies.add(strategy));\n\n this.debug(`✅ 预处理器完成: ${preprocessor.name}`, {\n 输入消息: result.stats.originalCount,\n 输出消息: result.stats.processedCount,\n 移除消息: result.stats.removedCount,\n 修改消息: result.stats.modifiedCount,\n 应用策略: result.appliedStrategies\n });\n\n } catch (error) {\n this.debug(`❌ 预处理器失败: ${preprocessor.name}`, { error });\n if (isContextProviderError(error) && error.fatal) {\n throw error;\n }\n // 预处理器失败不应该中断整个管道,继续执行后续预处理器\n console.warn(`Agent Preprocessor ${preprocessor.name} failed:`, error);\n }\n }\n\n const endTime = performance.now();\n const processingTime = endTime - startTime;\n\n this.debug('🏁 Agent预处理管道完成', {\n 原始消息数: messages.length,\n 最终消息数: currentMessages.length,\n 总移除数: messages.length - currentMessages.length,\n 执行时间: `${processingTime.toFixed(2)}ms`,\n 应用策略: Array.from(appliedStrategies)\n });\n\n return {\n messages: currentMessages,\n pipelineStats: {\n originalCount: messages.length,\n finalCount: currentMessages.length,\n totalRemovedCount: messages.length - currentMessages.length,\n processingTime,\n preprocessorsExecuted: pipelineResults.length,\n appliedStrategies: Array.from(appliedStrategies)\n },\n individualResults: pipelineResults\n };\n }\n\n /**\n * 更新预处理上下文\n */\n updateContext(newContext: Partial<PreprocessorContext>): void {\n this.context = { ...this.context, ...newContext };\n }\n\n /**\n * 获取当前上下文\n */\n getContext(): PreprocessorContext {\n return { ...this.context };\n }\n\n /**\n * 调试日志\n */\n private debug(message: string, data?: Record<string, unknown>): void {\n if (this.context.debugMode) {\n console.log(`[AgentPreprocessorPipeline] ${message}`, data);\n }\n }\n}\n\n/**\n * 预处理管道结果接口\n */\nexport interface PreprocessorPipelineResult {\n /** 预处理后的消息列表 */\n messages: AiMessage[];\n \n /** 管道级别的统计信息 */\n pipelineStats: {\n originalCount: number;\n finalCount: number;\n totalRemovedCount: number;\n processingTime: number;\n preprocessorsExecuted: number;\n appliedStrategies: string[];\n };\n \n /** 各个预处理器的详细结果 */\n individualResults: Array<{\n preprocessor: string;\n result: PreprocessorResult;\n }>;\n}\n\n// ================= 默认配置 =================\n\n/**\n * 创建默认的Agent预处理器注册表\n * \n * 🔥 这里定义了Agent预处理管道的默认配置:\n * 1. ToolHistoryCompressorPreprocessor (priority: 0) - 工具历史压缩,最先执行\n * 2. ToolReplayProtocolGuardPreprocessor (priority: 0.5) - 工具回放协议守卫,仅治理历史轮次\n * 3. HistoryPurificationPreprocessor (priority: 1) - Agent历史净化,在压缩后执行\n * \n * 💡 未来可扩展:\n * 3. AgentToolCallValidationPreprocessor (priority: 2) - 工具调用验证\n * 4. AgentContextOptimizationPreprocessor (priority: 3) - 上下文优化\n */\nexport function createDefaultAgentPreprocessorRegistry(\n options: DefaultAgentPreprocessorRegistryOptions = {},\n): PreprocessorRegistry {\n const registry = new PreprocessorRegistry();\n \n // 注册工具历史压缩预处理器 - 优先级0,最先执行\n registry.register(new ToolHistoryCompressorPreprocessor(options.toolHistory));\n\n // 注册工具回放协议守卫 - 压缩后、净化前执行,避免旧工具组伪装为结构化 replay\n registry.register(new ToolReplayProtocolGuardPreprocessor({ policy: options.providerReplay }));\n \n // 注册Agent历史净化预处理器 - 优先级1,在压缩后执行\n // 🔥 使用共享实现,配置 Agent 模式的日志前缀\n registry.register(new HistoryPurificationPreprocessor({ logPrefix: 'Agent-HistoryPurification' }));\n\n if (options.fenceRegistry) {\n registry.register(new FenceLifetimePreprocessor({ fenceRegistry: options.fenceRegistry }));\n }\n \n // 未来可以在这里注册更多Agent专用预处理器:\n // registry.register(new AgentToolCallValidationPreprocessor());\n // registry.register(new AgentContextOptimizationPreprocessor());\n // registry.register(new AgentDeduplicationPreprocessor());\n \n return registry;\n}\n\n/**\n * 创建默认的Agent预处理管道\n * \n * @param context 预处理上下文配置\n * @returns 配置好的Agent预处理管道实例\n */\nexport function createDefaultAgentPreprocessorPipeline(\n context: PreprocessorContext = {},\n options: DefaultAgentPreprocessorRegistryOptions = {},\n): PreprocessorPipeline {\n const registry = createDefaultAgentPreprocessorRegistry(options);\n return new PreprocessorPipeline(registry, context);\n}\n","import type { ToolSummaryProvider } from '../../../shared/preprocessors/base';\nimport type { AiMessage } from '../../../../contracts';\n\nexport type MissingSidecarBehavior = 'allow' | 'degrade_to_text' | 'provider_empty_replay_field';\n\nexport interface ToolReplayProtocolPolicy {\n provider?: string;\n requiresReasoningDetailsForToolReplay?: boolean;\n missingSidecarBehavior?: MissingSidecarBehavior;\n}\n\n/**\n * Preprocessor context object\n */\nexport interface PreprocessorContext {\n debugMode?: boolean;\n model?: string;\n toolReplayProtocolPolicy?: ToolReplayProtocolPolicy;\n toolSummaryProvider?: ToolSummaryProvider;\n}\n\n/**\n * Result of a preprocessor run\n */\nexport interface PreprocessorResult {\n /** 预处理后的消息列表 */\n messages: AiMessage[];\n /** 预处理统计信息 */\n stats: {\n /** 原始消息数量 */\n originalCount: number;\n /** 处理后消息数量 */\n processedCount: number;\n /** 被移除的消息数量 */\n removedCount: number;\n /** 被修改的消息数量 */\n modifiedCount: number;\n };\n /** 应用的策略列表 */\n appliedStrategies: string[];\n}\n\n/**\n * 预处理器接口 - 管道模式的核心契约\n */\nexport interface IPreprocessor {\n /** 预处理器名称 */\n readonly name: string;\n \n /** 预处理器描述 */\n readonly description: string;\n \n /** 执行顺序优先级 (数字越小越先执行) */\n readonly priority: number;\n\n /**\n * 预处理方法 - 管道模式的核心方法\n * \n * @param messages 输入的消息列表\n * @param context 预处理上下文\n * @returns 预处理结果\n */\n process(\n messages: AiMessage[], \n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n /**\n * 可选:判断是否应该跳过此预处理器\n * \n * @param messages 输入的消息列表\n * @param context 预处理上下文\n * @returns true表示跳过,false表示执行\n */\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean;\n}\n\n/**\n * 预处理器基类 - 提供通用功能实现\n */\nexport abstract class BasePreprocessor implements IPreprocessor {\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly priority: number;\n\n abstract process(\n messages: AiMessage[], \n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n /**\n * 默认的跳过逻辑 - 子类可以覆盖\n */\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean {\n return false; // 默认不跳过\n }\n\n /**\n * 创建预处理结果的辅助方法\n */\n protected createResult(\n originalMessages: AiMessage[],\n processedMessages: AiMessage[],\n appliedStrategies: string[],\n modifiedCount: number = 0\n ): PreprocessorResult {\n const removedCount = originalMessages.length - processedMessages.length;\n \n return {\n messages: processedMessages,\n stats: {\n originalCount: originalMessages.length,\n processedCount: processedMessages.length,\n removedCount,\n modifiedCount\n },\n appliedStrategies\n };\n }\n\n /**\n * 调试日志辅助方法\n */\n protected debug(message: string, data?: Record<string, unknown>, context?: PreprocessorContext): void {\n if (context?.debugMode) {\n console.log(`[${this.name}] ${message}`, data);\n }\n }\n}\n","import { generateMessageId } from '../../../../shared/ids';\nimport {\n BasePreprocessor,\n PreprocessorContext,\n PreprocessorResult,\n} from './base';\nimport { createDefaultToolOutputSummarizer } from '../utils/toolOutputSummarizer';\nimport {\n buildToolInteractionGroupsFromMessages,\n findCurrentRunStartIndex,\n type ToolInteractionGroup,\n} from '../utils/toolInteractionGroup';\nimport type { AiMessage } from '../../../../contracts';\nimport {\n ContextProviderError,\n TOOL_HISTORY_OVERFLOW_ERROR_CODE,\n} from '../../../shared/providers/base';\n\nconst CHECKPOINT_TOOL_NAME = 'context_checkpoint';\nconst DEFAULT_KEEP_LATEST_TOOL_PAIRS = 2;\nconst DEFAULT_KEEP_LATEST_RUNS = 1;\nconst DEFAULT_MAX_INTERACTION_GROUPS = 12;\n\nexport type ToolHistoryCompressionStrategy = 'per-pair' | 'per-run' | 'none';\nexport type ToolHistoryOverflowStrategy = 'keep-latest' | 'fail-fast';\n\nexport interface ToolHistoryCompressorOptions {\n strategy?: ToolHistoryCompressionStrategy;\n keepLatestToolPairs?: number;\n keepLatestRuns?: number;\n maxInteractionGroups?: number;\n overflowStrategy?: ToolHistoryOverflowStrategy;\n maxPairTokens?: number;\n maxOutputSummaryTokens?: number;\n}\n\ntype NormalizedToolHistoryCompressorOptions = {\n strategy: ToolHistoryCompressionStrategy;\n keepLatestToolPairs: number;\n keepLatestRuns: number;\n maxInteractionGroups: number;\n overflowStrategy: ToolHistoryOverflowStrategy;\n};\n\n/**\n * 工具历史压缩预处理器。\n *\n * 三种策略边界:\n * - per-pair:旧行为,按全局最近 N 组完整工具交互保留,其余压成自然语言记录。\n * - per-run:按 user_input 划分 run,完整保留最近 K 个历史 run 内的工具组,避免腰斩同一轮工具链。\n * - none:不做常规压缩,仅在 maxInteractionGroups 显式触发时执行安全阀。\n *\n * 注意:单个 tool_output 的 token 截断不在这里做,那是 WorkingMemory 阶段\n * ToolPairTruncator 的职责;本处理器只决定“工具组是原样保留还是压缩为摘要消息”。\n */\nexport class ToolHistoryCompressorPreprocessor extends BasePreprocessor {\n readonly name = 'ToolHistoryCompressorPreprocessor';\n readonly description = '工具历史压缩处理器 - 将较早的历史工具调用对压缩为自然语言记录消息';\n readonly priority = 0;\n\n private summarizer = createDefaultToolOutputSummarizer();\n private readonly options: NormalizedToolHistoryCompressorOptions;\n\n constructor(options: ToolHistoryCompressorOptions = {}) {\n super();\n this.options = {\n strategy: options.strategy ?? 'per-run',\n keepLatestToolPairs: normalizeNonNegativeInteger(\n options.keepLatestToolPairs,\n DEFAULT_KEEP_LATEST_TOOL_PAIRS,\n ),\n keepLatestRuns: normalizeNonNegativeInteger(\n options.keepLatestRuns,\n DEFAULT_KEEP_LATEST_RUNS,\n ),\n maxInteractionGroups: normalizeNonNegativeInteger(\n options.maxInteractionGroups,\n DEFAULT_MAX_INTERACTION_GROUPS,\n ),\n overflowStrategy: options.overflowStrategy ?? 'keep-latest',\n };\n }\n\n async process(\n messages: AiMessage[],\n context: PreprocessorContext,\n ): Promise<PreprocessorResult> {\n this.debug('🔧 开始工具历史压缩处理', {\n 原始消息数: messages.length,\n }, context);\n\n const currentRunStartIndex = findCurrentRunStartIndex(messages);\n const historyMessages = messages.slice(0, currentRunStartIndex);\n const currentRunMessages = messages.slice(currentRunStartIndex);\n\n this.debug('📊 消息分段分析', {\n 历史消息数: historyMessages.length,\n 当前轮次消息数: currentRunMessages.length,\n 当前轮次起点索引: currentRunStartIndex,\n 工具压缩策略: this.options.strategy,\n }, context);\n\n const compressedHistory = this.compressToolCallPairsInHistory(historyMessages, context);\n\n const finalMessages = [...compressedHistory, ...currentRunMessages];\n const originalCount = messages.length;\n const compressedCount = finalMessages.length;\n const removedCount = originalCount - compressedCount;\n const appliedStrategies = removedCount > 0 ? ['tool_history_compression'] : [];\n\n this.debug('✅ 工具历史压缩完成', {\n 原始消息: originalCount,\n 压缩后消息: compressedCount,\n 减少消息: removedCount,\n Token节省估计: `约${removedCount * 50}个Token`,\n }, context);\n\n return this.createResult(\n messages,\n finalMessages,\n appliedStrategies,\n 0,\n );\n }\n\n shouldSkip(messages: AiMessage[], context: PreprocessorContext): boolean {\n const hasToolCalls = messages.some((msg) =>\n (msg.role === 'assistant' && msg.type === 'tool_calls') ||\n (msg.role === 'tool' && msg.type === 'tool_output'),\n );\n\n if (!hasToolCalls) {\n this.debug('⏭️ 无工具调用消息,跳过历史压缩', {}, context);\n return true;\n }\n\n return false;\n }\n\n private compressToolCallPairsInHistory(\n historyMessages: AiMessage[],\n context: PreprocessorContext,\n ): AiMessage[] {\n if (historyMessages.length < 2) {\n return historyMessages;\n }\n\n const groups = buildToolInteractionGroupsFromMessages(historyMessages);\n if (groups.length === 0) {\n this.debug('🤔 在历史记录中未找到有效的工具交互组,跳过压缩', {}, context);\n return historyMessages;\n }\n\n const completeGroups = groups.filter((group) => group.isComplete);\n const keepGroups = this.enforceMaxInteractionGroups(\n this.selectGroupsToKeep(completeGroups),\n context,\n );\n const keepAnchorIds = new Set(keepGroups.map((group) => group.anchorId));\n\n const messagesToRemove = new Set<number>();\n const replacementMap = new Map<number, AiMessage>();\n\n for (const group of groups) {\n if (!group.isComplete || keepAnchorIds.has(group.anchorId)) {\n continue;\n }\n const compressedMessage = this.compressToolInteractionGroup(group, context);\n replacementMap.set(group.assistantIndex, compressedMessage);\n for (const messageIndex of group.messageIndexes) {\n messagesToRemove.add(messageIndex);\n }\n }\n\n if (messagesToRemove.size === 0) {\n return historyMessages;\n }\n\n const finalResult: AiMessage[] = [];\n for (let i = 0; i < historyMessages.length; i++) {\n if (messagesToRemove.has(i)) {\n if (replacementMap.has(i)) {\n const replacement = replacementMap.get(i);\n if (replacement) {\n finalResult.push(replacement);\n }\n }\n } else {\n finalResult.push(historyMessages[i]);\n }\n }\n\n return finalResult;\n }\n\n private selectGroupsToKeep(\n completeGroups: Array<ToolInteractionGroup<AiMessage>>,\n ): Array<ToolInteractionGroup<AiMessage>> {\n const keepAnchorIds = new Set<string>();\n const latestCheckpointGroup = findLatestCheckpointGroup(completeGroups);\n\n if (this.options.strategy === 'none') {\n for (const group of completeGroups) {\n keepAnchorIds.add(group.anchorId);\n }\n } else if (this.options.strategy === 'per-run') {\n const maxRunOrdinal = completeGroups.reduce(\n (maxOrdinal, group) => Math.max(maxOrdinal, group.runOrdinal),\n 0,\n );\n const minRunOrdinal = Math.max(0, maxRunOrdinal - this.options.keepLatestRuns + 1);\n for (const group of completeGroups) {\n if (group.runOrdinal >= minRunOrdinal) {\n keepAnchorIds.add(group.anchorId);\n }\n }\n } else {\n const nonCheckpointGroups = completeGroups.filter((group) => !group.isCheckpointGroup);\n if (this.options.keepLatestToolPairs > 0) {\n for (const group of nonCheckpointGroups.slice(-this.options.keepLatestToolPairs)) {\n keepAnchorIds.add(group.anchorId);\n }\n }\n }\n\n if (latestCheckpointGroup) {\n keepAnchorIds.add(latestCheckpointGroup.anchorId);\n }\n\n return completeGroups.filter((group) => keepAnchorIds.has(group.anchorId));\n }\n\n private enforceMaxInteractionGroups(\n groupsToKeep: Array<ToolInteractionGroup<AiMessage>>,\n context: PreprocessorContext,\n ): Array<ToolInteractionGroup<AiMessage>> {\n if (groupsToKeep.length <= this.options.maxInteractionGroups) {\n return groupsToKeep;\n }\n\n if (this.options.overflowStrategy === 'fail-fast') {\n throw new ContextProviderError({\n code: TOOL_HISTORY_OVERFLOW_ERROR_CODE,\n fatal: true,\n providerName: this.name,\n message: `工具历史交互组数量 ${groupsToKeep.length} 超过上限 ${this.options.maxInteractionGroups}`,\n });\n }\n\n const latestCheckpointGroup = findLatestCheckpointGroup(groupsToKeep);\n const selectedAnchorIds = new Set<string>();\n if (latestCheckpointGroup) {\n selectedAnchorIds.add(latestCheckpointGroup.anchorId);\n }\n\n const sortedByLatestAction = [...groupsToKeep].sort((left, right) => right.endIndex - left.endIndex);\n for (const group of sortedByLatestAction) {\n if (selectedAnchorIds.size >= this.options.maxInteractionGroups) {\n break;\n }\n selectedAnchorIds.add(group.anchorId);\n }\n\n this.debug('⚠️ 工具历史交互组超过上限,按最近行动裁剪', {\n 原始保留组数: groupsToKeep.length,\n 裁剪后组数: selectedAnchorIds.size,\n 上限: this.options.maxInteractionGroups,\n }, context);\n\n return groupsToKeep.filter((group) => selectedAnchorIds.has(group.anchorId));\n }\n\n private compressToolInteractionGroup(\n group: ToolInteractionGroup<AiMessage>,\n context: PreprocessorContext,\n ): AiMessage {\n const summaryParts: string[] = [];\n for (const item of group.items) {\n const formattedArgs = this.summarizer.formatToolArgs(item.toolArgs);\n const argsPart = formattedArgs ? `(参数:${formattedArgs})` : '';\n const outputSummaries = item.rawOutputs.map((rawOutput) =>\n this.summarizer.getSummary(item.toolName, rawOutput, context.toolSummaryProvider, item.toolArgs),\n );\n const mergedSummary = outputSummaries.join(';');\n summaryParts.push(`我已经调用了工具「${item.toolName}」${argsPart},并得到了结果:${mergedSummary}`);\n }\n\n const compressedContent = `${summaryParts.join(';')},我需要思考下一步行动`;\n\n return {\n id: generateMessageId(),\n role: 'assistant',\n type: 'final_answer',\n content: compressedContent,\n timestamp: group.assistantMessage.timestamp,\n metadata: {\n isCompressedToolHistory: true,\n replacementSourceIds: group.sourceMessageIds,\n compressedToolCallIds: group.toolCallIds,\n compressedToolNames: group.toolNames,\n toolInteractionGroupSize: group.items.length,\n containsCheckpoint: group.isCheckpointGroup,\n },\n };\n }\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return fallback;\n }\n return Math.max(0, Math.floor(value));\n}\n\nfunction findLatestCheckpointGroup<T>(\n groups: Array<ToolInteractionGroup<T>>,\n): ToolInteractionGroup<T> | undefined {\n return groups\n .filter((group) => group.isCheckpointGroup)\n .sort((left, right) => left.endIndex - right.endIndex)\n .at(-1);\n}\n","import { generateMessageId } from '../../../../shared/ids';\nimport type { AiMessage } from '../../../../contracts';\nimport {\n BasePreprocessor,\n PreprocessorContext,\n PreprocessorResult,\n type ToolReplayProtocolPolicy,\n} from './base';\nimport {\n buildToolInteractionGroupsFromMessages,\n findCurrentRunStartIndex,\n type ToolInteractionGroup,\n} from '../utils/toolInteractionGroup';\n\nexport interface ToolReplayProtocolGuardOptions {\n policy?: ToolReplayProtocolPolicy;\n priority?: number;\n}\n\nexport function resolveToolReplayProtocolPolicy(\n context: PreprocessorContext,\n explicitPolicy?: ToolReplayProtocolPolicy,\n): ToolReplayProtocolPolicy {\n if (explicitPolicy) {\n return explicitPolicy;\n }\n\n if (context.toolReplayProtocolPolicy) {\n return context.toolReplayProtocolPolicy;\n }\n\n return {\n missingSidecarBehavior: 'allow',\n };\n}\n\nfunction hasReasoningDetails(message: AiMessage): boolean {\n const reasoningDetails = message.metadata?.reasoning_details;\n return Array.isArray(reasoningDetails) && reasoningDetails.length > 0;\n}\n\nfunction stringifyRecord(record: Record<string, unknown>): string {\n try {\n return JSON.stringify(record);\n } catch {\n return '{}';\n }\n}\n\nfunction buildDegradedToolReplayMessage(group: ToolInteractionGroup<AiMessage>): AiMessage {\n const lines: string[] = [];\n const assistantContent = group.assistantMessage.content.trim();\n if (assistantContent) {\n lines.push(assistantContent);\n }\n\n for (const item of group.items) {\n lines.push(`Tool call ${item.toolName} args=${stringifyRecord(item.toolArgs)}`);\n const outputs = item.rawOutputs.length > 0 ? item.rawOutputs : [''];\n for (const rawOutput of outputs) {\n lines.push(`Tool result ${item.toolCallId}: ${rawOutput}`);\n }\n }\n\n return {\n id: generateMessageId(),\n role: 'assistant',\n type: 'final_answer',\n content: lines.join('\\n\\n'),\n timestamp: group.assistantMessage.timestamp,\n metadata: {\n isDegradedToolReplay: true,\n degradationReason: 'missing_required_reasoning_details',\n replacementSourceIds: group.sourceMessageIds,\n degradedToolCallIds: group.toolCallIds,\n degradedToolNames: group.toolNames,\n toolInteractionGroupSize: group.items.length,\n },\n };\n}\n\nfunction markProviderEmptyReplayField(message: AiMessage, group: ToolInteractionGroup<AiMessage>): AiMessage {\n return {\n ...message,\n metadata: {\n ...message.metadata,\n provider_empty_replay_field: true,\n providerSidecarMissingBehavior: 'provider_empty_replay_field',\n providerSidecarMissingReason: 'missing_required_reasoning_details',\n providerSidecarMissingSourceIds: group.sourceMessageIds,\n providerSidecarMissingToolCallIds: group.toolCallIds,\n providerSidecarMissingToolNames: group.toolNames,\n },\n };\n}\n\n/**\n * Agent 工具回放协议守卫。\n *\n * 中文说明:\n * - 正向链路必须优先保证真实 provider sidecar 不丢;\n * - 这里仅处理“已经进入历史轮次”的旧工具组,避免它们继续伪装成结构化 replay;\n * - 当前轮次的工具组不在这里降级,否则会掩盖新链路丢 sidecar 的根因。\n */\nexport class ToolReplayProtocolGuardPreprocessor extends BasePreprocessor {\n readonly name = 'ToolReplayProtocolGuardPreprocessor';\n readonly description = '工具回放协议守卫 - 对要求 provider sidecar 的历史工具组执行结构化回放治理';\n readonly priority: number;\n\n private readonly explicitPolicy?: ToolReplayProtocolPolicy;\n\n constructor(options: ToolReplayProtocolGuardOptions = {}) {\n super();\n this.priority = options.priority ?? 0.5;\n this.explicitPolicy = options.policy;\n }\n\n shouldSkip(messages: AiMessage[], context: PreprocessorContext): boolean {\n if (!messages.some((message) => message.role === 'assistant' && message.type === 'tool_calls')) {\n return true;\n }\n const policy = resolveToolReplayProtocolPolicy(context, this.explicitPolicy);\n return policy.requiresReasoningDetailsForToolReplay !== true\n || policy.missingSidecarBehavior === undefined\n || policy.missingSidecarBehavior === 'allow';\n }\n\n async process(messages: AiMessage[], context: PreprocessorContext): Promise<PreprocessorResult> {\n const policy = resolveToolReplayProtocolPolicy(context, this.explicitPolicy);\n if (\n policy.requiresReasoningDetailsForToolReplay !== true\n || policy.missingSidecarBehavior === undefined\n || policy.missingSidecarBehavior === 'allow'\n ) {\n return this.createResult(messages, messages, [], 0);\n }\n\n const currentRoundStartIndex = findCurrentRunStartIndex(messages);\n const groups = buildToolInteractionGroupsFromMessages(messages);\n const groupsToDegrade = groups.filter((group) => {\n return group.isComplete\n && group.endIndex < currentRoundStartIndex\n && !hasReasoningDetails(group.assistantMessage);\n });\n\n if (groupsToDegrade.length === 0) {\n return this.createResult(messages, messages, [], 0);\n }\n\n if (policy.missingSidecarBehavior === 'provider_empty_replay_field') {\n const groupByAssistantIndex = new Map<number, ToolInteractionGroup<AiMessage>>();\n for (const group of groupsToDegrade) {\n groupByAssistantIndex.set(group.assistantIndex, group);\n }\n const processedMessages = messages.map((message, index) => {\n const group = groupByAssistantIndex.get(index);\n return group ? markProviderEmptyReplayField(message, group) : message;\n });\n\n this.debug('已标记缺少 provider sidecar 的历史工具组由 provider 空字段回放', {\n provider: policy.provider,\n markedGroupCount: groupsToDegrade.length,\n }, context);\n\n return this.createResult(\n messages,\n processedMessages,\n ['tool_replay_protocol_guard'],\n groupsToDegrade.length,\n );\n }\n\n const replacementByAssistantIndex = new Map<number, AiMessage>();\n const indexesToRemove = new Set<number>();\n for (const group of groupsToDegrade) {\n replacementByAssistantIndex.set(group.assistantIndex, buildDegradedToolReplayMessage(group));\n for (const messageIndex of group.messageIndexes) {\n indexesToRemove.add(messageIndex);\n }\n }\n\n const processedMessages: AiMessage[] = [];\n for (let index = 0; index < messages.length; index += 1) {\n if (!indexesToRemove.has(index)) {\n processedMessages.push(messages[index]);\n continue;\n }\n const replacement = replacementByAssistantIndex.get(index);\n if (replacement) {\n processedMessages.push(replacement);\n }\n }\n\n this.debug('已降级缺少 provider sidecar 的历史工具组', {\n provider: policy.provider,\n degradedGroupCount: groupsToDegrade.length,\n }, context);\n\n return this.createResult(\n messages,\n processedMessages,\n ['tool_replay_protocol_guard'],\n groupsToDegrade.length,\n );\n }\n}\n","/**\n * @file src/agent/shared/llmTelemetryContext.ts\n *\n * @description\n * LLM Telemetry 上下文(用于审计/统计,不进入模型上下文,不落库到 EventStore)。\n *\n * 中文备注(设计约束):\n * - 某些“多阶段/多子任务”的审计需要一个可聚合的数据源;\n * - 这些数据不适合塞进 RuntimeEvent(会污染主时间轴、跨端联动成本高);\n * - 因此这里用 AsyncLocalStorage 提供“同一条异步链路内可写入/可聚合”的基础设施;\n * - 默认不启用:只有当业务侧显式用 `withLLMTelemetryContext(...)` 包裹执行链路时才会收集。\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nexport type LlmUsageRaw = {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n /**\n * 兼容:部分 mock/自研 adapter 只返回 usage.tokens\n */\n tokens?: number;\n};\n\nexport type NormalizedLlmUsage = {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n};\n\nexport type LLMTelemetryContext = {\n /**\n * 预留:用于业务侧注入“聚合维度”。\n *\n * 中文备注:\n * - 该字段不进入模型上下文、不落库,仅用于本地统计/审计聚合;\n * - 建议只放稳定标识(如 conversationId/turnId/runId 等),避免塞入大对象。\n */\n scope?: {\n conversationId?: string;\n turnId?: string;\n runId?: string;\n stepId?: string;\n stepIndex?: number;\n };\n};\n\nexport type LlmCallTelemetry = {\n modelId: string;\n stream: boolean;\n startedAt: number;\n durationMs: number;\n usage?: NormalizedLlmUsage;\n};\n\ntype Store = {\n ctx: LLMTelemetryContext;\n calls: LlmCallTelemetry[];\n};\n\nconst als = new AsyncLocalStorage<Store>();\n\n/**\n * 轻量规范化:把 provider 的 usage(不同字段名)收敛为统一结构。\n */\nexport function normalizeLlmUsage(usage: unknown): NormalizedLlmUsage | undefined {\n if (!usage || typeof usage !== 'object' || Array.isArray(usage)) return undefined;\n const rec = usage as Record<string, unknown>;\n\n const promptTokensRaw = rec['prompt_tokens'];\n const completionTokensRaw = rec['completion_tokens'];\n const totalTokensRaw = rec['total_tokens'];\n const tokensRaw = rec['tokens'];\n\n const promptTokens = typeof promptTokensRaw === 'number' && Number.isFinite(promptTokensRaw) ? promptTokensRaw : 0;\n const completionTokens =\n typeof completionTokensRaw === 'number' && Number.isFinite(completionTokensRaw) ? completionTokensRaw : 0;\n const totalFromExplicit =\n typeof totalTokensRaw === 'number' && Number.isFinite(totalTokensRaw) ? totalTokensRaw : undefined;\n const totalFromTokens = typeof tokensRaw === 'number' && Number.isFinite(tokensRaw) ? tokensRaw : undefined;\n\n const totalTokens = totalFromExplicit ?? totalFromTokens ?? promptTokens + completionTokens;\n\n if (promptTokens === 0 && completionTokens === 0 && totalTokens === 0) return undefined;\n\n return { promptTokens, completionTokens, totalTokens };\n}\n\nexport function getCurrentLLMTelemetryContext(): LLMTelemetryContext | undefined {\n return als.getStore()?.ctx;\n}\n\nexport function recordLlmCallTelemetry(entry: LlmCallTelemetry): void {\n const store = als.getStore();\n if (!store) return;\n store.calls.push(entry);\n}\n\nexport async function withLLMTelemetryContext<T>(\n ctx: LLMTelemetryContext,\n fn: () => Promise<T>\n): Promise<{ value: T; calls: LlmCallTelemetry[] }> {\n const parent = als.getStore();\n const merged: LLMTelemetryContext = {\n ...(parent?.ctx ?? {}),\n ...(ctx ?? {}),\n };\n const store: Store = { ctx: merged, calls: [] };\n const value = await als.run(store, fn);\n return { value, calls: store.calls };\n}\n","import type { SystemReminderContext } from './types';\nexport { DEFAULT_CONTEXT_CHECKPOINT_TOOL_NAME } from '../../shared/checkpointMarker';\n\nimport { DEFAULT_CONTEXT_CHECKPOINT_TOOL_NAME } from '../../shared/checkpointMarker';\n\nexport function readNonEmptyStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((item) => (typeof item === 'string' ? item.trim() : ''))\n .filter((item) => item.length > 0);\n}\n\nexport function toDisplayStep(nodeSwitches: number): number {\n return Math.ceil(nodeSwitches / 2);\n}\n\nexport function readContextCheckpointToolName(ctx: SystemReminderContext): string {\n const configured = ctx.executorLocal?.contextCheckpointToolName;\n return typeof configured === 'string' && configured.trim().length > 0\n ? configured.trim()\n : DEFAULT_CONTEXT_CHECKPOINT_TOOL_NAME;\n}\n\nfunction isRuntimeEventLike(value: unknown): value is { type: unknown } {\n return !!value && typeof value === 'object' && !Array.isArray(value) && 'type' in value;\n}\n\n/**\n * 统计“本轮请求内”的工具调用次数(LLM 决策层)。\n *\n * 中文备注:只统计最后一个 user_input 之后的 tool_call_decision,避免旧事件或 ToolNode\n * 复用 action 语义时把同一轮工具调用重复计数。\n */\nexport function countToolCallsInCurrentRequest(history: ReadonlyArray<unknown>): number {\n let startIdx = 0;\n for (let index = history.length - 1; index >= 0; index -= 1) {\n const event = history[index];\n if (!isRuntimeEventLike(event)) continue;\n if (event.type === 'user_input') {\n startIdx = index + 1;\n break;\n }\n }\n\n let count = 0;\n for (let index = startIdx; index < history.length; index += 1) {\n const event = history[index];\n if (!isRuntimeEventLike(event)) continue;\n if (event.type === 'tool_call_decision') {\n count += 1;\n }\n }\n return count;\n}\n","import {\n countToolCallsInCurrentRequest,\n readContextCheckpointToolName,\n readNonEmptyStrings,\n toDisplayStep,\n} from './helpers';\nimport type { SystemReminderContentTemplate, SystemReminderContext } from './types';\n\nexport const maxStepsForceFinalAnswerTemplate: SystemReminderContentTemplate = () => [\n '你已达到最大步数限制:本轮工具已被禁用。',\n '你必须立刻给出最终答案,不要再尝试调用任何工具。',\n '若信息不完整,请明确说明关键假设和缺口,并给出当前最好的可用回答。',\n].join('\\n');\n\nexport const lastStepsHintTemplate: SystemReminderContentTemplate = (ctx) => {\n const el = ctx.executorLocal;\n if (!el) return '';\n const maxSteps = el.maxSteps;\n const stepCount = el.stepCount;\n const remainingSteps = el.remainingSteps;\n if (typeof maxSteps !== 'number' || typeof stepCount !== 'number' || typeof remainingSteps !== 'number') {\n return '';\n }\n\n const displayMaxSteps = toDisplayStep(maxSteps);\n const displayStepCount = toDisplayStep(stepCount);\n const displayRemainingSteps = toDisplayStep(remainingSteps);\n const finalStepPolicy = el.finalStepPolicy ?? 'final_answer';\n\n if (finalStepPolicy === 'force_tools') {\n const forcedTools = readNonEmptyStrings(el.finalStepForcedTools);\n const toolsText = forcedTools.length > 0 ? forcedTools.join(', ') : '(未配置 forcedTools)';\n return [\n `步数提醒:你当前处于第 ${displayStepCount}/${displayMaxSteps} 步,还剩 ${displayRemainingSteps} 步。`,\n `当剩余 1 步时:你必须立刻调用工具:${toolsText}(系统将只保留这些工具)。`,\n '最后 1 步将用于执行工具,因此不要在最后一步才尝试再调用其他工具。',\n ].join('\\n');\n }\n\n return [\n `步数提醒:你当前处于第 ${displayStepCount}/${displayMaxSteps} 步,还剩 ${displayRemainingSteps} 步。`,\n '建议你结束无关推理/无关工具调用,确保在步数耗尽前完成任务。',\n ].join('\\n');\n};\n\nexport const toolCallStreakTemplate: SystemReminderContentTemplate = (ctx) => {\n const count = countToolCallsInCurrentRequest(ctx.history);\n return [\n `你已连续执行了 ${count} 次工具调用。`,\n '如果问题比较复杂,考虑创建sub-agent,也就是task,以降低上下文占用。',\n '如果问题即将解决,请忽略本条提醒。',\n ].join('\\n');\n};\n\nexport const periodicTaskstateReflectionTemplate: SystemReminderContentTemplate = (ctx) => {\n const stepCount = ctx.executorLocal?.stepCount ?? 0;\n const displayStep = toDisplayStep(stepCount);\n return [\n `你已执行了 ${displayStep} 步。请暂停当前工作,花一步反思和整理:`,\n '1. 回顾你最近的 taskstate_write 输出,确认当前工作方向正确(没有偏离 Goal)。',\n '2. 调用 taskstate_write 更新 progress 和 next_steps,如有必要调整 current_plan。',\n '3. 如果任务复杂但尚未创建 TaskState,现在是创建的好时机。',\n '完成整理后继续执行任务。',\n ].join('\\n');\n};\n\nexport const contextBudgetWarningTemplate: SystemReminderContentTemplate = (ctx) => {\n const stepCount = ctx.executorLocal?.stepCount ?? 0;\n const maxSteps = ctx.executorLocal?.maxSteps ?? 0;\n const displayStep = toDisplayStep(stepCount);\n const displayMax = toDisplayStep(maxSteps);\n const checkpointToolName = readContextCheckpointToolName(ctx);\n return [\n `⚠️ 上下文预算告警:你已执行了 ${displayStep}/${displayMax} 步,上下文空间即将耗尽。`,\n '你必须立即执行以下操作以避免上下文溢出:',\n '1. 调用sharedmemory_write工具,将当前发现、总结、思考或者任何重要信息详细写入sharedmemory。',\n `2. 调用 ${checkpointToolName} 工具,传入 summary(阶段过渡摘要)和 taskstate(最新任务状态)。`,\n ' 这会一次性完成\"保存状态 + 清理历史\",checkpoint tool_output 中会保留你的 TaskState 快照。',\n '3. 清理后你的上下文将只保留:checkpoint 工具对(含摘要 + TaskState)+ 最近 2 对工具交互。重要信息会通过sharedmemory保存。',\n ].join('\\n');\n};\n\nexport const BUILTIN_SYSTEM_REMINDER_TEMPLATES: Record<string, SystemReminderContentTemplate> = {\n maxStepsForceFinalAnswer: maxStepsForceFinalAnswerTemplate,\n lastStepsHint: lastStepsHintTemplate,\n toolCallStreak: toolCallStreakTemplate,\n periodicTaskstateReflection: periodicTaskstateReflectionTemplate,\n contextBudgetWarning: contextBudgetWarningTemplate,\n};\n","import type { AgentSpecSystemReminderTrigger } from '../../contracts';\nimport { countToolCallsInCurrentRequest, readContextCheckpointToolName } from './helpers';\nimport type { SystemReminderContext, SystemReminderTriggerEvaluator } from './types';\n\nfunction readNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction getTriggerThreshold(trigger: AgentSpecSystemReminderTrigger): number | undefined {\n return readNumber(trigger.threshold);\n}\n\nexport const phaseEqualsTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const expected = readString(trigger.value);\n return !!expected && ctx.executorLocal?.phase === expected;\n};\n\nexport const remainingStepsLeqTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const remainingSteps = readNumber(ctx.executorLocal?.remainingSteps);\n const threshold = getTriggerThreshold(trigger) ?? readNumber(ctx.executorLocal?.lastStepsHintThreshold);\n if (remainingSteps === undefined || threshold === undefined || threshold <= 0) return false;\n if (ctx.executorLocal?.phase === 'force_final_answer') return false;\n return remainingSteps <= threshold;\n};\n\nexport const stepCountModuloTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const stepCount = readNumber(ctx.executorLocal?.stepCount);\n const period = readNumber(trigger.period) ?? getTriggerThreshold(trigger);\n const minStep = readNumber(trigger.minStep) ?? period;\n if (stepCount === undefined || period === undefined || period <= 0) return false;\n if (ctx.executorLocal?.phase === 'force_final_answer') return false;\n if (stepCount < (minStep ?? 0)) return false;\n return stepCount % period === 0;\n};\n\nexport const toolCallStreakTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const threshold = getTriggerThreshold(trigger) ?? 10;\n if (threshold <= 0) return false;\n const count = countToolCallsInCurrentRequest(ctx.history);\n if (count < threshold) return false;\n return trigger.moduloStep === false ? true : count % threshold === 0;\n};\n\nexport const budgetWarningTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const toolName = readString(trigger.toolName) ?? readContextCheckpointToolName(ctx);\n const tools = ctx.request.availableTools;\n if (!Array.isArray(tools) || !tools.includes(toolName)) return false;\n\n const stepCount = readNumber(ctx.executorLocal?.stepCount);\n const maxSteps = readNumber(ctx.executorLocal?.maxSteps);\n const ratio = readNumber(trigger.ratio) ?? 0.9;\n if (stepCount === undefined || maxSteps === undefined || maxSteps <= 0) return false;\n if (ctx.executorLocal?.phase === 'force_final_answer') return false;\n\n const threshold = Math.floor(maxSteps * ratio);\n return stepCount >= threshold && stepCount < threshold + 4;\n};\n\nexport const agentHasToolTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const toolName = readString(trigger.toolName) ?? readString(trigger.value);\n if (!toolName || !Array.isArray(ctx.request.availableTools)) return false;\n return ctx.request.availableTools.includes(toolName);\n};\n\nexport const BUILTIN_SYSTEM_REMINDER_TRIGGERS: Record<string, SystemReminderTriggerEvaluator> = {\n 'phase-equals': phaseEqualsTrigger,\n 'remaining-steps-leq': remainingStepsLeqTrigger,\n 'step-count-modulo': stepCountModuloTrigger,\n 'tool-call-streak': toolCallStreakTrigger,\n 'budget-warning': budgetWarningTrigger,\n 'agent-has-tool': agentHasToolTrigger,\n};\n","import { BUILTIN_SYSTEM_REMINDER_TEMPLATES } from './templates';\nimport { BUILTIN_SYSTEM_REMINDER_TRIGGERS } from './triggers';\nimport type {\n SystemReminderContentTemplate,\n SystemReminderRule,\n SystemReminderRuleDefinition,\n SystemReminderTriggerEvaluator,\n} from './types';\n\nexport class SystemReminderRegistry {\n private readonly triggers = new Map<string, SystemReminderTriggerEvaluator>();\n private readonly templates = new Map<string, SystemReminderContentTemplate>();\n\n constructor(seed?: {\n triggers?: Record<string, SystemReminderTriggerEvaluator>;\n templates?: Record<string, SystemReminderContentTemplate>;\n }) {\n for (const [kind, evaluator] of Object.entries(seed?.triggers ?? {})) {\n this.registerTriggerKind(kind, evaluator);\n }\n for (const [name, template] of Object.entries(seed?.templates ?? {})) {\n this.registerContentTemplate(name, template);\n }\n }\n\n registerTriggerKind(kind: string, evaluator: SystemReminderTriggerEvaluator): void {\n const normalized = kind.trim();\n if (!normalized) {\n throw new Error('[SystemReminderRegistry] trigger kind 不能为空');\n }\n this.triggers.set(normalized, evaluator);\n }\n\n registerContentTemplate(name: string, template: SystemReminderContentTemplate): void {\n const normalized = name.trim();\n if (!normalized) {\n throw new Error('[SystemReminderRegistry] content template 不能为空');\n }\n this.templates.set(normalized, template);\n }\n\n buildRule(definition: SystemReminderRuleDefinition): SystemReminderRule | undefined {\n const trigger = this.triggers.get(definition.trigger.kind);\n const template = this.templates.get(definition.contentTemplate);\n if (!trigger || !template) {\n return undefined;\n }\n\n return {\n id: definition.id,\n when: (ctx) => trigger(ctx, definition.trigger),\n build: (ctx) => template(ctx, definition.contentArgs),\n };\n }\n}\n\nexport function createDefaultSystemReminderRegistry(): SystemReminderRegistry {\n return new SystemReminderRegistry({\n triggers: BUILTIN_SYSTEM_REMINDER_TRIGGERS,\n templates: BUILTIN_SYSTEM_REMINDER_TEMPLATES,\n });\n}\n\nexport const defaultSystemReminderRegistry = createDefaultSystemReminderRegistry();\n","/**\n * @file runtime-kernel/events/agentEvents.ts\n * @description graph 主执行链使用的最小 Agent 事件契约\n *\n * 中文备注:\n * - 该文件只承载 runtime-kernel 主链路真正需要识别的事件子集;\n * - 目标是让 `executor` / `llmNode` / `eventMappers` 不再反向依赖宿主或产品层事件定义;\n * - host/product 层若有更丰富的事件,只要结构兼容,仍可在边界透传进来。\n */\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport interface AgentEvent {\n type: string;\n timestamp: number;\n id?: string;\n /**\n * 中文备注:\n * - 该标记只在运行期内存中使用,用于避免同一事件被 SSE 重复分发;\n * - 不属于持久化协议字段。\n */\n __dispatched_via_sse__?: true;\n}\n\ninterface BaseToolLifecycleAgentEvent extends AgentEvent {\n tool_name: string;\n tool_args: Record<string, unknown>;\n tool_calls?: unknown[];\n tool_call_id?: string;\n phase?: 'start' | 'update' | 'complete' | 'error';\n status?: 'loading' | 'success' | 'error';\n payload?: Record<string, unknown>;\n meta?: Record<string, unknown>;\n}\n\nexport interface ThoughtEvent extends AgentEvent {\n type: 'thought';\n content: string;\n delta?: string;\n is_complete?: boolean;\n meta?: Record<string, unknown>;\n thought_message_id?: string;\n}\n\nexport interface ToolCallDecisionEvent extends BaseToolLifecycleAgentEvent {\n type: 'tool_call_decision';\n}\n\nexport interface ToolProcessEvent extends BaseToolLifecycleAgentEvent {\n type: 'tool_process';\n}\n\nexport interface ObservationEvent extends AgentEvent {\n type: 'observation';\n tool_name: string;\n tool_call_id?: string;\n output: string;\n success?: boolean;\n payload?: Record<string, unknown>;\n duration_ms?: number;\n}\n\nexport interface FinalAnswerEvent extends AgentEvent {\n type: 'final_answer';\n answer: string;\n answer_id?: string;\n answerId?: string;\n reasoning_details?: unknown[];\n meta?: Record<string, unknown>;\n}\n\nexport interface ErrorEvent extends AgentEvent {\n type: 'error';\n error: string;\n details?: string;\n}\n\nexport interface StreamChunkEvent extends AgentEvent {\n type: 'stream_chunk';\n content: string;\n answer_id?: string;\n seq?: number;\n is_last?: boolean;\n isLast?: boolean;\n}\n\nexport interface ProviderSidecarEvent extends AgentEvent {\n type: 'provider_sidecar';\n reasoning_details?: unknown[];\n}\n\nexport type AnyAgentEvent =\n | ThoughtEvent\n | ToolCallDecisionEvent\n | ToolProcessEvent\n | ObservationEvent\n | FinalAnswerEvent\n | ErrorEvent\n | StreamChunkEvent\n | ProviderSidecarEvent;\n\nexport function isMarkedAsSseDispatched(event: unknown): boolean {\n return isRecord(event) && event['__dispatched_via_sse__'] === true;\n}\n\nexport function readAgentEventAnswerId(event: unknown): string | undefined {\n if (!isRecord(event)) return undefined;\n\n const snake = event['answer_id'];\n if (typeof snake === 'string' && snake.trim().length > 0) {\n return snake.trim();\n }\n\n const camel = event['answerId'];\n if (typeof camel === 'string' && camel.trim().length > 0) {\n return camel.trim();\n }\n\n return undefined;\n}\n\nexport function readAgentEventSeq(event: unknown): number | undefined {\n if (!isRecord(event)) return undefined;\n const value = event['seq'];\n return Number.isInteger(value) ? Number(value) : undefined;\n}\n","import type { AiMessage, RuntimeEvent, ToolCallWire } from '../../contracts';\nimport type { ToolPresentationPort } from '../tools/ports';\n\nexport interface EventMappingContext {\n conversationId: string;\n turnId: string;\n timestamp?: number;\n /**\n * 事件级扩展元数据(透传到 SSE/RuntimeEvent.metadata)。\n *\n * 中文备注:这里只放跨事件归类信息,不放 ui.hidden 这类单事件展示语义。\n */\n metadata?: Record<string, unknown>;\n}\n\nexport interface SSEMappingOptions {\n emitSse?: boolean;\n skipAlreadyDispatched?: boolean;\n toolPresentationPort?: ToolPresentationPort;\n}\n\nexport interface RuntimeMappingOptions {\n collectRuntime?: boolean;\n skipIncomplete?: boolean;\n toolPresentationPort?: ToolPresentationPort;\n}\n\n/**\n * RuntimeEvent 回放所需的最小会话内存端口。\n *\n * 中文备注:\n * - core 只依赖“写入消息”的最小能力;\n * - 具体产品实现只要结构兼容即可接入。\n */\nexport interface ConversationMemoryPort {\n addUserMessage(content: string, id?: string): void;\n addAssistantMessage(\n content: string | null,\n type: AiMessage['type'] & ('thought' | 'final_answer' | 'tool_calls'),\n metadata?: AiMessage['metadata'],\n id?: string\n ): void;\n addToolResponse(toolCallId: string, content: string, toolName?: string, id?: string): void;\n appendMessage(message: AiMessage): void;\n}\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object' && !Array.isArray(value);\n\nexport const isToolCallWire = (value: unknown): value is ToolCallWire => {\n if (!isRecord(value)) return false;\n if (typeof value.id !== 'string') return false;\n if (value.type !== 'function') return false;\n const fn = value.function;\n return isRecord(fn) && typeof fn.name === 'string' && typeof fn.arguments === 'string';\n};\n\nexport function resolveToolDisplayOptions(\n toolName: string,\n toolPresentationPort?: ToolPresentationPort,\n) {\n return toolPresentationPort?.getDisplayOptions(toolName);\n}\n\nexport function readAnswerIdFromEvent(event: unknown): string | undefined {\n if (!isRecord(event)) return undefined;\n const value = event['answerId'];\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nexport function readMetaFromEvent(event: unknown): Record<string, unknown> | undefined {\n if (!isRecord(event)) return undefined;\n const value = event['meta'];\n return isRecord(value) ? value : undefined;\n}\n\nexport type HistorySummaryRuntimeEvent = RuntimeEvent & {\n type: 'history_summary';\n content: string;\n replaces_start_message_id?: string;\n replaces_end_message_id?: string;\n original_message_count?: number;\n compression_ratio?: number;\n generated_by?: string;\n included_old_summary?: boolean;\n replaced_message_ids?: string[];\n summary_seq?: number;\n};\n","import {\n AnyAgentEvent,\n ErrorEvent as AgentErrorEvent,\n FinalAnswerEvent as AgentFinalAnswerEvent,\n ObservationEvent as AgentObservationEvent,\n StreamChunkEvent as AgentStreamChunkEvent,\n ThoughtEvent as AgentThoughtEvent,\n ToolCallDecisionEvent as AgentToolCallDecisionEvent,\n ToolProcessEvent as AgentToolProcessEvent,\n readAgentEventAnswerId,\n readAgentEventSeq,\n} from './agentEvents';\nimport {\n RuntimeEvent,\n createErrorEvent,\n createFinalAnswerChunkEvent,\n createFinalAnswerEvent,\n createThoughtEvent,\n createToolCallDecisionEvent,\n createToolOutputEvent,\n createToolProcessEvent,\n} from '../../contracts';\nimport { generateMessageId } from '../../shared/ids';\nimport {\n type EventMappingContext,\n type RuntimeMappingOptions,\n isRecord,\n readAnswerIdFromEvent,\n readMetaFromEvent,\n resolveToolDisplayOptions,\n} from './provider-sidecar';\n\nexport function agentEventToRuntime(\n agentEvent: AnyAgentEvent | RuntimeEvent,\n context: EventMappingContext,\n options: RuntimeMappingOptions = {},\n): RuntimeEvent | null {\n if (!agentEvent || typeof agentEvent !== 'object') return null;\n\n if (isRecord(agentEvent) && agentEvent['type'] === 'history_summary') {\n const evt = agentEvent as RuntimeEvent;\n if (context.metadata) {\n evt.metadata = { ...(evt.metadata ?? {}), ...context.metadata };\n }\n return evt;\n }\n\n const typed = agentEvent as AnyAgentEvent;\n const { conversationId, turnId } = context;\n const timestamp = typed.timestamp ?? context.timestamp ?? Date.now();\n const id = typed.id ?? generateMessageId();\n const contextMeta = context.metadata;\n\n switch (typed.type) {\n case 'thought':\n return mapThoughtToRuntime(typed as AgentThoughtEvent, context, options, id, timestamp);\n\n case 'tool_call_decision':\n case 'tool_process':\n return mapToolProgressToRuntime(typed, context, options, id, timestamp);\n\n case 'observation': {\n const observationEvent = typed as AgentObservationEvent;\n const toolName = observationEvent.tool_name || 'unknown_tool';\n const toolCallId = observationEvent.tool_call_id || `call_${id}`;\n const success = observationEvent.success ?? !/^错误[::]/i.test(String(observationEvent.output ?? ''));\n const payload = observationEvent.payload || {};\n const event = createToolOutputEvent(\n id,\n conversationId,\n turnId,\n toolName,\n toolCallId,\n observationEvent.output,\n success ? 'success' : 'error',\n { timestamp, payload, duration_ms: payload.duration_ms as number | undefined },\n );\n event.ephemeral = false;\n if (contextMeta) event.metadata = { ...(event.metadata ?? {}), ...contextMeta };\n return event;\n }\n\n case 'final_answer': {\n const finalAnswerEvent = typed as AgentFinalAnswerEvent;\n const answerIdFromSnake =\n typeof finalAnswerEvent.answer_id === 'string' && finalAnswerEvent.answer_id.trim().length > 0\n ? finalAnswerEvent.answer_id.trim()\n : undefined;\n return createFinalAnswerEvent(\n id,\n conversationId,\n turnId,\n answerIdFromSnake ?? readAnswerIdFromEvent(finalAnswerEvent) ?? `answer_${turnId}`,\n finalAnswerEvent.answer ?? '',\n {\n timestamp,\n reasoning_details: Array.isArray(finalAnswerEvent.reasoning_details)\n ? finalAnswerEvent.reasoning_details\n : undefined,\n meta: readMetaFromEvent(finalAnswerEvent),\n },\n );\n }\n\n case 'error': {\n const errorEvent = typed as AgentErrorEvent;\n return createErrorEvent(id, conversationId, turnId, errorEvent.error ?? 'Unknown error', {\n timestamp,\n details: errorEvent.details,\n });\n }\n\n case 'stream_chunk':\n return mapStreamChunkToRuntime(typed as AgentStreamChunkEvent, context, id, timestamp);\n\n default:\n return null;\n }\n}\n\nfunction mapThoughtToRuntime(\n thoughtEvent: AgentThoughtEvent,\n context: EventMappingContext,\n options: RuntimeMappingOptions,\n id: string,\n timestamp: number,\n): RuntimeEvent | null {\n const isComplete = 'is_complete' in thoughtEvent ? Boolean(thoughtEvent.is_complete) : false;\n if (options.skipIncomplete && !isComplete) return null;\n\n const thoughtMessageId =\n typeof thoughtEvent.thought_message_id === 'string' && thoughtEvent.thought_message_id.length > 0\n ? thoughtEvent.thought_message_id\n : undefined;\n const runtimeEvent = createThoughtEvent(id, context.conversationId, context.turnId, thoughtEvent.content ?? '', {\n timestamp,\n thought_message_id: thoughtMessageId,\n delta: thoughtEvent.delta,\n is_complete: isComplete,\n });\n if (!isComplete) runtimeEvent.ephemeral = true;\n const thoughtMeta = isRecord(thoughtEvent.meta) ? thoughtEvent.meta : undefined;\n if (context.metadata || thoughtMeta) {\n runtimeEvent.metadata = { ...(runtimeEvent.metadata ?? {}), ...(context.metadata ?? {}), ...(thoughtMeta ?? {}) };\n }\n return runtimeEvent;\n}\n\nfunction mapToolProgressToRuntime(\n toolEvent: AgentToolCallDecisionEvent | AgentToolProcessEvent,\n context: EventMappingContext,\n options: RuntimeMappingOptions,\n id: string,\n timestamp: number,\n): RuntimeEvent {\n const toolName = toolEvent.tool_name || 'unknown_tool';\n const toolCallId = toolEvent.tool_call_id || `call_${id}`;\n const meta = toolEvent.meta && typeof toolEvent.meta === 'object' ? { ...toolEvent.meta } : {};\n const displayOptions = resolveToolDisplayOptions(toolName, options.toolPresentationPort);\n if (displayOptions && !meta.displayOptions) meta.displayOptions = displayOptions;\n\n const event = toolEvent.type === 'tool_call_decision'\n ? createToolCallDecisionEvent(id, context.conversationId, context.turnId, toolName, toolCallId, {\n timestamp,\n phase: toolEvent.phase ?? 'start',\n status: toolEvent.status ?? 'loading',\n args: toolEvent.tool_args || {},\n payload: toolEvent.payload || {},\n meta,\n })\n : createToolProcessEvent(id, context.conversationId, context.turnId, toolName, toolCallId, {\n timestamp,\n phase: toolEvent.phase ?? 'start',\n status: toolEvent.status ?? 'loading',\n args: toolEvent.tool_args || {},\n payload: toolEvent.payload || {},\n meta,\n });\n event.ephemeral = meta.ephemeral === true;\n if (context.metadata) event.metadata = { ...(event.metadata ?? {}), ...context.metadata };\n return event;\n}\n\nfunction mapStreamChunkToRuntime(\n streamEvent: AgentStreamChunkEvent,\n context: EventMappingContext,\n id: string,\n timestamp: number,\n): RuntimeEvent | null {\n const text = streamEvent.content ?? '';\n if (!text) return null;\n const answerId = readAgentEventAnswerId(streamEvent) ?? `answer_${context.turnId}`;\n const seq = readAgentEventSeq(streamEvent) ?? 0;\n const isLast = Boolean(\n ('isLast' in streamEvent && streamEvent.isLast) ||\n ('is_last' in streamEvent && streamEvent.is_last),\n );\n const chunkEvent = createFinalAnswerChunkEvent(id, context.conversationId, context.turnId, answerId, seq, text, {\n timestamp,\n is_last: isLast,\n });\n chunkEvent.ephemeral = true;\n if (context.metadata) chunkEvent.metadata = { ...(chunkEvent.metadata ?? {}), ...context.metadata };\n return chunkEvent;\n}\n","import type {\n AiMessage,\n RuntimeEvent,\n ThoughtEvent as RuntimeThoughtEvent,\n ToolCallDecisionEvent as RuntimeToolCallDecisionEvent,\n ToolOutputEvent as RuntimeToolOutputEvent,\n FinalAnswerEvent as RuntimeFinalAnswerEvent,\n UserInputEvent as RuntimeUserInputEvent,\n ToolCallWire,\n} from '../../contracts';\nimport {\n type ConversationMemoryPort,\n type HistorySummaryRuntimeEvent,\n isToolCallWire,\n} from './provider-sidecar';\n\nexport function applyRuntimeEventToMemory(event: RuntimeEvent, memory: ConversationMemoryPort): void {\n if (!event || !memory) return;\n\n switch (event.type) {\n case 'user_input': {\n const userEvent = event as RuntimeUserInputEvent;\n memory.addUserMessage(userEvent.content || '', userEvent.id);\n break;\n }\n\n case 'tool_call_decision':\n applyToolCallDecision(event as RuntimeToolCallDecisionEvent, memory);\n break;\n\n case 'tool_output':\n applyToolOutput(event as RuntimeToolOutputEvent, memory);\n break;\n\n case 'final_answer': {\n const answerEvent = event as RuntimeFinalAnswerEvent;\n const answerContent = answerEvent.content || '';\n if (answerContent.trim()) {\n const metadata = Array.isArray(answerEvent.reasoning_details)\n ? { reasoning_details: answerEvent.reasoning_details }\n : undefined;\n memory.addAssistantMessage(answerContent, 'final_answer', metadata, answerEvent.id);\n }\n break;\n }\n\n case 'thought': {\n const thoughtEvent = event as RuntimeThoughtEvent;\n memory.addAssistantMessage(thoughtEvent.content || '', 'thought', undefined, thoughtEvent.id);\n break;\n }\n\n case 'history_summary':\n applyHistorySummary(event as HistorySummaryRuntimeEvent, memory);\n break;\n\n case 'error':\n break;\n\n default:\n break;\n }\n}\n\nfunction applyToolCallDecision(event: RuntimeToolCallDecisionEvent, memory: ConversationMemoryPort): void {\n const payload = event.payload || {};\n const toolCalls = Array.isArray(payload.tool_calls)\n ? payload.tool_calls.filter(isToolCallWire)\n : [];\n const toolArgs = event.args || payload.args || {};\n const toolCallId = event.tool_call_id ||\n (toolCalls.length > 0 ? toolCalls[0].id : `call_${event.id || Date.now()}`);\n\n const normalizedToolCalls: ToolCallWire[] = toolCalls.length > 0\n ? toolCalls\n : [\n {\n id: toolCallId,\n type: 'function',\n function: { name: event.tool_name, arguments: JSON.stringify(toolArgs || {}) },\n },\n ];\n const reasoningDetails = Array.isArray(payload.reasoning_details)\n ? payload.reasoning_details\n : undefined;\n\n memory.addAssistantMessage(\n null,\n 'tool_calls',\n {\n tool_calls: normalizedToolCalls,\n ...(reasoningDetails ? { reasoning_details: reasoningDetails } : {}),\n },\n event.id,\n );\n}\n\nfunction applyToolOutput(event: RuntimeToolOutputEvent, memory: ConversationMemoryPort): void {\n if (!event.tool_call_id) return;\n const payload = event.payload || {};\n const outputValue = payload.result ?? payload.output ?? event.output;\n let serializedOutput: string;\n if (typeof outputValue === 'string') {\n serializedOutput = outputValue;\n } else {\n try {\n serializedOutput = JSON.stringify(outputValue ?? '');\n } catch {\n serializedOutput = String(outputValue ?? '');\n }\n }\n memory.addToolResponse(String(event.tool_call_id), serializedOutput, event.tool_name, event.id);\n}\n\nfunction applyHistorySummary(summaryEvent: HistorySummaryRuntimeEvent, memory: ConversationMemoryPort): void {\n const summaryMetadata: AiMessage['metadata'] = {\n messageType: 'summary',\n generatedBy: summaryEvent.generated_by || 'AgentSummarizationProvider',\n originalMessageCount: summaryEvent.original_message_count,\n compressionRatio: summaryEvent.compression_ratio,\n includedOldSummary: summaryEvent.included_old_summary,\n replacesStartMessageId: summaryEvent.replaces_start_message_id,\n replacesEndMessageId: summaryEvent.replaces_end_message_id,\n replacedMessageIds: Array.isArray(summaryEvent.replaced_message_ids) ? summaryEvent.replaced_message_ids : [],\n summarySeq: summaryEvent.summary_seq || 0,\n };\n\n const summaryMessage: AiMessage = {\n id: summaryEvent.id,\n role: 'system',\n type: 'history_summary',\n content: summaryEvent.content || '',\n timestamp: summaryEvent.timestamp,\n metadata: summaryMetadata,\n };\n\n memory.appendMessage(summaryMessage);\n}\n","import {\n AnyAgentEvent,\n ErrorEvent as AgentErrorEvent,\n FinalAnswerEvent as AgentFinalAnswerEvent,\n ObservationEvent as AgentObservationEvent,\n StreamChunkEvent as AgentStreamChunkEvent,\n ThoughtEvent as AgentThoughtEvent,\n ToolCallDecisionEvent as AgentToolCallDecisionEvent,\n ToolProcessEvent as AgentToolProcessEvent,\n isMarkedAsSseDispatched,\n readAgentEventAnswerId,\n readAgentEventSeq,\n} from './agentEvents';\nimport {\n createSSEErrorEvent,\n createSSEFinalAnswerChunkEvent,\n createSSEFinalAnswerEvent,\n createSSEThoughtEvent,\n createSSEToolCallDecisionEvent,\n createSSEToolOutputEvent,\n createSSEToolProcessEvent,\n type SSEEvent,\n} from '../../contracts';\nimport { generateMessageId } from '../../shared/ids';\nimport {\n type EventMappingContext,\n type SSEMappingOptions,\n isRecord,\n readAnswerIdFromEvent,\n readMetaFromEvent,\n resolveToolDisplayOptions,\n} from './provider-sidecar';\n\nexport function agentEventToSSE(\n agentEvent: AnyAgentEvent,\n context: EventMappingContext,\n options: SSEMappingOptions = {},\n): SSEEvent | null {\n if (!agentEvent || typeof agentEvent !== 'object') return null;\n if (options.skipAlreadyDispatched && isMarkedAsSseDispatched(agentEvent)) return null;\n\n const { conversationId, turnId } = context;\n const timestamp = agentEvent.timestamp ?? context.timestamp ?? Date.now();\n const id = agentEvent.id ?? generateMessageId();\n const contextMeta = context.metadata;\n\n switch (agentEvent.type) {\n case 'thought': {\n const thoughtEvent = agentEvent as AgentThoughtEvent;\n const rawContent = 'content' in thoughtEvent ? thoughtEvent.content : '';\n const delta = 'delta' in thoughtEvent ? thoughtEvent.delta : '';\n const isComplete = 'is_complete' in thoughtEvent ? Boolean(thoughtEvent.is_complete) : false;\n const thoughtMessageId =\n typeof thoughtEvent.thought_message_id === 'string' && thoughtEvent.thought_message_id.length > 0\n ? thoughtEvent.thought_message_id\n : undefined;\n\n const sse = createSSEThoughtEvent(id, conversationId, turnId, {\n thought_message_id: thoughtMessageId,\n content: isComplete ? (rawContent ?? '') : undefined,\n delta: !isComplete ? (delta ?? rawContent) : undefined,\n is_complete: isComplete,\n });\n sse.timestamp = timestamp;\n const thoughtMeta = isRecord(thoughtEvent.meta) ? thoughtEvent.meta : undefined;\n if (contextMeta || thoughtMeta) {\n sse.metadata = { ...(contextMeta ?? {}), ...(thoughtMeta ?? {}) };\n }\n return sse;\n }\n\n case 'tool_call_decision':\n case 'tool_process':\n return mapToolProgressToSse(agentEvent, context, options, id, timestamp);\n\n case 'observation': {\n const observationEvent = agentEvent as AgentObservationEvent;\n const toolName = observationEvent.tool_name || 'unknown_tool';\n const toolCallId = observationEvent.tool_call_id || `call_${id}`;\n const status: 'success' | 'error' = observationEvent.success === false ? 'error' : 'success';\n const payload = observationEvent.payload || {};\n const duration = payload.duration_ms as number | undefined;\n const sse = createSSEToolOutputEvent(\n id,\n conversationId,\n turnId,\n toolName,\n toolCallId,\n status,\n observationEvent.output,\n { timestamp, payload, duration_ms: duration },\n );\n sse.timestamp = timestamp;\n if (contextMeta) sse.metadata = contextMeta;\n return sse;\n }\n\n case 'stream_chunk': {\n const streamEvent = agentEvent as AgentStreamChunkEvent;\n const text = streamEvent.content ?? '';\n if (!text) return null;\n const answerId = readAgentEventAnswerId(streamEvent) ?? `answer_${turnId}`;\n const seq = readAgentEventSeq(streamEvent) ?? 0;\n const isLast = Boolean(\n ('isLast' in streamEvent && streamEvent.isLast) ||\n ('is_last' in streamEvent && streamEvent.is_last),\n );\n const sse = createSSEFinalAnswerChunkEvent(id, conversationId, turnId, answerId, seq, text, {\n is_last: isLast,\n });\n sse.timestamp = timestamp;\n if (contextMeta) sse.metadata = contextMeta;\n return sse;\n }\n\n case 'final_answer': {\n const finalAnswerEvent = agentEvent as AgentFinalAnswerEvent;\n const answer = finalAnswerEvent.answer ?? '';\n const answerIdFromSnake =\n typeof finalAnswerEvent.answer_id === 'string' && finalAnswerEvent.answer_id.trim().length > 0\n ? finalAnswerEvent.answer_id.trim()\n : undefined;\n const answerId = answerIdFromSnake ?? readAnswerIdFromEvent(finalAnswerEvent) ?? `answer_${turnId}`;\n const sse = createSSEFinalAnswerEvent(id, conversationId, turnId, answerId, answer, {\n meta: readMetaFromEvent(finalAnswerEvent),\n });\n sse.timestamp = timestamp;\n if (contextMeta) sse.metadata = contextMeta;\n return sse;\n }\n\n case 'error': {\n const errorEvent = agentEvent as AgentErrorEvent;\n const sse = createSSEErrorEvent(id, conversationId, turnId, errorEvent.error ?? 'Unknown error', {\n details: errorEvent.details,\n });\n sse.timestamp = timestamp;\n if (contextMeta) sse.metadata = contextMeta;\n return sse;\n }\n\n default:\n return null;\n }\n}\n\nfunction mapToolProgressToSse(\n agentEvent: AgentToolCallDecisionEvent | AgentToolProcessEvent,\n context: EventMappingContext,\n options: SSEMappingOptions,\n id: string,\n timestamp: number,\n): SSEEvent {\n const toolName = agentEvent.tool_name || 'unknown_tool';\n const toolCallId = agentEvent.tool_call_id || `call_${id}`;\n const phase = agentEvent.phase ?? 'start';\n const status = agentEvent.status ?? 'loading';\n const args = agentEvent.tool_args || {};\n const payload = agentEvent.payload || {};\n const meta = agentEvent.meta && typeof agentEvent.meta === 'object' ? { ...agentEvent.meta } : {};\n const displayOptions = resolveToolDisplayOptions(toolName, options.toolPresentationPort);\n if (displayOptions && !meta.displayOptions) meta.displayOptions = displayOptions;\n\n const sse = agentEvent.type === 'tool_call_decision'\n ? createSSEToolCallDecisionEvent(id, context.conversationId, context.turnId, toolName, toolCallId, phase, status, {\n timestamp,\n args,\n payload,\n meta,\n })\n : createSSEToolProcessEvent(id, context.conversationId, context.turnId, toolName, toolCallId, phase, status, {\n timestamp,\n args,\n payload,\n meta,\n });\n sse.timestamp = timestamp;\n if (context.metadata) sse.metadata = context.metadata;\n return sse;\n}\n","/**\n * @file src/agent/runtime-kernel/events/eventMappers.ts\n * @brief 统一事件映射器兼容出口\n *\n * @description\n * 具体职责已拆分:\n * - sse-projection.ts:AnyAgentEvent → SSEEvent\n * - agent-to-runtime.ts:AnyAgentEvent → RuntimeEvent\n * - runtime-to-ai-message.ts:RuntimeEvent → ConversationMemoryPort\n * - provider-sidecar.ts:sidecar/tool_call/displayOptions 相关共享工具与类型\n */\n\nimport type { AnyAgentEvent } from './agentEvents';\nimport type { RuntimeEvent } from '../../contracts';\nimport { agentEventToRuntime } from './agent-to-runtime';\nimport {\n type ConversationMemoryPort,\n type EventMappingContext,\n type RuntimeMappingOptions,\n type SSEMappingOptions,\n} from './provider-sidecar';\nimport { applyRuntimeEventToMemory } from './runtime-to-ai-message';\nimport { agentEventToSSE } from './sse-projection';\n\nexport { agentEventToRuntime } from './agent-to-runtime';\nexport {\n type ConversationMemoryPort,\n type EventMappingContext,\n type RuntimeMappingOptions,\n type SSEMappingOptions,\n} from './provider-sidecar';\nexport { applyRuntimeEventToMemory } from './runtime-to-ai-message';\nexport { agentEventToSSE } from './sse-projection';\n\n/**\n * 统一的事件映射器。\n *\n * 中文备注:\n * - 保持旧调用方式 `eventMapper.xxx` 不变;\n * - 新逻辑不要继续写回本文件,按职责放到拆分后的模块。\n */\nexport const eventMapper = {\n /**\n * 将 AgentEvent 转换为 SSEEvent。\n */\n agentToSse: agentEventToSSE,\n\n /**\n * 将 AgentEvent 转换为 RuntimeEvent。\n */\n agentToRuntime: agentEventToRuntime,\n\n /**\n * 将 RuntimeEvent 应用到 ConversationMemoryPort。\n */\n applyToMemory: applyRuntimeEventToMemory,\n\n /**\n * 批量处理 AgentEvent → SSEEvent + RuntimeEvent。\n */\n agentToBoth: (\n agentEvent: AnyAgentEvent,\n context: EventMappingContext,\n options: { sseOptions?: SSEMappingOptions; runtimeOptions?: RuntimeMappingOptions } = {},\n ) => {\n const sseEvent = agentEventToSSE(agentEvent, context, options.sseOptions);\n const runtimeEvent = agentEventToRuntime(agentEvent, context, options.runtimeOptions);\n return { sseEvent, runtimeEvent };\n },\n\n /**\n * 批量重建内存。\n */\n rebuildMemory: (events: RuntimeEvent[], memory: ConversationMemoryPort) => {\n for (const event of events) {\n applyRuntimeEventToMemory(event, memory);\n }\n },\n};\n","export { eventMapper } from './eventMappers';\nexport {\n describeRuntimeEventLifecycle,\n getRuntimeEventUiProjectionKind,\n isCheckpointHistorySummaryEvent,\n isToolCallDecisionEvent,\n shouldReplayRuntimeEventToUi,\n shouldEnterAgentContext,\n shouldEmitRuntimeEventToSse,\n shouldPersistRuntimeEvent,\n} from './eventGovernance';\n\nexport type { AnyAgentEvent } from './agentEvents';\nexport type { ConversationMemoryPort, EventMappingContext } from './eventMappers';\nexport type { RuntimeEventLifecycleDecision } from './eventGovernance';\n","import type { RuntimeEvent } from '../../contracts';\n\n/**\n * 中文备注:\n * - 本文件是事件生命周期治理的唯一入口;\n * - 目标是把“是否持久化 / 是否进入上下文 / 是否属于工具决策”这些规则从散落判断收敛到单点;\n * - 后续新增事件时,优先修改这里,而不是去 bridge / orchestrator / converter / projector 各补一份条件。\n */\n\ntype TypedEvent = {\n type: string;\n metadata?: Record<string, unknown>;\n content?: string;\n};\n\nexport type RuntimeEventUiProjectionKind =\n | 'hidden'\n | 'user_input'\n | 'thought'\n | 'final_answer'\n | 'final_answer_chunk'\n | 'tool_call_decision'\n | 'tool_process'\n | 'tool_output'\n | 'requires_user_interaction'\n | 'audit_envelope'\n | 'todo_updated'\n | 'subrun_trace'\n | 'error'\n | 'stream_end'\n | 'history_summary'\n | 'checkpoint_history_summary'\n | 'unsupported';\n\nexport type RuntimeEventRealtimeChannel = 'event_bus_sse' | 'none';\n\nexport interface RuntimeEventLifecycleDecision {\n uiProjectionKind: RuntimeEventUiProjectionKind;\n persist: boolean;\n replayToUi: boolean;\n enterAgentContext: boolean;\n realtimeChannel: RuntimeEventRealtimeChannel;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function isToolCallDecisionEvent<T extends { type: string }>(\n event: T,\n): event is T & { type: 'tool_call_decision' } {\n return event.type === 'tool_call_decision';\n}\n\nexport function isToolProcessEvent<T extends { type: string }>(\n event: T,\n): event is T & { type: 'tool_process' } {\n return event.type === 'tool_process';\n}\n\nexport function isTodoUpdatedRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'todo_updated' }> {\n return event.type === 'todo_updated';\n}\n\nexport function isSubRunTraceRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'subrun_trace' }> {\n return event.type === 'subrun_trace';\n}\n\nexport function isStreamEndRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'stream_end' }> {\n return event.type === 'stream_end';\n}\n\nexport function isRequiresUserInteractionRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'requires_user_interaction' }> {\n return event.type === 'requires_user_interaction';\n}\n\nexport function isAuditEnvelopeRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'audit_envelope' }> {\n return event.type === 'audit_envelope';\n}\n\nexport function isControlRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'control' }> {\n return event.type === 'control';\n}\n\nexport function isHiddenUserInputEvent(event: RuntimeEvent): boolean {\n if (event.type !== 'user_input') {\n return false;\n }\n\n const metadata = isRecord(event.metadata) ? event.metadata : undefined;\n const ui = metadata && isRecord(metadata.ui) ? metadata.ui : undefined;\n return ui?.presentation === 'hidden';\n}\n\nexport function isEmptyTerminalAssistantRuntimeEvent(event: RuntimeEvent): boolean {\n if (event.type !== 'thought' && event.type !== 'final_answer') {\n return false;\n }\n\n return event.content.trim().length === 0;\n}\n\nexport function shouldPersistRuntimeEvent(event: RuntimeEvent): boolean {\n return describeRuntimeEventLifecycle(event).persist;\n}\n\nexport function shouldReplayRuntimeEventToUi(event: RuntimeEvent): boolean {\n return describeRuntimeEventLifecycle(event).replayToUi;\n}\n\nexport function shouldEnterAgentContext(event: RuntimeEvent): boolean {\n return describeRuntimeEventLifecycle(event).enterAgentContext;\n}\n\nexport function shouldCreateToolCallMessage(event: TypedEvent): boolean {\n return isToolCallDecisionEvent(event);\n}\n\nexport function isCheckpointHistorySummaryEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'history_summary' }> {\n if (event.type !== 'history_summary') {\n return false;\n }\n\n const metadata = isRecord(event.metadata) ? event.metadata : undefined;\n return metadata?.summary_kind === 'checkpoint';\n}\n\nexport function getRuntimeEventUiProjectionKind(\n event: RuntimeEvent,\n): RuntimeEventUiProjectionKind {\n if (isHiddenUserInputEvent(event)) {\n return 'hidden';\n }\n\n switch (event.type) {\n case 'user_input':\n return 'user_input';\n case 'thought':\n return 'thought';\n case 'final_answer':\n return 'final_answer';\n case 'final_answer_chunk':\n return 'final_answer_chunk';\n case 'tool_call_decision':\n return 'tool_call_decision';\n case 'tool_process':\n return 'tool_process';\n case 'tool_output':\n return 'tool_output';\n case 'requires_user_interaction':\n return 'requires_user_interaction';\n case 'audit_envelope':\n return 'audit_envelope';\n case 'todo_updated':\n return 'todo_updated';\n case 'subrun_trace':\n return 'subrun_trace';\n case 'error':\n return 'error';\n case 'stream_end':\n return 'stream_end';\n case 'history_summary':\n return isCheckpointHistorySummaryEvent(event)\n ? 'checkpoint_history_summary'\n : 'history_summary';\n default:\n return 'unsupported';\n }\n}\n\nexport function describeRuntimeEventLifecycle(\n event: RuntimeEvent,\n): RuntimeEventLifecycleDecision {\n const uiProjectionKind = getRuntimeEventUiProjectionKind(event);\n const persist = event.ephemeral !== true && !isToolProcessEvent(event);\n\n const replayToUi =\n uiProjectionKind !== 'hidden' &&\n uiProjectionKind !== 'audit_envelope' &&\n uiProjectionKind !== 'final_answer_chunk' &&\n uiProjectionKind !== 'unsupported';\n\n const enterAgentContext = (() => {\n if (isTodoUpdatedRuntimeEvent(event)) {\n return false;\n }\n\n if (isSubRunTraceRuntimeEvent(event)) {\n return false;\n }\n\n if (isStreamEndRuntimeEvent(event)) {\n return false;\n }\n\n if (isRequiresUserInteractionRuntimeEvent(event)) {\n return false;\n }\n\n if (isAuditEnvelopeRuntimeEvent(event)) {\n return false;\n }\n\n if (isControlRuntimeEvent(event)) {\n return false;\n }\n\n if (isHiddenUserInputEvent(event)) {\n return false;\n }\n\n if (isToolProcessEvent(event)) {\n return false;\n }\n\n if (event.type === 'final_answer_chunk') {\n return false;\n }\n\n if (isEmptyTerminalAssistantRuntimeEvent(event)) {\n return false;\n }\n\n return true;\n })();\n\n const realtimeChannel: RuntimeEventRealtimeChannel = (() => {\n switch (uiProjectionKind) {\n case 'thought':\n case 'final_answer':\n case 'final_answer_chunk':\n case 'tool_call_decision':\n case 'tool_process':\n case 'tool_output':\n case 'requires_user_interaction':\n case 'todo_updated':\n case 'subrun_trace':\n case 'error':\n return 'event_bus_sse';\n case 'audit_envelope':\n return 'none';\n default:\n return 'none';\n }\n })();\n\n return {\n uiProjectionKind,\n persist,\n replayToUi,\n enterAgentContext,\n realtimeChannel,\n };\n}\n\nexport function shouldEmitRuntimeEventToSse(event: RuntimeEvent): boolean {\n return describeRuntimeEventLifecycle(event).realtimeChannel === 'event_bus_sse';\n}\n","import type { AuditEnvelope } from '../../contracts';\nimport type { AuditPort } from '../../ports';\n\nexport interface ConsoleAuditOptions {\n sink?: Pick<Console, 'info'>;\n}\n\nexport function createConsoleAudit(options: ConsoleAuditOptions = {}): AuditPort {\n const sink = options.sink ?? console;\n return {\n emit(envelope: AuditEnvelope): void {\n sink.info('[linnkit:audit]', envelope);\n },\n };\n}\n\nexport const consoleAudit = createConsoleAudit();\n","import { events as runtimeEvents } from '../../../../runtime-kernel';\nimport type { FinalAnswerEvent, RuntimeEvent, ToolOutputEvent, AiMessage } from '../../../../contracts';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isHistorySummaryEvent(event: RuntimeEvent): event is RuntimeEvent & {\n type: 'history_summary';\n content: string;\n original_message_count?: number;\n compression_ratio?: number;\n generated_by?: string;\n included_old_summary?: boolean;\n replaced_message_ids?: string[];\n summary_seq?: number;\n} {\n return 'type' in event && event.type === 'history_summary';\n}\n\nexport function convertEventToAiMessage(event: RuntimeEvent): AiMessage {\n if (isHistorySummaryEvent(event)) {\n const replacedIds = Array.isArray(event.replaced_message_ids) ? event.replaced_message_ids : [];\n\n console.log('[Agent-eventConverter] 📋 摘要事件转换:', {\n summaryId: event.id,\n replacedCount: replacedIds.length,\n summarySeq: event.summary_seq,\n 示例ID: replacedIds.slice(0, 3),\n });\n\n return {\n id: event.id,\n role: 'system',\n type: 'history_summary',\n content: event.content || '',\n timestamp: event.timestamp,\n metadata: {\n messageType: 'summary',\n originalMessageCount: event.original_message_count,\n compressionRatio: event.compression_ratio,\n generatedBy: event.generated_by,\n includedOldSummary: event.included_old_summary,\n replacedMessageIds: replacedIds,\n summarySeq: event.summary_seq,\n },\n };\n }\n\n switch (event.type) {\n case 'user_input':\n return {\n id: event.id,\n role: 'user',\n type: 'user_input',\n content: event.content || '',\n timestamp: event.timestamp,\n };\n\n case 'thought':\n return {\n id: event.id,\n role: 'assistant',\n type: 'thought',\n content: event.content || '',\n timestamp: event.timestamp,\n };\n\n case 'tool_call_decision':\n return {\n id: event.id,\n role: 'assistant',\n type: 'tool_calls',\n content: '',\n timestamp: event.timestamp,\n metadata: {\n tool_calls: (() => {\n type UnknownRecord = Record<string, unknown>;\n const isRecord = (v: unknown): v is UnknownRecord =>\n !!v && typeof v === 'object' && !Array.isArray(v);\n\n const payload = (event as { payload?: unknown }).payload;\n const toolCallsFromPayload = (() => {\n if (!isRecord(payload)) return undefined;\n const raw = payload['tool_calls'];\n return Array.isArray(raw) ? raw : undefined;\n })();\n\n if (toolCallsFromPayload && toolCallsFromPayload.length > 0) {\n return toolCallsFromPayload;\n }\n\n return [\n {\n id: event.tool_call_id || '',\n type: 'function' as const,\n function: {\n name: event.tool_name || 'unknown',\n arguments: JSON.stringify(event.args || {}),\n },\n },\n ];\n })(),\n reasoning_details: (() => {\n type UnknownRecord = Record<string, unknown>;\n const isRecord = (v: unknown): v is UnknownRecord =>\n !!v && typeof v === 'object' && !Array.isArray(v);\n const payload = (event as { payload?: unknown }).payload;\n if (!isRecord(payload)) return undefined;\n const rd = payload['reasoning_details'];\n return Array.isArray(rd) ? rd : undefined;\n })(),\n },\n };\n\n case 'tool_output': {\n const observationFromPayload = (() => {\n const payload = (event as ToolOutputEvent).payload;\n if (!isRecord(payload)) return undefined;\n const result = payload['result'];\n if (!isRecord(result)) return undefined;\n const obs = result['observation'];\n return typeof obs === 'string' && obs.trim().length > 0 ? obs : undefined;\n })();\n\n const rawOutput = (() => {\n const payload = (event as ToolOutputEvent).payload;\n if (isRecord(payload)) {\n const out = payload['output'];\n if (typeof out === 'string' && out.trim().length > 0) {\n return out;\n }\n }\n if (typeof event.output === 'string') {\n return event.output;\n }\n try {\n return JSON.stringify(event.output ?? '');\n } catch {\n return String(event.output ?? '');\n }\n })();\n\n const outputContent = observationFromPayload ?? rawOutput;\n\n return {\n id: event.id,\n role: 'tool',\n type: 'tool_output',\n content: outputContent,\n timestamp: event.timestamp,\n metadata: {\n tool_call_id: event.tool_call_id,\n tool_name: event.tool_name,\n raw_output: rawOutput,\n ...(observationFromPayload ? { observation: observationFromPayload } : {}),\n },\n };\n }\n\n case 'final_answer':\n return {\n id: event.id,\n role: 'assistant',\n type: 'final_answer',\n content: event.content || '',\n timestamp: event.timestamp,\n metadata: {\n reasoning_details: Array.isArray(event.reasoning_details) ? event.reasoning_details : undefined,\n },\n };\n\n default:\n console.warn(`[eventConverter] Unsupported event type: ${event.type}`);\n return {\n id: event.id,\n role: 'assistant',\n type: 'final_answer',\n content: '',\n timestamp: event.timestamp || Date.now(),\n };\n }\n}\n\nexport function convertEventsToAiMessages(events: RuntimeEvent[]): AiMessage[] {\n const filtered = events.filter((event) => runtimeEvents.shouldEnterAgentContext(event));\n return filtered.map((event) => convertEventToAiMessage(event));\n}\n\nexport function convertAiMessageToEvent(\n message: AiMessage,\n overrides?: Partial<RuntimeEvent>\n): RuntimeEvent {\n const base = {\n id: message.id,\n timestamp: message.timestamp,\n conversation_id: '',\n turn_id: '',\n version: 1,\n ...overrides,\n };\n\n switch (message.role) {\n case 'user':\n return {\n ...base,\n type: 'user_input',\n content: message.content,\n } as RuntimeEvent;\n\n case 'tool':\n return {\n ...base,\n type: 'tool_output',\n tool_name: message.metadata?.tool_name || 'unknown',\n tool_call_id: message.metadata?.tool_call_id || '',\n output: message.metadata?.raw_output || message.content,\n status: 'success',\n } as RuntimeEvent;\n\n case 'assistant':\n if (message.type === 'thought') {\n return {\n ...base,\n type: 'thought',\n content: message.content,\n } as RuntimeEvent;\n }\n\n return {\n ...base,\n type: 'final_answer',\n content: message.content,\n answer_id: (overrides as Partial<FinalAnswerEvent> | undefined)?.answer_id,\n is_complete: true,\n reasoning_details: Array.isArray(message.metadata?.reasoning_details)\n ? message.metadata.reasoning_details\n : undefined,\n } as RuntimeEvent;\n default:\n return {\n ...base,\n type: 'user_input',\n content: message.content,\n } as RuntimeEvent;\n }\n}\n","import type { AgentProfileRequest } from '../contracts';\nimport {\n AgentContextManager,\n type AgentBuildPhase,\n type ContextBuildResult,\n ConversationSession,\n} from '../context';\nimport {\n AGENT_CONTEXT_BUILDER_CONFIG,\n type AgentContextBuilderConfig,\n} from '../context/config';\nimport type { SummarizationCallbacks } from '../context/providers/base';\nimport type { ContextProviderRegistry } from '../context/providers';\nimport {\n type PreprocessorPipeline,\n type PreprocessorPipelineResult,\n createDefaultAgentPreprocessorPipeline,\n type ToolReplayProtocolPolicy,\n} from '../preprocessors';\nimport { ToolManager } from '../tools/ToolManager';\nimport type { AgentTaskResolver } from '../tasks/base';\nimport { convertEventsToAiMessages } from '../utils/eventConverter';\nimport type { GenerateRequest, GenerateResponse } from '../../chat/contracts';\nimport type { AgentSpecContextPolicy, AiMessage, RuntimeEvent } from '../../../../contracts';\nimport type { TokenizerPort } from '../../../../ports';\nimport type { FenceRegistry } from '../../../shared/fences';\nimport {\n contextPolicyToContextBuilderConfig,\n contextPolicyToPreprocessorOptions,\n} from '../../../shared/agentSpecAdapter';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction readOptionalStringProperty(value: unknown, key: string): string | undefined {\n if (!isRecord(value)) return undefined;\n const candidate = value[key];\n return typeof candidate === 'string' && candidate.trim().length > 0 ? candidate : undefined;\n}\n\nexport interface AgentOrchestratorOptions {\n tokenBudget: {\n maxTokens: number;\n reservedForResponse: number;\n };\n processing: {\n debugMode?: boolean;\n preserveMetadata?: boolean;\n };\n model?: string;\n resolveToolReplayProtocolPolicy?: (params: {\n request: AgentProfileRequest;\n modelId: string;\n }) => ToolReplayProtocolPolicy | undefined;\n resolveContextPolicy?: (request: AgentProfileRequest) => AgentSpecContextPolicy | undefined;\n createProviderRegistry?: (params: {\n request: AgentProfileRequest;\n contextPolicy: AgentSpecContextPolicy | undefined;\n contextBuilderConfig: Partial<AgentContextBuilderConfig>;\n }) => ContextProviderRegistry;\n taskResolver: AgentTaskResolver;\n providerRegistry: ContextProviderRegistry;\n fenceRegistry?: FenceRegistry;\n tokenizer?: TokenizerPort;\n}\n\nexport interface AgentProcessingResult {\n messages: AiMessage[];\n contextBuildResult: ContextBuildResult;\n metadata: {\n originalCount: number;\n processedCount: number;\n tokenUsage: {\n estimated: number;\n budget: number;\n remaining: number;\n };\n processingStats: ContextBuildResult['processingStats'];\n truncated: boolean;\n truncatedCount?: number;\n };\n}\n\nexport class AgentMessageOrchestrator {\n private agentContextManager: AgentContextManager;\n private options: AgentOrchestratorOptions;\n private readonly taskResolver: AgentTaskResolver;\n private baseContextConfig: Partial<AgentContextBuilderConfig>;\n\n constructor(options: AgentOrchestratorOptions) {\n this.options = options;\n this.taskResolver = options.taskResolver;\n this.baseContextConfig = {\n DEFAULT_MAX_TOKENS: options.tokenBudget.maxTokens,\n RESERVED_FOR_RESPONSE: options.tokenBudget.reservedForResponse,\n WORKING_MEMORY_BUDGET_PERCENTAGE: AGENT_CONTEXT_BUILDER_CONFIG.WORKING_MEMORY_BUDGET_PERCENTAGE,\n SUMMARIZATION_TRIGGER_THRESHOLD: AGENT_CONTEXT_BUILDER_CONFIG.SUMMARIZATION_TRIGGER_THRESHOLD,\n SUMMARY_BUDGET_PERCENTAGE: AGENT_CONTEXT_BUILDER_CONFIG.SUMMARY_BUDGET_PERCENTAGE,\n SUMMARY_OLDEST_MESSAGES_PERCENTAGE: AGENT_CONTEXT_BUILDER_CONFIG.SUMMARY_OLDEST_MESSAGES_PERCENTAGE,\n };\n this.agentContextManager = new AgentContextManager({\n debugMode: options.processing.debugMode,\n customConfig: this.baseContextConfig,\n providerRegistry: options.providerRegistry,\n tokenizer: options.tokenizer,\n tokenizerModelId: options.model,\n });\n }\n\n private buildPreprocessorPipelineForRequest(\n toolManager: ToolManager,\n request: AgentProfileRequest,\n contextPolicy: AgentSpecContextPolicy | undefined,\n ): PreprocessorPipeline {\n return createDefaultAgentPreprocessorPipeline({\n debugMode: this.options.processing.debugMode,\n model: this.resolvePreprocessorModel(request),\n toolSummaryProvider: toolManager.getSummaryProvider(),\n }, {\n fenceRegistry: this.options.fenceRegistry,\n ...contextPolicyToPreprocessorOptions(contextPolicy),\n });\n }\n\n private resolvePreprocessorModel(request: AgentProfileRequest): string {\n return readOptionalStringProperty(request, 'model_id')\n ?? readOptionalStringProperty(request, 'modelId')\n ?? this.options.model\n ?? 'default';\n }\n\n private resolveContextPolicy(request: AgentProfileRequest): AgentSpecContextPolicy | undefined {\n return this.options.resolveContextPolicy?.(request);\n }\n\n private applyContextPolicy(\n request: AgentProfileRequest,\n contextPolicy: AgentSpecContextPolicy | undefined,\n ): void {\n const contextBuilderConfig = {\n ...this.baseContextConfig,\n ...(contextPolicy ? contextPolicyToContextBuilderConfig(contextPolicy) : {}),\n };\n const providerRegistry = this.options.createProviderRegistry?.({\n request,\n contextPolicy,\n contextBuilderConfig,\n }) ?? this.options.providerRegistry;\n\n this.agentContextManager = new AgentContextManager({\n debugMode: this.options.processing.debugMode,\n customConfig: contextBuilderConfig,\n providerRegistry,\n tokenizer: this.options.tokenizer,\n tokenizerModelId: this.resolvePreprocessorModel(request),\n });\n }\n\n async processAgentConversation(\n request: AgentProfileRequest,\n history: RuntimeEvent[],\n toolManager: ToolManager,\n callbacks?: SummarizationCallbacks,\n extraOptions?: {\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>;\n }\n ): Promise<AgentProcessingResult> {\n const historyCount = history.length;\n\n this.debug('Starting agent conversation processing', {\n requestQuery: request.query.substring(0, 50),\n historyEventCount: historyCount,\n availableTools: request.availableTools || 'all_tools',\n });\n\n const startTime = performance.now();\n\n try {\n const historyMessages = convertEventsToAiMessages(history);\n this.debug('Converted history events to messages', {\n eventCount: history.length,\n messageCount: historyMessages.length,\n });\n\n const allMessages = this.buildCompleteMessageList(request, historyMessages);\n this.debug('Built complete message list', { totalCount: allMessages.length });\n\n const contextPolicy = this.resolveContextPolicy(request);\n this.applyContextPolicy(request, contextPolicy);\n\n const preprocessorPipeline = this.buildPreprocessorPipelineForRequest(toolManager, request, contextPolicy);\n const modelId = this.resolvePreprocessorModel(request);\n preprocessorPipeline.updateContext({\n model: modelId,\n toolReplayProtocolPolicy: this.options.resolveToolReplayProtocolPolicy?.({\n request,\n modelId,\n }),\n });\n\n const preprocessResult = await this.runPreprocessorPipeline(preprocessorPipeline, allMessages);\n this.debug('Preprocessor pipeline completed', {\n originalCount: allMessages.length,\n processedCount: preprocessResult.messages.length,\n appliedStrategies: preprocessResult.pipelineStats.appliedStrategies,\n });\n\n const tempSession = new ConversationSession('');\n tempSession.getHistory().length = 0;\n preprocessResult.messages.forEach((msg) => {\n tempSession.getHistory().push(msg);\n });\n\n const contextResult = await this.buildContextFromPreprocessedMessages(\n request,\n tempSession,\n preprocessResult.messages,\n callbacks,\n undefined,\n extraOptions?.generate,\n contextPolicy,\n );\n this.debug('Context built', { afterContextCount: contextResult.messages.length });\n\n if (this.options.processing.debugMode) {\n console.log(\n '[AgentMessageOrchestrator] DEBUG: Messages after context build:',\n JSON.stringify(\n contextResult.messages.map((m) => ({\n id: m.id,\n ts: m.timestamp,\n role: m.role,\n type: m.type,\n content: m.content.substring(0, 50),\n })),\n null,\n 2\n )\n );\n }\n\n const endTime = performance.now();\n const processingTime = endTime - startTime;\n\n this.debug('Processing completed', {\n processingTime: `${processingTime.toFixed(2)}ms`,\n finalMessageCount: contextResult.messages.length,\n });\n\n return {\n messages: contextResult.messages,\n contextBuildResult: contextResult,\n metadata: {\n originalCount: allMessages.length,\n processedCount: contextResult.messages.length,\n tokenUsage: {\n estimated: contextResult.tokenUsage.used,\n budget: this.options.tokenBudget.maxTokens,\n remaining: contextResult.tokenUsage.remaining,\n },\n processingStats: contextResult.processingStats,\n truncated: contextResult.truncated,\n truncatedCount: contextResult.truncatedCount,\n },\n };\n } catch (error) {\n this.debug('Processing failed', { error });\n throw new Error(`Agent message processing failed: ${error}`);\n }\n }\n\n private buildCompleteMessageList(request: AgentProfileRequest, historyMessages: AiMessage[]): AiMessage[] {\n const task = this.taskResolver(request.promptKey);\n return task.buildMessages(request, historyMessages);\n }\n\n private async runPreprocessorPipeline(\n preprocessorPipeline: PreprocessorPipeline,\n messages: AiMessage[],\n ): Promise<PreprocessorPipelineResult> {\n return preprocessorPipeline.process(messages);\n }\n\n private async buildContextFromPreprocessedMessages(\n request: AgentProfileRequest,\n conversationSession: ConversationSession,\n messages: AiMessage[],\n callbacks?: SummarizationCallbacks,\n phaseOverride?: AgentBuildPhase,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>,\n contextPolicy?: AgentSpecContextPolicy,\n ): Promise<ContextBuildResult> {\n const totalBudget =\n this.options.tokenBudget.maxTokens - this.options.tokenBudget.reservedForResponse;\n\n const contextResult = await this.agentContextManager.buildContextFromPreprocessedMessages(\n request,\n conversationSession,\n messages,\n totalBudget,\n callbacks,\n phaseOverride,\n generate,\n {\n policy: contextPolicy?.contextTrace,\n effectiveContextPolicy: contextPolicy,\n },\n );\n\n if (this.options.processing.debugMode) {\n this.debug('Context build result', {\n original: contextResult.processingStats.originalCount,\n kept: contextResult.processingStats.keptCount,\n truncated: contextResult.processingStats.truncatedCount,\n strategies: contextResult.strategies.applied,\n tokenUsage: contextResult.tokenUsage,\n recommendations: contextResult.strategies.recommendations,\n buildStats: contextResult.processingStats.buildStats,\n });\n }\n\n return contextResult;\n }\n\n private debug(message: string, data?: Record<string, unknown>): void {\n if (this.options.processing.debugMode) {\n console.log(`[AgentMessageOrchestrator] ${message}`, data);\n }\n }\n\n updateOptions(newOptions: Partial<AgentOrchestratorOptions>): void {\n this.options = {\n ...this.options,\n ...newOptions,\n tokenBudget: { ...this.options.tokenBudget, ...newOptions.tokenBudget },\n processing: { ...this.options.processing, ...newOptions.processing },\n };\n this.baseContextConfig = {\n ...this.baseContextConfig,\n DEFAULT_MAX_TOKENS: this.options.tokenBudget.maxTokens,\n RESERVED_FOR_RESPONSE: this.options.tokenBudget.reservedForResponse,\n };\n this.agentContextManager.updateConfig(this.baseContextConfig);\n this.agentContextManager.updateTokenizerModelId(this.options.model);\n }\n\n getContextManager(): AgentContextManager {\n return this.agentContextManager;\n }\n\n getContextInfo(): { config: AgentContextBuilderConfig } {\n return {\n config: this.agentContextManager.getConfig(),\n };\n }\n}\n","export { BaseAgentTask } from './BaseAgentTask';\nexport type { IAgentTask, AgentTaskResolver, IAgentTaskRegistry } from './base';\n","/**\n * @file src/agent/context-manager/profiles/agent/tasks/BaseAgentTask.ts\n * @description Agent任务的抽象基类 - 处理Agent通用逻辑\n *\n * 🔥 重构:借鉴 BaseConversationalTask 的轻量级设计\n * 专注于核心消息构建,将复杂的上下文管理交给 AgentContextManager\n */\n\nimport type { AgentProfileRequest } from '../contracts';\nimport { IAgentTask } from './base';\nimport { generateMessageId } from '../../../../shared/ids';\nimport type { AiMessage, PersistentMetadata } from '../../../../contracts';\nimport type {\n FenceDescriptor,\n FenceInjection,\n FencePlacement,\n FenceRegistry,\n} from '../../../shared/fences';\n\nexport interface BaseAgentTaskOptions {\n fenceRegistry?: FenceRegistry;\n}\n\n/**\n * Agent任务的抽象基类\n *\n * @abstract\n * @description\n * 现在只负责构建 Agent 任务的核心消息骨架:\n * - system prompt\n * - host-provided context injection messages\n * - 当前 user query\n * - 按时序附加 history\n */\nexport abstract class BaseAgentTask implements IAgentTask {\n abstract readonly name: string;\n\n private readonly fenceRegistry?: FenceRegistry;\n\n constructor(options: BaseAgentTaskOptions = {}) {\n this.fenceRegistry = options.fenceRegistry;\n }\n\n protected abstract getSystemPrompt(request: AgentProfileRequest): string;\n\n public getSystemPromptForRequest(request: AgentProfileRequest): string {\n return this.getSystemPrompt(request);\n }\n\n buildMessages(request: AgentProfileRequest, history: AiMessage[]): AiMessage[] {\n const messages: AiMessage[] = [];\n const fenceMessages = this.createFenceMessages(request.fences ?? []);\n\n const systemPrompt = this.getSystemPrompt(request);\n if (systemPrompt && systemPrompt.trim()) {\n messages.push({\n id: generateMessageId(),\n role: 'system',\n type: 'system_prompt',\n content: systemPrompt,\n timestamp: Date.now(),\n });\n }\n\n messages.push(...fenceMessages['after-system']);\n\n messages.push(...fenceMessages['before-current-user']);\n\n const hasUserMessageInHistory = history.some((m) => m.role === 'user');\n\n if (!hasUserMessageInHistory && request.query && request.query.trim()) {\n messages.push({\n id: generateMessageId(),\n role: 'user',\n type: 'user_input',\n content: request.query.trim(),\n timestamp: Date.now(),\n });\n }\n\n messages.push(...fenceMessages['after-current-user']);\n messages.push(...history);\n this.insertAfterLastToolResult(messages, fenceMessages['after-last-tool-result']);\n\n return messages;\n }\n\n private createFenceMessages(fences: FenceInjection[]): Record<FencePlacement, AiMessage[]> {\n const grouped: Record<FencePlacement, AiMessage[]> = {\n 'after-system': [],\n 'before-current-user': [],\n 'after-current-user': [],\n 'after-last-tool-result': [],\n };\n\n if (fences.length === 0) {\n return grouped;\n }\n\n if (!this.fenceRegistry) {\n throw new Error('Fence injections require a FenceRegistry.');\n }\n\n for (const fence of fences) {\n const descriptor = this.fenceRegistry.get(fence.kind);\n if (!descriptor) {\n throw new Error(`Fence kind \"${fence.kind}\" is not registered.`);\n }\n grouped[descriptor.placement].push(this.createFenceMessage(fence, descriptor));\n }\n\n return grouped;\n }\n\n private createFenceMessage(fence: FenceInjection, descriptor: FenceDescriptor): AiMessage {\n const metadata: PersistentMetadata = {\n ...fence.metadata,\n fenceKind: fence.kind,\n fenceAttrs: fence.attrs ?? {},\n fencePlacement: descriptor.placement,\n };\n\n return {\n id: generateMessageId(),\n role: descriptor.llmRole,\n type: 'context_injection',\n content: fence.content,\n timestamp: Date.now(),\n metadata,\n };\n }\n\n private insertAfterLastToolResult(messages: AiMessage[], fenceMessages: AiMessage[]): void {\n if (fenceMessages.length === 0) {\n return;\n }\n const lastToolIndex = findLastIndex(messages, message => message.role === 'tool' && message.type === 'tool_output');\n if (lastToolIndex === -1) {\n messages.push(...fenceMessages);\n return;\n }\n messages.splice(lastToolIndex + 1, 0, ...fenceMessages);\n }\n\n processResponse(rawResponse: string): string {\n return rawResponse;\n }\n\n processStreamChunk(chunk: string): string {\n return chunk;\n }\n}\n\nfunction findLastIndex<T>(items: T[], predicate: (item: T) => boolean): number {\n for (let index = items.length - 1; index >= 0; index--) {\n if (predicate(items[index])) {\n return index;\n }\n }\n return -1;\n}\n","export { ToolManager } from './ToolManager';\nexport type { DynamicToolContext, ToolManagerRegistry } from './ToolManager';\n","import type { AgentProfileRequest } from '../contracts';\nimport type { ToolSummaryProvider } from '../../../shared/preprocessors/base';\nimport type { ToolArgs } from 'linnkit/runtime-kernel';\n\nexport interface ToolManagerRegistry extends ToolSummaryProvider {\n getAvailableToolNames(toolNames?: string[]): string[];\n validateToolCall(\n toolName: string,\n args: ToolArgs,\n ): { success: boolean; error?: string };\n}\n\nexport interface DynamicToolContext {\n request: AgentProfileRequest;\n}\n\nexport class ToolManager {\n private readonly registry: ToolManagerRegistry;\n\n constructor(registry: ToolManagerRegistry) {\n this.registry = registry;\n }\n\n getAvailableToolNames(context: DynamicToolContext): string[] {\n return this.registry.getAvailableToolNames(context.request.availableTools);\n }\n\n validateToolCall(\n toolName: string,\n args: ToolArgs,\n context: DynamicToolContext\n ): { success: boolean; error?: string } {\n void context;\n return this.registry.validateToolCall(toolName, args);\n }\n\n getSummaryProvider(): ToolSummaryProvider {\n return this.registry;\n }\n}\n","export * from './eventConverter';\nexport * from './toolInteractionGroup';\nexport * from './toolOutputSummarizer';\n","/**\n * @file src/chat/context/config.ts\n * @description 上下文构建策略配置 - 多阶段智能填充配置中心\n * \n * 🎯 目的: 为ContextManager提供所有策略参数的可配置中心\n * 📖 详情: 实现README中描述的3阶段上下文构建策略\n */\n\n/**\n * 上下文构建器核心配置\n * \n * 🎯 统一管理所有Token限制、触发条件和策略参数\n * 基于README第183-205行的规格实现\n */\nexport const CONTEXT_BUILDER_CONFIG = {\n // === 绝对Token限制设置 ===\n \n /** 默认最大Token预算上限 */\n DEFAULT_MAX_TOKENS: 120000,\n \n /** 响应预留Token数 */\n RESERVED_FOR_RESPONSE: 2000,\n \n /** 系统提示词预留token数 (v4.0架构中暂未使用,予以保留以备未来扩展) */\n // SYSTEM_PROMPT_RESERVED_TOKENS: 2000, // 决定暂时注释而不是删除,以便追溯\n \n // --- 百分比相关配置说明 ---\n //\n // 除非特殊说明,以下所有百分比配置的基准都是【可用上下文总预算】。\n // 【可用上下文总预算】 = DEFAULT_MAX_TOKENS - RESERVED_FOR_RESPONSE\n // 例如,在 8k 模型和 2k 响应预留的情况下,基准预算为 6000 Token。\n //\n // ---\n\n // === 工作记忆填充策略 ===\n \n /**\n * 工作记忆填充目标百分比 (当前未使用)。\n * - **说明**: 在当前架构中,WorkingMemoryProvider会尽力填充100%可用预算,\n * 而摘要触发由SummarizationProvider基于SUMMARIZATION_TRIGGER_THRESHOLD控制。\n * 此配置项预留以备未来需要精确控制填充上限时使用。\n */\n // BUDGET_PERCENTAGE: 0.90,\n \n /**\n * 摘要触发阈值百分比。\n * - **基准**: 可用上下文总预算。\n * - **说明**: 当已用Token总量(精确计算后)超过此百分比时,将触发摘要机制。\n * 例如,0.85 表示使用量超过85%就触发摘要。\n */\n SUMMARIZATION_TRIGGER_THRESHOLD: 0.7,\n \n // === 摘要策略设置 ===\n \n /**\n * 摘要消息长度上限百分比。\n * - **基准**: 可用上下文总预算。\n * - **说明**: AI生成的摘要文本,其Token长度不应超过此百分比。\n * 用于限制摘要本身的体积,确保对话可持续。\n */\n SUMMARY_BUDGET_PERCENTAGE: 0.10,\n \n /**\n * 选取摘要候选消息的比例。\n * - **基准**: 符合摘要条件的消息**数量** (非Token)。\n * - **说明**: 在触发摘要时,从符合条件的历史消息中,选取最老的百分之多少来进行压缩。\n * 例如,0.8 表示选取最老的80%的消息作为摘要的原材料。\n */\n SUMMARY_OLDEST_MESSAGES_PERCENTAGE: 0.80,\n \n // === 文档处理策略 ===\n \n /**\n * 文档片段最大占比。\n * - **基准**: 可用上下文总预算。\n * - **说明**: 为保证核心请求的完整性,在极端情况下,单个文档片段的Token数会被截断,\n * 确保其不超过此百分比。这是一个“硬上限”。\n */\n DOCUMENT_FRAGMENT_MAX_PERCENTAGE: 0.20,\n \n // === 思维链回补策略 ===\n \n /** 最多回补最近几次对话的思维链 */\n THINKING_RECALL_COUNT: 2,\n \n // === 消息类型优先级定义 ===\n \n /** 核心上下文保留层消息类型 (Must-Keep) - 第一阶段 */\n CORE_MESSAGE_TYPES: ['system_prompt', 'user_input', 'document_fragment'] as const,\n \n /** 优先填充内容类型 (P1) - 第二阶段优先 */\n PRIORITY_CONTENT_TYPES: ['final_answer', 'task_completion', 'user_input'] as const,\n \n /** 次要填充内容类型 (P2) - 第二阶段次优先 */\n SECONDARY_CONTENT_TYPES: ['thought'] as const,\n \n // === Token估算配置 ===\n \n /** 平均每个字符的token估算比例 (用于快速预估) */\n AVG_CHARS_PER_TOKEN: 2.0,\n \n // === 模型配置 ===\n \n /**\n * Token 精确估算用的“模型标识”(用于映射到 tiktoken encoding)\n *\n * 说明:\n * - 这里只用于 `TokenCalculator.estimateTokensPrecise(...)` 的 encoding 选择,不用于真实 LLM 调用;\n * - 为避免把某个具体业务模型写死在这里,统一使用 tiktoken 的默认 encoding:cl100k_base。\n */\n TOKEN_ENCODING_NAME: 'cl100k_base',\n \n // === 性能与调试配置 ===\n \n /** 是否启用详细的构建统计 */\n ENABLE_BUILD_STATS: true,\n \n /** 是否启用阶段执行时间统计 */\n ENABLE_TIMING_STATS: true,\n \n /** 上下文构建超时阈值 (毫秒) */\n PROCESSING_TIMEOUT_MS: 1000,\n \n /** 大量摘要消息警告阈值 */\n LARGE_SUMMARIZATION_WARNING_THRESHOLD: 5,\n \n} as const;\n\n/**\n * 上下文构建策略配置的类型定义\n * 使用通用类型(如 number)而不是字面量类型,以增加灵活性\n */\nexport type ContextBuilderConfig = {\n // 绝对Token限制\n readonly DEFAULT_MAX_TOKENS: number;\n readonly RESERVED_FOR_RESPONSE: number;\n // readonly SYSTEM_PROMPT_RESERVED_TOKENS: number;\n \n // 工作记忆填充策略 (当前未使用)\n // readonly BUDGET_PERCENTAGE: number;\n readonly SUMMARIZATION_TRIGGER_THRESHOLD: number;\n \n // 摘要策略\n readonly SUMMARY_BUDGET_PERCENTAGE: number;\n readonly SUMMARY_OLDEST_MESSAGES_PERCENTAGE: number;\n \n // 文档处理策略\n readonly DOCUMENT_FRAGMENT_MAX_PERCENTAGE: number;\n \n // 思维链回补策略\n readonly THINKING_RECALL_COUNT: number;\n \n // 消息类型定义\n readonly CORE_MESSAGE_TYPES: readonly ('system_prompt' | 'user_input' | 'document_fragment')[];\n readonly PRIORITY_CONTENT_TYPES: readonly ('final_answer' | 'task_completion' | 'user_input')[];\n readonly SECONDARY_CONTENT_TYPES: readonly ('thought')[];\n \n // Token估算配置\n readonly AVG_CHARS_PER_TOKEN: number;\n \n // 模型配置\n readonly TOKEN_ENCODING_NAME: string;\n \n // 性能与调试配置\n readonly ENABLE_BUILD_STATS: boolean;\n readonly ENABLE_TIMING_STATS: boolean;\n readonly PROCESSING_TIMEOUT_MS: number;\n readonly LARGE_SUMMARIZATION_WARNING_THRESHOLD: number;\n};\n\n/**\n * 阶段执行优先级枚举\n * 用于标识和排序3个构建阶段\n */\nexport enum BuildPhase {\n /** 阶段1: 核心上下文保留层 */\n CORE_CONTEXT = 1,\n \n /** 阶段2: 工作记忆填充层 */\n WORKING_MEMORY = 2,\n \n /** 阶段3: 历史摘要触发层 */\n SUMMARIZATION = 3\n}\n\n/**\n * 消息优先级枚举\n * 用于工作记忆填充时的优先级排序\n */\nexport enum MessagePriority {\n /** 最高优先级: 系统消息和用户输入 */\n CRITICAL = 1,\n \n /** 高优先级: AI最终回答 */\n HIGH = 2,\n \n /** 中优先级: 用户上下文信息 */\n MEDIUM = 3,\n \n /** 低优先级: AI思考过程 */\n LOW = 4\n}\n\n/**\n * 上下文构建统计接口\n */\nexport interface ContextBuildStats {\n /** 构建开始时间 */\n startTime: number;\n \n /** 各阶段执行时间 */\n phaseTiming: Record<BuildPhase, number>;\n \n /** 各阶段token使用情况 */\n phaseTokenUsage: Record<BuildPhase, { used: number; percentage: number }>;\n \n /** 消息数量统计 */\n messageStats: {\n original: number;\n afterCoreContext: number;\n afterWorkingMemory: number;\n afterSummarization: number;\n };\n \n /** 是否触发了摘要机制 */\n summarizationTriggered: boolean;\n \n /** 被摘要的消息数量 */\n summarizedCount?: number;\n \n /** 文档片段是否被截断 */\n documentTruncated: boolean;\n \n /** 总构建时间 */\n totalTime: number;\n}\n\n/**\n * 创建自定义上下文构建配置的辅助函数\n * 允许覆盖默认配置的任何部分\n */\nexport function createContextBuilderConfig(\n overrides: Partial<ContextBuilderConfig>\n): ContextBuilderConfig {\n return {\n ...CONTEXT_BUILDER_CONFIG,\n ...overrides\n };\n}\n\n// 已移除预算自适应逻辑,统一使用 CONTEXT_BUILDER_CONFIG\n\n/**\n * 验证配置有效性的辅助函数\n */\nexport function validateConfig(config: ContextBuilderConfig): boolean {\n // 检查绝对Token限制\n if (config.DEFAULT_MAX_TOKENS <= 0) {\n console.warn('DEFAULT_MAX_TOKENS must be positive');\n return false;\n }\n \n if (config.RESERVED_FOR_RESPONSE <= 0 || config.RESERVED_FOR_RESPONSE >= config.DEFAULT_MAX_TOKENS) {\n console.warn('RESERVED_FOR_RESPONSE must be positive and less than DEFAULT_MAX_TOKENS');\n return false;\n }\n \n // 检查百分比配置是否合理\n // BUDGET_PERCENTAGE 验证已移除,因为该配置项当前未被使用\n \n if (config.SUMMARIZATION_TRIGGER_THRESHOLD <= 0 || config.SUMMARIZATION_TRIGGER_THRESHOLD > 1) {\n console.warn('SUMMARIZATION_TRIGGER_THRESHOLD should be between 0 and 1');\n return false;\n }\n \n if (config.SUMMARY_BUDGET_PERCENTAGE <= 0 || config.SUMMARY_BUDGET_PERCENTAGE > 0.5) {\n console.warn('SUMMARY_BUDGET_PERCENTAGE should be between 0 and 0.5');\n return false;\n }\n \n if (config.DOCUMENT_FRAGMENT_MAX_PERCENTAGE <= 0 || config.DOCUMENT_FRAGMENT_MAX_PERCENTAGE > 0.5) {\n console.warn('DOCUMENT_FRAGMENT_MAX_PERCENTAGE should be between 0 and 0.5');\n return false;\n }\n \n // 检查各阶段百分比总和是否合理 (当前跳过,因为BUDGET_PERCENTAGE未被使用)\n // const totalPercentage = config.BUDGET_PERCENTAGE + config.SUMMARY_BUDGET_PERCENTAGE;\n // if (totalPercentage > 1) {\n // console.warn('Sum of BUDGET_PERCENTAGE and SUMMARY_BUDGET_PERCENTAGE exceeds 1');\n // return false;\n // }\n \n // 检查计数配置\n if (config.THINKING_RECALL_COUNT < 0) {\n console.warn('THINKING_RECALL_COUNT should be non-negative');\n return false;\n }\n \n if (config.LARGE_SUMMARIZATION_WARNING_THRESHOLD < 0) {\n console.warn('LARGE_SUMMARIZATION_WARNING_THRESHOLD should be non-negative');\n return false;\n }\n \n return true;\n}\n\n/**\n * 获取可用Token预算的辅助函数\n * @param totalBudget 总预算(可选,使用默认值)\n * @returns 可用于上下文构建的Token数量\n */\nexport function getAvailableTokenBudget(totalBudget?: number): number {\n const budget = totalBudget || CONTEXT_BUILDER_CONFIG.DEFAULT_MAX_TOKENS;\n return Math.max(0, budget - CONTEXT_BUILDER_CONFIG.RESERVED_FOR_RESPONSE);\n}\n\n/**\n * 获取默认Token配置的辅助函数\n * @returns Token预算配置对象\n */\nexport function getDefaultTokenConfig(): {\n maxTokens: number;\n reservedForResponse: number;\n availableForContext: number;\n} {\n const config = CONTEXT_BUILDER_CONFIG;\n return {\n maxTokens: config.DEFAULT_MAX_TOKENS,\n reservedForResponse: config.RESERVED_FOR_RESPONSE,\n availableForContext: getAvailableTokenBudget()\n };\n}\n\n/**\n * 检查Token预算是否充足的辅助函数\n * @param requiredTokens 需要的Token数量\n * @param totalBudget 总预算(可选,使用默认值)\n * @returns 是否有足够的Token预算\n */\nexport function hasEnoughTokenBudget(requiredTokens: number, totalBudget?: number): boolean {\n const availableBudget = getAvailableTokenBudget(totalBudget);\n return requiredTokens <= availableBudget;\n}\n\n/**\n * 获取推荐的摘要触发条件检查函数\n * @param currentTokenUsage 当前Token使用量\n * @param totalBudget 总预算\n * @param config 配置对象(可选,使用自适应配置)\n * @returns 是否应该触发摘要\n */\nexport function shouldTriggerSummarization(\n currentTokenUsage: number, \n totalBudget: number, \n config?: ContextBuilderConfig\n): boolean {\n const activeConfig = config || CONTEXT_BUILDER_CONFIG;\n const threshold = totalBudget * activeConfig.SUMMARIZATION_TRIGGER_THRESHOLD;\n return currentTokenUsage >= threshold;\n}","import type { ContextBuilderConfig } from '../config';\nimport {\n BaseContextProvider as SharedBaseContextProvider,\n type IContextProvider as SharedIContextProvider,\n type MessageProcessingState,\n type ProviderContext as SharedProviderContext,\n type ProviderResult,\n type SummarizationCallbacks,\n} from '../../../../shared/providers/base';\n\nexport type {\n MessageProcessingState,\n ProviderResult,\n SummarizationCallbacks,\n} from '../../../../shared/providers/base';\n\nexport type ProviderContext = SharedProviderContext<ContextBuilderConfig>;\nexport interface IContextProvider extends SharedIContextProvider<ContextBuilderConfig> {}\nexport abstract class BaseContextProvider\n extends SharedBaseContextProvider<ContextBuilderConfig>\n implements IContextProvider {}\n","/**\n * @file src/chat/context/providers/CoreContextProvider.ts\n * @description 核心上下文保留层Provider - 第一阶段上下文构建\n * \n * 🎯 职责: 识别并保留必须保留的核心消息\n * 📖 规则: 系统提示词、最新用户输入、文档片段始终无条件保留\n * ✨ 特性: 支持文档片段智能截断,确保核心请求的完整性\n */\n\nimport { BaseContextProvider, MessageProcessingState, ProviderContext, ProviderResult } from './base';\nimport type { AiMessage } from '../../../../../contracts';\n\n/**\n * 核心上下文保留层Provider\n * \n * 实现README中描述的第一阶段:核心上下文保留层 (Must-Keep)\n * 内容包括:系统提示词、用户意图块(最新用户输入+相关上下文信息)\n */\nexport class CoreContextProvider extends BaseContextProvider {\n readonly name = 'CoreContextProvider';\n readonly description = '核心上下文保留层 - 识别并保留系统提示词、最新用户输入和文档片段';\n readonly priority = 1; // 最高优先级\n\n async provide(\n states: MessageProcessingState[], \n availableBudget: number, \n context: ProviderContext\n ): Promise<ProviderResult> {\n this.debug('🚀 开始核心上下文保留层处理', {\n totalMessages: states.length,\n availableBudget,\n config: {\n documentFragmentMaxPercentage: context.config.DOCUMENT_FRAGMENT_MAX_PERCENTAGE\n }\n }, context);\n\n let coreTokens = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n \n // 获取所有原始消息,用于判断最新用户输入\n const allMessages = states.map(s => s.message);\n \n for (let i = 0; i < states.length; i++) {\n const state = states[i];\n const msg = state.message;\n \n // 检查是否为核心消息\n if (this.isCoreMessage(msg, i, allMessages)) {\n let processedContent = msg.content;\n let contentType: MessageProcessingState['contentType'] = 'full';\n \n // 文档片段截断逻辑 - 极端情况处理\n if (msg.type === 'document_fragment') {\n const originalTokens = context.estimateTokens(msg);\n const maxAllowedTokens = Math.floor(context.totalBudget * context.config.DOCUMENT_FRAGMENT_MAX_PERCENTAGE);\n \n if (originalTokens > maxAllowedTokens) {\n processedContent = this.truncateContent(msg.content, maxAllowedTokens, context.config.AVG_CHARS_PER_TOKEN);\n strategiesApplied.push('document_truncation');\n \n this.debug(`📄 文档片段被截断`, {\n id: msg.id,\n originalTokens,\n maxAllowedTokens,\n truncatedTokens: context.estimateTokens({ ...msg, content: processedContent })\n }, context);\n }\n }\n \n // 标记为核心消息\n state.action = 'keep_core';\n state.processedContent = processedContent;\n state.contentType = contentType;\n state.phase = 'CORE_CONTEXT';\n \n // 重新计算Token数量(基于可能被截断的内容)\n state.tokens = context.estimateTokens({ ...msg, content: processedContent });\n coreTokens += state.tokens;\n processedCount++;\n \n this.debug(`✅ 标记为核心消息`, {\n index: i,\n id: msg.id,\n type: msg.type,\n tokens: state.tokens,\n totalCoreTokens: coreTokens\n }, context);\n } else {\n this.debug(`⏭️ 跳过非核心消息`, { \n index: i, \n id: msg.id, \n type: msg.type \n }, context);\n }\n }\n \n this.debug('📊 核心上下文保留层处理完成', {\n coreMessages: processedCount,\n coreTokens,\n remainingBudget: availableBudget - coreTokens\n }, context);\n\n return this.createResult(\n states,\n coreTokens,\n strategiesApplied,\n {\n processedCount,\n skippedCount: states.length - processedCount,\n addedCount: 0\n }\n );\n }\n\n /**\n * 判断是否为核心消息\n * 🔥 关键设计:只保留真正的核心消息\n */\n private isCoreMessage(msg: AiMessage, index: number, allMessages: AiMessage[]): boolean {\n // 核心消息类型:系统提示词和文档片段始终无条件保留\n if (msg.type === 'system_prompt' || msg.type === 'document_fragment') {\n return true;\n }\n \n // README规则:最新的user_input也算核心消息\n if (msg.type === 'user_input') {\n const lastUserIndex = allMessages.map(m => m.type).lastIndexOf('user_input');\n return index === lastUserIndex;\n }\n \n // 🚨 重要:history_summary 不在此处保留,让其进入后续的处理流程\n // 这是解决\"循环累积\"问题的关键 - 旧摘要必须能被新摘要替换\n // 参考 AgentCoreContextProvider 的实现\n if (msg.type === 'history_summary') {\n return false;\n }\n \n return false;\n }\n\n /**\n * 内容截断 - 保持完整词汇\n * 复用ContextManager中的逻辑\n */\n private truncateContent(content: string, maxTokens: number, avgCharsPerToken: number): string {\n const maxChars = maxTokens * avgCharsPerToken;\n if (content.length <= maxChars) {\n return content;\n }\n\n // 找到最接近的词汇边界\n const truncated = content.substring(0, maxChars);\n const lastSpaceIndex = truncated.lastIndexOf(' ');\n const result = lastSpaceIndex > maxChars * 0.8 \n ? truncated.substring(0, lastSpaceIndex)\n : truncated;\n \n return result + '...';\n }\n}","/**\n * @file src/chat/context/providers/WorkingMemoryProvider.ts\n * @description 工作记忆填充层Provider - 第二阶段上下文构建\n * \n * 🎯 职责: 使用剩余预算,从最近的历史消息开始反向逐条填充\n * 📖 策略: P1优先级(最终回答) + P2优先级(思维链回补)\n * ✨ 特性: 智能内容提取,最大化保留对话的\"事实\"和\"结论\"\n *\n * 🧩 说明(Chat 与工具消息):\n * - Chat 模式下,来自 Agent 历史的 `tool_calls/tool_output` 默认会被 `ToolHistoryFilterPreprocessor` 过滤掉,\n * 因此本 Provider 不承担“工具交互优先级/配对保留”等职责(这些属于 AgentWorkingMemoryProvider)。\n */\n\nimport { BaseContextProvider, MessageProcessingState, ProviderContext, ProviderResult } from './base';\nimport type { AiMessage } from '../../../../../contracts';\n\n/**\n * 工作记忆填充层Provider\n * \n * 实现README中描述的第二阶段:工作记忆填充层 (Working Memory)\n * 使用剩余预算反向填充,优先保留最终回答,其次回补思维链\n */\nexport class WorkingMemoryProvider extends BaseContextProvider {\n readonly name = 'WorkingMemoryProvider';\n readonly description = '工作记忆填充层 - 反向填充最终回答和思维链,最大化保留对话事实';\n readonly priority = 2; // 仅次于核心上下文\n\n async provide(\n states: MessageProcessingState[], \n availableBudget: number, \n context: ProviderContext\n ): Promise<ProviderResult> {\n this.debug('🧠 开始工作记忆填充层处理', {\n totalMessages: states.length,\n availableBudget,\n config: {\n thinkingRecallCount: context.config.THINKING_RECALL_COUNT\n }\n }, context);\n\n // 计算当前已使用的Token (核心上下文)\n const coreTokens = this.calculateUsedTokens(states);\n let workingMemoryTokens = coreTokens;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n\n // 获取所有跳过的消息状态,用于填充\n const skippedStates = states.filter(s => s.action === 'skip');\n\n // === P1 优先级:反向填充最终回答部分 ===\n this.debug('🎯 P1优先级:开始标记最终回答部分');\n const p1Result = await this.processP1Priority(\n skippedStates, \n workingMemoryTokens, \n availableBudget, \n context\n );\n \n workingMemoryTokens += p1Result.tokensUsed;\n processedCount += p1Result.processedCount;\n strategiesApplied.push(...p1Result.strategiesApplied);\n\n // === P2 优先级:回补思维链 ===\n if (workingMemoryTokens < availableBudget) {\n this.debug('🧠 P2优先级:开始标记思维链回补');\n const p2Result = await this.processP2Priority(\n states, \n workingMemoryTokens, \n availableBudget, \n context\n );\n \n workingMemoryTokens += p2Result.tokensUsed;\n processedCount += p2Result.processedCount;\n strategiesApplied.push(...p2Result.strategiesApplied);\n }\n\n const finalTokensUsed = workingMemoryTokens - coreTokens;\n\n this.debug('📊 工作记忆填充层处理完成', {\n workingMemoryMessages: processedCount,\n workingMemoryTokens: finalTokensUsed,\n totalTokensUsed: workingMemoryTokens,\n remainingBudget: availableBudget - workingMemoryTokens\n }, context);\n\n return this.createResult(\n states,\n finalTokensUsed,\n strategiesApplied,\n {\n processedCount,\n skippedCount: skippedStates.length - processedCount,\n addedCount: 0\n }\n );\n }\n\n /**\n * P1优先级处理:反向填充最终回答部分\n */\n private async processP1Priority(\n skippedStates: MessageProcessingState[],\n currentTokens: number,\n budgetLimit: number,\n context: ProviderContext\n ): Promise<{ tokensUsed: number; processedCount: number; strategiesApplied: string[] }> {\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n\n // 反向遍历跳过的消息\n for (let i = skippedStates.length - 1; i >= 0; i--) {\n const state = skippedStates[i];\n \n if (currentTokens + tokensUsed >= budgetLimit) {\n this.debug('💰 达到预算限制,停止P1填充', { \n currentTokens: currentTokens + tokensUsed, \n budgetLimit \n }, context);\n break;\n }\n\n // 处理 assistant final_answer 消息\n if (state.message.role === 'assistant' && state.message.type === 'final_answer') {\n const finalAnswerContent = this.extractFinalAnswerContent(state.message);\n if (finalAnswerContent) {\n const finalAnswerTokens = context.estimateTokens({ \n ...state.message, \n content: finalAnswerContent \n });\n \n if (currentTokens + tokensUsed + finalAnswerTokens <= budgetLimit) {\n state.action = 'keep_working_memory';\n state.processedContent = finalAnswerContent;\n state.tokens = finalAnswerTokens;\n state.contentType = 'final_answer_only';\n state.phase = 'WORKING_MEMORY';\n \n tokensUsed += finalAnswerTokens;\n processedCount++;\n strategiesApplied.push('final_answer_extraction');\n \n this.debug(`✅ P1标记assistant消息`, {\n id: state.message.id,\n tokens: finalAnswerTokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n } else {\n this.debug(`❌ P1超出预算`, { \n id: state.message.id, \n wouldExceed: currentTokens + tokensUsed + finalAnswerTokens,\n budgetLimit \n }, context);\n }\n }\n }\n // 新增:处理 assistant task_completion 消息(完整保留,不做<think>剥离)\n else if (state.message.role === 'assistant' && state.message.type === 'task_completion') {\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n // contentType 维持默认 'full'\n tokensUsed += state.tokens;\n processedCount++;\n strategiesApplied.push('task_completion_preservation');\n\n this.debug(`✅ P1标记task_completion消息`, {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n } else {\n this.debug(`❌ P1超出预算(task_completion)`, { \n id: state.message.id, \n wouldExceed: currentTokens + tokensUsed + state.tokens,\n budgetLimit \n }, context);\n }\n }\n // 处理其他优先级消息 (final_answer, user_input)\n else if (state.message.type === 'final_answer' || state.message.type === 'user_input') {\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n tokensUsed += state.tokens;\n processedCount++;\n \n this.debug(`✅ P1标记优先级消息`, {\n id: state.message.id,\n type: state.message.type,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n }\n }\n }\n\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n /**\n * P2优先级处理:回补思维链 + 历史摘要\n * \n * 💬 处理顺序(参考 AgentWorkingMemoryProvider):\n * 1. 首先处理 history_summary(如果有)\n * 2. 然后回补思维链\n */\n private async processP2Priority(\n states: MessageProcessingState[],\n currentTokens: number,\n budgetLimit: number,\n context: ProviderContext\n ): Promise<{ tokensUsed: number; processedCount: number; strategiesApplied: string[] }> {\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n\n // 🔥 新增:优先处理历史摘要(参考 AgentWorkingMemoryProvider)\n // 此时已由HistoryPurificationPreprocessor清理,最多只会有一条摘要\n for (const state of states) {\n if (state.message.role === 'system' && state.message.type === 'history_summary') {\n if (state.action === 'skip' && currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n tokensUsed += state.tokens;\n processedCount++;\n strategiesApplied.push('history_summary');\n \n this.debug(`✅ P2保留历史摘要`, {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n }\n break; // 最多只有一条摘要,找到后退出\n }\n }\n\n // 获取最近保留的 assistant final_answer 消息\n const recentFinalAnswers = states\n .filter(s => s.action === 'keep_working_memory' && \n s.message.role === 'assistant' && \n s.message.type === 'final_answer')\n .slice(-context.config.THINKING_RECALL_COUNT);\n\n for (const finalAnswerState of recentFinalAnswers) {\n if (currentTokens + tokensUsed >= budgetLimit) {\n this.debug('💰 达到预算限制,停止P2回补', { \n currentTokens: currentTokens + tokensUsed, \n budgetLimit \n }, context);\n break;\n }\n\n // 寻找对应的独立 thought 消息\n // 关键修复:仅在 final_answer 消息紧邻的前一条消息是 thought 时才进行回补\n const finalAnswerIndex = finalAnswerState.originalIndex;\n let thoughtState: MessageProcessingState | undefined = undefined;\n\n if (finalAnswerIndex > 0) {\n const potentialThoughtState = states[finalAnswerIndex - 1];\n if (\n potentialThoughtState &&\n potentialThoughtState.action === 'skip' &&\n potentialThoughtState.message.role === 'assistant' &&\n potentialThoughtState.message.type === 'thought'\n ) {\n thoughtState = potentialThoughtState;\n }\n }\n\n if (thoughtState && currentTokens + tokensUsed + thoughtState.tokens <= budgetLimit) {\n thoughtState.action = 'keep_working_memory';\n thoughtState.phase = 'WORKING_MEMORY';\n thoughtState.contentType = 'thinking_only';\n \n tokensUsed += thoughtState.tokens;\n processedCount++;\n strategiesApplied.push('independent_thinking_recall');\n\n this.debug(`✅ P2回补独立思维链`, {\n thoughtId: thoughtState.message.id,\n finalAnswerId: finalAnswerState.message.id,\n tokens: thoughtState.tokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n }\n }\n\n // 新增:Fallback 回补 - 当没有可用的 final_answer 配对时,按最近顺序回补少量 thought\n if (processedCount === 0 && currentTokens + tokensUsed < budgetLimit) {\n let recalled = 0;\n for (let i = states.length - 1; i >= 0; i--) {\n if (recalled >= context.config.THINKING_RECALL_COUNT) break;\n const s = states[i];\n if (s.action !== 'skip') continue;\n if (s.message.role === 'assistant' && s.message.type === 'thought') {\n if (currentTokens + tokensUsed + s.tokens <= budgetLimit) {\n s.action = 'keep_working_memory';\n s.phase = 'WORKING_MEMORY';\n s.contentType = 'thinking_only';\n tokensUsed += s.tokens;\n processedCount++;\n recalled++;\n strategiesApplied.push('independent_thinking_recall_fallback');\n this.debug(`✅ P2回补(无配对)思维链`, {\n thoughtId: s.message.id,\n tokens: s.tokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n } else {\n break;\n }\n }\n }\n }\n\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n /**\n * 计算当前已使用的Token数\n */\n private calculateUsedTokens(states: MessageProcessingState[]): number {\n return states\n .filter(s => s.action.startsWith('keep_'))\n .reduce((total, state) => total + state.tokens, 0);\n }\n\n /**\n * 提取AI消息的最终回答部分(移除<think>标签内容)\n */\n private extractFinalAnswerContent(message: AiMessage): string {\n const thinkRegex = /<think>([\\s\\S]*?)<\\/think>/gi;\n return message.content.replace(thinkRegex, '').trim();\n }\n}\n","/**\n * @file src/agent/context-manager/profiles/chat/context/providers/index.ts\n * @description Chat profile provider 协议与实现导出\n */\n\nexport * from './base';\n\nexport { CoreContextProvider } from './CoreContextProvider';\nexport { WorkingMemoryProvider } from './WorkingMemoryProvider';\nexport { SummarizationProvider } from '../../../../shared/providers';\nimport { ContextProviderRegistry as SharedContextProviderRegistry } from '../../../../shared/providers';\nimport type { ContextBuilderConfig } from '../config';\n\nexport class ContextProviderRegistry extends SharedContextProviderRegistry<ContextBuilderConfig> {}\n","import type { ChatMessage } from '../contracts';\nimport { generateMessageId } from '../../../../shared/ids';\nimport type { AiMessage, UserMessage } from '../../../../contracts';\n\nexport function aiMessageToChatMessage(aiMessage: AiMessage): ChatMessage {\n return {\n id: aiMessage.id,\n timestamp: aiMessage.timestamp,\n role: aiMessage.role,\n content: aiMessage.content,\n type: aiMessage.type,\n metadata: aiMessage.metadata,\n };\n}\n\nexport function chatMessageToAiMessage(\n chatMessage: ChatMessage,\n options: { id?: string; timestamp?: number } = {},\n): AiMessage {\n const { role, content, type, metadata, id: chatId } = chatMessage;\n const id = options.id || chatId || generateMessageId();\n\n const base = {\n id,\n content,\n timestamp: chatMessage.timestamp || options.timestamp || Date.now(),\n metadata,\n };\n\n switch (role) {\n case 'system': {\n const allowedSystemTypes = ['system_prompt', 'history_summary'] as const;\n const finalSystemType = (allowedSystemTypes as readonly string[]).includes(String(type))\n ? (type as typeof allowedSystemTypes[number])\n : 'system_prompt';\n return { ...base, role, type: finalSystemType };\n }\n case 'user': {\n const userType = type || 'user_input';\n if (\n ['user_input', 'context_before', 'context_after', 'document_fragment', 'image', 'task_request'].includes(\n userType,\n )\n ) {\n return { ...base, role, type: userType as UserMessage['type'] };\n }\n throw new Error(`Invalid type \"${userType}\" for role \"user\"`);\n }\n case 'assistant': {\n if (type === 'thought' || type === 'final_answer' || type === 'task_completion') {\n return { ...base, role, type };\n }\n throw new Error(`Invalid or missing type \"${type}\" for role \"assistant\"`);\n }\n default:\n throw new Error(`Unknown role: ${role}`);\n }\n}\n","import { \n CONTEXT_BUILDER_CONFIG,\n BuildPhase,\n ContextBuildStats,\n validateConfig,\n ContextBuilderConfig\n} from './config';\nimport { \n IContextProvider, \n ProviderContext,\n ContextProviderRegistry,\n SummarizationCallbacks\n} from './providers';\nimport {\n ContextManagerBase,\n type ContextManagerBaseOptions,\n} from '../../../shared/context-manager-base';\nimport {\n buildContextResult,\n generateContextRecommendations,\n} from '../../../shared/context-result';\nimport type { GenerateRequest, GenerateResponse } from '../contracts';\nimport type { AiMessage, RuntimeEvent } from '../../../../contracts';\nimport type { TokenizerPort } from '../../../../ports';\n\n/**\n * 上下文构建结果接口 - 与TokenBudgetManager保持兼容\n */\nexport interface ContextBuildResult {\n /** 构建后的消息列表 */\n messages: AiMessage[];\n \n /** Token使用情况 */\n tokenUsage: {\n used: number;\n remaining: number;\n };\n \n /** 处理统计信息 - 兼容TokenBudgetManager格式 */\n processingStats: {\n originalCount: number;\n keptCount: number;\n truncatedCount: number;\n tokenDistribution: Record<string, number>;\n strategiesApplied: string[];\n recommendations: string[];\n // 新增的上下文构建统计\n buildStats?: ContextBuildStats;\n };\n \n /** 是否进行了截断 */\n truncated: boolean;\n \n /** 截断的消息数量 */\n truncatedCount?: number;\n \n /** 应用的策略列表 */\n strategies: {\n applied: string[];\n recommendations: string[];\n };\n \n /** 🔥 新增:Provider生成的运行时事件(如摘要事件) */\n events?: RuntimeEvent[];\n}\n\n/**\n * 智能上下文管理器 - Provider编排器\n * \n * 🎯 职责: 编排各个ContextProvider,协调3阶段上下文构建流程\n * 🏗️ 架构: 策略模式 + 责任链模式,实现高内聚、低耦合\n */\nexport class ContextManager extends ContextManagerBase<\n ContextBuilderConfig,\n ContextProviderRegistry\n> {\n\n constructor(options: {\n debugMode?: boolean;\n customConfig?: Partial<ContextBuilderConfig>;\n providerRegistry?: ContextProviderRegistry;\n tokenizer?: TokenizerPort;\n tokenizerModelId?: string;\n } = {}) {\n super(options as ContextManagerBaseOptions<ContextBuilderConfig, ContextProviderRegistry>, {\n defaultConfig: CONTEXT_BUILDER_CONFIG,\n validateConfig,\n createRegistry: () => new ContextProviderRegistry(),\n loggerName: 'ContextManager',\n invalidConfigMessage: 'Invalid ContextManager configuration',\n });\n }\n\n /**\n * 主入口:构建智能上下文 - Provider编排模式\n */\n async buildContext(\n messages: AiMessage[], \n totalBudget: number,\n callbacks?: SummarizationCallbacks,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>\n ): Promise<ContextBuildResult> {\n // 计算摘要触发相关信息\n const summarizationThreshold = this.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n const summarizationTokenThreshold = Math.floor(totalBudget * summarizationThreshold);\n \n this.debug('🎯 [Chat上下文管理器] 开始上下文构建', { \n 原始消息数: messages.length, \n 总预算: totalBudget,\n 摘要触发阈值: `${(summarizationThreshold * 100).toFixed(0)}%`,\n 摘要Token阈值: summarizationTokenThreshold\n });\n\n const startTime = performance.now();\n const buildStats: ContextBuildStats = this.initializeBuildStats(startTime, messages.length);\n\n try {\n // 🔥 核心流程:编排各个Provider按优先级处理\n const providerContext: ProviderContext = {\n totalBudget,\n config: this.config,\n debugMode: this.debugMode,\n estimateTokens: message => this.estimateTokens(message),\n summarizationCallbacks: callbacks,\n generate,\n };\n\n const { finalMessages, finalTokens, strategiesApplied, events } =\n await this.runPipeline({\n messages,\n totalBudget,\n buildStats,\n providerContext,\n getPhaseByProviderName: providerName => this.getPhaseByProviderName(providerName),\n });\n \n const endTime = performance.now();\n buildStats.totalTime = endTime - startTime;\n \n // 计算摘要触发相关信息\n const summarizationThreshold = this.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n const summarizationTokenThreshold = Math.floor(totalBudget * summarizationThreshold);\n \n this.debug('✅ [Chat上下文管理器] 上下文构建完成', {\n 原始消息: messages.length,\n 最终消息: finalMessages.length,\n Token使用: finalTokens,\n 总预算: totalBudget,\n 使用率: `${((finalTokens / totalBudget) * 100).toFixed(1)}%`,\n 摘要触发阈值: `${(summarizationThreshold * 100).toFixed(0)}%`,\n 摘要Token阈值: summarizationTokenThreshold,\n 总耗时: `${buildStats.totalTime.toFixed(2)}ms`\n });\n\n return this.buildFinalResult(\n finalMessages, \n finalTokens, \n totalBudget, \n messages.length, \n strategiesApplied, \n buildStats,\n events // 🔥 传递收集的事件\n );\n\n } catch (error) {\n this.debug('❌ [Chat上下文管理器] 上下文构建失败', { error });\n throw new Error(`Context building failed with Provider orchestration: ${error}`);\n }\n }\n\n // ------------------- Provider编排核心方法 -------------------\n\n /**\n * 根据Provider名称获取对应的阶段名称\n */\n private getPhaseByProviderName(providerName: string): BuildPhase | null {\n const phaseMap: Record<string, BuildPhase> = {\n 'CoreContextProvider': BuildPhase.CORE_CONTEXT,\n 'WorkingMemoryProvider': BuildPhase.WORKING_MEMORY,\n 'SummarizationProvider': BuildPhase.SUMMARIZATION\n };\n return phaseMap[providerName] || null;\n }\n\n // ------------------- Provider编排辅助方法 -------------------\n\n private initializeBuildStats(startTime: number, originalMessageCount: number): ContextBuildStats {\n return {\n startTime,\n phaseTiming: {} as Record<BuildPhase, number>,\n phaseTokenUsage: {} as Record<BuildPhase, { used: number; percentage: number }>,\n messageStats: {\n original: originalMessageCount,\n afterCoreContext: 0,\n afterWorkingMemory: 0,\n afterSummarization: 0\n },\n summarizationTriggered: false,\n documentTruncated: false,\n totalTime: 0\n };\n }\n\n private buildFinalResult(\n finalMessages: AiMessage[],\n finalTokens: number,\n totalBudget: number,\n originalCount: number,\n strategiesApplied: string[],\n buildStats: ContextBuildStats,\n events: RuntimeEvent[] = [] // 🔥 新增:事件列表\n ): ContextBuildResult {\n const recommendations = this.generateRecommendations(buildStats, totalBudget);\n return buildContextResult({\n finalMessages,\n finalTokens,\n totalBudget,\n originalCount,\n strategiesApplied,\n buildStats,\n enableBuildStats: this.config.ENABLE_BUILD_STATS,\n estimateTokens: message => this.estimateTokens(message),\n coreTypes: this.config.CORE_MESSAGE_TYPES,\n recommendations,\n events,\n });\n }\n /**\n * 生成优化建议\n */\n private generateRecommendations(stats: ContextBuildStats, totalBudget: number): string[] {\n return generateContextRecommendations(stats, {\n totalBudget,\n processingTimeoutMs: this.config.PROCESSING_TIMEOUT_MS,\n largeSummarizationWarningThreshold:\n this.config.LARGE_SUMMARIZATION_WARNING_THRESHOLD,\n });\n }\n /**\n * 获取Provider注册表(用于测试或调试)\n */\n getProviderRegistry(): ContextProviderRegistry {\n return this.providerRegistry;\n }\n\n /**\n * 注册新的Provider\n */\n registerProvider(provider: IContextProvider): void {\n this.providerRegistry.register(provider);\n }\n}\n","import type { AiMessage } from '../../../../contracts';\n\n/**\n * 预处理器上下文 - 为管道模式提供的轻量级上下文\n */\nexport interface PreprocessorContext {\n /** 调试模式开关 */\n debugMode?: boolean;\n /** 可选的元数据传递 */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * 预处理结果接口\n */\nexport interface PreprocessorResult {\n /** 预处理后的消息列表 */\n messages: AiMessage[];\n /** 预处理统计信息 */\n stats: {\n /** 原始消息数量 */\n originalCount: number;\n /** 处理后消息数量 */\n processedCount: number;\n /** 被移除的消息数量 */\n removedCount: number;\n /** 被修改的消息数量 */\n modifiedCount: number;\n };\n /** 应用的策略列表 */\n appliedStrategies: string[];\n}\n\n/**\n * 预处理器接口 - 管道模式的核心契约\n */\nexport interface IPreprocessor {\n /** 预处理器名称 */\n readonly name: string;\n \n /** 预处理器描述 */\n readonly description: string;\n \n /** 执行顺序优先级 (数字越小越先执行) */\n readonly priority: number;\n\n /**\n * 预处理方法 - 管道模式的核心方法\n * \n * @param messages 输入的消息列表\n * @param context 预处理上下文\n * @returns 预处理结果\n */\n process(\n messages: AiMessage[], \n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n /**\n * 可选:判断是否应该跳过此预处理器\n * \n * @param messages 输入的消息列表\n * @param context 预处理上下文\n * @returns true表示跳过,false表示执行\n */\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean;\n}\n\n/**\n * 预处理器基类 - 提供通用功能实现\n */\nexport abstract class BasePreprocessor implements IPreprocessor {\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly priority: number;\n\n abstract process(\n messages: AiMessage[], \n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n /**\n * 默认的跳过逻辑 - 子类可以覆盖\n */\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean {\n return false; // 默认不跳过\n }\n\n /**\n * 创建预处理结果的辅助方法\n */\n protected createResult(\n originalMessages: AiMessage[],\n processedMessages: AiMessage[],\n appliedStrategies: string[],\n modifiedCount: number = 0\n ): PreprocessorResult {\n const removedCount = originalMessages.length - processedMessages.length;\n \n return {\n messages: processedMessages,\n stats: {\n originalCount: originalMessages.length,\n processedCount: processedMessages.length,\n removedCount,\n modifiedCount\n },\n appliedStrategies\n };\n }\n\n /**\n * 调试日志辅助方法\n */\n protected debug(message: string, data?: Record<string, unknown>, context?: PreprocessorContext): void {\n if (context?.debugMode) {\n console.log(`[${this.name}] ${message}`, data);\n }\n }\n}\n","import {\n BasePreprocessor,\n type PreprocessorContext,\n type PreprocessorResult,\n} from './base';\nimport type { AiMessage } from '../../../../contracts';\n\ninterface UserQuoteMetadata {\n text: string;\n source?: Record<string, unknown>;\n}\n\nexport interface UserQuoteLifetimeConfig {\n keepLatestUserInputs?: number;\n priority?: number;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readUserQuoteMetadata(metadata: AiMessage['metadata']): UserQuoteMetadata | undefined {\n const quote = metadata?.user_quote;\n if (!isRecord(quote) || typeof quote.text !== 'string') {\n return undefined;\n }\n\n return {\n text: quote.text,\n source: isRecord(quote.source) ? quote.source : undefined,\n };\n}\n\nexport class UserQuoteLifetimePreprocessor extends BasePreprocessor {\n readonly name = 'UserQuoteLifetimePreprocessor';\n readonly description = 'chat 兼容层:限制 <user_quote> 在历史中的生效轮数';\n readonly priority: number;\n\n private readonly keepLatestUserInputs: number;\n\n constructor(config: UserQuoteLifetimeConfig = {}) {\n super();\n this.keepLatestUserInputs = config.keepLatestUserInputs ?? 2;\n this.priority = config.priority ?? 3;\n }\n\n async process(messages: AiMessage[], context: PreprocessorContext): Promise<PreprocessorResult> {\n this.debug('🧹 开始处理 chat 用户引用寿命', {\n 原始消息数: messages.length,\n 保留用户输入条数: this.keepLatestUserInputs,\n }, context);\n\n if (messages.length === 0) {\n return this.createResult(messages, messages, [], 0);\n }\n\n const userInputIndices = messages\n .map((msg, index) => ({ msg, index }))\n .filter(({ msg }) => msg.role === 'user' && msg.type === 'user_input')\n .map(({ index }) => index);\n\n if (userInputIndices.length === 0) {\n return this.createResult(messages, messages, [], 0);\n }\n\n const keepCount = Math.max(1, this.keepLatestUserInputs);\n const cutoff = Math.max(0, userInputIndices.length - keepCount);\n const indicesToStrip = userInputIndices.slice(0, cutoff);\n const keptIndices = userInputIndices.slice(cutoff);\n\n const processedMessages: AiMessage[] = [...messages];\n let modifiedCount = 0;\n\n for (const index of indicesToStrip) {\n const { message, modified } = this.stripUserQuoteFromMessage(processedMessages[index]);\n if (modified) {\n processedMessages[index] = message;\n modifiedCount++;\n }\n }\n\n for (const index of keptIndices) {\n const { message, modified } = this.ensureUserQuoteOnMessage(processedMessages[index]);\n if (modified) {\n processedMessages[index] = message;\n modifiedCount++;\n }\n }\n\n return this.createResult(\n messages,\n processedMessages,\n modifiedCount > 0 ? ['user_quote_lifetime'] : [],\n modifiedCount,\n );\n }\n\n private stripUserQuoteFromMessage(\n message: AiMessage,\n ): { message: AiMessage; modified: boolean } {\n let modified = false;\n let newContent = message.content;\n\n if (newContent.includes('<user_quote')) {\n const replaced = newContent.replace(/<user_quote[\\s\\S]*?<\\/user_quote>\\s*/gm, '').trimStart();\n if (replaced !== newContent) {\n newContent = replaced;\n modified = true;\n }\n }\n\n let newMetadata = message.metadata;\n if (message.metadata?.user_quote) {\n newMetadata = { ...message.metadata };\n delete newMetadata.user_quote;\n modified = true;\n }\n\n if (!modified) {\n return { message, modified: false };\n }\n\n return {\n message: {\n ...message,\n content: newContent,\n ...(newMetadata ? { metadata: newMetadata } : {}),\n },\n modified: true,\n };\n }\n\n private ensureUserQuoteOnMessage(\n message: AiMessage,\n ): { message: AiMessage; modified: boolean } {\n const quote = readUserQuoteMetadata(message.metadata);\n if (!quote || message.content.includes('<user_quote')) {\n return { message, modified: false };\n }\n\n const quoteText = quote.text.trim();\n if (!quoteText) {\n return { message, modified: false };\n }\n\n const source = quote.source ?? {};\n const attrs: string[] = [];\n if (typeof source.doc_id === 'string') attrs.push(`source_doc=\"${source.doc_id}\"`);\n if (typeof source.block_id === 'string') attrs.push(`block_id=\"${source.block_id}\"`);\n if (typeof source.start === 'number') attrs.push(`start=\"${source.start}\"`);\n if (typeof source.end === 'number') attrs.push(`end=\"${source.end}\"`);\n\n const openTag = attrs.length > 0 ? `<user_quote ${attrs.join(' ')}>` : '<user_quote>';\n const quoteBlock = `${openTag}\\n${quoteText}\\n</user_quote>`;\n const queryBlock = `<user_query>\\n${message.content.trim()}\\n</user_query>`;\n\n return {\n message: {\n ...message,\n content: `${quoteBlock}\\n${queryBlock}`,\n },\n modified: true,\n };\n }\n}\n","import {\n BasePreprocessor,\n PreprocessorContext,\n PreprocessorResult\n} from './base';\nimport type { AiMessage } from '../../../../contracts';\n\n/**\n * 工具历史过滤器预处理器\n *\n * 过滤掉Agent模式产生的、与Chat模式不兼容的工具调用历史消息。\n */\nexport class ToolHistoryFilterPreprocessor extends BasePreprocessor {\n readonly name = 'ToolHistoryFilterPreprocessor';\n readonly description = '移除Agent历史记录中与Chat模式不兼容的工具调用消息';\n readonly priority = 2; // 在历史净化之后执行\n\n /**\n * 功能: 执行工具历史过滤处理。\n * @param messages {AiMessage[]} 输入的消息列表。\n * @param context {PreprocessorContext} 预处理上下文。\n * @returns {Promise<PreprocessorResult>} 过滤后的结果。\n * @side-effects 无\n */\n async process(\n messages: AiMessage[],\n context: PreprocessorContext\n ): Promise<PreprocessorResult> {\n this.debug('🧹 开始过滤工具调用历史', {\n 原始消息数: messages.length\n }, context);\n\n const filteredMessages = messages.filter(msg => {\n const isToolCall = msg.role === 'assistant' && msg.type === 'tool_calls';\n const isToolOutput = msg.role === 'tool' && msg.type === 'tool_output';\n return !isToolCall && !isToolOutput;\n });\n\n const removedCount = messages.length - filteredMessages.length;\n const appliedStrategies = removedCount > 0 ? ['tool_history_filtering'] : [];\n\n this.debug('✅ 工具历史过滤完成', {\n 原始消息: messages.length,\n 过滤后消息: filteredMessages.length,\n 移除消息: removedCount\n }, context);\n\n return this.createResult(\n messages,\n filteredMessages,\n appliedStrategies,\n 0\n );\n }\n\n /**\n * 功能: 判断是否应跳过此预处理器。\n * @param messages {AiMessage[]} 输入的消息列表。\n * @param context {PreprocessorContext} 预处理上下文。\n * @returns {boolean} 如果没有工具相关的消息,则返回 true 跳过。\n * @side-effects 无\n */\n shouldSkip(messages: AiMessage[], context: PreprocessorContext): boolean {\n const hasToolMessages = messages.some(msg =>\n (msg.role === 'assistant' && msg.type === 'tool_calls') ||\n (msg.role === 'tool' && msg.type === 'tool_output')\n );\n\n if (!hasToolMessages) {\n this.debug('⏭️ 无工具调用历史,跳过过滤', {}, context);\n return true;\n }\n\n return false;\n }\n}\n","import { \n IPreprocessor, \n PreprocessorContext, \n PreprocessorResult \n} from './base';\nimport {\n HistoryPurificationPreprocessor,\n} from '../../../shared/preprocessors';\nimport { UserQuoteLifetimePreprocessor } from './userQuoteLifetime';\nimport { ToolHistoryFilterPreprocessor } from './toolHistoryFilter';\nimport type { AiMessage } from '../../../../contracts';\n\n// 重新导出公共接口\nexport * from './base';\nexport { HistoryPurificationPreprocessor } from '../../../shared/preprocessors';\nexport * from './toolHistoryFilter';\nexport * from './userQuoteLifetime';\n\n/**\n * 预处理器注册表 - 管理所有预处理器及其执行顺序\n */\nexport class PreprocessorRegistry {\n private preprocessors: Map<string, IPreprocessor> = new Map();\n\n /**\n * 注册预处理器\n */\n register(preprocessor: IPreprocessor): void {\n if (this.preprocessors.has(preprocessor.name)) {\n throw new Error(`Preprocessor with name '${preprocessor.name}' is already registered`);\n }\n this.preprocessors.set(preprocessor.name, preprocessor);\n }\n\n /**\n * 获取指定名称的预处理器\n */\n getPreprocessor(name: string): IPreprocessor | undefined {\n return this.preprocessors.get(name);\n }\n\n /**\n * 获取所有预处理器,按优先级排序\n */\n getAllPreprocessors(): IPreprocessor[] {\n return Array.from(this.preprocessors.values())\n .sort((a, b) => a.priority - b.priority);\n }\n\n /**\n * 获取已注册的预处理器名称列表\n */\n getRegisteredNames(): string[] {\n return Array.from(this.preprocessors.keys());\n }\n\n /**\n * 检查是否已注册指定预处理器\n */\n isRegistered(name: string): boolean {\n return this.preprocessors.has(name);\n }\n\n /**\n * 获取注册的预处理器数量\n */\n getCount(): number {\n return this.preprocessors.size;\n }\n}\n\n/**\n * 预处理管道 - 按顺序执行所有预处理器\n */\nexport class PreprocessorPipeline {\n private registry: PreprocessorRegistry;\n private context: PreprocessorContext;\n\n constructor(\n registry: PreprocessorRegistry, \n context: PreprocessorContext = {}\n ) {\n this.registry = registry;\n this.context = context;\n }\n\n /**\n * 执行完整的预处理管道\n * \n * @param messages 输入消息列表\n * @returns 预处理管道的汇总结果\n */\n async process(messages: AiMessage[]): Promise<PreprocessorPipelineResult> {\n const startTime = performance.now();\n let currentMessages = messages;\n const pipelineResults: Array<{ preprocessor: string; result: PreprocessorResult }> = [];\n const appliedStrategies = new Set<string>();\n\n this.debug('🚀 开始预处理管道', {\n 初始消息数: messages.length,\n 预处理器数量: this.registry.getCount()\n });\n\n // 获取所有预处理器,按优先级排序\n const preprocessors = this.registry.getAllPreprocessors();\n\n // 按优先级顺序执行每个预处理器\n for (const preprocessor of preprocessors) {\n this.debug(`🔄 执行预处理器: ${preprocessor.name}`, {\n 优先级: preprocessor.priority,\n 当前消息数: currentMessages.length\n });\n\n try {\n // 检查是否应该跳过\n if (preprocessor.shouldSkip?.(currentMessages, this.context)) {\n this.debug(`⏭️ 跳过预处理器: ${preprocessor.name}`, {});\n continue;\n }\n\n // 执行预处理\n const result = await preprocessor.process(currentMessages, this.context);\n \n // 记录结果\n pipelineResults.push({\n preprocessor: preprocessor.name,\n result\n });\n\n // 更新消息列表以供下一个预处理器使用\n currentMessages = result.messages;\n \n // 收集应用的策略\n result.appliedStrategies.forEach(strategy => appliedStrategies.add(strategy));\n\n this.debug(`✅ 预处理器完成: ${preprocessor.name}`, {\n 输入消息: result.stats.originalCount,\n 输出消息: result.stats.processedCount,\n 移除消息: result.stats.removedCount,\n 修改消息: result.stats.modifiedCount,\n 应用策略: result.appliedStrategies\n });\n\n } catch (error) {\n this.debug(`❌ 预处理器失败: ${preprocessor.name}`, { error });\n // 预处理器失败不应该中断整个管道,继续执行后续预处理器\n console.warn(`Preprocessor ${preprocessor.name} failed:`, error);\n }\n }\n\n const endTime = performance.now();\n const processingTime = endTime - startTime;\n\n this.debug('🏁 预处理管道完成', {\n 原始消息数: messages.length,\n 最终消息数: currentMessages.length,\n 总移除数: messages.length - currentMessages.length,\n 执行时间: `${processingTime.toFixed(2)}ms`,\n 应用策略: Array.from(appliedStrategies)\n });\n\n return {\n messages: currentMessages,\n pipelineStats: {\n originalCount: messages.length,\n finalCount: currentMessages.length,\n totalRemovedCount: messages.length - currentMessages.length,\n processingTime,\n preprocessorsExecuted: pipelineResults.length,\n appliedStrategies: Array.from(appliedStrategies)\n },\n individualResults: pipelineResults\n };\n }\n\n /**\n * 更新预处理上下文\n */\n updateContext(newContext: Partial<PreprocessorContext>): void {\n this.context = { ...this.context, ...newContext };\n }\n\n /**\n * 获取当前上下文\n */\n getContext(): PreprocessorContext {\n return { ...this.context };\n }\n\n /**\n * 调试日志\n */\n private debug(message: string, data?: Record<string, unknown>): void {\n if (this.context.debugMode) {\n console.log(`[PreprocessorPipeline] ${message}`, data);\n }\n }\n}\n\n/**\n * 预处理管道结果接口\n */\nexport interface PreprocessorPipelineResult {\n /** 预处理后的消息列表 */\n messages: AiMessage[];\n \n /** 管道级别的统计信息 */\n pipelineStats: {\n originalCount: number;\n finalCount: number;\n totalRemovedCount: number;\n processingTime: number;\n preprocessorsExecuted: number;\n appliedStrategies: string[];\n };\n \n /** 各个预处理器的详细结果 */\n individualResults: Array<{\n preprocessor: string;\n result: PreprocessorResult;\n }>;\n}\n\n// ================= 默认配置 =================\n\n/**\n * 创建默认的预处理器注册表\n * \n * 🔥 这里定义了预处理管道的默认配置:\n * 1. HistoryPurificationPreprocessor (priority: 1) - 历史净化,最先执行\n * \n * 💡 扩展示例:\n * 2. PIIScrubbingPreprocessor (priority: 2) - PII数据清洗\n * 3. FormatNormalizationPreprocessor (priority: 3) - 格式标准化\n */\nexport function createDefaultPreprocessorRegistry(): PreprocessorRegistry {\n const registry = new PreprocessorRegistry();\n \n // 注册历史净化预处理器 - 优先级1,最先执行\n // 🔥 使用共享实现,配置 Chat 模式的日志前缀\n registry.register(new HistoryPurificationPreprocessor({ logPrefix: 'Chat-HistoryPurification' }));\n \n // 注册工具历史过滤器 - 优先级2,移除Agent工具消息\n registry.register(new ToolHistoryFilterPreprocessor());\n\n // 注册用户引用寿命控制器 - 优先级3,清理过期引用\n registry.register(\n new UserQuoteLifetimePreprocessor({\n keepLatestUserInputs: 2,\n priority: 3,\n })\n );\n\n // 未来可以在这里注册更多预处理器:\n // registry.register(new PIIScrubbingPreprocessor());\n // registry.register(new FormatNormalizationPreprocessor());\n // registry.register(new DeduplicationPreprocessor());\n \n return registry;\n}\n\n/**\n * 创建默认的预处理管道\n * \n * @param context 预处理上下文配置\n * @returns 配置好的预处理管道实例\n */\nexport function createDefaultPreprocessorPipeline(\n context: PreprocessorContext = {}\n): PreprocessorPipeline {\n const registry = createDefaultPreprocessorRegistry();\n return new PreprocessorPipeline(registry, context);\n}\n","import type { AgentProfileRequest } from '../agent/contracts';\nimport type { GenerateRequest } from './contracts';\nimport { aiMessageToChatMessage } from './utils/messageAdapters';\nimport type { AiMessage } from '../../../contracts';\n\nexport interface ChatGenerateRequestAdapterInput extends AgentProfileRequest {\n context_before?: string;\n context_after?: string;\n current_paragraph?: string;\n document_fragment?: string;\n document_title?: string;\n project_metadata?: {\n id?: string;\n name?: string;\n description?: string;\n };\n document_metadata?: {\n id?: string;\n title?: string;\n };\n user_quote?: {\n text: string;\n source?: Record<string, unknown>;\n display_label?: string;\n };\n completionLengthHint?: string;\n recentRejections?: GenerateRequest['recentRejections'];\n}\n\n/**\n * Product request adapter:\n * - keeps AgentInvokeRequest -> GenerateRequest conversion out of orchestrator core\n * - makes the remaining app-specific request shape explicit and replaceable\n */\nexport function buildGenerateRequestFromAgentRequest(\n request: ChatGenerateRequestAdapterInput,\n conversationHistory: AiMessage[],\n): GenerateRequest {\n return {\n prompt: request.query,\n documentFragment: request.document_fragment,\n conversationHistory: conversationHistory.map((message) => aiMessageToChatMessage(message)),\n promptKey: request.promptKey,\n contextBefore: request.context_before,\n contextAfter: request.context_after,\n currentBlockContent: request.current_paragraph,\n current_paragraph: request.current_paragraph,\n projectMetadata: request.project_metadata\n ? {\n id: request.project_metadata.id,\n name: request.project_metadata.name,\n description: request.project_metadata.description,\n }\n : undefined,\n documentMetadata: request.document_metadata\n ? {\n id: request.document_metadata.id,\n title: request.document_metadata.title || request.document_title,\n }\n : (request.document_title ? { title: request.document_title } : undefined),\n userQuote: request.user_quote\n ? {\n text: request.user_quote.text,\n source: request.user_quote.source,\n displayLabel: request.user_quote.display_label,\n }\n : undefined,\n completionLengthHint: request.completionLengthHint,\n recentRejections: request.recentRejections,\n };\n}\n","import type { ChatMessage, GenerateRequest, GenerateResponse } from '../contracts';\nimport { chatMessageToAiMessage } from '../utils/messageAdapters';\nimport { ContextManager, ContextBuildResult } from '../context';\nimport { CONTEXT_BUILDER_CONFIG } from '../context/config';\nimport type { ContextBuilderConfig } from '../context/config';\nimport type { SummarizationCallbacks } from '../context/providers/base';\nimport type { ContextProviderRegistry } from '../context/providers';\nimport { \n PreprocessorPipeline, \n createDefaultPreprocessorPipeline,\n PreprocessorPipelineResult \n} from '../preprocessors';\nimport { messageFormatter } from '../../../shared/MessageFormatter';\nimport type { AgentProfileRequest } from '../../agent/contracts';\nimport type { ChatTaskResolver } from '../tasks/base';\nimport { generateMessageId } from '../../../../shared/ids';\nimport { buildGenerateRequestFromAgentRequest } from '../request-adapters';\nimport type { AiMessage } from '../../../../contracts';\nimport type { TokenizerPort } from '../../../../ports';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction readOptionalStringProperty(value: unknown, key: string): string | undefined {\n if (!isRecord(value)) return undefined;\n const candidate = value[key];\n return typeof candidate === 'string' && candidate.trim().length > 0 ? candidate : undefined;\n}\n\n/**\n * 编排器配置选项\n */\nexport interface OrchestratorOptions {\n /** Token预算配置 (现在由ContextManager内部管理,但保留API以兼容旧用法) */\n tokenBudget: {\n maxTokens: number;\n reservedForResponse: number;\n };\n \n /** 处理选项 */\n processing: {\n enableMerge?: boolean;\n enableBatch?: boolean;\n debugMode?: boolean;\n preserveMetadata?: boolean;\n };\n \n /** 系统提示词 */\n systemPrompt?: string;\n \n /** 模型名称 (用于精确Token计算) */\n model?: string;\n\n /** 任务解析器 */\n taskResolver: ChatTaskResolver;\n providerRegistry: ContextProviderRegistry;\n tokenizer?: TokenizerPort;\n}\n\n/**\n * 处理结果接口\n */\nexport interface ProcessingResult {\n /** 处理后的消息 (AI引擎格式) */\n messages: ChatMessage[];\n \n /** 完整的上下文构建结果,包含详细统计信息 */\n contextBuildResult: ContextBuildResult;\n \n /** 处理元信息 */\n metadata: {\n originalCount: number;\n processedCount: number;\n tokenUsage: {\n estimated: number;\n budget: number;\n remaining: number;\n };\n processingStats: ContextBuildResult['processingStats'];\n truncated: boolean;\n truncatedCount?: number;\n };\n}\n\n/**\n * 消息处理编排器\n * \n * 实现完整的处理流程:解析 → 分发 → 上下文构建 → 注入系统提示词 → 转换\n */\nexport class MessageOrchestrator {\n private contextManager: ContextManager;\n private preprocessorPipeline: PreprocessorPipeline;\n private options: OrchestratorOptions;\n private readonly taskResolver: ChatTaskResolver;\n\n constructor(options: OrchestratorOptions) {\n this.options = options;\n this.taskResolver = options.taskResolver;\n \n // 初始化预处理管道\n this.preprocessorPipeline = createDefaultPreprocessorPipeline({\n debugMode: options.processing.debugMode\n });\n \n // 初始化新的上下文管理器\n this.contextManager = new ContextManager({\n debugMode: options.processing.debugMode,\n // 允许通过 OrchestratorOptions 覆盖默认配置\n customConfig: CONTEXT_BUILDER_CONFIG,\n providerRegistry: options.providerRegistry,\n tokenizer: options.tokenizer,\n tokenizerModelId: options.model,\n });\n }\n\n /**\n * 🔥 新增:与 AgentOrchestrator 对称的主方法\n * 负责从 AgentProfileRequest 构建完整的初始消息列表,然后进行处理\n */\n async processChatConversation(\n request: AgentProfileRequest,\n callbacks?: SummarizationCallbacks,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>\n ): Promise<ProcessingResult> {\n console.log('[Chat-Orchestrator] 🚀 开始 Chat 对话处理');\n this.contextManager.updateTokenizerModelId(this.resolveTokenizerModelId(request));\n\n // 🔥 1. [预处理] 首先对原始历史记录进行净化\n const originalHistory = request.conversationHistory || [];\n const preprocessResult = await this.runPreprocessorPipeline(originalHistory);\n console.log(`[Chat-Orchestrator] 🧹 历史净化完成: ${originalHistory.length} -> ${preprocessResult.messages.length} 条`);\n\n // 2. 将 AgentProfileRequest 转换为 GenerateRequest 格式,并注入净化后的历史\n const generateRequest = buildGenerateRequestFromAgentRequest(\n request,\n preprocessResult.messages,\n );\n\n this.debug(`Converting AgentProfileRequest to GenerateRequest`, {\n promptKey: request.promptKey,\n originalHistoryCount: originalHistory.length,\n purifiedHistoryCount: preprocessResult.messages.length,\n });\n\n // 3. 获取任务并调用其 buildMessages 方法\n const task = this.taskResolver(request.promptKey);\n const initialChatMessages = task.buildMessages(generateRequest);\n \n this.debug(`Task built ${initialChatMessages.length} initial messages using purified history`, {\n promptKey: request.promptKey,\n taskType: task.constructor.name,\n });\n\n // 4. 将 ChatMessage[] 转换为 AiMessage[] 以供后续处理\n const initialAiMessages: AiMessage[] = initialChatMessages.map((chatMsg, index) => \n chatMessageToAiMessage(chatMsg, { \n id: chatMsg.id || generateMessageId(), \n timestamp: chatMsg.timestamp || (Date.now() - (initialChatMessages.length - index))\n })\n );\n \n // 5. [上下文构建] - 调用ContextManager (不再需要内部预处理)\n const finalResult = await this.buildAndFinalizeContext(initialAiMessages, callbacks, generate);\n\n this.debug('✅ Chat 对话处理完成', {\n hasCallbacks: !!callbacks,\n onSummarizationStart: !!callbacks?.onSummarizationStart,\n onSummarizationEnd: !!callbacks?.onSummarizationEnd,\n });\n\n console.log('[Chat-Orchestrator] ✅ Chat 对话处理完成');\n return finalResult;\n }\n\n /**\n * 核心编排方法 - 处理一个预构建好的对话历史\n */\n async processConversation(\n messages: AiMessage[],\n callbacks?: SummarizationCallbacks,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>\n ): Promise<ProcessingResult> {\n this.debug('Starting conversation processing', { messageCount: messages.length });\n \n const startTime = performance.now();\n \n try {\n // 1. [解析验证] - 确保消息结构和内容的基本有效性\n const validMessages = this.parseAndValidateMessages(messages);\n this.debug('Parsed and validated messages', { validCount: validMessages.length });\n \n // 🔥 注意: 此方法现在主要由内部调用,预处理已在 processChatConversation 中完成\n // 因此,我们直接进入上下文构建\n \n // 3. [上下文构建] - 调用ContextManager在Token预算内构建最优消息组合\n const contextResult = await this.buildContext(validMessages, callbacks, generate);\n this.debug('Context built', { afterContextCount: contextResult.messages.length });\n \n if (this.options.processing.debugMode) {\n console.log('[MessageOrchestrator] DEBUG: Messages after context build:', JSON.stringify(\n contextResult.messages.map(m => ({ id: m.id, ts: m.timestamp, role: m.role, type: m.type, content: m.content.substring(0, 50) })),\n null,\n 2\n ));\n }\n \n // 4. [最终格式化] - 将内部AiMessage格式转换为外部API的ChatMessage格式\n const chatMessages = this.convertToChatMessages(contextResult.messages);\n \n const endTime = performance.now();\n const processingTime = endTime - startTime;\n \n if (this.options.processing.debugMode) {\n console.log('[MessageOrchestrator] DEBUG: Final ChatMessages for AI Engine:', JSON.stringify(\n chatMessages.map(m => ({ id: m.id, ts: m.timestamp, role: m.role, type: m.type, content: m.content.substring(0, 50) })),\n null,\n 2\n ));\n }\n \n this.debug('Processing completed', { \n processingTime: `${processingTime.toFixed(2)}ms`,\n finalMessageCount: chatMessages.length\n });\n \n // 构建处理结果\n return {\n messages: chatMessages,\n contextBuildResult: contextResult,\n metadata: {\n originalCount: messages.length,\n processedCount: chatMessages.length,\n tokenUsage: {\n estimated: contextResult.tokenUsage.used,\n budget: this.options.tokenBudget.maxTokens,\n remaining: contextResult.tokenUsage.remaining\n },\n processingStats: contextResult.processingStats,\n truncated: contextResult.truncated,\n truncatedCount: contextResult.truncatedCount\n }\n };\n \n } catch (error) {\n this.debug('Processing failed', { error });\n throw new Error(`Message processing failed: ${error}`);\n }\n }\n\n /**\n * 封装了 buildContext 和 convertToChatMessages 的逻辑\n */\n private async buildAndFinalizeContext(\n messages: AiMessage[],\n callbacks?: SummarizationCallbacks,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>\n ): Promise<ProcessingResult> {\n const contextResult = await this.buildContext(messages, callbacks, generate);\n const chatMessages = this.convertToChatMessages(contextResult.messages);\n\n return {\n messages: chatMessages,\n contextBuildResult: contextResult,\n metadata: {\n originalCount: messages.length, // 注意:这里的 originalCount 是净化后的数量\n processedCount: chatMessages.length,\n tokenUsage: {\n estimated: contextResult.tokenUsage.used,\n budget: this.options.tokenBudget.maxTokens,\n remaining: contextResult.tokenUsage.remaining\n },\n processingStats: contextResult.processingStats,\n truncated: contextResult.truncated,\n truncatedCount: contextResult.truncatedCount\n }\n };\n }\n \n /**\n * 1. 解析和验证消息 - 直接使用原始消息,不进行格式转换\n */\n private parseAndValidateMessages(messages: AiMessage[]): AiMessage[] {\n this.debug('开始解析和验证消息', { originalCount: messages.length });\n \n // 直接验证原始消息,不使用historyFormatter\n const validMessages = messages.filter(message => {\n // 结构验证\n if (!message.id || !message.role || !message.type || typeof message.content !== 'string') {\n this.debug('消息结构无效', { id: message.id, type: message.type });\n return false;\n }\n \n // 内容验证\n if (!message.content.trim()) {\n this.debug('消息内容为空', { id: message.id });\n return false;\n }\n \n return true;\n });\n \n this.debug('消息解析完成', {\n 原始消息数: messages.length,\n 验证通过: validMessages.length,\n 被过滤: messages.length - validMessages.length\n });\n \n return validMessages;\n }\n\n /**\n * 🔥 2. [预处理管道] - 运行所有注册的预处理器\n */\n private async runPreprocessorPipeline(messages: AiMessage[]): Promise<PreprocessorPipelineResult> {\n return await this.preprocessorPipeline.process(messages);\n }\n\n private resolveTokenizerModelId(request?: AgentProfileRequest): string | undefined {\n return readOptionalStringProperty(request, 'model_id')\n ?? readOptionalStringProperty(request, 'modelId')\n ?? this.options.model;\n }\n\n /**\n * 3. [上下文构建] - 调用ContextManager进行智能Token预算和消息构建\n */\n private async buildContext(\n messages: AiMessage[],\n callbacks?: SummarizationCallbacks,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>\n ): Promise<ContextBuildResult> {\n const totalBudget = this.options.tokenBudget.maxTokens - this.options.tokenBudget.reservedForResponse;\n \n // 委托给专门的上下文管理器处理\n const contextResult = await this.contextManager.buildContext(\n messages,\n totalBudget,\n callbacks,\n generate\n );\n \n if (this.options.processing.debugMode) {\n this.debug('Context build result', {\n original: contextResult.processingStats.originalCount,\n kept: contextResult.processingStats.keptCount,\n truncated: contextResult.processingStats.truncatedCount,\n strategies: contextResult.strategies.applied,\n tokenUsage: contextResult.tokenUsage,\n recommendations: contextResult.strategies.recommendations,\n buildStats: contextResult.processingStats.buildStats\n });\n }\n \n return contextResult;\n }\n\n /**\n * 4. [最终格式化] - 将内部AiMessage格式转换为外部API的ChatMessage格式\n */\n private convertToChatMessages(messages: AiMessage[]): ChatMessage[] {\n // 关键修复:使用专用的 MessageFormatter 来确保格式正确且无冗余数据\n // 🔥 Chat模式:不使用native tools,使用chat模式\n return messageFormatter.format(messages, { nativeTools: false, mode: 'chat' });\n }\n\n /**\n * 调试日志\n */\n private debug(message: string, data?: Record<string, unknown>): void {\n if (this.options.processing.debugMode) {\n console.log(`[MessageOrchestrator] ${message}`, data);\n }\n }\n\n /**\n * 更新配置\n */\n updateOptions(newOptions: Partial<OrchestratorOptions>): void {\n this.options = {\n ...this.options,\n ...newOptions,\n tokenBudget: { ...this.options.tokenBudget, ...newOptions.tokenBudget },\n processing: { ...this.options.processing, ...newOptions.processing }\n };\n \n // 同步更新上下文管理器配置\n if (newOptions.processing?.debugMode !== undefined) {\n // 这是一个示例,实际中可能需要更复杂的配置更新逻辑\n }\n this.contextManager.updateTokenizerModelId(this.options.model);\n }\n\n /**\n * 获取预算管理器 (用于高级配置) - 已更新为上下文管理器\n */\n getContextManager(): ContextManager {\n return this.contextManager;\n }\n\n /**\n * 获取预算管理状态 - 已更新为上下文管理状态\n */\n getContextInfo(): {\n config: ContextBuilderConfig;\n } {\n return {\n config: this.contextManager.getConfig()\n };\n }\n}\n\n/**\n * 🔥 工厂函数:创建默认配置的 MessageOrchestrator\n */\n","/**\n * @file src/agent/context-manager/profiles/chat/tasks/BaseConversationalTask.ts\n * \n * @brief 对话型任务的抽象基类 - 处理多轮对话场景的通用逻辑\n * \n * @description\n * BaseConversationalTask 是所有需要处理对话历史的任务的抽象基类。\n * \n * 🔥 设计理念(参考 BaseAgentTask):\n * - Task层:构建核心的、必须的消息(系统提示词 + 文档上下文 + 当前用户输入)\n * - ContextManager层:处理复杂的上下文管理、历史编排、Token优化\n * \n * 它封装了对话型任务的标准流程:\n * 1. 添加系统提示词(由子类实现)\n * 2. 添加文档上下文(如果提供)\n * 3. 添加当前用户输入(如果历史中没有用户消息)\n * 4. 附加完整的对话历史(不做任何过滤,保留所有消息包括 history_summary)\n * \n * 与工具型任务的区别:\n * - 工具型任务:使用 useSimpleProcessing=true,不处理对话历史,专注于单次请求\n * - 对话型任务:处理完整的对话上下文,支持多轮对话\n */\n\nimport type { GenerateRequest, ChatMessage } from '../contracts';\nimport { IChatTask } from './base';\n\n/**\n * 对话型任务的抽象基类\n * \n * @abstract\n * @description\n * 🔥 参考 BaseAgentTask 的轻量级设计,专注于核心消息构建\n * \n * 所有需要处理对话历史的任务都应该继承此类。\n * 该基类实现了标准的对话上下文构建流程,子类只需要实现系统提示词的获取。\n * \n * 重要特性:\n * - 不过滤任何历史消息,完整保留对话历史(包括 history_summary)\n * - 复杂的上下文管理由 ContextManager 层处理\n */\nexport abstract class BaseConversationalTask implements IChatTask {\n /**\n * 对话型任务默认使用完整处理链路(MessageOrchestrator)\n */\n readonly useSimpleProcessing = false;\n\n /**\n * 抽象方法:子类必须实现此方法来提供特定的系统提示词\n * \n * @abstract\n * @returns 系统提示词字符串\n */\n protected abstract getSystemPrompt(request: GenerateRequest): string;\n\n /**\n * 构建对话消息的标准流程\n * \n * @description\n * 🔥 参考 BaseAgentTask 的实现,实现了所有对话型任务都需要的标准流程:\n * 1. 添加系统提示词 - Task层拥有对系统指令的完全控制权\n * 2. 添加文档片段(如果有)\n * 3. 添加当前用户输入(仅当历史中没有用户消息时)\n * 4. 附加完整的对话历史(不做任何过滤,保留所有消息包括 history_summary)\n * \n * @param request 生成请求\n * @returns 构建好的消息数组\n */\n buildMessages(request: GenerateRequest): ChatMessage[] {\n const messages: ChatMessage[] = [];\n \n // 1. 添加系统提示词 - Task层拥有对系统指令的完全控制权\n const systemPrompt = this.getSystemPrompt(request);\n messages.push({\n role: 'system', \n content: systemPrompt, \n type: 'system_prompt'\n });\n\n // 2. 获取对话历史(不做任何过滤,完全参考 BaseAgentTask 的实现)\n const history: ChatMessage[] = request.conversationHistory || [];\n \n // 🔥 关键修复:检查历史中是否已包含用户消息(参考 BaseAgentTask 的逻辑)\n const hasUserMessageInHistory = history.some(m => m.role === 'user');\n \n // 3. 如果有文档片段,添加文档上下文\n const supplementalSections: string[] = [];\n const projectName = request.projectMetadata?.name?.trim();\n const projectDescription = request.projectMetadata?.description?.trim();\n const documentTitle = request.documentMetadata?.title?.trim();\n\n if (projectName || projectDescription) {\n const projectLines: string[] = [];\n if (projectName) {\n projectLines.push(`project name: ${projectName}`);\n }\n if (projectDescription) {\n projectLines.push(`project description: ${projectDescription}`);\n }\n supplementalSections.push(`<project_context>\\n${projectLines.join('\\n')}\\n</project_context>`);\n }\n\n if ((documentTitle || request.documentFragment?.trim())) {\n const documentLines: string[] = [];\n if (documentTitle) {\n documentLines.push(`document title: ${documentTitle}`);\n }\n if (request.documentFragment && request.documentFragment.trim()) {\n documentLines.push('document fragment:');\n documentLines.push(request.documentFragment.trim());\n }\n supplementalSections.push(`<document_context>\\n${documentLines.join('\\n')}\\n</document_context>`);\n }\n\n if (supplementalSections.length > 0) {\n messages.push({\n role: 'user',\n content: supplementalSections.join('\\n\\n'),\n type: 'document_fragment'\n });\n }\n \n // 4. 🔥 只有在历史中没有用户消息时,才添加当前用户输入\n // 这避免了在重复调用时添加重复的用户输入\n if (!hasUserMessageInHistory) {\n messages.push({\n role: 'user', \n content: request.prompt.trim(),\n type: 'user_input'\n });\n }\n \n // 5. 🔥 将完整的、时序正确的历史记录附加到新构建的消息后面(参考 BaseAgentTask)\n // 不做任何过滤,保留所有消息(包括 history_summary)\n // 如果存在 userQuote,则在附加前对“最后一条用户输入”进行内容重写:\n // <user_quote ...>引用内容</user_quote>\n // <user_query>用户问题</user_query>\n let finalHistory = history;\n\n if (request.userQuote && history.length > 0) {\n // 从后往前找到最后一条用户输入消息\n const lastUserIndex = [...history]\n .map((msg, idx) => ({ msg, idx }))\n .reverse()\n .find(entry => entry.msg.role === 'user' && (entry.msg.type === 'user_input' || !entry.msg.type))?.idx;\n\n if (lastUserIndex !== undefined) {\n const quote = request.userQuote;\n const source = (quote.source || {}) as Record<string, unknown>;\n const attrs: string[] = [];\n\n if (typeof source.doc_id === 'string') {\n attrs.push(`source_doc=\"${source.doc_id}\"`);\n }\n if (typeof source.block_id === 'string') {\n attrs.push(`block_id=\"${source.block_id}\"`);\n }\n if (typeof source.start === 'number') {\n attrs.push(`start=\"${source.start}\"`);\n }\n if (typeof source.end === 'number') {\n attrs.push(`end=\"${source.end}\"`);\n }\n\n const openTag = attrs.length > 0\n ? `<user_quote ${attrs.join(' ')}>`\n : '<user_quote>';\n\n const quoteText = quote.text.trim();\n const promptText = request.prompt.trim();\n\n const quoteBlock = `${openTag}\\n${quoteText}\\n</user_quote>`;\n const queryBlock = `<user_query>\\n${promptText}\\n</user_query>`;\n const combined = `${quoteBlock}\\n${queryBlock}`;\n\n finalHistory = history.slice();\n finalHistory[lastUserIndex] = {\n ...finalHistory[lastUserIndex],\n content: combined,\n };\n }\n }\n\n messages.push(...finalHistory);\n \n return messages;\n }\n\n /**\n * 默认的响应处理 - 保留完整内容包括思考过程\n * \n * @description\n * 对话型任务通常保留完整的响应内容,包括 <think> 标签,\n * 让用户看到AI的思考过程。子类可以覆盖此方法来实现特定的处理逻辑。\n * \n * @param rawResponse LLM返回的原始响应\n * @returns 处理后的响应文本\n */\n processResponse(rawResponse: string): string {\n // 默认保留完整的响应内容,包括思考过程\n return rawResponse;\n }\n\n /**\n * 默认的流式块处理 - 直接返回原块\n * \n * @description\n * 对话型任务通常直接返回原始流式块,保留所有内容包括思考过程。\n * 子类可以覆盖此方法来实现特定的处理逻辑。\n * \n * @param chunk 流式内容块\n * @returns 处理后的内容块\n */\n processStreamChunk(chunk: string): string {\n // 默认直接返回原块,保留所有内容包括思考过程\n return chunk;\n }\n}\n","import type { ChatMessage } from '../contracts';\nimport type { RuntimeEvent, AiMessage } from '../../../../contracts';\n\n/**\n * 类型守卫:检查是否为 history_summary 事件\n */\nfunction isHistorySummaryEvent(event: RuntimeEvent): event is RuntimeEvent & {\n type: 'history_summary';\n content: string;\n original_message_count?: number;\n compression_ratio?: number;\n generated_by?: string;\n included_old_summary?: boolean;\n replaced_message_ids?: string[];\n summary_seq?: number;\n} {\n return 'type' in event && event.type === 'history_summary';\n}\n\n/**\n * 将 RuntimeEvent 转换为 ChatMessage\n * (供 HistoryBuilder 使用,用于 Chat 模式的历史构建)\n */\nexport function convertEventToChatMessage(event: RuntimeEvent): ChatMessage | null {\n console.debug('[Chat-eventConverter] 🛈 Incoming event', {\n id: event.id,\n type: event.type,\n hasMetadata: !!event.metadata,\n metadataKeys: event.metadata ? Object.keys(event.metadata) : [],\n });\n // 处理 history_summary (使用类型守卫)\n if (isHistorySummaryEvent(event)) {\n return {\n role: 'system',\n content: event.content || '',\n type: 'history_summary',\n id: event.id,\n timestamp: event.timestamp,\n metadata: {\n messageType: 'summary',\n originalMessageCount: event.original_message_count,\n compressionRatio: event.compression_ratio,\n generatedBy: event.generated_by,\n includedOldSummary: event.included_old_summary,\n replacedMessageIds: event.replaced_message_ids,\n summarySeq: event.summary_seq,\n }\n };\n }\n \n switch (event.type) {\n case 'user_input': {\n if (!event.content) return null;\n const metadata = event.metadata ? { ...event.metadata } : undefined;\n return {\n role: 'user',\n content: String(event.content),\n type: 'user_input',\n id: event.id, // 🔥 保留 ID,用于历史净化的范围定位\n timestamp: event.timestamp,\n ...(metadata ? { metadata } : {}),\n };\n }\n \n case 'thought': {\n if (!event.content) return null;\n const metadata = event.metadata ? { ...event.metadata } : undefined;\n return {\n role: 'assistant',\n content: String(event.content),\n type: 'thought',\n id: event.id, // 🔥 保留 ID\n timestamp: event.timestamp,\n ...(metadata ? { metadata } : {}),\n };\n }\n \n case 'final_answer': {\n if (!event.content) return null;\n const metadata = event.metadata ? { ...event.metadata } : undefined;\n return {\n role: 'assistant',\n content: String(event.content),\n type: 'final_answer',\n id: event.id, // 🔥 保留 ID\n timestamp: event.timestamp,\n ...(metadata ? { metadata } : {}),\n };\n }\n \n // 🔥 Chat 模式下跳过工具调用事件(tool_call_decision / tool_process / tool_output)\n // 这些事件没有对应的 ChatMessage type,且 Chat 模式不需要展示工具调用细节\n case 'tool_call_decision':\n case 'tool_process':\n case 'tool_output':\n return null;\n\n // 🔥 UI-only 子过程过程流:即使落库也不进入 Chat 历史消息\n case 'subrun_trace':\n return null;\n \n default:\n // 对于未知类型,返回 null\n console.warn(`[Chat-eventConverter] Unsupported event type: ${event.type}`);\n return null;\n }\n}\n\n/**\n * 批量转换 RuntimeEvent 数组为 ChatMessage 数组\n * (用于 Chat 模式的历史构建)\n */\nexport function convertEventsToChatMessages(events: RuntimeEvent[]): ChatMessage[] {\n const messages: ChatMessage[] = [];\n \n for (const event of events) {\n const message = convertEventToChatMessage(event);\n if (message) {\n messages.push(message);\n console.debug('[Chat-eventConverter] ✅ Converted event', {\n id: event.id,\n type: event.type,\n metadataKeys: message.metadata ? Object.keys(message.metadata) : [],\n });\n }\n }\n \n return messages;\n}\n\n/**\n * 将 ChatMessage 转换为 AiMessage\n * (用于将 ChatMessage 转换为内部使用的 AiMessage 格式)\n */\nexport function chatMessageToAiMessage(message: ChatMessage, options?: { id?: string; timestamp?: number }): AiMessage {\n return {\n id: message.id || options?.id || `msg-${Date.now()}`,\n role: message.role,\n type: message.type || 'final_answer',\n content: message.content,\n timestamp: message.timestamp || options?.timestamp || Date.now(),\n ...(message.metadata && { metadata: message.metadata })\n } as AiMessage;\n}\n"]}
1
+ {"version":3,"sources":["../src/context-manager/shared/MessageFormatter.ts","../src/shared/checkpointMarker.ts","../src/context-manager/shared/policies/MustKeepPolicy.ts","../src/context-manager/shared/agentSpecAdapter.ts","../src/contracts/messages.ts","../src/contracts/contextPolicy.ts","../src/contracts/agentSpec.ts","../src/contracts/audit.ts","../src/contracts/events.ts","../src/contracts/constants.ts","../src/contracts/execution.ts","../src/contracts/sse.ts","../src/context-manager/shared/contextPolicyMerge.ts","../src/context-manager/shared/context-trace.ts","../src/context-manager/shared/preprocessors/base.ts","../src/context-manager/shared/preprocessors/historyPurification.ts","../src/context-manager/shared/preprocessors/fenceLifetimeManager.ts","../src/context-manager/shared/preprocessors/currentTurnMessageAssembler.ts","../src/context-manager/shared/providers/base.ts","../src/shared/TokenCalculator.ts","../src/context-manager/shared/summarization/SummarizationTrigger.ts","../src/context-manager/shared/summarization/SummarizationCandidateSelector.ts","../src/context-manager/shared/summarization/AISummaryGenerator.ts","../src/shared/ids.ts","../src/context-manager/shared/summarization/SummarizationStateUtils.ts","../src/context-manager/shared/providers/SummarizationProvider.ts","../src/context-manager/shared/providers/registry.ts","../src/context-manager/shared/fences/FenceRegistry.ts","../src/context-manager/profiles/agent/contracts.ts","../src/context-manager/profiles/agent/config.ts","../src/context-manager/profiles/agent/context/config.ts","../src/context-manager/profiles/agent/context/index.ts","../src/context-manager/profiles/agent/context/providers/base.ts","../src/context-manager/profiles/agent/context/providers/AgentCoreContextProvider.ts","../src/context-manager/profiles/agent/utils/toolInteractionGroup.ts","../src/context-manager/profiles/agent/context/providers/working-memory/ToolPairMatcher.ts","../src/context-manager/profiles/agent/utils/toolOutputSummarizer.ts","../src/context-manager/profiles/agent/context/providers/working-memory/ToolPairTruncator.ts","../src/context-manager/profiles/agent/context/providers/working-memory/ReplacementSourceTagger.ts","../src/context-manager/profiles/agent/context/providers/working-memory/HistoricalToolCandidates.ts","../src/context-manager/profiles/agent/context/providers/working-memory/PostToolCallRetention.ts","../src/context-manager/profiles/agent/context/providers/working-memory/TextConversationRetention.ts","../src/context-manager/profiles/agent/context/providers/working-memory/ToolGroupKeeper.ts","../src/context-manager/profiles/agent/context/providers/working-memory/CurrentToolInteractionRetention.ts","../src/context-manager/profiles/agent/context/providers/working-memory/HistoricalToolInteractionRetention.ts","../src/context-manager/profiles/agent/context/providers/AgentWorkingMemoryProvider.ts","../src/shared/logger.ts","../src/context-manager/profiles/agent/context/providers/CheckpointSummarizationProvider.ts","../src/context-manager/profiles/agent/context/providers/index.ts","../src/shared/defaultTokenizerPort.ts","../src/context-manager/shared/context-pipeline.ts","../src/context-manager/shared/context-manager-base.ts","../src/context-manager/shared/context-result.ts","../src/context-manager/profiles/agent/context/AgentContextManager.ts","../src/context-manager/profiles/agent/context/ConversationSession.ts","../src/context-manager/profiles/agent/orchestration/index.ts","../src/context-manager/profiles/agent/preprocessors/index.ts","../src/context-manager/profiles/agent/preprocessors/base.ts","../src/context-manager/profiles/agent/preprocessors/toolHistoryCompressor.ts","../src/context-manager/profiles/agent/preprocessors/toolReplayProtocolGuard.ts","../src/shared/llmTelemetryContext.ts","../src/runtime-kernel/system-reminder/helpers.ts","../src/runtime-kernel/system-reminder/templates.ts","../src/runtime-kernel/system-reminder/triggers.ts","../src/runtime-kernel/system-reminder/registry.ts","../src/runtime-kernel/events/agentEvents.ts","../src/runtime-kernel/events/provider-sidecar.ts","../src/runtime-kernel/events/agent-to-runtime.ts","../src/runtime-kernel/events/runtime-to-ai-message.ts","../src/runtime-kernel/events/sse-projection.ts","../src/runtime-kernel/events/eventMappers.ts","../src/runtime-kernel/events/index.ts","../src/runtime-kernel/events/eventGovernance.ts","../src/runtime-kernel/audit/consoleAudit.ts","../src/context-manager/profiles/agent/utils/eventConverter.ts","../src/context-manager/profiles/agent/orchestration/AgentMessageOrchestrator.ts","../src/context-manager/profiles/agent/tasks/index.ts","../src/context-manager/profiles/agent/tasks/BaseAgentTask.ts","../src/context-manager/profiles/agent/tools/index.ts","../src/context-manager/profiles/agent/tools/ToolManager.ts","../src/context-manager/profiles/agent/utils/index.ts","../src/context-manager/profiles/chat/context/config.ts","../src/context-manager/profiles/chat/context/providers/base.ts","../src/context-manager/profiles/chat/context/providers/CoreContextProvider.ts","../src/context-manager/profiles/chat/context/providers/WorkingMemoryProvider.ts","../src/context-manager/profiles/chat/context/providers/index.ts","../src/context-manager/profiles/chat/utils/messageAdapters.ts","../src/context-manager/profiles/chat/context/ContextManager.ts","../src/context-manager/profiles/chat/preprocessors/base.ts","../src/context-manager/profiles/chat/preprocessors/userQuoteLifetime.ts","../src/context-manager/profiles/chat/preprocessors/toolHistoryFilter.ts","../src/context-manager/profiles/chat/preprocessors/index.ts","../src/context-manager/profiles/chat/request-adapters.ts","../src/context-manager/profiles/chat/orchestration/MessageOrchestrator.ts","../src/context-manager/profiles/chat/tasks/BaseConversationalTask.ts","../src/context-manager/profiles/chat/utils/eventConverter.ts"],"names":["z","JsonRecord","get_encoding","normalizeNonNegativeInteger","AgentBuildPhase","AgentMessagePriority","BaseContextProvider","ContextProviderRegistry","groupIndex","group","item","markWorkingMemory","CHECKPOINT_TOOL_NAME","summarizationThreshold","summarizationTokenThreshold","BasePreprocessor","processedMessages","AsyncLocalStorage","isRecord","isHistorySummaryEvent","findLastIndex","tools_exports","PreprocessorRegistry","PreprocessorPipeline","readOptionalStringProperty"],"mappings":"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","file":"context-manager.cjs","sourcesContent":["import type { AiMessage } from '../../contracts';\nimport type { FenceRegistry } from './fences';\nimport type { ChatMessage } from './contracts/chatLineMessage';\n\nexport interface MessageFormatOptions {\n nativeTools?: boolean;\n mode?: 'agent' | 'chat';\n fenceRegistry?: FenceRegistry;\n}\n\nexport interface MessageFormatterOptions {\n fenceRegistry?: FenceRegistry;\n}\n\nexport type NativeToolCallingMessage =\n | { role: 'system' | 'user'; content: string }\n | { role: 'assistant'; content: string; reasoning_details?: unknown[]; provider_empty_replay_field?: true }\n | { role: 'assistant'; content: string | null; tool_calls: unknown[]; reasoning_details?: unknown[]; provider_empty_replay_field?: true }\n | { role: 'tool'; tool_call_id: string; content: string };\n\nclass MessageFormatter {\n private readonly fenceRegistry?: FenceRegistry;\n\n constructor(options: MessageFormatterOptions = {}) {\n this.fenceRegistry = options.fenceRegistry;\n }\n\n public format(\n messages: AiMessage[],\n options: { nativeTools: true; mode?: 'agent' | 'chat' },\n ): NativeToolCallingMessage[];\n public format(\n messages: AiMessage[],\n options?: { nativeTools?: false; mode?: 'agent' | 'chat' },\n ): ChatMessage[];\n public format(messages: AiMessage[], options: MessageFormatOptions = {}): (ChatMessage | NativeToolCallingMessage)[] {\n const processedMessages = options.mode === 'agent' ? messages : this.mergeThoughtAndAnswer(messages);\n return processedMessages\n .map((msg) => this.formatSingleMessage(msg, options))\n .filter((msg): msg is ChatMessage | NativeToolCallingMessage => msg !== null);\n }\n\n private mergeThoughtAndAnswer(messages: AiMessage[]): AiMessage[] {\n const processedMessages: AiMessage[] = [];\n for (let i = 0; i < messages.length; i++) {\n const currentMsg = messages[i];\n const nextMsg = messages[i + 1];\n if (this.shouldMergeWithNext(currentMsg, nextMsg)) {\n processedMessages.push(this.performMerge(currentMsg, nextMsg));\n i++;\n continue;\n }\n processedMessages.push(currentMsg);\n }\n return processedMessages;\n }\n\n private shouldMergeWithNext(current: AiMessage, next: AiMessage | undefined): boolean {\n if (!next) {\n return false;\n }\n return current.role === 'assistant' && next.role === 'assistant' && current.type === 'thought' && next.type === 'final_answer';\n }\n\n private performMerge(thought: AiMessage, answer: AiMessage): AiMessage {\n return {\n id: answer.id,\n role: 'assistant',\n type: 'final_answer',\n content: `<think>${thought.content}</think>${answer.content}`,\n timestamp: answer.timestamp,\n metadata: {\n ...answer.metadata,\n ...thought.metadata,\n isMergedMessage: true,\n originalIds: [thought.id, answer.id],\n },\n };\n }\n\n private formatSingleMessage(\n message: AiMessage,\n options: MessageFormatOptions,\n ): ChatMessage | NativeToolCallingMessage | null {\n const { role, type, content, metadata } = message;\n const fenceRegistry = options.fenceRegistry ?? this.fenceRegistry;\n\n if (options.nativeTools) {\n if (role === 'assistant' && type === 'tool_calls' && metadata?.tool_calls) {\n const toolCallsRaw = metadata.tool_calls;\n const toolCalls = Array.isArray(toolCallsRaw) ? toolCallsRaw : [];\n const reasoningDetailsRaw = metadata.reasoning_details;\n const reasoningDetails = Array.isArray(reasoningDetailsRaw) ? reasoningDetailsRaw : undefined;\n const shouldUseProviderEmptyReplayField = metadata.provider_empty_replay_field === true;\n return {\n role: 'assistant',\n content: content || null,\n tool_calls: toolCalls,\n ...(reasoningDetails && reasoningDetails.length > 0 ? { reasoning_details: reasoningDetails } : {}),\n ...(shouldUseProviderEmptyReplayField ? { provider_empty_replay_field: true as const } : {}),\n };\n }\n\n if (role === 'assistant' && type === 'final_answer') {\n const reasoningDetailsRaw = metadata?.reasoning_details;\n const reasoningDetails = Array.isArray(reasoningDetailsRaw) ? reasoningDetailsRaw : undefined;\n const shouldUseProviderEmptyReplayField = metadata?.provider_empty_replay_field === true;\n return {\n role: 'assistant',\n content,\n ...(reasoningDetails && reasoningDetails.length > 0 ? { reasoning_details: reasoningDetails } : {}),\n ...(shouldUseProviderEmptyReplayField ? { provider_empty_replay_field: true as const } : {}),\n };\n }\n\n if (role === 'tool' && type === 'tool_output' && metadata?.tool_call_id) {\n return {\n role: 'tool',\n tool_call_id: metadata.tool_call_id,\n content,\n };\n }\n }\n\n if (type === 'tool_output') {\n return null;\n }\n if (role !== 'user' && role !== 'assistant' && role !== 'system') {\n return null;\n }\n\n switch (type) {\n case 'system_prompt':\n case 'user_input':\n case 'final_answer':\n return { role, content };\n case 'context_injection': {\n const fenceKind = metadata?.fenceKind;\n if (!fenceKind) {\n console.warn('[MessageFormatter] context_injection missing metadata.fenceKind, skipping.');\n return null;\n }\n const descriptor = fenceRegistry?.get(fenceKind);\n if (!descriptor) {\n console.warn(`[MessageFormatter] Fence kind \"${fenceKind}\" is not registered, skipping.`);\n return null;\n }\n return {\n role: descriptor.llmRole,\n content: descriptor.formatter(content, metadata?.fenceAttrs ?? {}),\n };\n }\n case 'history_summary':\n return { role: 'system', content };\n case 'thought':\n return { role, content: content.includes('<think>') ? content : `<think>${content}</think>` };\n case 'tool_calls': {\n const toolCalls = metadata?.tool_calls;\n if (Array.isArray(toolCalls) && toolCalls.length > 0) {\n const firstToolCall = toolCalls[0];\n const toolName = firstToolCall.function?.name;\n const toolArgs = firstToolCall.function?.arguments;\n if (toolName && toolArgs) {\n const call = {\n name: toolName,\n arguments: typeof toolArgs === 'string' ? JSON.parse(toolArgs) : toolArgs,\n };\n return { role, content: `<tool_code>${JSON.stringify(call)}</tool_code>` };\n }\n }\n return null;\n }\n case 'tool_code': {\n const { tool_name, args } = metadata || {};\n if (tool_name && args) {\n return { role, content: `<tool_code>${JSON.stringify({ name: tool_name, arguments: args })}</tool_code>` };\n }\n return null;\n }\n case 'task_request':\n case 'task_completion':\n return { role, content };\n default:\n console.warn(`[MessageFormatter] Unhandled message type for chat history: \"${type}\", skipping.`);\n return null;\n }\n }\n\n}\n\nexport const messageFormatter = new MessageFormatter();\nexport function createMessageFormatter(options: MessageFormatterOptions = {}): MessageFormatter {\n return new MessageFormatter(options);\n}\nexport function formatAgentLlmMessages(\n messages: AiMessage[],\n options: Pick<MessageFormatOptions, 'fenceRegistry'> = {},\n): NativeToolCallingMessage[] {\n return messageFormatter.format(messages, { nativeTools: true, mode: 'agent', ...options });\n}\nexport type LlmMessage = ChatMessage | NativeToolCallingMessage;\n","/**\n * @file shared/checkpointMarker.ts\n * @description 上下文 checkpoint 的跨模块共享协议常量。\n */\n\nexport const CHECKPOINT_MARKER_TYPE = 'context_checkpoint' as const;\nexport const DEFAULT_CONTEXT_CHECKPOINT_TOOL_NAME = CHECKPOINT_MARKER_TYPE;\n","import type { AiMessage } from '../../../contracts';\n\nexport interface MustKeepTruncationRule {\n messageType?: AiMessage['type'] | string;\n metadataFragmentType?: string;\n fenceKind?: string;\n maxBudgetFraction: number;\n strategyName: string;\n}\n\nexport interface MustKeepPolicy {\n alwaysKeepTypes: Array<AiMessage['type'] | string>;\n alwaysKeepFenceKinds: string[];\n truncationRules: MustKeepTruncationRule[];\n}\n\nexport const DEFAULT_MUST_KEEP_POLICY: MustKeepPolicy = {\n alwaysKeepTypes: ['system_prompt', 'user_input'],\n alwaysKeepFenceKinds: [],\n truncationRules: [],\n};\n\nexport function findMatchingTruncationRule(\n message: AiMessage,\n policy: MustKeepPolicy,\n): MustKeepTruncationRule | undefined {\n return policy.truncationRules.find((rule) => {\n if (rule.messageType !== undefined && rule.messageType !== message.type) {\n return false;\n }\n if (rule.metadataFragmentType !== undefined && message.metadata?.fragmentType !== rule.metadataFragmentType) {\n return false;\n }\n if (rule.fenceKind !== undefined && message.metadata?.fenceKind !== rule.fenceKind) {\n return false;\n }\n return true;\n });\n}\n","import type {\n AgentSpec,\n AgentSpecCheckpointPolicy,\n AgentSpecContextPolicy,\n AgentSpecContextTracePolicy,\n AgentSpecProviderReplayPolicy,\n AgentSpecSummarizationPolicy,\n AgentSpecSystemReminderPolicy,\n AgentSpecToolOutputPolicy,\n} from '../../contracts';\nimport {\n DEFAULT_MUST_KEEP_POLICY,\n type MustKeepPolicy,\n} from './policies';\n\nexport interface AgentContextBuilderConfigOverrides {\n DEFAULT_MAX_TOKENS?: number;\n RESERVED_FOR_RESPONSE?: number;\n WORKING_MEMORY_BUDGET_PERCENTAGE?: number;\n SUMMARIZATION_TRIGGER_THRESHOLD?: number;\n SUMMARY_BUDGET_PERCENTAGE?: number;\n SUMMARY_OLDEST_MESSAGES_PERCENTAGE?: number;\n MAX_THOUGHTS_TO_KEEP?: number;\n TOOL_PAIRING_SEARCH_RANGE?: number;\n MAX_TOOL_PAIR_TOKENS?: number;\n MAX_TOOL_OUTPUT_SUMMARY_TOKENS?: number;\n MIN_TOOL_INTERACTIONS_TO_KEEP?: number;\n MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP?: number;\n MAX_TOOL_INTERACTION_GROUPS_TO_KEEP?: number;\n AVG_CHARS_PER_TOKEN?: number;\n TOOL_CALL_OVERHEAD_TOKENS?: number;\n TOKEN_ENCODING_NAME?: string;\n}\n\nexport interface AgentSpecPreprocessorOptions {\n toolHistory?: {\n strategy?: 'per-pair' | 'per-run' | 'none';\n retentionMode?: 'drop' | 'compress';\n keepLatestToolPairs?: number;\n keepLatestRuns?: number;\n maxInteractionGroups?: number;\n overflowStrategy?: 'keep-latest' | 'fail-fast';\n maxPairTokens?: number;\n maxOutputSummaryTokens?: number;\n };\n providerReplay?: AgentSpecProviderReplayPolicy;\n}\n\nexport interface AgentSpecProviderOptions {\n mustKeep?: MustKeepPolicy;\n checkpoint?: AgentSpecCheckpointPolicy;\n summarization?: Pick<AgentSpecSummarizationPolicy, 'agentId' | 'failureBehavior'>;\n contextTrace?: AgentSpecContextTracePolicy;\n}\n\nexport interface AgentSpecExecutionOptions {\n toolOutput?: AgentSpecToolOutputPolicy;\n}\n\nexport interface AgentSpecRuntimeOptions {\n contextBuilderConfig: AgentContextBuilderConfigOverrides;\n preprocessorOptions: AgentSpecPreprocessorOptions;\n providerOptions: AgentSpecProviderOptions;\n executionOptions: AgentSpecExecutionOptions;\n systemReminder?: AgentSpecSystemReminderPolicy;\n}\n\n/**\n * 把 AgentSpec 的上下文策略转换成 AgentContextManager 能识别的配置覆盖。\n * 注意:profileId 只用于宿主路由,这里不消费。\n */\nexport function agentSpecToContextBuilderConfig(\n spec: AgentSpec,\n): AgentContextBuilderConfigOverrides {\n return contextPolicyToContextBuilderConfig(spec.contextPolicy);\n}\n\nexport function contextPolicyToContextBuilderConfig(\n policy: AgentSpecContextPolicy,\n): AgentContextBuilderConfigOverrides {\n const config: AgentContextBuilderConfigOverrides = {};\n const {\n budget,\n summarization,\n toolHistory,\n workingMemory,\n reasoningRetention,\n tokenEstimation,\n } = policy;\n\n if (budget?.maxTokens !== undefined) {\n config.DEFAULT_MAX_TOKENS = budget.maxTokens;\n }\n if (budget?.reservedForResponse !== undefined) {\n config.RESERVED_FOR_RESPONSE = budget.reservedForResponse;\n }\n if (budget?.workingMemoryBudgetPercentage !== undefined) {\n config.WORKING_MEMORY_BUDGET_PERCENTAGE = budget.workingMemoryBudgetPercentage;\n }\n if (summarization?.triggerThreshold !== undefined) {\n config.SUMMARIZATION_TRIGGER_THRESHOLD = summarization.triggerThreshold;\n }\n if (summarization?.budgetPercentage !== undefined) {\n config.SUMMARY_BUDGET_PERCENTAGE = summarization.budgetPercentage;\n }\n if (summarization?.oldestMessagesPercentage !== undefined) {\n config.SUMMARY_OLDEST_MESSAGES_PERCENTAGE = summarization.oldestMessagesPercentage;\n }\n if (toolHistory?.maxPairTokens !== undefined) {\n config.MAX_TOOL_PAIR_TOKENS = toolHistory.maxPairTokens;\n }\n if (toolHistory?.maxOutputSummaryTokens !== undefined) {\n config.MAX_TOOL_OUTPUT_SUMMARY_TOKENS = toolHistory.maxOutputSummaryTokens;\n }\n if (toolHistory?.maxInteractionGroups !== undefined) {\n config.MAX_TOOL_INTERACTION_GROUPS_TO_KEEP = toolHistory.maxInteractionGroups;\n }\n if (workingMemory?.maxRecentToolInteractions !== undefined) {\n config.MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP = workingMemory.maxRecentToolInteractions;\n }\n if (workingMemory?.minToolInteractionsToKeep !== undefined) {\n config.MIN_TOOL_INTERACTIONS_TO_KEEP = workingMemory.minToolInteractionsToKeep;\n }\n if (workingMemory?.toolPairingSearchRange !== undefined) {\n config.TOOL_PAIRING_SEARCH_RANGE = workingMemory.toolPairingSearchRange;\n }\n if (reasoningRetention?.keepLatestThoughts !== undefined) {\n config.MAX_THOUGHTS_TO_KEEP = reasoningRetention.keepLatestThoughts;\n }\n if (tokenEstimation?.avgCharsPerToken !== undefined) {\n config.AVG_CHARS_PER_TOKEN = tokenEstimation.avgCharsPerToken;\n }\n if (tokenEstimation?.toolCallOverhead !== undefined) {\n config.TOOL_CALL_OVERHEAD_TOKENS = tokenEstimation.toolCallOverhead;\n }\n if (tokenEstimation?.encoding !== undefined) {\n config.TOKEN_ENCODING_NAME = tokenEstimation.encoding;\n }\n\n return config;\n}\n\n/**\n * 把 contextPolicy.toolHistory 原样转成交给 agent preprocessor registry 的配置。\n */\nexport function contextPolicyToPreprocessorOptions(\n policy: AgentSpecContextPolicy | undefined,\n): AgentSpecPreprocessorOptions {\n const options: AgentSpecPreprocessorOptions = {};\n\n if (policy?.toolHistory) {\n options.toolHistory = {\n ...policy.toolHistory,\n };\n }\n\n const providerReplay = pickDefinedProviderReplayOptions(policy?.providerReplay);\n if (providerReplay) {\n options.providerReplay = providerReplay;\n }\n\n return options;\n}\n\n/**\n * 提供给后续 provider registry 重建链路使用。\n * F1.2 只做映射,不在这里创建 provider,避免 shared 层反向依赖 agent profile 实现。\n */\nexport function contextPolicyToProviderOptions(\n policy: AgentSpecContextPolicy | undefined,\n): AgentSpecProviderOptions {\n if (!policy) {\n return {};\n }\n\n return {\n mustKeep: contextPolicyToMustKeepPolicy(policy),\n checkpoint: policy.checkpoint,\n summarization: pickDefinedSummarizationOptions(policy.summarization),\n contextTrace: policy.contextTrace,\n };\n}\n\nexport function contextPolicyToMustKeepPolicy(\n policy: AgentSpecContextPolicy | undefined,\n): MustKeepPolicy | undefined {\n if (!policy?.mustKeep) {\n return undefined;\n }\n\n return {\n alwaysKeepTypes: policy.mustKeep.alwaysKeepTypes ?? DEFAULT_MUST_KEEP_POLICY.alwaysKeepTypes,\n alwaysKeepFenceKinds: policy.mustKeep.alwaysKeepFenceKinds ?? DEFAULT_MUST_KEEP_POLICY.alwaysKeepFenceKinds,\n truncationRules: policy.mustKeep.truncationRules ?? DEFAULT_MUST_KEEP_POLICY.truncationRules,\n };\n}\n\nexport function contextPolicyToSystemReminderOptions(\n policy: AgentSpecContextPolicy | undefined,\n): AgentSpecSystemReminderPolicy | undefined {\n return policy?.systemReminder;\n}\n\nexport function contextPolicyToExecutionOptions(\n policy: AgentSpecContextPolicy | undefined,\n): AgentSpecExecutionOptions {\n if (!policy?.toolOutput) {\n return {};\n }\n\n return {\n toolOutput: {\n ...policy.toolOutput,\n observationGovernance: policy.toolOutput.observationGovernance\n ? { ...policy.toolOutput.observationGovernance }\n : undefined,\n },\n };\n}\n\nexport function agentSpecToRuntimeOptions(spec: AgentSpec): AgentSpecRuntimeOptions {\n return contextPolicyToRuntimeOptions(spec.contextPolicy);\n}\n\nexport function contextPolicyToRuntimeOptions(\n policy: AgentSpecContextPolicy,\n): AgentSpecRuntimeOptions {\n return {\n contextBuilderConfig: contextPolicyToContextBuilderConfig(policy),\n preprocessorOptions: contextPolicyToPreprocessorOptions(policy),\n providerOptions: contextPolicyToProviderOptions(policy),\n executionOptions: contextPolicyToExecutionOptions(policy),\n systemReminder: contextPolicyToSystemReminderOptions(policy),\n };\n}\n\nfunction pickDefinedProviderReplayOptions(\n providerReplay: AgentSpecProviderReplayPolicy | undefined,\n): AgentSpecPreprocessorOptions['providerReplay'] {\n if (!providerReplay) {\n return undefined;\n }\n const result: AgentSpecProviderReplayPolicy = {};\n if (providerReplay.provider !== undefined) {\n result.provider = providerReplay.provider;\n }\n if (providerReplay.requiresReasoningDetailsForToolReplay !== undefined) {\n result.requiresReasoningDetailsForToolReplay = providerReplay.requiresReasoningDetailsForToolReplay;\n }\n if (providerReplay.missingSidecarBehavior !== undefined) {\n result.missingSidecarBehavior = providerReplay.missingSidecarBehavior;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction pickDefinedSummarizationOptions(\n summarization: AgentSpecSummarizationPolicy | undefined,\n): AgentSpecProviderOptions['summarization'] {\n if (!summarization) {\n return undefined;\n }\n const result: AgentSpecProviderOptions['summarization'] = {};\n if (summarization.agentId !== undefined) {\n result.agentId = summarization.agentId;\n }\n if (summarization.failureBehavior !== undefined) {\n result.failureBehavior = summarization.failureBehavior;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n","import { z } from 'zod';\n\nexport const ProviderReasoningDetails = z.array(z.unknown());\nexport type ProviderReasoningDetails = z.infer<typeof ProviderReasoningDetails>;\n\nexport const ToolCallExtraContent = z.object({\n google: z.object({\n thought_signature: z.string().optional(),\n }).passthrough().optional(),\n}).passthrough();\n\nexport type ToolCallExtraContent = z.infer<typeof ToolCallExtraContent>;\n\nexport const ToolCallWire = z.object({\n id: z.string(),\n type: z.literal('function'),\n function: z.object({\n name: z.string(),\n arguments: z.string(),\n }),\n extra_content: ToolCallExtraContent.optional(),\n}).passthrough();\n\nexport type ToolCallWire = z.infer<typeof ToolCallWire>;\n\nexport const HistorySummaryMeta = z.object({\n messageType: z.literal('summary'),\n originalMessageCount: z.number().int().positive(),\n compressionRatio: z.number().min(0).max(1).optional(),\n includedOldSummary: z.boolean(),\n replacedMessageIds: z.array(z.string()),\n summarySeq: z.number().int().nonnegative(),\n});\n\nexport type HistorySummaryMeta = z.infer<typeof HistorySummaryMeta>;\n\nexport const ToolCallsMeta = z.object({\n tool_calls: z.array(ToolCallWire),\n reasoning_details: ProviderReasoningDetails.optional(),\n});\n\nexport type ToolCallsMeta = z.infer<typeof ToolCallsMeta>;\n\nexport const ToolOutputMeta = z.object({\n tool_name: z.string(),\n args: z.record(z.unknown()).optional(),\n tool_call_id: z.string(),\n});\n\nexport type ToolOutputMeta = z.infer<typeof ToolOutputMeta>;\n\nexport const ImageInfoMeta = z.object({\n url: z.string().optional(),\n width: z.number().int().positive().optional(),\n height: z.number().int().positive().optional(),\n format: z.string().optional(),\n size: z.number().int().nonnegative().optional(),\n});\n\nexport type ImageInfoMeta = z.infer<typeof ImageInfoMeta>;\n\nexport const TaskTrackingMeta = z.object({\n taskType: z.string().optional(),\n taskId: z.string().optional(),\n taskStatus: z.enum(['requested', 'in_progress', 'completed', 'failed']).optional(),\n taskTrackingInfo: z.object({\n startTime: z.number().optional(),\n endTime: z.number().optional(),\n duration: z.number().optional(),\n retryCount: z.number().int().nonnegative().optional(),\n lastError: z.string().optional(),\n }).optional(),\n});\n\nexport type TaskTrackingMeta = z.infer<typeof TaskTrackingMeta>;\n\nexport const PersistentMetadata = z.object({\n messageType: z.literal('summary').optional(),\n originalMessageCount: z.number().int().positive().optional(),\n compressionRatio: z.number().min(0).max(1).optional(),\n includedOldSummary: z.boolean().optional(),\n replacedMessageIds: z.array(z.string()).optional(),\n summarySeq: z.number().int().nonnegative().optional(),\n tool_calls: z.array(ToolCallWire).optional(),\n reasoning_details: ProviderReasoningDetails.optional(),\n tool_name: z.string().optional(),\n args: z.record(z.unknown()).optional(),\n tool_call_id: z.string().optional(),\n raw_output: z.string().optional(),\n image_info: ImageInfoMeta.optional(),\n taskType: z.string().optional(),\n taskId: z.string().optional(),\n taskStatus: z.enum(['requested', 'in_progress', 'completed', 'failed']).optional(),\n taskTrackingInfo: z.object({\n startTime: z.number().optional(),\n endTime: z.number().optional(),\n duration: z.number().optional(),\n retryCount: z.number().int().nonnegative().optional(),\n lastError: z.string().optional(),\n }).optional(),\n fenceKind: z.string().optional(),\n fenceAttrs: z.record(z.unknown()).optional(),\n fencePlacement: z.string().optional(),\n}).passthrough();\n\nexport type PersistentMetadata = z.infer<typeof PersistentMetadata>;\n\nconst BaseMessage = z.object({\n id: z.string(),\n content: z.string(),\n timestamp: z.number().int().nonnegative(),\n metadata: PersistentMetadata.optional(),\n});\n\nexport const SystemMessage = BaseMessage.extend({\n role: z.literal('system'),\n type: z.enum(['system_prompt', 'history_summary', 'context_injection']),\n});\n\nexport type SystemMessage = z.infer<typeof SystemMessage>;\n\nexport const UserMessage = BaseMessage.extend({\n role: z.literal('user'),\n type: z.enum([\n 'user_input',\n 'context_injection',\n 'context_before',\n 'context_after',\n 'document_fragment',\n 'task_request',\n 'image',\n ]),\n});\n\nexport type UserMessage = z.infer<typeof UserMessage>;\n\nexport const AssistantMessage = BaseMessage.extend({\n role: z.literal('assistant'),\n type: z.enum([\n 'thought',\n 'final_answer',\n 'tool_code',\n 'tool_calls',\n 'task_completion',\n ]),\n});\n\nexport type AssistantMessage = z.infer<typeof AssistantMessage>;\n\nexport const ToolMessage = BaseMessage.extend({\n role: z.literal('tool'),\n type: z.literal('tool_output'),\n});\n\nexport type ToolMessage = z.infer<typeof ToolMessage>;\n\nexport const AiMessage = z.discriminatedUnion('role', [\n SystemMessage,\n UserMessage,\n AssistantMessage,\n ToolMessage,\n]);\n\nexport type AiMessage = z.infer<typeof AiMessage>;\n\nexport function createSystemMessage(\n type: SystemMessage['type'],\n content: string,\n metadata?: PersistentMetadata,\n): SystemMessage {\n return {\n id: crypto.randomUUID(),\n role: 'system',\n type,\n content,\n timestamp: Date.now(),\n metadata,\n };\n}\n\nexport function createUserMessage(\n type: UserMessage['type'],\n content: string,\n metadata?: PersistentMetadata,\n): UserMessage {\n return {\n id: crypto.randomUUID(),\n role: 'user',\n type,\n content,\n timestamp: Date.now(),\n metadata,\n };\n}\n\nexport function createAssistantMessage(\n type: AssistantMessage['type'],\n content: string,\n metadata?: PersistentMetadata,\n): AssistantMessage {\n return {\n id: crypto.randomUUID(),\n role: 'assistant',\n type,\n content,\n timestamp: Date.now(),\n metadata,\n };\n}\n\nexport function createToolMessage(\n content: string,\n toolCallId: string,\n toolName: string,\n metadata?: PersistentMetadata,\n): ToolMessage {\n return {\n id: crypto.randomUUID(),\n role: 'tool',\n type: 'tool_output',\n content,\n timestamp: Date.now(),\n metadata: {\n ...metadata,\n tool_call_id: toolCallId,\n tool_name: toolName,\n },\n };\n}\n\nexport function createHistorySummaryMessage(\n content: string,\n summaryMeta: HistorySummaryMeta,\n): SystemMessage {\n return {\n id: crypto.randomUUID(),\n role: 'system',\n type: 'history_summary',\n content,\n timestamp: Date.now(),\n metadata: summaryMeta,\n };\n}\n\nexport function validateAiMessage(data: unknown): z.SafeParseReturnType<unknown, AiMessage> {\n return AiMessage.safeParse(data);\n}\n\nexport function validateHistorySummaryMeta(\n data: unknown,\n): z.SafeParseReturnType<unknown, HistorySummaryMeta> {\n return HistorySummaryMeta.safeParse(data);\n}\n\nexport function isSystemMessage(message: AiMessage): message is SystemMessage {\n return message.role === 'system';\n}\n\nexport function isUserMessage(message: AiMessage): message is UserMessage {\n return message.role === 'user';\n}\n\nexport function isAssistantMessage(message: AiMessage): message is AssistantMessage {\n return message.role === 'assistant';\n}\n\nexport function isToolMessage(message: AiMessage): message is ToolMessage {\n return message.role === 'tool';\n}\n\nexport function isHistorySummaryMessage(message: AiMessage): message is SystemMessage {\n return message.role === 'system'\n && message.type === 'history_summary'\n && message.metadata?.messageType === 'summary';\n}\n\nexport function hasToolCalls(message: AiMessage): boolean {\n return message.role === 'assistant'\n && Array.isArray(message.metadata?.tool_calls)\n && message.metadata.tool_calls.length > 0;\n}\n","import { z } from 'zod';\n\ntype SerializableJsonValue =\n | string\n | number\n | boolean\n | null\n | SerializableJsonValue[]\n | { [key: string]: SerializableJsonValue };\n\nconst SerializableJsonValueSchema: z.ZodType<SerializableJsonValue> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(SerializableJsonValueSchema),\n z.record(z.string(), SerializableJsonValueSchema),\n ]),\n);\n\nconst SerializableJsonRecord = z.record(z.string(), SerializableJsonValueSchema);\n\nexport const AgentSpecMessageType = z.enum([\n 'system_prompt',\n 'history_summary',\n 'context_injection',\n 'user_input',\n 'context_before',\n 'context_after',\n 'document_fragment',\n 'task_request',\n 'image',\n 'thought',\n 'final_answer',\n 'tool_code',\n 'tool_calls',\n 'task_completion',\n 'tool_output',\n]);\nexport type AgentSpecMessageType = z.infer<typeof AgentSpecMessageType>;\n\nexport const AgentSpecBudgetPolicy = z.object({\n maxTokens: z.number().int().positive().optional(),\n reservedForResponse: z.number().int().nonnegative().optional(),\n workingMemoryBudgetPercentage: z.number().min(0).max(1).optional(),\n});\nexport type AgentSpecBudgetPolicy = z.infer<typeof AgentSpecBudgetPolicy>;\n\nexport const AgentSpecToolHistoryPolicy = z.object({\n strategy: z.enum(['per-pair', 'per-run', 'none']).optional(),\n retentionMode: z.enum(['drop', 'compress']).optional(),\n keepLatestToolPairs: z.number().int().nonnegative().optional(),\n keepLatestRuns: z.number().int().nonnegative().optional(),\n maxInteractionGroups: z.number().int().nonnegative().optional(),\n overflowStrategy: z.enum(['keep-latest', 'fail-fast']).optional(),\n maxPairTokens: z.number().int().nonnegative().optional(),\n maxOutputSummaryTokens: z.number().int().nonnegative().optional(),\n});\nexport type AgentSpecToolHistoryPolicy = z.infer<typeof AgentSpecToolHistoryPolicy>;\n\nexport const AgentSpecToolObservationGovernancePolicy = z.object({\n enabled: z.boolean().optional(),\n maxChars: z.number().int().positive().optional(),\n maxLines: z.number().int().positive().optional(),\n});\nexport type AgentSpecToolObservationGovernancePolicy = z.infer<typeof AgentSpecToolObservationGovernancePolicy>;\n\nexport const AgentSpecToolOutputPolicy = z.object({\n observationGovernance: AgentSpecToolObservationGovernancePolicy.optional(),\n});\nexport type AgentSpecToolOutputPolicy = z.infer<typeof AgentSpecToolOutputPolicy>;\n\nexport const AgentSpecProviderReplayPolicy = z.object({\n provider: z.string().min(1).optional(),\n requiresReasoningDetailsForToolReplay: z.boolean().optional(),\n missingSidecarBehavior: z.enum(['allow', 'degrade_to_text', 'provider_empty_replay_field']).optional(),\n});\nexport type AgentSpecProviderReplayPolicy = z.infer<typeof AgentSpecProviderReplayPolicy>;\n\nexport const AgentSpecSummarizationPolicy = z.object({\n triggerThreshold: z.number().min(0).max(1).optional(),\n budgetPercentage: z.number().min(0).max(1).optional(),\n oldestMessagesPercentage: z.number().min(0).max(1).optional(),\n agentId: z.string().min(1).optional(),\n failureBehavior: z.enum(['fail-fast', 'continue-if-within-budget']).optional(),\n});\nexport type AgentSpecSummarizationPolicy = z.infer<typeof AgentSpecSummarizationPolicy>;\n\nexport const AgentSpecMustKeepTruncationRule = z.object({\n fenceKind: z.string().min(1),\n maxBudgetFraction: z.number().gt(0).max(1),\n strategyName: z.string().min(1),\n});\nexport type AgentSpecMustKeepTruncationRule = z.infer<typeof AgentSpecMustKeepTruncationRule>;\n\nexport const AgentSpecMustKeepPolicy = z.object({\n alwaysKeepTypes: z.array(AgentSpecMessageType).optional(),\n alwaysKeepFenceKinds: z.array(z.string().min(1)).optional(),\n truncationRules: z.array(AgentSpecMustKeepTruncationRule).optional(),\n});\nexport type AgentSpecMustKeepPolicy = z.infer<typeof AgentSpecMustKeepPolicy>;\n\nexport const AgentSpecWorkingMemoryPolicy = z.object({\n maxRecentToolInteractions: z.number().int().nonnegative().optional(),\n minToolInteractionsToKeep: z.number().int().nonnegative().optional(),\n toolPairingSearchRange: z.number().int().positive().optional(),\n});\nexport type AgentSpecWorkingMemoryPolicy = z.infer<typeof AgentSpecWorkingMemoryPolicy>;\n\nexport const AgentSpecCheckpointPolicy = z.object({\n keepPairsBefore: z.number().int().nonnegative().optional(),\n triggerToolName: z.string().min(1).optional(),\n});\nexport type AgentSpecCheckpointPolicy = z.infer<typeof AgentSpecCheckpointPolicy>;\n\nexport const AgentSpecReasoningRetentionPolicy = z.object({\n keepLatestThoughts: z.number().int().nonnegative().optional(),\n});\nexport type AgentSpecReasoningRetentionPolicy = z.infer<typeof AgentSpecReasoningRetentionPolicy>;\n\nexport const AgentSpecTokenEstimationPolicy = z.object({\n encoding: z.string().min(1).optional(),\n avgCharsPerToken: z.number().positive().optional(),\n toolCallOverhead: z.number().int().nonnegative().optional(),\n});\nexport type AgentSpecTokenEstimationPolicy = z.infer<typeof AgentSpecTokenEstimationPolicy>;\n\nexport const SYSTEM_REMINDER_BUILTIN_TRIGGER_KINDS = [\n 'phase-equals',\n 'remaining-steps-leq',\n 'step-count-modulo',\n 'tool-call-streak',\n 'budget-warning',\n 'agent-has-tool',\n] as const;\n\nexport const AgentSpecSystemReminderTrigger = z.object({\n kind: z.string().min(1),\n threshold: z.number().nonnegative().optional(),\n value: z.union([z.string(), z.number(), z.boolean()]).optional(),\n moduloStep: z.boolean().optional(),\n toolName: z.string().min(1).optional(),\n period: z.number().int().positive().optional(),\n minStep: z.number().int().nonnegative().optional(),\n ratio: z.number().min(0).max(1).optional(),\n config: SerializableJsonRecord.optional(),\n});\nexport type AgentSpecSystemReminderTrigger = z.infer<typeof AgentSpecSystemReminderTrigger>;\n\nexport const AgentSpecSystemReminderExtraRule = z.object({\n id: z.string().min(1),\n trigger: AgentSpecSystemReminderTrigger,\n contentTemplate: z.string().min(1),\n contentArgs: SerializableJsonRecord.optional(),\n});\nexport type AgentSpecSystemReminderExtraRule = z.infer<typeof AgentSpecSystemReminderExtraRule>;\n\nexport const AgentSpecSystemReminderPolicy = z.object({\n enabledRuleIds: z.array(z.string().min(1)).nullable().optional(),\n disabledRuleIds: z.array(z.string().min(1)).optional(),\n thresholds: z.object({\n toolCallStreak: z.number().int().nonnegative().optional(),\n taskstateReflectionPeriod: z.number().int().positive().optional(),\n budgetWarningRatio: z.number().min(0).max(1).optional(),\n lastStepsHintThreshold: z.number().int().nonnegative().optional(),\n }).optional(),\n extraRules: z.array(AgentSpecSystemReminderExtraRule).optional(),\n}).superRefine((value, ctx) => {\n if (value.enabledRuleIds !== undefined && value.enabledRuleIds !== null && value.disabledRuleIds?.length) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['disabledRuleIds'],\n message: 'enabledRuleIds and disabledRuleIds cannot be configured at the same time',\n });\n }\n});\nexport type AgentSpecSystemReminderPolicy = z.infer<typeof AgentSpecSystemReminderPolicy>;\n\nexport const AgentSpecContextTracePolicy = z.object({\n enabled: z.boolean().optional(),\n includeMessageIds: z.boolean().optional(),\n includeTokenBreakdown: z.boolean().optional(),\n maxTraceEvents: z.number().int().positive().optional(),\n});\nexport type AgentSpecContextTracePolicy = z.infer<typeof AgentSpecContextTracePolicy>;\n\nexport const AgentSpecContextPolicy = z.object({\n profileId: z.string().min(1),\n budget: AgentSpecBudgetPolicy.optional(),\n toolHistory: AgentSpecToolHistoryPolicy.optional(),\n toolOutput: AgentSpecToolOutputPolicy.optional(),\n providerReplay: AgentSpecProviderReplayPolicy.optional(),\n summarization: AgentSpecSummarizationPolicy.optional(),\n mustKeep: AgentSpecMustKeepPolicy.optional(),\n workingMemory: AgentSpecWorkingMemoryPolicy.optional(),\n checkpoint: AgentSpecCheckpointPolicy.optional(),\n reasoningRetention: AgentSpecReasoningRetentionPolicy.optional(),\n tokenEstimation: AgentSpecTokenEstimationPolicy.optional(),\n systemReminder: AgentSpecSystemReminderPolicy.optional(),\n contextTrace: AgentSpecContextTracePolicy.optional(),\n});\nexport type AgentSpecContextPolicy = z.infer<typeof AgentSpecContextPolicy>;\n\nexport type AgentSpecContextPolicyInput = Omit<z.input<typeof AgentSpecContextPolicy>, 'profileId'> & {\n profileId?: string;\n};\n\nconst DEFAULT_CONTEXT_POLICY: Required<AgentSpecContextPolicy> = {\n profileId: 'agent',\n budget: {\n maxTokens: 232000,\n reservedForResponse: 2400,\n workingMemoryBudgetPercentage: 0.7,\n },\n toolHistory: {\n strategy: 'per-run',\n retentionMode: 'drop',\n keepLatestToolPairs: 2,\n keepLatestRuns: 1,\n maxInteractionGroups: 12,\n overflowStrategy: 'keep-latest',\n maxPairTokens: 6000,\n maxOutputSummaryTokens: 1000,\n },\n toolOutput: {\n observationGovernance: {\n enabled: true,\n maxChars: 20_000,\n maxLines: 1_200,\n },\n },\n providerReplay: {},\n summarization: {\n triggerThreshold: 0.7,\n budgetPercentage: 0.12,\n oldestMessagesPercentage: 0.75,\n failureBehavior: 'fail-fast',\n },\n mustKeep: {\n alwaysKeepTypes: ['system_prompt', 'user_input'],\n alwaysKeepFenceKinds: [],\n truncationRules: [],\n },\n workingMemory: {\n maxRecentToolInteractions: 2,\n minToolInteractionsToKeep: 2,\n toolPairingSearchRange: 10,\n },\n checkpoint: {\n keepPairsBefore: 2,\n triggerToolName: 'context_checkpoint',\n },\n reasoningRetention: {\n keepLatestThoughts: 1,\n },\n tokenEstimation: {\n encoding: 'cl100k_base',\n avgCharsPerToken: 2.0,\n toolCallOverhead: 50,\n },\n systemReminder: {\n enabledRuleIds: null,\n disabledRuleIds: [],\n thresholds: {\n toolCallStreak: 10,\n taskstateReflectionPeriod: 30,\n budgetWarningRatio: 0.9,\n lastStepsHintThreshold: 0,\n },\n extraRules: [],\n },\n contextTrace: {\n enabled: false,\n includeMessageIds: true,\n includeTokenBreakdown: true,\n maxTraceEvents: 200,\n },\n};\n\n/**\n * 创建完整 contextPolicy。\n *\n * 中文备注:\n * - schema 保持 optional,避免现有 host 的 `{ profileId: 'agent' }` 类型大面积变红;\n * - 需要完整默认值时走这个 helper,后续 F1.2/F1.3 的 adapter 与 fallback 会复用它。\n */\nexport function defineContextPolicy(input: AgentSpecContextPolicyInput = {}): AgentSpecContextPolicy {\n const merged: Required<AgentSpecContextPolicy> = {\n profileId: input.profileId ?? DEFAULT_CONTEXT_POLICY.profileId,\n budget: { ...DEFAULT_CONTEXT_POLICY.budget, ...input.budget },\n toolHistory: { ...DEFAULT_CONTEXT_POLICY.toolHistory, ...input.toolHistory },\n toolOutput: {\n ...DEFAULT_CONTEXT_POLICY.toolOutput,\n ...input.toolOutput,\n observationGovernance: {\n ...DEFAULT_CONTEXT_POLICY.toolOutput.observationGovernance,\n ...input.toolOutput?.observationGovernance,\n },\n },\n providerReplay: { ...DEFAULT_CONTEXT_POLICY.providerReplay, ...input.providerReplay },\n summarization: { ...DEFAULT_CONTEXT_POLICY.summarization, ...input.summarization },\n mustKeep: { ...DEFAULT_CONTEXT_POLICY.mustKeep, ...input.mustKeep },\n workingMemory: { ...DEFAULT_CONTEXT_POLICY.workingMemory, ...input.workingMemory },\n checkpoint: { ...DEFAULT_CONTEXT_POLICY.checkpoint, ...input.checkpoint },\n reasoningRetention: { ...DEFAULT_CONTEXT_POLICY.reasoningRetention, ...input.reasoningRetention },\n tokenEstimation: { ...DEFAULT_CONTEXT_POLICY.tokenEstimation, ...input.tokenEstimation },\n systemReminder: {\n ...DEFAULT_CONTEXT_POLICY.systemReminder,\n ...input.systemReminder,\n thresholds: {\n ...DEFAULT_CONTEXT_POLICY.systemReminder.thresholds,\n ...input.systemReminder?.thresholds,\n },\n extraRules: input.systemReminder?.extraRules ?? DEFAULT_CONTEXT_POLICY.systemReminder.extraRules,\n },\n contextTrace: { ...DEFAULT_CONTEXT_POLICY.contextTrace, ...input.contextTrace },\n };\n\n return AgentSpecContextPolicy.parse(merged);\n}\n","import { z } from 'zod';\nimport { AgentSpecContextPolicy } from './contextPolicy';\n\nconst JsonRecord = z.record(z.string(), z.unknown());\n\n/**\n * 工具参数 schema 在 AgentSpec 里是可序列化契约,不是运行时 zod 对象。\n * 这里主动拦截 zod-like 对象,避免把 `z.any()` 一类实现细节混进协议层。\n */\nconst ToolArgsSchemaSpec = JsonRecord.superRefine((value, ctx) => {\n const parse = value['parse'];\n const safeParse = value['safeParse'];\n const definition = value['_def'];\n if (typeof parse === 'function' && typeof safeParse === 'function' && definition !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'argsSchema must be a serializable record, not a runtime zod schema',\n });\n }\n});\n\nexport const AgentCapability = z.string().min(1);\nexport type AgentCapability = z.infer<typeof AgentCapability>;\n\nexport const ToolBindingSpec = z.object({\n toolId: z.string().min(1),\n bindingId: z.string().min(1).optional(),\n argsSchema: ToolArgsSchemaSpec.optional(),\n config: JsonRecord.optional(),\n metadata: JsonRecord.optional(),\n});\nexport type ToolBindingSpec = z.infer<typeof ToolBindingSpec>;\n\nexport const AgentSpecModelHints = z.object({\n preferredProviders: z.array(z.string().min(1)).optional(),\n preferredModels: z.array(z.string().min(1)).optional(),\n fallbackChain: z.array(z.string().min(1)).optional(),\n});\nexport type AgentSpecModelHints = z.infer<typeof AgentSpecModelHints>;\n\nexport const AgentSpecAuditConfig = z.object({\n redactionLevel: z.enum(['none', 'standard', 'strict']).optional(),\n pii: z.boolean().optional(),\n});\nexport type AgentSpecAuditConfig = z.infer<typeof AgentSpecAuditConfig>;\n\nexport const AgentSpec = z.object({\n id: z.string().min(1),\n version: z.string().min(1),\n role: z.string().optional(),\n description: z.string().optional(),\n capabilities: z.array(AgentCapability),\n tools: z.array(ToolBindingSpec),\n contextPolicy: AgentSpecContextPolicy,\n modelHints: AgentSpecModelHints.optional(),\n audit: AgentSpecAuditConfig.optional(),\n metadata: JsonRecord.optional(),\n});\nexport type AgentSpec = z.infer<typeof AgentSpec>;\n","import { z } from 'zod';\n\nconst JsonRecord = z.record(z.string(), z.unknown());\n\nexport const AUDIT_ACTIONS = [\n 'model.select',\n 'model.fallback',\n 'tool.allow',\n 'tool.deny',\n 'wait_user.request',\n 'sandbox.decide',\n 'run.cancel',\n 'run.pause',\n 'run.resume',\n 'memory.write',\n] as const;\n\nexport const AUDIT_DECISION_OUTCOMES = [\n 'allowed',\n 'denied',\n 'fallback',\n 'retry',\n 'cancelled',\n 'paused',\n 'resumed',\n 'requested',\n 'recorded',\n] as const;\n\nexport const AuditActor = z.object({\n kind: z.enum(['system', 'host', 'agent', 'model', 'tool', 'user']),\n id: z.string().min(1).optional(),\n name: z.string().min(1).optional(),\n});\nexport type AuditActor = z.infer<typeof AuditActor>;\n\nexport const AuditDecision = z.object({\n outcome: z.enum(AUDIT_DECISION_OUTCOMES),\n reason: z.string().optional(),\n policy: z.string().optional(),\n metadata: JsonRecord.optional(),\n});\nexport type AuditDecision = z.infer<typeof AuditDecision>;\n\nexport const AuditEvidence = z.object({\n kind: z.string().min(1),\n ref: z.string().min(1).optional(),\n summary: z.string().optional(),\n metadata: JsonRecord.optional(),\n});\nexport type AuditEvidence = z.infer<typeof AuditEvidence>;\n\nexport const AuditCostDelta = z.object({\n tokensInput: z.number().int().nonnegative().optional(),\n tokensOutput: z.number().int().nonnegative().optional(),\n totalCostUsd: z.number().nonnegative().optional(),\n latencyMs: z.number().nonnegative().optional(),\n});\nexport type AuditCostDelta = z.infer<typeof AuditCostDelta>;\n\nexport const AuditScope = z.object({\n conversationId: z.string().min(1).optional(),\n runId: z.string().min(1).optional(),\n parentRunId: z.string().min(1).optional(),\n turnId: z.string().min(1).optional(),\n traceId: z.string().min(1).optional(),\n agentSpecId: z.string().min(1).optional(),\n toolCallId: z.string().min(1).optional(),\n toolName: z.string().min(1).optional(),\n modelId: z.string().min(1).optional(),\n nodeId: z.string().min(1).optional(),\n metadata: JsonRecord.optional(),\n});\nexport type AuditScope = z.infer<typeof AuditScope>;\n\n/**\n * 标准审计信封。\n *\n * 中文备注:\n * - action 保持 string,以便 host 扩展自己的动作名;\n * - decision/evidence/costDelta 都是可选事实片段,避免把所有审计场景压成同一种形状;\n * - envelope 必须追加只读,更新/撤回应追加新的补偿 envelope。\n */\nexport const AuditEnvelope = z.object({\n envelopeId: z.string().min(1),\n runId: z.string().min(1),\n parentRunId: z.string().min(1).optional(),\n ts: z.number().int().nonnegative(),\n actor: AuditActor,\n action: z.string().min(1),\n decision: AuditDecision.optional(),\n evidence: z.array(AuditEvidence).optional(),\n costDelta: AuditCostDelta.optional(),\n scope: AuditScope.optional(),\n});\nexport type AuditEnvelope = z.infer<typeof AuditEnvelope>;\n","import { z } from 'zod';\nimport { AuditEnvelope } from './audit';\n\nexport const BaseEvent = z.object({\n id: z.string(),\n conversation_id: z.string(),\n timestamp: z.number(),\n metadata: z.record(z.unknown()).optional(),\n version: z.literal(1).default(1),\n turn_id: z.string(),\n ephemeral: z.boolean().optional(),\n});\n\nexport const ToolCallPhase = z.enum(['start', 'update', 'complete', 'error']);\nexport const Status = z.enum(['loading', 'success', 'error']);\nexport const AgentTodoStatus = z.enum(['pending', 'in_progress', 'completed', 'cancelled']);\n\nexport const AgentTodoItem = z.object({\n id: z.string(),\n content: z.string(),\n status: AgentTodoStatus,\n});\n\nexport const ProviderReasoningDetailsPayload = z.array(z.unknown());\nexport type ProviderReasoningDetailsPayload = z.infer<typeof ProviderReasoningDetailsPayload>;\n\nexport const ToolCallDecisionPayload = z.object({\n args: z.record(z.any()).optional(),\n tool_calls: z.array(z.unknown()).optional(),\n /**\n * 不透明 provider reasoning replay blocks。\n *\n * RuntimeEvent 层的标准位置是 assistant 产出事件携带 reasoning_details;\n * context-manager 会把它回放到 AiMessage.metadata.reasoning_details。\n */\n reasoning_details: ProviderReasoningDetailsPayload.optional(),\n}).passthrough();\n\nexport type ToolCallDecisionPayload = z.infer<typeof ToolCallDecisionPayload>;\n\nexport const RuntimeEvent = z.discriminatedUnion('type', [\n BaseEvent.extend({\n type: z.literal('user_input'),\n content: z.string(),\n raw_content: z.string().optional(),\n source: z.enum(['user', 'editor', 'system']).default('user'),\n }),\n BaseEvent.extend({\n type: z.literal('thought'),\n content: z.string(),\n thought_message_id: z.string().optional(),\n delta: z.string().optional(),\n is_complete: z.boolean().default(false),\n }),\n BaseEvent.extend({\n type: z.literal('tool_call_decision'),\n tool_name: z.string(),\n tool_call_id: z.string(),\n phase: ToolCallPhase,\n status: Status,\n args: z.record(z.any()).optional(),\n payload: ToolCallDecisionPayload.optional(),\n parent_tool_call_id: z.string().optional(),\n meta: z.record(z.any()).optional(),\n }),\n BaseEvent.extend({\n type: z.literal('tool_process'),\n tool_name: z.string(),\n tool_call_id: z.string(),\n phase: ToolCallPhase,\n status: Status,\n args: z.record(z.any()).optional(),\n payload: z.record(z.any()).optional(),\n parent_tool_call_id: z.string().optional(),\n meta: z.record(z.any()).optional(),\n }),\n BaseEvent.extend({\n type: z.literal('tool_output'),\n tool_name: z.string(),\n tool_call_id: z.string(),\n status: z.enum(['success', 'error']),\n output: z.any().optional(),\n payload: z.record(z.any()).optional(),\n error: z.string().optional(),\n duration_ms: z.number().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('todo_updated'),\n todo_list_id: z.string(),\n todo_list_version: z.number().int().nonnegative(),\n items: z.array(AgentTodoItem),\n }),\n BaseEvent.extend({\n type: z.literal('subrun_trace'),\n parent_tool_call_id: z.string(),\n subrun_id: z.string(),\n subrun_parent_id: z.string().optional(),\n kind: z.enum([\n 'thought_delta',\n 'thought_complete',\n 'tool_call_decision',\n 'tool_process',\n 'tool_output',\n 'final_answer_chunk',\n 'final_answer',\n ]),\n delta: z.string().optional(),\n content: z.string().optional(),\n tool_name: z.string().optional(),\n tool_call_id: z.string().optional(),\n phase: ToolCallPhase.optional(),\n status: Status.optional(),\n args: z.unknown().optional(),\n output: z.unknown().optional(),\n duration_ms: z.number().optional(),\n meta: z.record(z.unknown()).optional(),\n }),\n BaseEvent.extend({\n type: z.literal('requires_user_interaction'),\n form: z.any().optional(),\n interaction_type: z.string().optional(),\n prompt: z.string().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('audit_envelope'),\n envelope: AuditEnvelope,\n }),\n BaseEvent.extend({\n type: z.literal('final_answer'),\n answer_id: z.string(),\n content: z.string(),\n is_complete: z.boolean().default(true),\n reasoning_details: ProviderReasoningDetailsPayload.optional(),\n meta: z.record(z.any()).optional(),\n }),\n BaseEvent.extend({\n type: z.literal('final_answer_chunk'),\n answer_id: z.string(),\n seq: z.number().int().nonnegative(),\n content: z.string(),\n is_last: z.boolean().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('history_summary'),\n content: z.string(),\n replaced_message_ids: z.array(z.string()),\n summary_seq: z.number().int().nonnegative(),\n original_message_count: z.number().int().nonnegative().optional(),\n compression_ratio: z.number().min(0).max(1).optional(),\n included_old_summary: z.boolean().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('error'),\n error: z.string(),\n details: z.any().optional(),\n error_code: z.string().optional(),\n retryable: z.boolean().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('control'),\n op: z.enum(['truncate_after', 'replace', 'redo', 'branch']),\n target_id: z.string().optional(),\n reason: z.string().optional(),\n meta: z.any().optional(),\n }),\n BaseEvent.extend({\n type: z.literal('stream_end'),\n reason: z.enum(['complete', 'error', 'interrupted', 'timeout']).optional(),\n reason_message: z.string().optional(),\n stats: z.object({\n total_events: z.number().optional(),\n duration_ms: z.number().optional(),\n error_count: z.number().optional(),\n }).optional(),\n }),\n]);\n\nexport type RuntimeEvent = z.infer<typeof RuntimeEvent>;\nexport type UserInputEvent = Extract<RuntimeEvent, { type: 'user_input' }>;\nexport type ThoughtEvent = Extract<RuntimeEvent, { type: 'thought' }>;\nexport type ToolCallDecisionEvent = Extract<RuntimeEvent, { type: 'tool_call_decision' }>;\nexport type ToolProcessEvent = Extract<RuntimeEvent, { type: 'tool_process' }>;\nexport type ToolOutputEvent = Extract<RuntimeEvent, { type: 'tool_output' }>;\nexport type TodoUpdatedEvent = Extract<RuntimeEvent, { type: 'todo_updated' }>;\nexport type SubRunTraceEvent = Extract<RuntimeEvent, { type: 'subrun_trace' }>;\nexport type RequiresUserInteractionEvent = Extract<RuntimeEvent, { type: 'requires_user_interaction' }>;\nexport type AuditEnvelopeEvent = Extract<RuntimeEvent, { type: 'audit_envelope' }>;\nexport type FinalAnswerEvent = Extract<RuntimeEvent, { type: 'final_answer' }>;\nexport type FinalAnswerChunkEvent = Extract<RuntimeEvent, { type: 'final_answer_chunk' }>;\nexport type HistorySummaryEvent = Extract<RuntimeEvent, { type: 'history_summary' }>;\nexport type ErrorEvent = Extract<RuntimeEvent, { type: 'error' }>;\nexport type ControlEvent = Extract<RuntimeEvent, { type: 'control' }>;\nexport type StreamEndEvent = Extract<RuntimeEvent, { type: 'stream_end' }>;\n\nexport const validateRuntimeEvent = (event: unknown) => RuntimeEvent.safeParse(event);\nexport const validateRuntimeEvents = (events: unknown[]) => z.array(RuntimeEvent).safeParse(events);\n\nexport const createUserInputEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n content: string,\n options: Partial<UserInputEvent> = {},\n): UserInputEvent => ({\n type: 'user_input',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n content,\n source: 'user',\n ...options,\n});\n\nexport const createThoughtEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n content: string,\n options: Partial<ThoughtEvent> = {},\n): ThoughtEvent => ({\n type: 'thought',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n content,\n is_complete: false,\n ...options,\n});\n\nexport const createToolCallDecisionEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n options: Partial<ToolCallDecisionEvent> = {},\n): ToolCallDecisionEvent => ({\n type: 'tool_call_decision',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n tool_name: toolName,\n tool_call_id: toolCallId,\n phase: 'start',\n status: 'loading',\n ...options,\n});\n\nexport const createToolProcessEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n options: Partial<ToolProcessEvent> = {},\n): ToolProcessEvent => ({\n type: 'tool_process',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n tool_name: toolName,\n tool_call_id: toolCallId,\n phase: 'start',\n status: 'loading',\n ...options,\n});\n\nexport const createSubRunTraceEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n parentToolCallId: string,\n subrunId: string,\n kind: SubRunTraceEvent['kind'],\n options: Partial<SubRunTraceEvent> = {},\n): SubRunTraceEvent => ({\n type: 'subrun_trace',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n ephemeral: true,\n parent_tool_call_id: parentToolCallId,\n subrun_id: subrunId,\n kind,\n ...options,\n});\n\nexport const createToolOutputEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n output: unknown,\n status: 'success' | 'error' = 'success',\n options: Partial<ToolOutputEvent> = {},\n): ToolOutputEvent => ({\n type: 'tool_output',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n tool_name: toolName,\n tool_call_id: toolCallId,\n status,\n output,\n ...options,\n});\n\nexport const createTodoUpdatedEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n todoListId: string,\n todoListVersion: number,\n items: TodoUpdatedEvent['items'],\n options: Partial<TodoUpdatedEvent> = {},\n): TodoUpdatedEvent => ({\n type: 'todo_updated',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n todo_list_id: todoListId,\n todo_list_version: todoListVersion,\n items,\n ...options,\n});\n\nexport const createFinalAnswerEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n answerId: string,\n content: string,\n options: Partial<FinalAnswerEvent> = {},\n): FinalAnswerEvent => ({\n type: 'final_answer',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n answer_id: answerId,\n content,\n is_complete: true,\n ...options,\n});\n\nexport const createAuditEnvelopeEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n envelope: AuditEnvelopeEvent['envelope'],\n options: Partial<AuditEnvelopeEvent> = {},\n): AuditEnvelopeEvent => ({\n type: 'audit_envelope',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: envelope.ts,\n version: 1,\n envelope,\n metadata: {\n audit_action: envelope.action,\n run_context: {\n runId: envelope.runId,\n parentId: envelope.parentRunId,\n traceId: envelope.scope?.traceId,\n },\n },\n ...options,\n});\n\nexport const createFinalAnswerChunkEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n answerId: string,\n seq: number,\n content: string,\n options: Partial<FinalAnswerChunkEvent> = {},\n): FinalAnswerChunkEvent => ({\n type: 'final_answer_chunk',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n answer_id: answerId,\n seq,\n content,\n ...options,\n});\n\nexport const createHistorySummaryEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n content: string,\n replacedMessageIds: string[],\n summarySeq: number,\n options: Partial<HistorySummaryEvent> = {},\n): HistorySummaryEvent => ({\n type: 'history_summary',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n content,\n replaced_message_ids: replacedMessageIds,\n summary_seq: summarySeq,\n ...options,\n});\n\nexport const createErrorEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n error: string,\n options: Partial<ErrorEvent> = {},\n): ErrorEvent => ({\n type: 'error',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n error,\n ...options,\n});\n\nexport const createStreamEndEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n options: Partial<StreamEndEvent> = {},\n): StreamEndEvent => ({\n type: 'stream_end',\n id,\n conversation_id: conversationId,\n turn_id: turnId,\n timestamp: Date.now(),\n version: 1,\n ...options,\n});\n","export const DEFAULT_MAX_STEPS = 80;\n","import { z } from 'zod';\n\nexport const ExecutionTraceContext = z.object({\n execution_id: z.string().describe('The unique identifier for a single, complete execution flow.'),\n trace_id: z.string().optional().describe('An optional trace ID for correlating logs in an APM system.'),\n});\n\nconst EventEnvelopeSchema = z.object({\n seq: z.number().int().nonnegative().describe('A monotonically increasing sequence number within a single execution.'),\n timestamp: z.number().describe('The high-precision timestamp of when the event occurred.'),\n trace: ExecutionTraceContext,\n source: z.string().describe(\"The origin of the event, e.g., 'ai', 'tool:file_reader', 'system:summary'.\"),\n payload: z.unknown(),\n render_hint: z.object({\n card: z.enum(['normal', 'collapsible', 'none', 'image', 'interactive']).optional().describe('Hint for how the UI card should be rendered.'),\n content: z.enum(['markdown', 'text', 'json', 'image_url', 'code']).default('text').describe('Hint for how the content itself should be interpreted.'),\n }).optional(),\n run_location: z.enum(['frontend', 'backend']).optional().describe('Specifies where a tool action should be or was executed.'),\n});\n\nexport const EventEnvelope = EventEnvelopeSchema;\n\ntype EventEnvelopeBase = z.infer<typeof EventEnvelopeSchema>;\n\nexport type EventEnvelope<TPayload = unknown> = Omit<EventEnvelopeBase, 'payload'> & {\n payload: TPayload;\n};\n\nexport type ExecutionTraceContext = z.infer<typeof ExecutionTraceContext>;\n","import { z } from 'zod';\n\nexport const BaseSSEEvent = z.object({\n id: z.string(),\n timestamp: z.number(),\n conversation_id: z.string(),\n turn_id: z.string(),\n metadata: z.record(z.unknown()).optional(),\n});\n\nexport type BaseSSEEvent = z.infer<typeof BaseSSEEvent>;\n\nexport const SSEThoughtEvent = BaseSSEEvent.extend({\n type: z.literal('thought'),\n thought_message_id: z.string().optional(),\n delta: z.string().optional(),\n content: z.string().optional(),\n is_complete: z.boolean().default(false),\n});\n\nexport type SSEThoughtEvent = z.infer<typeof SSEThoughtEvent>;\n\nexport const SSEFinalAnswerChunkEvent = BaseSSEEvent.extend({\n type: z.literal('final_answer_chunk'),\n answer_id: z.string(),\n seq: z.number().int().nonnegative(),\n chunk: z.string(),\n is_last: z.boolean().optional(),\n});\n\nexport type SSEFinalAnswerChunkEvent = z.infer<typeof SSEFinalAnswerChunkEvent>;\n\nexport const SSEFinalAnswerEvent = BaseSSEEvent.extend({\n type: z.literal('final_answer'),\n answer_id: z.string(),\n content: z.string(),\n meta: z.record(z.any()).optional(),\n});\n\nexport type SSEFinalAnswerEvent = z.infer<typeof SSEFinalAnswerEvent>;\n\nexport const SSEMarkdownChunkEvent = BaseSSEEvent.extend({\n type: z.literal('markdown_chunk'),\n content_type: z.enum(['text', 'code', 'table', 'image']).default('text'),\n text: z.string(),\n seq: z.number().optional(),\n});\n\nexport type SSEMarkdownChunkEvent = z.infer<typeof SSEMarkdownChunkEvent>;\n\nconst BaseSSEToolLifecycleEvent = BaseSSEEvent.extend({\n tool_name: z.string(),\n tool_call_id: z.string(),\n phase: z.enum(['start', 'update', 'complete', 'error']),\n status: z.enum(['loading', 'success', 'error']),\n args: z.any().optional(),\n payload: z.any().optional(),\n meta: z.record(z.any()).optional(),\n});\n\nexport const SSEToolCallDecisionEvent = BaseSSEToolLifecycleEvent.extend({\n type: z.literal('tool_call_decision'),\n});\n\nexport type SSEToolCallDecisionEvent = z.infer<typeof SSEToolCallDecisionEvent>;\n\nexport const SSEToolProcessEvent = BaseSSEToolLifecycleEvent.extend({\n type: z.literal('tool_process'),\n});\n\nexport type SSEToolProcessEvent = z.infer<typeof SSEToolProcessEvent>;\n\nexport const SSEToolOutputEvent = BaseSSEEvent.extend({\n type: z.literal('tool_output'),\n tool_name: z.string(),\n tool_call_id: z.string(),\n status: z.enum(['success', 'error']),\n output: z.any().optional(),\n payload: z.record(z.any()).optional(),\n duration_ms: z.number().optional(),\n});\n\nexport type SSEToolOutputEvent = z.infer<typeof SSEToolOutputEvent>;\n\nexport const SSETodoUpdatedEvent = BaseSSEEvent.extend({\n type: z.literal('todo_updated'),\n todo_list_id: z.string(),\n todo_list_version: z.number().int().nonnegative(),\n items: z.array(z.object({\n id: z.string(),\n content: z.string(),\n status: z.enum(['pending', 'in_progress', 'completed', 'cancelled']),\n })),\n});\n\nexport type SSETodoUpdatedEvent = z.infer<typeof SSETodoUpdatedEvent>;\n\nexport const SSESubRunTraceEvent = BaseSSEEvent.extend({\n type: z.literal('subrun_trace'),\n parent_tool_call_id: z.string(),\n subrun_id: z.string(),\n subrun_parent_id: z.string().optional(),\n kind: z.enum([\n 'thought_delta',\n 'thought_complete',\n 'tool_call_decision',\n 'tool_process',\n 'tool_output',\n 'final_answer_chunk',\n 'final_answer',\n ]),\n delta: z.string().optional(),\n content: z.string().optional(),\n tool_name: z.string().optional(),\n tool_call_id: z.string().optional(),\n phase: z.enum(['start', 'update', 'complete', 'error']).optional(),\n status: z.enum(['loading', 'success', 'error']).optional(),\n args: z.unknown().optional(),\n output: z.unknown().optional(),\n duration_ms: z.number().optional(),\n meta: z.record(z.unknown()).optional(),\n});\n\nexport type SSESubRunTraceEvent = z.infer<typeof SSESubRunTraceEvent>;\n\nexport const SSERequiresUserInteractionEvent = BaseSSEEvent.extend({\n type: z.literal('requires_user_interaction'),\n form: z.any().optional(),\n interaction_type: z.string().optional(),\n prompt: z.string().optional(),\n});\n\nexport type SSERequiresUserInteractionEvent = z.infer<typeof SSERequiresUserInteractionEvent>;\n\nexport const SSEErrorEvent = BaseSSEEvent.extend({\n type: z.literal('error'),\n error: z.string(),\n details: z.any().optional(),\n error_code: z.string().optional(),\n retryable: z.boolean().optional(),\n});\n\nexport type SSEErrorEvent = z.infer<typeof SSEErrorEvent>;\n\nexport const SSEStreamEndEvent = BaseSSEEvent.extend({\n type: z.literal('stream_end'),\n reason: z.enum(['complete', 'error', 'interrupted', 'timeout']).optional(),\n reason_message: z.string().optional(),\n stats: z.object({\n total_events: z.number().optional(),\n duration_ms: z.number().optional(),\n error_count: z.number().optional(),\n benchmark: z.record(z.unknown()).optional(),\n }).optional(),\n});\n\nexport type SSEStreamEndEvent = z.infer<typeof SSEStreamEndEvent>;\n\nexport const SSEHistorySummaryEvent = BaseSSEEvent.extend({\n type: z.literal('history_summary'),\n summary_id: z.string(),\n content: z.string(),\n original_message_count: z.number().int().nonnegative(),\n summary_seq: z.number().int().nonnegative(),\n});\n\nexport type SSEHistorySummaryEvent = z.infer<typeof SSEHistorySummaryEvent>;\n\nexport const SSESummarizationStartEvent = BaseSSEEvent.extend({\n type: z.literal('summarization_start'),\n originalMessages: z.number().optional(),\n});\n\nexport type SSESummarizationStartEvent = z.infer<typeof SSESummarizationStartEvent>;\n\nexport const SSESummarizationEndEvent = BaseSSEEvent.extend({\n type: z.literal('summarization_end'),\n originalMessages: z.number().optional(),\n compressedMessages: z.number().optional(),\n compressionRatio: z.string().optional(),\n timeSaved: z.string().optional(),\n});\n\nexport type SSESummarizationEndEvent = z.infer<typeof SSESummarizationEndEvent>;\n\nexport const SSESummarizationErrorEvent = BaseSSEEvent.extend({\n type: z.literal('summarization_error'),\n error: z.string(),\n});\n\nexport type SSESummarizationErrorEvent = z.infer<typeof SSESummarizationErrorEvent>;\n\nexport const SSEEvent = z.discriminatedUnion('type', [\n SSEThoughtEvent,\n SSEFinalAnswerChunkEvent,\n SSEFinalAnswerEvent,\n SSEMarkdownChunkEvent,\n SSEToolCallDecisionEvent,\n SSEToolProcessEvent,\n SSEToolOutputEvent,\n SSETodoUpdatedEvent,\n SSESubRunTraceEvent,\n SSERequiresUserInteractionEvent,\n SSEErrorEvent,\n SSEStreamEndEvent,\n SSEHistorySummaryEvent,\n SSESummarizationStartEvent,\n SSESummarizationEndEvent,\n SSESummarizationErrorEvent,\n]);\n\nexport type SSEEvent = z.infer<typeof SSEEvent>;\n\nexport const validateSSEEvent = (event: unknown) => SSEEvent.safeParse(event);\n\nexport const createSSEThoughtEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n options: { thought_message_id?: string; delta?: string; content?: string; is_complete?: boolean } = {},\n): SSEThoughtEvent => ({\n type: 'thought',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n is_complete: false,\n ...options,\n});\n\nexport const createSSEFinalAnswerChunkEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n answerId: string,\n seq: number,\n chunk: string,\n options: { is_last?: boolean } = {},\n): SSEFinalAnswerChunkEvent => ({\n type: 'final_answer_chunk',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n answer_id: answerId,\n seq,\n chunk,\n ...options,\n});\n\nexport const createSSEFinalAnswerEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n answerId: string,\n content: string,\n options: Partial<SSEFinalAnswerEvent> = {},\n): SSEFinalAnswerEvent => ({\n type: 'final_answer',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n answer_id: answerId,\n content,\n ...options,\n});\n\nexport const createSSEMarkdownChunkEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n text: string,\n options: Partial<SSEMarkdownChunkEvent> = {},\n): SSEMarkdownChunkEvent => ({\n type: 'markdown_chunk',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n text,\n content_type: 'text',\n ...options,\n});\n\nexport const createSSEToolCallDecisionEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n phase: SSEToolCallDecisionEvent['phase'],\n status: SSEToolCallDecisionEvent['status'],\n options: Partial<SSEToolCallDecisionEvent> = {},\n): SSEToolCallDecisionEvent => ({\n type: 'tool_call_decision',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n tool_name: toolName,\n tool_call_id: toolCallId,\n phase,\n status,\n ...options,\n});\n\nexport const createSSEToolProcessEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n phase: SSEToolProcessEvent['phase'],\n status: SSEToolProcessEvent['status'],\n options: Partial<SSEToolProcessEvent> = {},\n): SSEToolProcessEvent => ({\n type: 'tool_process',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n tool_name: toolName,\n tool_call_id: toolCallId,\n phase,\n status,\n ...options,\n});\n\nexport const createSSEToolOutputEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n toolName: string,\n toolCallId: string,\n status: SSEToolOutputEvent['status'],\n output: unknown,\n options: Partial<SSEToolOutputEvent> = {},\n): SSEToolOutputEvent => ({\n type: 'tool_output',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n tool_name: toolName,\n tool_call_id: toolCallId,\n status,\n output,\n ...options,\n});\n\nexport const createSSETodoUpdatedEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n todoListId: string,\n todoListVersion: number,\n items: SSETodoUpdatedEvent['items'],\n options: Partial<SSETodoUpdatedEvent> = {},\n): SSETodoUpdatedEvent => ({\n type: 'todo_updated',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n todo_list_id: todoListId,\n todo_list_version: todoListVersion,\n items,\n ...options,\n});\n\nexport const createSSESubRunTraceEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n parentToolCallId: string,\n subrunId: string,\n kind: SSESubRunTraceEvent['kind'],\n options: Partial<SSESubRunTraceEvent> = {},\n): SSESubRunTraceEvent => ({\n type: 'subrun_trace',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n parent_tool_call_id: parentToolCallId,\n subrun_id: subrunId,\n kind,\n ...options,\n});\n\nexport const createSSERequiresUserInteractionEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n options: Partial<SSERequiresUserInteractionEvent> = {},\n): SSERequiresUserInteractionEvent => ({\n type: 'requires_user_interaction',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n ...options,\n});\n\nexport const createSSEErrorEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n error: string,\n options: Partial<SSEErrorEvent> = {},\n): SSEErrorEvent => ({\n type: 'error',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n error,\n ...options,\n});\n\nexport const createSSEStreamEndEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n options: Partial<SSEStreamEndEvent> = {},\n): SSEStreamEndEvent => ({\n type: 'stream_end',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n ...options,\n});\n\nexport const createSSEHistorySummaryEvent = (\n id: string,\n conversationId: string,\n turnId: string,\n summaryId: string,\n content: string,\n originalMessageCount: number,\n summarySeq: number,\n options: Partial<SSEHistorySummaryEvent> = {},\n): SSEHistorySummaryEvent => ({\n type: 'history_summary',\n id,\n timestamp: Date.now(),\n conversation_id: conversationId,\n turn_id: turnId,\n summary_id: summaryId,\n content,\n original_message_count: originalMessageCount,\n summary_seq: summarySeq,\n ...options,\n});\n","import {\n AgentSpecContextPolicy,\n type AgentSpecContextPolicyInput,\n defineContextPolicy,\n} from '../../contracts';\n\nexport interface MergeContextPolicyParams {\n frameworkDefault?: AgentSpecContextPolicyInput;\n hostFallback?: AgentSpecContextPolicyInput;\n agentSpec?: AgentSpecContextPolicyInput;\n}\n\n/**\n * 合并三层 contextPolicy。\n *\n * 中文备注:\n * - 优先级:frameworkDefault < hostFallback < agentSpec;\n * - 按分组做字段级合并;\n * - 数组字段整体替换,不做 concat,避免 host/agent 的规则顺序变得不可预测。\n */\nexport function mergeContextPolicy(params: MergeContextPolicyParams): AgentSpecContextPolicy {\n const merged = mergePolicyLayer(\n mergePolicyLayer(params.frameworkDefault, params.hostFallback),\n params.agentSpec,\n );\n\n return defineContextPolicy(merged);\n}\n\nfunction mergePolicyLayer(\n base: AgentSpecContextPolicyInput | undefined,\n override: AgentSpecContextPolicyInput | undefined,\n): AgentSpecContextPolicyInput {\n if (!base && !override) {\n return {};\n }\n if (!override) {\n return { ...base };\n }\n if (!base) {\n return { ...override };\n }\n\n return {\n ...base,\n ...override,\n budget: mergeObject(base.budget, override.budget),\n toolHistory: mergeObject(base.toolHistory, override.toolHistory),\n toolOutput: mergeToolOutput(base.toolOutput, override.toolOutput),\n providerReplay: mergeObject(base.providerReplay, override.providerReplay),\n summarization: mergeObject(base.summarization, override.summarization),\n mustKeep: mergeObject(base.mustKeep, override.mustKeep),\n workingMemory: mergeObject(base.workingMemory, override.workingMemory),\n checkpoint: mergeObject(base.checkpoint, override.checkpoint),\n reasoningRetention: mergeObject(base.reasoningRetention, override.reasoningRetention),\n tokenEstimation: mergeObject(base.tokenEstimation, override.tokenEstimation),\n systemReminder: mergeSystemReminder(base.systemReminder, override.systemReminder),\n contextTrace: mergeObject(base.contextTrace, override.contextTrace),\n };\n}\n\nfunction mergeObject<T extends object>(\n base: T | undefined,\n override: T | undefined,\n): T | undefined {\n if (!base && !override) {\n return undefined;\n }\n return {\n ...base,\n ...override,\n } as T;\n}\n\nfunction mergeSystemReminder(\n base: AgentSpecContextPolicyInput['systemReminder'],\n override: AgentSpecContextPolicyInput['systemReminder'],\n): AgentSpecContextPolicyInput['systemReminder'] {\n if (!base && !override) {\n return undefined;\n }\n return {\n ...base,\n ...override,\n thresholds: mergeObject(base?.thresholds, override?.thresholds),\n extraRules: override?.extraRules ?? base?.extraRules,\n };\n}\n\nfunction mergeToolOutput(\n base: AgentSpecContextPolicyInput['toolOutput'],\n override: AgentSpecContextPolicyInput['toolOutput'],\n): AgentSpecContextPolicyInput['toolOutput'] {\n if (!base && !override) {\n return undefined;\n }\n return {\n ...base,\n ...override,\n observationGovernance: mergeObject(base?.observationGovernance, override?.observationGovernance),\n };\n}\n","import type {\n AgentSpecContextPolicy,\n AgentSpecContextTracePolicy,\n AiMessage,\n} from '../../contracts';\nimport type { MessageProcessingState } from './providers/base';\n\nexport type ContextTraceEvent =\n | ContextTraceProviderEvent\n | ContextTraceMessageDecisionEvent;\n\nexport interface ContextTraceProviderEvent {\n kind: 'provider';\n providerName: string;\n skipped: boolean;\n durationMs: number;\n beforeTokens: number;\n afterTokens: number;\n tokenDelta: number;\n tokensUsed: number;\n beforeKeptCount: number;\n afterKeptCount: number;\n strategiesApplied: string[];\n remainingBudget: number;\n}\n\nexport interface ContextTraceMessageDecisionEvent {\n kind: 'message-decision';\n originalIndex: number;\n messageId?: string;\n role: AiMessage['role'];\n type: AiMessage['type'];\n action: MessageProcessingState['action'];\n phase?: string;\n tokens: number;\n kept: boolean;\n reason: string;\n replacementSourceIds?: string[];\n}\n\nexport interface ContextTrace {\n enabled: true;\n includeMessageIds: boolean;\n includeTokenBreakdown: boolean;\n maxTraceEvents: number;\n overflowed: boolean;\n effectivePolicy?: AgentSpecContextPolicy;\n totalBudget: number;\n originalCount: number;\n finalCount: number;\n finalTokens: number;\n truncated: boolean;\n events: ContextTraceEvent[];\n}\n\ninterface ContextTraceCollectorOptions {\n policy?: AgentSpecContextTracePolicy;\n effectivePolicy?: AgentSpecContextPolicy;\n totalBudget: number;\n originalCount: number;\n}\n\ninterface ProviderSnapshot {\n tokens: number;\n keptCount: number;\n}\n\ninterface ProviderTraceInput {\n providerName: string;\n skipped: boolean;\n durationMs: number;\n beforeStates: ReadonlyArray<MessageProcessingState>;\n afterStates: ReadonlyArray<MessageProcessingState>;\n tokensUsed: number;\n strategiesApplied: readonly string[];\n remainingBudget: number;\n}\n\n/**\n * ContextTrace 的最小采集器。\n *\n * 中文备注:\n * - trace 只描述“本次上下文构建如何选择消息”,不进入 LLM 输入;\n * - 采集器内部做 maxTraceEvents 限流,避免观测数据反过来膨胀。\n */\nexport class ContextTraceCollector {\n private readonly includeMessageIds: boolean;\n private readonly includeTokenBreakdown: boolean;\n private readonly maxTraceEvents: number;\n private readonly effectivePolicy?: AgentSpecContextPolicy;\n private readonly totalBudget: number;\n private readonly originalCount: number;\n private readonly events: ContextTraceEvent[] = [];\n private overflowed = false;\n\n private constructor(options: Required<Pick<ContextTraceCollectorOptions, 'totalBudget' | 'originalCount'>> & {\n policy?: AgentSpecContextTracePolicy;\n effectivePolicy?: AgentSpecContextPolicy;\n }) {\n this.includeMessageIds = options.policy?.includeMessageIds ?? true;\n this.includeTokenBreakdown = options.policy?.includeTokenBreakdown ?? true;\n this.maxTraceEvents = options.policy?.maxTraceEvents ?? 200;\n this.effectivePolicy = options.effectivePolicy;\n this.totalBudget = options.totalBudget;\n this.originalCount = options.originalCount;\n }\n\n static create(options: ContextTraceCollectorOptions): ContextTraceCollector | undefined {\n if (options.policy?.enabled !== true) {\n return undefined;\n }\n return new ContextTraceCollector(options);\n }\n\n recordProvider(input: ProviderTraceInput): void {\n const before = snapshotStates(input.beforeStates);\n const after = snapshotStates(input.afterStates);\n this.push({\n kind: 'provider',\n providerName: input.providerName,\n skipped: input.skipped,\n durationMs: input.durationMs,\n beforeTokens: this.includeTokenBreakdown ? before.tokens : 0,\n afterTokens: this.includeTokenBreakdown ? after.tokens : 0,\n tokenDelta: this.includeTokenBreakdown ? after.tokens - before.tokens : 0,\n tokensUsed: this.includeTokenBreakdown ? input.tokensUsed : 0,\n beforeKeptCount: before.keptCount,\n afterKeptCount: after.keptCount,\n strategiesApplied: [...input.strategiesApplied],\n remainingBudget: input.remainingBudget,\n });\n }\n\n recordMessageDecisions(states: ReadonlyArray<MessageProcessingState>): void {\n for (const state of states) {\n const kept = state.action.startsWith('keep_');\n this.push({\n kind: 'message-decision',\n originalIndex: state.originalIndex,\n ...(this.includeMessageIds ? { messageId: state.message.id } : {}),\n role: state.message.role,\n type: state.message.type,\n action: state.action,\n ...(state.phase ? { phase: state.phase } : {}),\n tokens: this.includeTokenBreakdown ? state.tokens : 0,\n kept,\n reason: buildDecisionReason(state, kept),\n ...(state.replacementSourceIds ? { replacementSourceIds: [...state.replacementSourceIds] } : {}),\n });\n }\n }\n\n build(finalMessages: ReadonlyArray<AiMessage>, finalTokens: number): ContextTrace {\n return {\n enabled: true,\n includeMessageIds: this.includeMessageIds,\n includeTokenBreakdown: this.includeTokenBreakdown,\n maxTraceEvents: this.maxTraceEvents,\n overflowed: this.overflowed,\n ...(this.effectivePolicy ? { effectivePolicy: this.effectivePolicy } : {}),\n totalBudget: this.totalBudget,\n originalCount: this.originalCount,\n finalCount: finalMessages.length,\n finalTokens,\n truncated: this.originalCount !== finalMessages.length,\n events: [...this.events],\n };\n }\n\n private push(event: ContextTraceEvent): void {\n if (this.events.length >= this.maxTraceEvents) {\n this.overflowed = true;\n return;\n }\n this.events.push(event);\n }\n}\n\nfunction snapshotStates(states: ReadonlyArray<MessageProcessingState>): ProviderSnapshot {\n return states.reduce<ProviderSnapshot>(\n (acc, state) => {\n if (state.action.startsWith('keep_')) {\n acc.tokens += state.tokens;\n acc.keptCount += 1;\n }\n return acc;\n },\n { tokens: 0, keptCount: 0 },\n );\n}\n\nfunction buildDecisionReason(state: MessageProcessingState, kept: boolean): string {\n if (kept) {\n return state.phase ? `kept_by_${state.phase}` : `kept_by_${state.action}`;\n }\n if (state.phase) {\n return `dropped_by_${state.phase}`;\n }\n return 'dropped_by_budget_or_priority';\n}\n","import type { AiMessage } from '../../../contracts';\n\nexport interface ToolSummaryProvider {\n getTool(toolName: string): {\n getExecutionSummary?: (output: string) => string;\n } | undefined;\n}\n\nexport interface PreprocessorContext {\n debugMode?: boolean;\n model?: string;\n toolSummaryProvider?: ToolSummaryProvider;\n}\n\nexport interface PreprocessorResult {\n messages: AiMessage[];\n stats: {\n originalCount: number;\n processedCount: number;\n removedCount: number;\n modifiedCount: number;\n };\n appliedStrategies: string[];\n}\n\nexport interface IPreprocessor {\n readonly name: string;\n readonly description: string;\n readonly priority: number;\n\n process(\n messages: AiMessage[],\n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean;\n}\n\nexport abstract class BasePreprocessor implements IPreprocessor {\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly priority: number;\n\n abstract process(\n messages: AiMessage[],\n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean {\n return false;\n }\n\n protected createResult(\n originalMessages: AiMessage[],\n processedMessages: AiMessage[],\n appliedStrategies: string[],\n modifiedCount: number = 0\n ): PreprocessorResult {\n const removedCount = originalMessages.length - processedMessages.length;\n\n return {\n messages: processedMessages,\n stats: {\n originalCount: originalMessages.length,\n processedCount: processedMessages.length,\n removedCount,\n modifiedCount,\n },\n appliedStrategies,\n };\n }\n\n protected debug(message: string, data?: Record<string, unknown>, context?: PreprocessorContext): void {\n if (context?.debugMode) {\n console.log(`[${this.name}] ${message}`, data);\n }\n }\n}\n","import {\n BasePreprocessor,\n type PreprocessorContext,\n type PreprocessorResult,\n} from './base';\nimport type { AiMessage } from '../../../contracts';\n\nexport interface HistoryPurificationConfig {\n logPrefix?: string;\n}\n\nexport class HistoryPurificationPreprocessor extends BasePreprocessor {\n readonly name = 'HistoryPurificationPreprocessor';\n readonly description = '基于摘要ID列表的历史净化处理器';\n readonly priority = 1;\n\n private logPrefix: string;\n\n constructor(config: HistoryPurificationConfig = {}) {\n super();\n this.logPrefix = config.logPrefix || 'HistoryPurification';\n }\n\n async process(messages: AiMessage[], context: PreprocessorContext): Promise<PreprocessorResult> {\n this.debug('🧹 开始历史净化处理', { 原始消息数: messages.length }, context);\n\n const cleanedMessages = this.cleanHistoryWithSummaryReplacement(messages, context);\n const removedCount = messages.length - cleanedMessages.length;\n const appliedStrategies = removedCount > 0 ? ['summary_replacement_cleanup'] : [];\n\n this.debug(\n '✅ 历史净化完成',\n {\n 原始消息: messages.length,\n 净化后消息: cleanedMessages.length,\n 移除消息: removedCount,\n },\n context,\n );\n\n return this.createResult(messages, cleanedMessages, appliedStrategies, 0);\n }\n\n shouldSkip(messages: AiMessage[], context: PreprocessorContext): boolean {\n const hasSummaryMessages = messages.some((msg) => msg.type === 'history_summary');\n if (!hasSummaryMessages) {\n this.debug('⏭️ 无摘要消息,跳过历史净化', {}, context);\n return true;\n }\n return false;\n }\n\n private findLatestSummary(summaryMessages: AiMessage[]): AiMessage {\n return summaryMessages.reduce((latest, current) => {\n const latestSeq = latest.metadata?.summarySeq ?? -1;\n const currentSeq = current.metadata?.summarySeq ?? -1;\n return currentSeq > latestSeq ? current : latest;\n }, summaryMessages[0]);\n }\n\n private cleanHistoryWithSummaryReplacement(\n messages: AiMessage[],\n context: PreprocessorContext,\n ): AiMessage[] {\n const summaryMessages = messages.filter((m) => m.type === 'history_summary');\n\n console.log(`[${this.logPrefix}] 🧹 开始历史净化(基于ID列表)`);\n console.log(`[${this.logPrefix}] 📊 总消息数: ${messages.length}, 摘要消息数: ${summaryMessages.length}`);\n\n this.debug(\n '🧹 开始历史净化',\n {\n 总消息数: messages.length,\n 摘要消息数: summaryMessages.length,\n },\n context,\n );\n\n if (summaryMessages.length === 0) {\n console.log(`[${this.logPrefix}] ⚠️ 未发现摘要消息,但不应该跳过(shouldSkip没有触发?)`);\n this.debug('⚠️ 未发现摘要消息', {}, context);\n return messages;\n }\n\n const latestSummary = this.findLatestSummary(summaryMessages);\n\n console.log(`[${this.logPrefix}] 📋 最新摘要:`, {\n id: latestSummary.id,\n summarySeq: latestSummary.metadata?.summarySeq,\n hasReplacedIds: Array.isArray(latestSummary.metadata?.replacedMessageIds),\n replacedCount: latestSummary.metadata?.replacedMessageIds?.length || 0,\n });\n\n this.debug(\n '📋 最新摘要',\n {\n id: latestSummary.id,\n summarySeq: latestSummary.metadata?.summarySeq,\n hasReplacedIds: Array.isArray(latestSummary.metadata?.replacedMessageIds),\n replacedCount: latestSummary.metadata?.replacedMessageIds?.length || 0,\n },\n context,\n );\n\n if (!latestSummary?.metadata?.replacedMessageIds || latestSummary.metadata.replacedMessageIds.length === 0) {\n this.debug('⏭️ 最新摘要缺少 replacedMessageIds,跳过净化', { summaryId: latestSummary?.id }, context);\n return messages;\n }\n\n const idsToRemove = new Set(latestSummary.metadata.replacedMessageIds);\n\n const summariesInInput = messages.filter((m) => m.type === 'history_summary');\n console.log(`[${this.logPrefix}] 📥 收到的消息列表:`, {\n 总消息数: messages.length,\n 摘要消息数: summariesInInput.length,\n 摘要ID列表: summariesInInput.map((s) => ({ id: s.id, seq: s.metadata?.summarySeq })),\n 消息类型分布: messages.reduce((acc, m) => {\n acc[m.type] = (acc[m.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n });\n\n const summaryIdsInRemoveList = summariesInInput.filter((s) => idsToRemove.has(s.id || ''));\n console.log(`[${this.logPrefix}] ⚠️ 摘要ID检查:`, {\n 摘要是否在移除列表: summaryIdsInRemoveList.length > 0,\n 被误标记的摘要: summaryIdsInRemoveList.map((s) => ({ id: s.id, seq: s.metadata?.summarySeq })),\n });\n\n console.log(`[${this.logPrefix}] 🎯 执行ID列表净化`, {\n 要移除的ID数量: idsToRemove.size,\n 示例ID: Array.from(idsToRemove).slice(0, 3),\n });\n\n this.debug(\n '🎯 执行ID列表净化',\n {\n 要移除的ID数量: idsToRemove.size,\n 示例ID: Array.from(idsToRemove).slice(0, 3),\n },\n context,\n );\n\n const removedMessages: AiMessage[] = [];\n const finalMessages = messages.filter((msg) => {\n if (msg.id === latestSummary.id) {\n return true;\n }\n\n if (idsToRemove.has(msg.id)) {\n removedMessages.push(msg);\n return false;\n }\n\n const sourceIds = msg.metadata?.replacementSourceIds as string[] | undefined;\n if (sourceIds && Array.isArray(sourceIds)) {\n for (const sourceId of sourceIds) {\n if (idsToRemove.has(sourceId)) {\n removedMessages.push(msg);\n return false;\n }\n }\n }\n\n return true;\n });\n\n const removedCount = messages.length - finalMessages.length;\n const coveredRemovedIds = new Set<string>();\n for (const removedMessage of removedMessages) {\n if (typeof removedMessage.id === 'string' && idsToRemove.has(removedMessage.id)) {\n coveredRemovedIds.add(removedMessage.id);\n }\n const sourceIds = removedMessage.metadata?.replacementSourceIds;\n if (Array.isArray(sourceIds)) {\n for (const sourceId of sourceIds) {\n if (typeof sourceId === 'string' && idsToRemove.has(sourceId)) {\n coveredRemovedIds.add(sourceId);\n }\n }\n }\n }\n\n if (coveredRemovedIds.size !== idsToRemove.size) {\n const missingIds = Array.from(idsToRemove).filter((id) => !coveredRemovedIds.has(id));\n console.log(`[${this.logPrefix}] 🔍 移除差异详情`, {\n 缺失ID数量: missingIds.length,\n 缺失ID示例: missingIds.slice(0, 5),\n });\n }\n\n const summariesAfterClean = finalMessages.filter((m) => m.type === 'history_summary');\n console.log(`[${this.logPrefix}] 📤 净化后的消息列表:`, {\n 净化后消息数: finalMessages.length,\n 摘要消息数: summariesAfterClean.length,\n 摘要ID列表: summariesAfterClean.map((s) => ({ id: s.id, seq: s.metadata?.summarySeq })),\n 消息类型分布: finalMessages.reduce((acc, m) => {\n acc[m.type] = (acc[m.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n });\n\n console.log(`[${this.logPrefix}] ✅ 净化完成: ${messages.length} → ${finalMessages.length} (移除了 ${removedCount} 条消息)`);\n console.log(\n `[${this.logPrefix}] 📊 要移除的ID数量: ${idsToRemove.size}, 实际移除消息: ${removedCount}, 覆盖source ids: ${coveredRemovedIds.size}`,\n );\n\n this.debug(\n '✅ 净化完成',\n {\n 原始消息: messages.length,\n 净化后消息: finalMessages.length,\n 实际移除: removedCount,\n 预期移除: idsToRemove.size,\n 覆盖sourceIds: coveredRemovedIds.size,\n },\n context,\n );\n\n if (coveredRemovedIds.size !== idsToRemove.size) {\n console.log(`[${this.logPrefix}] ⚠️ 移除数量不匹配`, {\n 预期: idsToRemove.size,\n 实际覆盖: coveredRemovedIds.size,\n 差异: idsToRemove.size - coveredRemovedIds.size,\n });\n\n this.debug(\n '⚠️ 移除数量不匹配',\n {\n 预期: idsToRemove.size,\n 实际覆盖: coveredRemovedIds.size,\n 差异: idsToRemove.size - coveredRemovedIds.size,\n },\n context,\n );\n }\n\n return finalMessages;\n }\n}\n","import type { AiMessage } from '../../../contracts';\nimport type { FenceRegistry } from '../fences';\nimport { BasePreprocessor, type PreprocessorContext, type PreprocessorResult } from './base';\n\nexport interface FenceLifetimePreprocessorOptions {\n fenceRegistry: FenceRegistry;\n}\n\nexport class FenceLifetimePreprocessor extends BasePreprocessor {\n readonly name = 'FenceLifetimePreprocessor';\n readonly description = 'Removes expired turn-only context injection messages from history';\n readonly priority = 15;\n\n private readonly fenceRegistry: FenceRegistry;\n\n constructor(options: FenceLifetimePreprocessorOptions) {\n super();\n this.fenceRegistry = options.fenceRegistry;\n }\n\n async process(\n messages: AiMessage[],\n context: PreprocessorContext,\n ): Promise<PreprocessorResult> {\n const latestUserInputIndex = findLastIndex(messages, message => {\n return message.role === 'user' && message.type === 'user_input';\n });\n let modifiedCount = 0;\n const processedMessages: AiMessage[] = [];\n\n for (let index = 0; index < messages.length; index++) {\n const message = messages[index];\n if (message.type !== 'context_injection') {\n processedMessages.push(message);\n continue;\n }\n\n const fenceKind = message.metadata?.fenceKind;\n if (!fenceKind) {\n processedMessages.push(message);\n continue;\n }\n\n const descriptor = this.fenceRegistry.get(fenceKind);\n if (!descriptor) {\n this.debug(`Fence kind \"${fenceKind}\" is not registered; keeping message.`, { messageId: message.id }, context);\n processedMessages.push(message);\n continue;\n }\n\n const isHistorical = latestUserInputIndex === -1 || index < latestUserInputIndex;\n if (descriptor.lifetime === 'turn-only' && isHistorical) {\n modifiedCount++;\n continue;\n }\n\n processedMessages.push(message);\n }\n\n return this.createResult(\n messages,\n processedMessages,\n modifiedCount > 0 ? ['fence_lifetime'] : [],\n modifiedCount,\n );\n }\n}\n\nfunction findLastIndex<T>(items: T[], predicate: (item: T) => boolean): number {\n for (let index = items.length - 1; index >= 0; index--) {\n if (predicate(items[index])) {\n return index;\n }\n }\n return -1;\n}\n","import type { AiMessage } from '../../../contracts';\nimport type { FenceDescriptor, FenceRegistry } from '../fences';\nimport { BasePreprocessor, type PreprocessorContext, type PreprocessorResult } from './base';\n\nexport interface CurrentTurnMessageAssemblerOptions {\n fenceRegistry: FenceRegistry;\n}\n\ntype UserFencePlacement = 'before-current-user' | 'after-current-user';\n\ninterface CollectedFence {\n index: number;\n message: AiMessage;\n descriptor: FenceDescriptor;\n}\n\ninterface AssemblyResult {\n messages: AiMessage[];\n modifiedCount: number;\n}\n\n/**\n * 组装当前轮 prompt block。\n *\n * 中文说明:\n * - formatter 只负责把单条消息转成 wire 形态,不负责猜测相邻消息是否应该合并;\n * - 当前轮 system-side fence 在这里合入 system_prompt;\n * - 当前轮 user-side fence 在这里合入同一条 user_input,未注入的 fence 不产生空标签。\n */\nexport class CurrentTurnMessageAssembler extends BasePreprocessor {\n readonly name = 'CurrentTurnMessageAssembler';\n readonly description = 'Assembles current-turn fences into system_prompt and user_input messages';\n readonly priority = 10;\n\n private readonly fenceRegistry: FenceRegistry;\n\n constructor(options: CurrentTurnMessageAssemblerOptions) {\n super();\n this.fenceRegistry = options.fenceRegistry;\n }\n\n async process(messages: AiMessage[], _context: PreprocessorContext): Promise<PreprocessorResult> {\n const systemResult = assembleSystemPrompt({ messages, fenceRegistry: this.fenceRegistry });\n const userResult = assembleCurrentUserInput({\n messages: systemResult.messages,\n fenceRegistry: this.fenceRegistry,\n });\n const modifiedCount = systemResult.modifiedCount + userResult.modifiedCount;\n\n return this.createResult(\n messages,\n userResult.messages,\n modifiedCount > 0 ? ['current_turn_message_assembly'] : [],\n modifiedCount,\n );\n }\n}\n\nfunction assembleSystemPrompt(params: {\n messages: readonly AiMessage[];\n fenceRegistry: FenceRegistry;\n}): AssemblyResult {\n const systemIndex = params.messages.findIndex(message =>\n message.role === 'system' && message.type === 'system_prompt'\n );\n if (systemIndex === -1) {\n return { messages: [...params.messages], modifiedCount: 0 };\n }\n\n const fences = collectAdjacentFences({\n messages: params.messages,\n startIndex: systemIndex + 1,\n direction: 1,\n fenceRegistry: params.fenceRegistry,\n matches: descriptor => descriptor.llmRole === 'system' && descriptor.placement === 'after-system',\n });\n if (fences.length === 0) {\n return { messages: [...params.messages], modifiedCount: 0 };\n }\n\n const indexesToRemove = new Set(fences.map(fence => fence.index));\n const systemPrompt = params.messages[systemIndex];\n const assembledSystemPrompt: AiMessage = {\n ...systemPrompt,\n content: [\n systemPrompt.content,\n ...fences.map(formatFence),\n ].join('\\n\\n'),\n metadata: {\n ...systemPrompt.metadata,\n assembledFenceKinds: fences\n .map(fence => fence.message.metadata?.fenceKind)\n .filter((kind): kind is string => typeof kind === 'string'),\n },\n };\n\n return {\n messages: params.messages.map((message, index) =>\n index === systemIndex ? assembledSystemPrompt : message\n ).filter((_, index) => !indexesToRemove.has(index)),\n modifiedCount: fences.length + 1,\n };\n}\n\nfunction assembleCurrentUserInput(params: {\n messages: readonly AiMessage[];\n fenceRegistry: FenceRegistry;\n}): AssemblyResult {\n const currentUserIndex = findLastUserInputIndex(params.messages);\n if (currentUserIndex === -1) {\n return { messages: [...params.messages], modifiedCount: 0 };\n }\n\n const beforeFences = collectAdjacentFences({\n messages: params.messages,\n startIndex: currentUserIndex - 1,\n direction: -1,\n fenceRegistry: params.fenceRegistry,\n matches: descriptor => isUserCurrentTurnPlacement(descriptor, 'before-current-user'),\n }).reverse();\n const afterFences = collectAdjacentFences({\n messages: params.messages,\n startIndex: currentUserIndex + 1,\n direction: 1,\n fenceRegistry: params.fenceRegistry,\n matches: descriptor => isUserCurrentTurnPlacement(descriptor, 'after-current-user'),\n });\n\n if (beforeFences.length === 0 && afterFences.length === 0) {\n return { messages: [...params.messages], modifiedCount: 0 };\n }\n\n const indexesToRemove = new Set([\n ...beforeFences.map(fence => fence.index),\n ...afterFences.map(fence => fence.index),\n ]);\n const currentUser = params.messages[currentUserIndex];\n const assembledUser: AiMessage = {\n ...currentUser,\n content: [\n ...beforeFences.map(formatFence),\n wrapUserRequest(currentUser.content),\n ...afterFences.map(formatFence),\n ].join('\\n\\n'),\n metadata: {\n ...currentUser.metadata,\n assembledFenceKinds: [\n ...beforeFences.map(fence => fence.message.metadata?.fenceKind),\n ...afterFences.map(fence => fence.message.metadata?.fenceKind),\n ].filter((kind): kind is string => typeof kind === 'string'),\n },\n };\n\n return {\n messages: params.messages.map((message, index) =>\n index === currentUserIndex ? assembledUser : message\n ).filter((_, index) => !indexesToRemove.has(index)),\n modifiedCount: indexesToRemove.size + 1,\n };\n}\n\nfunction findLastUserInputIndex(messages: readonly AiMessage[]): number {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role === 'user' && message.type === 'user_input') {\n return index;\n }\n }\n return -1;\n}\n\nfunction collectAdjacentFences(params: {\n messages: readonly AiMessage[];\n startIndex: number;\n direction: -1 | 1;\n fenceRegistry: FenceRegistry;\n matches: (descriptor: FenceDescriptor) => boolean;\n}): CollectedFence[] {\n const result: CollectedFence[] = [];\n\n for (\n let index = params.startIndex;\n index >= 0 && index < params.messages.length;\n index += params.direction\n ) {\n const message = params.messages[index];\n if (message.type !== 'context_injection') {\n break;\n }\n\n const fenceKind = message.metadata?.fenceKind;\n if (!fenceKind) {\n break;\n }\n\n const descriptor = params.fenceRegistry.get(fenceKind);\n if (!descriptor || !params.matches(descriptor)) {\n break;\n }\n\n result.push({ index, message, descriptor });\n }\n\n return result;\n}\n\nfunction isUserCurrentTurnPlacement(\n descriptor: FenceDescriptor,\n placement: UserFencePlacement,\n): boolean {\n return descriptor.llmRole === 'user' && descriptor.placement === placement;\n}\n\nfunction formatFence(fence: CollectedFence): string {\n return fence.descriptor.formatter(fence.message.content, fence.message.metadata?.fenceAttrs ?? {});\n}\n\nfunction wrapUserRequest(content: string): string {\n return `<user_request>\\n${content.trim()}\\n</user_request>`;\n}\n","import type {\n GenerateRequest,\n GenerateResponse,\n} from '../contracts/chatLineMessage';\nimport type { AiMessage, RuntimeEvent } from '../../../contracts';\n\nexport interface MessageProcessingState {\n message: AiMessage;\n originalIndex: number;\n action: 'keep_core' | 'keep_working_memory' | 'summarize' | 'skip';\n tokens: number;\n processedContent?: string;\n contentType?: 'full' | 'final_answer_only' | 'thinking_only';\n phase?: string;\n replacementSourceIds?: string[];\n}\n\nexport interface SummarizationCallbacks {\n onSummarizationStart?: () => void;\n onSummarizationEnd?: (info: {\n originalMessageCount: number;\n summaryTokenCount?: number;\n newSummaryId?: string;\n summaryEvent?: RuntimeEvent;\n }) => void;\n onSummarizationError?: (error: Error) => void;\n}\n\nexport interface ProviderContext<TConfig = unknown> {\n totalBudget: number;\n config: TConfig;\n debugMode: boolean;\n estimateTokens: (message: AiMessage) => number;\n summarizationCallbacks?: SummarizationCallbacks;\n /**\n * Host 注入的注册式 AI 调用入口。\n *\n * 中文备注:调用方必须通过 request.promptKey / agentId 解析已注册 agent/chat;\n * framework 不应在 Provider 内直接发起裸 LLM call。\n */\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>;\n}\n\nexport interface ProviderResult {\n states: MessageProcessingState[];\n tokensUsed: number;\n strategiesApplied: string[];\n stats: {\n processedCount: number;\n skippedCount: number;\n addedCount: number;\n };\n events?: RuntimeEvent[];\n}\n\nexport const TOOL_HISTORY_OVERFLOW_ERROR_CODE = 'TOOL_HISTORY_OVERFLOW' as const;\nexport const SUMMARIZATION_FAILED_ERROR_CODE = 'SUMMARIZATION_FAILED' as const;\n\nexport type ContextProviderErrorCode =\n | 'context_provider_failed'\n | typeof SUMMARIZATION_FAILED_ERROR_CODE\n | typeof TOOL_HISTORY_OVERFLOW_ERROR_CODE;\n\nexport interface ContextProviderErrorOptions {\n code: ContextProviderErrorCode;\n fatal?: boolean;\n providerName: string;\n message: string;\n cause?: unknown;\n}\n\n/**\n * Provider 内部向 pipeline 传递的结构化错误。\n *\n * 中文备注:\n * - pipeline 只能依赖 code/fatal 这类稳定字段做控制流判断;\n * - message 只用于日志和用户可见错误,不再承担协议语义。\n */\nexport class ContextProviderError extends Error {\n readonly code: ContextProviderErrorCode;\n readonly fatal: boolean;\n readonly providerName: string;\n readonly cause?: unknown;\n\n constructor(options: ContextProviderErrorOptions) {\n super(options.message);\n this.name = 'ContextProviderError';\n this.code = options.code;\n this.fatal = options.fatal ?? false;\n this.providerName = options.providerName;\n this.cause = options.cause;\n }\n}\n\nexport function isContextProviderError(error: unknown): error is ContextProviderError {\n return error instanceof ContextProviderError;\n}\n\nexport interface IContextProvider<TConfig = unknown> {\n readonly name: string;\n readonly description: string;\n readonly priority: number;\n\n provide(\n states: MessageProcessingState[],\n availableBudget: number,\n context: ProviderContext<TConfig>,\n ): Promise<ProviderResult>;\n\n shouldSkip?(\n states: MessageProcessingState[],\n availableBudget: number,\n context: ProviderContext<TConfig>,\n ): boolean;\n}\n\nexport abstract class BaseContextProvider<TConfig = unknown>\n implements IContextProvider<TConfig>\n{\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly priority: number;\n\n abstract provide(\n states: MessageProcessingState[],\n availableBudget: number,\n context: ProviderContext<TConfig>,\n ): Promise<ProviderResult>;\n\n shouldSkip(\n _states: MessageProcessingState[],\n availableBudget: number,\n _context: ProviderContext<TConfig>,\n ): boolean {\n return availableBudget <= 0;\n }\n\n protected debug(\n message: string,\n data?: Record<string, unknown>,\n context?: ProviderContext<TConfig>,\n ): void {\n if (context?.debugMode) {\n console.log(`[${this.name}] ${message}`, data);\n }\n }\n\n protected createResult(\n states: MessageProcessingState[],\n tokensUsed = 0,\n strategiesApplied: string[] = [],\n stats = { processedCount: 0, skippedCount: 0, addedCount: 0 },\n events: RuntimeEvent[] = [],\n ): ProviderResult {\n return {\n states,\n tokensUsed,\n strategiesApplied,\n stats,\n ...(events.length > 0 && { events }),\n };\n }\n}\n","import { get_encoding, Tiktoken } from 'tiktoken';\nimport type { LlmRequestMessage } from '../ports';\n\nexport type TokenEncodingName = Parameters<typeof get_encoding>[0];\n\nexport interface TokenEstimateOptions {\n /**\n * tiktoken encoding 名称,或历史兼容的模型标识。\n *\n * 中文说明:如果传入的是 `gpt-4o` / `claude` 这类模型名,会按旧逻辑映射到 encoding;\n * 如果传入的是 `cl100k_base` / `o200k_base`,则直接使用对应 encoding。\n */\n encoding?: string;\n /** tiktoken 不可用或未指定 encoding 时的字符/token 兜底比。 */\n avgCharsPerToken?: number;\n /** 单个 tool_call 的额外 token 开销估算。 */\n toolCallOverhead?: number;\n}\n\nexport class TokenCalculator {\n private static readonly BYTES_PER_TOKEN_LATIN = 4;\n private static readonly BYTES_PER_TOKEN_CJK = 3;\n private static readonly OVERHEAD_PER_MESSAGE = 5;\n private static readonly OVERHEAD_PER_TOOL_CALL = 10;\n private static encoderCache = new Map<TokenEncodingName, Tiktoken>();\n private static readonly DEFAULT_ENCODING: TokenEncodingName = 'cl100k_base';\n private static readonly SUPPORTED_ENCODINGS = [\n 'gpt2',\n 'r50k_base',\n 'p50k_base',\n 'p50k_edit',\n 'cl100k_base',\n 'o200k_base',\n ] as const satisfies readonly TokenEncodingName[];\n\n private static resolveEncodingFromModelIdentifier(modelIdentifier: string): TokenEncodingName {\n const normalized = (modelIdentifier || '').trim().toLowerCase();\n\n if (this.isSupportedEncodingName(normalized)) {\n return normalized;\n }\n\n if (normalized.includes('deepseek')) {\n return 'cl100k_base';\n }\n\n if (normalized.includes('gpt-4o') || normalized.startsWith('o1')) {\n return 'o200k_base';\n }\n\n if (normalized.includes('gemini') || normalized.includes('claude')) {\n return 'cl100k_base';\n }\n\n return this.DEFAULT_ENCODING;\n }\n\n private static isSupportedEncodingName(value: string): value is TokenEncodingName {\n return this.SUPPORTED_ENCODINGS.some(encoding => encoding === value);\n }\n\n private static getEncoder(modelIdentifierOrEncoding: string): Tiktoken {\n const encodingName = this.resolveEncodingFromModelIdentifier(modelIdentifierOrEncoding);\n const cached = this.encoderCache.get(encodingName);\n if (cached) {\n return cached;\n }\n\n const encoder = get_encoding(encodingName);\n this.encoderCache.set(encodingName, encoder);\n return encoder;\n }\n\n public static estimateTokensRough(text: string | null | undefined, _modelIdentifier?: string): number {\n if (!text) return 0;\n\n const hasCJK = /[\\u4e00-\\u9fa5]|[\\u3040-\\u30ff]|[\\uac00-\\ud7af]/.test(text);\n const ratio = hasCJK ? this.BYTES_PER_TOKEN_CJK : this.BYTES_PER_TOKEN_LATIN;\n const byteLength = new TextEncoder().encode(text).length;\n\n return Math.ceil(byteLength / ratio);\n }\n\n public static estimateTokens(text: string | null | undefined, options: TokenEstimateOptions = {}): number {\n if (!text) return 0;\n\n if (options.encoding) {\n try {\n return this.estimateTokensPrecise(text, options.encoding);\n } catch {\n // 中文备注:tiktoken 运行时不可用时退回声明式 avgCharsPerToken,保证上下文构建不中断。\n }\n }\n\n const avgCharsPerToken = normalizePositiveNumber(options.avgCharsPerToken, 2);\n return Math.ceil(text.length / avgCharsPerToken);\n }\n\n public static estimateTokensPrecise(text: string | null | undefined, modelIdentifier: string): number {\n if (!text) return 0;\n const encoder = this.getEncoder(modelIdentifier);\n return encoder.encode(text).length;\n }\n\n public static estimateMessageTokens(\n message: LlmRequestMessage,\n options: TokenEstimateOptions = {},\n ): number {\n let totalTokens = this.OVERHEAD_PER_MESSAGE;\n\n if (message.content) {\n totalTokens += this.estimateTokens(String(message.content), options);\n }\n\n const toolCalls = this.extractToolCallsForTokenEstimate(message);\n const toolCallOverhead = normalizeNonNegativeInteger(options.toolCallOverhead, this.OVERHEAD_PER_TOOL_CALL);\n for (const toolCall of toolCalls) {\n totalTokens += toolCallOverhead;\n const fn = toolCall['function'];\n if (fn && typeof fn === 'object' && !Array.isArray(fn)) {\n const fnRecord = fn as Record<string, unknown>;\n totalTokens += this.estimateTokens(String(fnRecord['name'] ?? ''), options);\n totalTokens += this.estimateTokens(String(fnRecord['arguments'] ?? ''), options);\n }\n }\n\n const toolCallId = this.extractToolCallIdForTokenEstimate(message);\n if (toolCallId) {\n totalTokens += this.estimateTokens(toolCallId, options);\n }\n\n return totalTokens;\n }\n\n public static estimateMessageTokensPrecise(message: LlmRequestMessage, modelIdentifier: string): number {\n return this.estimateMessageTokens(message, {\n encoding: modelIdentifier,\n toolCallOverhead: this.OVERHEAD_PER_TOOL_CALL,\n });\n }\n\n public static estimateMessagesTokensPrecise(messages: LlmRequestMessage[], modelIdentifier: string): number {\n return messages.reduce((total, msg) => total + this.estimateMessageTokensPrecise(msg, modelIdentifier), 0);\n }\n\n private static extractToolCallsForTokenEstimate(message: LlmRequestMessage): unknown[] {\n const direct = 'tool_calls' in message ? message.tool_calls : undefined;\n if (Array.isArray(direct)) return direct;\n\n const metadata = 'metadata' in message ? message.metadata : undefined;\n if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) return [];\n const metadataRecord = metadata as Record<string, unknown>;\n const metadataToolCalls = metadataRecord['tool_calls'];\n return Array.isArray(metadataToolCalls) ? metadataToolCalls : [];\n }\n\n private static extractToolCallIdForTokenEstimate(message: LlmRequestMessage): string | undefined {\n if ('tool_call_id' in message && typeof message.tool_call_id === 'string') {\n return message.tool_call_id;\n }\n\n const metadata = 'metadata' in message ? message.metadata : undefined;\n if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) return undefined;\n const metadataRecord = metadata as Record<string, unknown>;\n const toolCallId = metadataRecord['tool_call_id'];\n return typeof toolCallId === 'string' ? toolCallId : undefined;\n }\n\n public static truncateTextByTokens(\n text: string,\n maxTokens: number,\n modelIdentifier: string,\n strategy: 'start' | 'end' | 'middle' = 'end',\n ): string {\n if (!text || maxTokens <= 0) return '';\n\n const encoder = this.getEncoder(modelIdentifier);\n const tokens = encoder.encode(text);\n\n if (tokens.length <= maxTokens) {\n return text;\n }\n\n let truncatedTokens: Uint32Array;\n const ellipsis = '...';\n\n switch (strategy) {\n case 'start':\n truncatedTokens = tokens.slice(0, maxTokens);\n return encoder.decode(truncatedTokens) + ellipsis;\n case 'end':\n truncatedTokens = tokens.slice(tokens.length - maxTokens);\n return ellipsis + encoder.decode(truncatedTokens);\n case 'middle': {\n const half = Math.floor(maxTokens / 2);\n const head = tokens.slice(0, half);\n const tail = tokens.slice(tokens.length - (maxTokens - half));\n return encoder.decode(head) + ellipsis + encoder.decode(tail);\n }\n default:\n truncatedTokens = tokens.slice(0, maxTokens);\n return encoder.decode(truncatedTokens) + ellipsis;\n }\n }\n\n public static cleanup(): void {\n for (const encoder of this.encoderCache.values()) {\n encoder.free();\n }\n this.encoderCache.clear();\n }\n}\n\nfunction normalizePositiveNumber(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return fallback;\n }\n return Math.max(0, Math.floor(value));\n}\n","import type { MessageProcessingState } from '../providers/base';\nimport { TokenCalculator } from '../../../shared/TokenCalculator';\nimport type { SummarizationProviderContext } from './config';\n\nexport class SummarizationTrigger {\n static shouldSkip(\n states: MessageProcessingState[],\n availableBudget: number,\n context: SummarizationProviderContext\n ): boolean {\n const usedTokens = this.calculateUsedTokens(states);\n const usagePercentage = usedTokens / availableBudget;\n return usagePercentage < context.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n }\n\n static shouldTriggerSummarization(\n states: MessageProcessingState[],\n remainingBudget: number,\n totalBudget: number,\n context: SummarizationProviderContext,\n debugFn: (\n message: string,\n data: Record<string, unknown>,\n context: SummarizationProviderContext,\n ) => void,\n ): boolean {\n const usedTokensRough = this.calculateUsedTokens(states);\n const threshold = totalBudget * context.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n const lowerBound = threshold * 0.9;\n if (usedTokensRough < lowerBound) {\n return false;\n }\n\n debugFn('📝 估算Token接近摘要阈值,切换到精确计算', {\n usedTokensRough,\n threshold,\n }, context);\n\n const messagesToKeep = states\n .filter((s) => s.action.startsWith('keep_'))\n .map((s) => s.message);\n const modelIdentifier = context.config.TOKEN_ENCODING_NAME;\n const usedTokensPrecise = messagesToKeep.reduce(\n (total, msg) => total + TokenCalculator.estimateTokensPrecise(msg.content, modelIdentifier),\n 0\n );\n\n debugFn('📊 精确计算结果', {\n usedTokensPrecise,\n threshold,\n shouldTrigger: usedTokensPrecise >= threshold,\n }, context);\n\n return usedTokensPrecise >= threshold;\n }\n\n static calculateUsedTokens(states: MessageProcessingState[]): number {\n return states\n .filter((s) => s.action.startsWith('keep_'))\n .reduce((total, state) => total + state.tokens, 0);\n }\n}\n","import type { MessageProcessingState } from '../providers/base';\nimport type { SummarizationProviderContext } from './config';\n\nexport class SummarizationCandidateSelector {\n static identifySummarizationCandidates(\n workingMemoryStates: MessageProcessingState[],\n context: SummarizationProviderContext,\n options: { fullStateList?: MessageProcessingState[] } = {}\n ): {\n allCandidates: MessageProcessingState[];\n coreCandidates: MessageProcessingState[];\n } {\n const { fullStateList } = options;\n const isValuable = (state: MessageProcessingState) => {\n if (state.message.type === 'system_prompt' || state.message.type === 'context_injection') {\n return false;\n }\n return true;\n };\n\n const allScopeStates = fullStateList ?? workingMemoryStates;\n const allValuableMessages = allScopeStates.filter(isValuable);\n const workingValuableMessages = workingMemoryStates.filter(isValuable);\n const coreMessages = workingValuableMessages.filter((state) => {\n return state.message.type === 'user_input'\n || state.message.type === 'final_answer'\n || state.message.type === 'history_summary';\n });\n\n console.log('[SummarizationCandidateSelector] 🔍 筛选消息(两步):', {\n 输入消息数: workingMemoryStates.length,\n 摘要范围候选: allValuableMessages.length,\n 核心对话消息: coreMessages.length,\n 所有消息类型分布: allValuableMessages.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n 核心消息类型分布: coreMessages.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n });\n\n if (coreMessages.length <= 4) {\n return { allCandidates: [], coreCandidates: [] };\n }\n\n const sortedCoreMessages = coreMessages.sort((a, b) => {\n if (a.message.type === 'history_summary' && b.message.type !== 'history_summary') {\n return -1;\n }\n if (b.message.type === 'history_summary' && a.message.type !== 'history_summary') {\n return 1;\n }\n return a.originalIndex - b.originalIndex;\n });\n\n const summarizationCount = Math.ceil(sortedCoreMessages.length * context.config.SUMMARY_OLDEST_MESSAGES_PERCENTAGE);\n const lastUserInputIndex = sortedCoreMessages.map((s) => s.message.type).lastIndexOf('user_input');\n const maxSummarizationCount = lastUserInputIndex >= 0\n ? lastUserInputIndex\n : Math.max(0, sortedCoreMessages.length - 2);\n const actualSummarizationCount = Math.min(summarizationCount, maxSummarizationCount);\n\n if (actualSummarizationCount <= 0) {\n return { allCandidates: [], coreCandidates: [] };\n }\n\n const coreCandidatesSlice = sortedCoreMessages.slice(0, actualSummarizationCount);\n const coreCandidatesForPrompt = this.selectCompleteConversationPairs(coreCandidatesSlice, workingMemoryStates);\n const coreIndices = coreCandidatesForPrompt.map((s) => s.originalIndex);\n const minIndex = Math.min(...coreIndices);\n const maxIndex = Math.max(...coreIndices);\n\n console.log('[SummarizationCandidateSelector] 📐 计算替换范围:', {\n 核心候选数: coreCandidatesForPrompt.length,\n minIndex,\n maxIndex,\n 范围大小: maxIndex - minIndex + 1,\n });\n\n const allCandidatesInRange = allValuableMessages.filter((state) => {\n return state.originalIndex >= minIndex && state.originalIndex <= maxIndex;\n });\n\n console.log('[SummarizationCandidateSelector] ✅ 最终候选消息:', {\n 所有候选数: allCandidatesInRange.length,\n 核心候选数: coreCandidatesForPrompt.length,\n 所有候选类型: allCandidatesInRange.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n });\n\n return {\n allCandidates: allCandidatesInRange,\n coreCandidates: coreCandidatesForPrompt,\n };\n }\n\n static selectCompleteConversationPairs(\n candidates: MessageProcessingState[],\n workingSet: MessageProcessingState[]\n ): MessageProcessingState[] {\n const result: MessageProcessingState[] = [];\n let i = 0;\n\n while (i < candidates.length) {\n const current = candidates[i];\n if (current.message.type === 'history_summary') {\n result.push(current);\n i++;\n continue;\n }\n if (current.message.type === 'user_input') {\n result.push(current);\n if (i + 1 < candidates.length && candidates[i + 1].message.type === 'final_answer') {\n result.push(candidates[i + 1]);\n i += 2;\n } else {\n i++;\n }\n continue;\n }\n if (current.message.type === 'final_answer') {\n result.push(current);\n i++;\n continue;\n }\n i++;\n }\n\n return result;\n }\n}\n","/**\n * @file AISummaryGenerator.ts\n * @description AI摘要生成器 - 负责与AI模型交互生成摘要\n */\n\nimport type { MessageProcessingState } from '../providers/base';\nimport type {\n GenerateRequest,\n GenerateResponse,\n} from '../contracts/chatLineMessage';\nimport type { AiMessage } from '../../../contracts';\nimport type { SummarizationProviderContext } from './config';\n\nexport interface SummarizationOptions {\n maxSummaryTokens: number;\n targetCompressionRatio?: number;\n /**\n * 执行摘要的已注册 agent/chat ID。\n *\n * 中文备注:linnkit 不持有 prompt 正文,也不直接决定模型调用;这里只携带注册引用,\n * 真正的 prompt 构建与模型策略由 host 的注册表解释。\n */\n agentId: string;\n modelId: string | null;\n fallbackModelId?: string | null;\n language: 'zh' | 'en' | 'auto';\n failureBehavior?: 'fail-fast' | 'continue-if-within-budget';\n /** 内部调参与测试注入,默认保持生产重试行为。 */\n maxRetries?: number;\n /** 内部调参与测试注入,默认 1000ms。 */\n retryDelayMs?: number;\n}\n\nexport class AISummaryGenerator {\n private readonly defaultOptions: SummarizationOptions;\n private readonly fallbackModelId: string | null;\n private readonly MAX_RETRIES: number;\n private readonly RETRY_DELAY_MS: number;\n\n constructor(options: SummarizationOptions) {\n this.defaultOptions = options;\n this.fallbackModelId = options.fallbackModelId ?? null;\n this.MAX_RETRIES = normalizePositiveInteger(options.maxRetries, 3);\n this.RETRY_DELAY_MS = normalizeNonNegativeInteger(options.retryDelayMs, 1000);\n }\n\n async generateHistorySummary(\n candidates: MessageProcessingState[],\n context: SummarizationProviderContext,\n debugFn: (\n message: string,\n data: Record<string, unknown>,\n context: SummarizationProviderContext,\n ) => void,\n ): Promise<string> {\n const effectiveGenerate = context.generate;\n if (!effectiveGenerate) {\n throw new Error(\n '[AISummaryGenerator] ProviderContext.generate is required. ' +\n 'Inject summarization generation from host or profile orchestration.'\n );\n }\n\n if (!this.defaultOptions.modelId) {\n throw new Error(\n '[AISummaryGenerator] No summarization model configured. ' +\n 'Inject model selection from product/provider assembly.'\n );\n }\n\n const conversationText = this.formatMessagesForSummary(candidates.map((c) => c.message));\n\n debugFn('开始AI摘要生成', {\n messageCount: candidates.length,\n textLength: conversationText.length,\n primaryModel: this.defaultOptions.modelId,\n fallbackModel: this.fallbackModelId,\n }, context);\n\n const primaryResult = await this.tryGenerateSummaryWithRetries(\n effectiveGenerate,\n conversationText,\n this.defaultOptions.modelId,\n this.MAX_RETRIES,\n context,\n debugFn\n );\n\n if (primaryResult.success) {\n return primaryResult.summary!;\n }\n\n if (!this.fallbackModelId) {\n throw new Error(`摘要生成失败(无可用降级模型)。主模型(${this.defaultOptions.modelId})错误: ${primaryResult.error}`);\n }\n\n debugFn('⚠️ 主模型摘要失败,尝试降级到备用模型', {\n primaryModel: this.defaultOptions.modelId,\n fallbackModel: this.fallbackModelId,\n primaryError: primaryResult.error,\n }, context);\n\n const fallbackResult = await this.tryGenerateSummaryWithRetries(\n effectiveGenerate,\n conversationText,\n this.fallbackModelId,\n this.MAX_RETRIES,\n context,\n debugFn\n );\n\n if (fallbackResult.success) {\n return fallbackResult.summary!;\n }\n\n debugFn('❌ 主模型和备用模型均失败,摘要化终止', {\n primaryModel: this.defaultOptions.modelId,\n fallbackModel: this.fallbackModelId,\n primaryError: primaryResult.error,\n fallbackError: fallbackResult.error,\n }, context);\n\n throw new Error(\n `摘要生成完全失败。主模型(${this.defaultOptions.modelId})错误: ${primaryResult.error}; ` +\n `备用模型(${this.fallbackModelId})错误: ${fallbackResult.error}`\n );\n }\n\n private async tryGenerateSummaryWithRetries(\n generate: (request: GenerateRequest) => Promise<GenerateResponse>,\n conversationText: string,\n modelId: string,\n maxRetries: number,\n context: SummarizationProviderContext,\n debugFn: (\n message: string,\n data: Record<string, unknown>,\n context: SummarizationProviderContext,\n ) => void,\n ): Promise<{ success: true; summary: string } | { success: false; error: string }> {\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n debugFn(`🔄 尝试生成摘要 (模型: ${modelId}, 第${attempt}/${maxRetries}次)`, {\n modelId,\n attempt,\n maxRetries,\n }, context);\n\n const summaryRequest: GenerateRequest = {\n promptKey: this.defaultOptions.agentId,\n modelId,\n prompt: conversationText,\n };\n\n const response = await generate(summaryRequest);\n const summary = response.generatedText;\n\n if (!summary.trim()) {\n throw new Error('AI返回了空的摘要内容');\n }\n\n debugFn('✅ 摘要生成成功', {\n modelId,\n attempt,\n summaryLength: summary.length,\n }, context);\n\n return { success: true, summary: summary.trim() };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n debugFn(`❌ 摘要生成失败 (模型: ${modelId}, 第${attempt}/${maxRetries}次)`, {\n modelId,\n attempt,\n error: lastError.message,\n }, context);\n\n if (attempt < maxRetries) {\n await this.sleep(attempt * this.RETRY_DELAY_MS);\n }\n }\n }\n\n return {\n success: false,\n error: lastError?.message || 'Unknown error',\n };\n }\n\n private formatMessagesForSummary(messages: AiMessage[]): string {\n return messages\n .map((message) => `${message.role}: ${message.content}`)\n .join('\\n\\n');\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nfunction normalizePositiveInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {\n return fallback;\n }\n return Math.floor(value);\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return fallback;\n }\n return Math.max(0, Math.floor(value));\n}\n","/**\n * Isomorphic ID generators.\n *\n * 设计约束:\n * - linnkit 是同构 package(既会被 Node-side host 使用,也会被前端 renderer 通过\n * `linnkit/runtime-kernel/events` 等子入口透传 transitive import 拖入 bundle)。\n * - 因此本文件不允许 `import { randomUUID } from 'crypto'`:那会触发 vite\n * `__vite-browser-external` shim,构建时 named import 解析失败。\n * - 改用 Web Crypto API(`globalThis.crypto.randomUUID`),它在所有现代浏览器\n * 与 Node 19+ 上都内置;老 Node 也可通过 `globalThis.crypto.randomUUID` 访问\n * (Node 14.17+ 在 `node:crypto` 暴露了 `webcrypto`,并自 19 起把 `crypto`\n * 挂到 globalThis)。\n * - 极端 fallback:若运行环境同时缺 Web Crypto,则降级为 Math.random RFC4122 v4\n * 生成器;这些 ID 仅用于会话/消息/run/exec/trace 内部去重展示,不承担加密\n * 强度要求,降级在语义上是安全的。\n */\n\ntype WebCryptoLike = { randomUUID?: () => string };\n\nfunction isoRandomUUID(): string {\n const c = (globalThis as unknown as { crypto?: WebCryptoLike }).crypto;\n if (c && typeof c.randomUUID === 'function') {\n return c.randomUUID();\n }\n // Fallback RFC4122 v4(非加密强度)\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (ch) => {\n const r = (Math.random() * 16) | 0;\n const v = ch === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nfunction shortRandomId(prefix: string): string {\n return `${prefix}-${isoRandomUUID().replace(/-/g, '').slice(0, 12)}`;\n}\n\nexport function generateMessageId(): string {\n return shortRandomId('msg');\n}\n\nexport function generateConversationId(): string {\n return shortRandomId('conv');\n}\n\nexport function generateRunId(): string {\n return shortRandomId('run');\n}\n\nexport function generateAuditEnvelopeId(): string {\n return shortRandomId('audit');\n}\n\nexport function generateAuditEnvelopeEventId(): string {\n return shortRandomId('audit_evt');\n}\n\nexport function generateExecutionId(): string {\n return shortRandomId('exec');\n}\n\nexport function generateTraceId(): string {\n return shortRandomId('trace');\n}\n","import type { MessageProcessingState, ProviderContext } from '../providers/base';\nimport { generateMessageId } from '../../../shared/ids';\nimport {\n createHistorySummaryEvent,\n type AiMessage,\n type RuntimeEvent,\n} from '../../../contracts';\n\nexport type ReplacedIdRange = {\n startId: string;\n endId: string;\n};\n\nexport class SummarizationStateUtils {\n static collectReplacedIds(candidates: MessageProcessingState[]): string[] {\n const allReplacedIds = new Set<string>();\n for (const candidate of candidates) {\n allReplacedIds.add(candidate.message.id);\n if (Array.isArray(candidate.replacementSourceIds)) {\n for (const sourceId of candidate.replacementSourceIds) {\n allReplacedIds.add(sourceId);\n }\n }\n const metadataSources = candidate.message.metadata?.replacementSourceIds;\n if (Array.isArray(metadataSources)) {\n for (const sourceId of metadataSources) {\n allReplacedIds.add(sourceId);\n }\n }\n if (candidate.message.type === 'history_summary' && candidate.message.metadata?.replacedMessageIds) {\n for (const oldId of candidate.message.metadata.replacedMessageIds) {\n allReplacedIds.add(oldId);\n }\n }\n }\n return Array.from(allReplacedIds);\n }\n\n static generateSummarySeq(allMessages: AiMessage[]): number {\n let seq = 0;\n for (const msg of allMessages) {\n if (msg.type === 'history_summary') {\n seq = Math.max(seq, msg.metadata?.summarySeq || 0);\n }\n }\n return seq + 1;\n }\n\n static createSummaryMessageState(\n summary: string,\n candidates: MessageProcessingState[],\n context: ProviderContext,\n allMessages: AiMessage[],\n includedOldSummary: boolean = false\n ): { state: MessageProcessingState; event: RuntimeEvent } {\n const summaryId = generateMessageId();\n const timestamp = Date.now();\n const replacedMessageIds = this.collectReplacedIds(candidates);\n const originalMessageCount = candidates.length;\n const summarySeq = this.generateSummarySeq(allMessages);\n\n const description = includedOldSummary\n ? `[历史对话摘要(更新版) - 合并压缩了${originalMessageCount}条消息,包括旧摘要]`\n : `[历史对话摘要 - 压缩了${originalMessageCount}条消息]`;\n const fullContent = `${description}\\n\\n${summary}`;\n\n const summaryMessage: AiMessage = {\n id: summaryId,\n role: 'system',\n type: 'history_summary',\n content: fullContent,\n timestamp,\n metadata: {\n messageType: 'summary',\n originalMessageCount,\n compressionRatio: 0,\n includedOldSummary,\n replacedMessageIds,\n summarySeq,\n },\n };\n\n const tokens = context.estimateTokens(summaryMessage);\n if (summaryMessage.metadata) {\n const originalTokens = this.calculateOriginalTokens(candidates);\n summaryMessage.metadata.compressionRatio = originalTokens > 0 ? tokens / originalTokens : 0;\n }\n\n const summaryState: MessageProcessingState = {\n message: summaryMessage,\n originalIndex: -1,\n action: 'keep_core' as const,\n tokens,\n processedContent: summaryMessage.content,\n contentType: 'full' as const,\n phase: 'SUMMARIZATION' as const,\n };\n\n const summaryEvent = createHistorySummaryEvent(\n summaryId,\n '',\n '',\n fullContent,\n replacedMessageIds,\n summarySeq,\n {\n timestamp,\n original_message_count: originalMessageCount,\n compression_ratio: summaryMessage.metadata?.compressionRatio,\n included_old_summary: includedOldSummary,\n }\n );\n\n return { state: summaryState, event: summaryEvent };\n }\n\n static replaceWithSummary(\n allStates: MessageProcessingState[],\n candidatesForSummarization: MessageProcessingState[],\n summaryState: MessageProcessingState\n ): MessageProcessingState[] {\n const remainingStates = allStates.filter((s) => !candidatesForSummarization.includes(s));\n const insertIndex = Math.min(3, remainingStates.length);\n return [\n ...remainingStates.slice(0, insertIndex),\n summaryState,\n ...remainingStates.slice(insertIndex),\n ];\n }\n\n static calculateOriginalTokens(candidates: MessageProcessingState[]): number {\n return candidates.reduce((total, state) => total + state.tokens, 0);\n }\n}\n","/**\n * @file src/agent/context-manager/shared/providers/SummarizationProvider.ts\n * @description 统一摘要化处理层Provider - Chat 和 Agent 通用\n */\n\nimport {\n BaseContextProvider,\n ContextProviderError,\n SUMMARIZATION_FAILED_ERROR_CODE,\n ProviderResult,\n MessageProcessingState,\n} from './base';\nimport {\n SummarizationTrigger,\n SummarizationCandidateSelector,\n AISummaryGenerator,\n SummarizationOptions,\n SummarizationStateUtils,\n} from '../summarization';\nimport type { SummarizationConfig, SummarizationProviderContext } from '../summarization/config';\n\nexport type { SummarizationOptions } from '../summarization';\n\nexport class SummarizationProvider extends BaseContextProvider<SummarizationConfig> {\n readonly name = 'SummarizationProvider';\n readonly description = '摘要化处理层 - 核心对话压缩,聚焦用户意图与AI回答';\n readonly priority = 3;\n\n private aiGenerator: AISummaryGenerator;\n private readonly failureBehavior: NonNullable<SummarizationOptions['failureBehavior']>;\n\n constructor(options: SummarizationOptions) {\n super();\n this.aiGenerator = new AISummaryGenerator(options);\n this.failureBehavior = options.failureBehavior ?? 'fail-fast';\n }\n\n async provide(\n states: MessageProcessingState[],\n availableBudget: number,\n context: SummarizationProviderContext\n ): Promise<ProviderResult> {\n const usedTokens = SummarizationTrigger.calculateUsedTokens(states);\n const remainingBudget = availableBudget - usedTokens;\n\n const shouldSummarize = SummarizationTrigger.shouldTriggerSummarization(\n states,\n remainingBudget,\n context.totalBudget,\n context,\n this.debug.bind(this)\n );\n\n if (!shouldSummarize) {\n return this.createResult(states, 0, [], {\n processedCount: 0,\n skippedCount: 0,\n addedCount: 0,\n });\n }\n\n const workingMemoryStates = states.filter((s) => s.action.startsWith('keep_working') || s.action.startsWith('keep_'));\n\n this.debug('📊 工作记忆状态统计', {\n 总消息数: workingMemoryStates.length,\n 消息类型分布: workingMemoryStates.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n }, context);\n\n const { allCandidates: candidatesToReplace, coreCandidates: candidatesForPrompt } =\n SummarizationCandidateSelector.identifySummarizationCandidates(\n workingMemoryStates,\n context,\n { fullStateList: states }\n );\n\n this.debug('🔥 步骤2完成 - 识别摘要候选', {\n 所有候选数: candidatesToReplace.length,\n 核心候选数: candidatesForPrompt.length,\n 所有候选类型分布: candidatesToReplace.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n 核心候选类型分布: candidatesForPrompt.reduce((acc, s) => {\n acc[s.message.type] = (acc[s.message.type] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n 所有候选ID列表: candidatesToReplace.map((s) => `${s.message.type}:${s.message.id}`).slice(0, 5),\n }, context);\n\n if (candidatesToReplace.length === 0 || candidatesForPrompt.length === 0) {\n return this.createResult(states, 0, [], {\n processedCount: 0,\n skippedCount: 0,\n addedCount: 0,\n });\n }\n\n context.summarizationCallbacks?.onSummarizationStart?.();\n\n try {\n const summaryResult = await this.aiGenerator.generateHistorySummary(\n candidatesForPrompt,\n context,\n this.debug.bind(this)\n );\n\n const includedOldSummary = candidatesToReplace.some(\n (candidate) => candidate.message.type === 'history_summary'\n );\n\n this.debug('🔥 步骤4完成 - 准备创建摘要消息', {\n 替换块消息数: candidatesToReplace.length,\n 包含旧摘要: includedOldSummary,\n }, context);\n\n const allMessages = states.map((s) => s.message);\n const { state: summaryState, event: summaryEvent } = SummarizationStateUtils.createSummaryMessageState(\n summaryResult,\n candidatesToReplace,\n context,\n allMessages,\n includedOldSummary\n );\n\n const updatedStates = SummarizationStateUtils.replaceWithSummary(states, candidatesToReplace, summaryState);\n const tokensUsed = summaryState.tokens;\n\n context.summarizationCallbacks?.onSummarizationEnd?.({\n originalMessageCount: candidatesToReplace.length,\n summaryEvent,\n });\n\n this.debug('✨ 摘要化处理完成', {\n originalMessages: candidatesToReplace.length,\n summaryTokens: tokensUsed,\n compressionRatio: `${((tokensUsed / SummarizationStateUtils.calculateOriginalTokens(candidatesToReplace)) * 100).toFixed(1)}%`,\n remainingBudget: availableBudget - usedTokens - tokensUsed,\n }, context);\n\n return this.createResult(\n updatedStates,\n tokensUsed,\n ['ai_history_summarization'],\n {\n processedCount: candidatesToReplace.length,\n skippedCount: 0,\n addedCount: 1,\n },\n [summaryEvent]\n );\n } catch (error) {\n this.debug('❌ 摘要化处理失败', { error }, context);\n\n if (context.summarizationCallbacks?.onSummarizationError) {\n const err = error instanceof Error ? error : new Error(String(error));\n context.summarizationCallbacks.onSummarizationError(err);\n }\n\n if (this.failureBehavior === 'continue-if-within-budget' && usedTokens <= availableBudget) {\n this.debug('⚠️ 摘要失败,但当前上下文仍在预算内,按配置继续使用原上下文', {\n usedTokens,\n availableBudget,\n }, context);\n return this.createResult(states, 0, ['ai_history_summarization_failed_continue'], {\n processedCount: 0,\n skippedCount: 0,\n addedCount: 0,\n });\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new ContextProviderError({\n code: SUMMARIZATION_FAILED_ERROR_CODE,\n fatal: true,\n providerName: this.name,\n message: `历史对话摘要失败,无法继续: ${errorMessage}`,\n cause: error,\n });\n }\n }\n\n shouldSkip(\n states: MessageProcessingState[],\n availableBudget: number,\n context: SummarizationProviderContext\n ): boolean {\n return SummarizationTrigger.shouldSkip(states, availableBudget, context);\n }\n}\n","import type { IContextProvider } from './base';\n\nexport class ContextProviderRegistry<TConfig = unknown> {\n private providers: Map<string, IContextProvider<TConfig>> = new Map();\n\n register(provider: IContextProvider<TConfig>): void {\n this.providers.set(provider.name, provider);\n }\n\n getAllProviders(): IContextProvider<TConfig>[] {\n return Array.from(this.providers.values()).sort((a, b) => a.priority - b.priority);\n }\n\n getProvider(name: string): IContextProvider<TConfig> | undefined {\n return this.providers.get(name);\n }\n\n clear(): void {\n this.providers.clear();\n }\n}\n","export type FenceLlmRole = 'user' | 'system';\nexport type FencePlacement =\n | 'after-system'\n | 'before-current-user'\n | 'after-current-user'\n | 'after-last-tool-result';\nexport type FenceLifetime = 'turn-only' | 'persisted';\n\nexport interface FenceDescriptor {\n kind: string;\n llmRole: FenceLlmRole;\n placement: FencePlacement;\n lifetime: FenceLifetime;\n mustKeep?: boolean;\n maxBudgetFraction?: number;\n formatter: (content: string, attrs: Record<string, unknown>) => string;\n}\n\nexport interface FenceInjection {\n kind: string;\n content: string;\n attrs?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n}\n\nexport interface FenceRegistry {\n register(descriptor: FenceDescriptor): void;\n get(kind: string): FenceDescriptor | undefined;\n list(): FenceDescriptor[];\n}\n\nconst FENCE_KIND_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/;\n\nclass DefaultFenceRegistry implements FenceRegistry {\n private readonly descriptors = new Map<string, FenceDescriptor>();\n\n register(descriptor: FenceDescriptor): void {\n validateDescriptor(descriptor);\n if (this.descriptors.has(descriptor.kind)) {\n throw new Error(`Fence kind \"${descriptor.kind}\" is already registered.`);\n }\n this.descriptors.set(descriptor.kind, descriptor);\n }\n\n get(kind: string): FenceDescriptor | undefined {\n return this.descriptors.get(kind);\n }\n\n list(): FenceDescriptor[] {\n return [...this.descriptors.values()];\n }\n}\n\nexport function createFenceRegistry(descriptors: FenceDescriptor[] = []): FenceRegistry {\n const registry = new DefaultFenceRegistry();\n for (const descriptor of descriptors) {\n registry.register(descriptor);\n }\n return registry;\n}\n\nfunction validateDescriptor(descriptor: FenceDescriptor): void {\n if (!FENCE_KIND_PATTERN.test(descriptor.kind)) {\n throw new Error(`Fence kind \"${descriptor.kind}\" must be kebab-case.`);\n }\n\n const fraction = descriptor.maxBudgetFraction;\n if (fraction !== undefined && (fraction <= 0 || fraction > 1)) {\n throw new Error('Fence maxBudgetFraction must be within (0, 1].');\n }\n}\n","/**\n * @file src/agent/context-manager/profiles/agent/contracts.ts\n */\n\nimport type { AiMessage } from '../../../contracts';\nimport type { FenceInjection } from '../../shared/fences';\n\n/**\n * Minimal request contract used by package-neutral agent profile code.\n * Product-specific invoke requests can extend this shape.\n */\nexport interface AgentProfileRequest {\n query: string;\n promptKey: string;\n model_id?: string;\n modelId?: string;\n availableTools?: string[];\n conversationHistory?: AiMessage[];\n fences?: FenceInjection[];\n}\n","import { AGENT_CONTEXT_BUILDER_CONFIG } from './context/config';\nimport { DEFAULT_MAX_STEPS } from '../../../contracts';\n\nexport const AGENT_CONSTANTS = {\n DEFAULT_MAX_STEPS,\n DEFAULT_TIMEOUT_MS: 300000,\n DEFAULT_MAX_RETRIES: 3,\n DEFAULT_RETRY_DELAY_MS: 1000,\n} as const;\n\nexport interface AgentConfig {\n defaultModelId: string;\n maxSteps: number;\n defaultTools: string[];\n timeoutMs: number;\n debug: boolean;\n /**\n * @deprecated 不再参与上下文裁剪。\n * 中文备注:Agent 历史保留现在由 `contextPolicy.budget` 与 `contextPolicy.toolHistory`\n * 共同决定;保留这个字段只是为了兼容可能读取 `DEFAULT_AGENT_CONFIG` 的旧接入方。\n */\n maxHistoryLength: number;\n tokenBudget: {\n maxTokens: number;\n reservedForResponse: number;\n };\n contextProcessingTimeoutMs: number;\n retry: {\n maxRetries: number;\n enableEmptyResponseRetry: boolean;\n retryDelayMs: number;\n };\n}\n\nexport const DEFAULT_AGENT_CONFIG: AgentConfig = {\n defaultModelId: 'default',\n maxSteps: AGENT_CONSTANTS.DEFAULT_MAX_STEPS,\n defaultTools: [],\n timeoutMs: AGENT_CONSTANTS.DEFAULT_TIMEOUT_MS,\n debug: false,\n maxHistoryLength: 100,\n tokenBudget: {\n maxTokens: AGENT_CONTEXT_BUILDER_CONFIG.DEFAULT_MAX_TOKENS,\n reservedForResponse: AGENT_CONTEXT_BUILDER_CONFIG.RESERVED_FOR_RESPONSE,\n },\n contextProcessingTimeoutMs: AGENT_CONTEXT_BUILDER_CONFIG.PROCESSING_TIMEOUT_MS,\n retry: {\n maxRetries: AGENT_CONSTANTS.DEFAULT_MAX_RETRIES,\n enableEmptyResponseRetry: true,\n retryDelayMs: AGENT_CONSTANTS.DEFAULT_RETRY_DELAY_MS,\n },\n};\n","/**\n * @file src/agent/context/config.ts\n * @description Agent上下文构建策略配置 - Agent专用三阶段智能填充配置中心\n * \n * 🎯 目的: 为Agent的ContextManager提供所有策略参数的可配置中心\n * 📖 详情: 实现Agent README中描述的3阶段上下文构建策略,专注于工具交互优化\n * 🔧 特色: P1-P4优先级填充策略,工具调用配对保留机制\n */\n\n/**\n * Agent上下文构建器核心配置\n * \n * 🎯 统一管理Agent专用的Token限制、触发条件和策略参数\n * 🔧 特别针对工具交互场景进行优化\n */\nexport const AGENT_CONTEXT_BUILDER_CONFIG = {\n // === 绝对Token限制设置 ===\n \n /** 默认最大Token预算上限 */\n DEFAULT_MAX_TOKENS: 232000,\n \n /** 响应预留Token数 */\n RESERVED_FOR_RESPONSE: 2400,\n \n // === Agent专用工作记忆填充策略 ===\n \n /**\n * 工作记忆填充目标百分比\n * - **基准**: 可用上下文总预算\n * - **说明**: Agent工作记忆层会尽力填充到此百分比,为摘要预留空间\n */\n WORKING_MEMORY_BUDGET_PERCENTAGE: 0.70,\n \n /**\n * 摘要触发阈值百分比\n * - **基准**: 可用上下文总预算\n * - **说明**: 当已用Token总量超过此百分比时,将触发摘要机制\n */\n SUMMARIZATION_TRIGGER_THRESHOLD: 0.70,\n \n // === Agent专用优先级配置 ===\n \n /**\n * P1优先级:工具交互配对保留\n * - 工具调用(tool_calls)和工具结果(tool)必须配对保留\n * - 最高优先级,确保工具交互完整性\n */\n P1_TOOL_INTERACTION_PRIORITY: 1,\n \n /**\n * P2优先级:纯文本对话\n * - 不包含工具调用的user和assistant消息\n * - 按时间倒序填充\n */\n P2_TEXT_CONVERSATION_PRIORITY: 2,\n \n /**\n * P3优先级:历史工具交互\n * - 较旧的工具调用记录\n * - 仍然需要配对保留\n */\n P3_HISTORICAL_TOOL_PRIORITY: 3,\n \n /**\n * P4优先级:循环填充\n * - 剩余预算的循环填充策略\n */\n P4_CIRCULAR_FILL_PRIORITY: 4,\n \n /**\n * P2优先级:工作记忆中保留的最近'thought'消息数量\n */\n MAX_THOUGHTS_TO_KEEP: 1,\n \n // === 摘要策略设置 ===\n \n /**\n * 摘要消息长度上限百分比\n * - **基准**: 可用上下文总预算\n * - **说明**: AI生成的摘要文本Token长度限制\n */\n SUMMARY_BUDGET_PERCENTAGE: 0.12,\n \n /**\n * 选取摘要候选消息的比例\n * - **基准**: 符合摘要条件的消息数量\n * - **说明**: 选取最老的多少比例消息进行摘要\n */\n SUMMARY_OLDEST_MESSAGES_PERCENTAGE: 0.75,\n \n // === 工具交互特殊配置 ===\n \n /**\n * 工具调用配对搜索范围\n * - 在多少条消息范围内搜索工具调用的配对\n */\n TOOL_PAIRING_SEARCH_RANGE: 10,\n \n /**\n * 单个工具交互对的最大Token数\n *\n * 中文说明:\n * - 这里是上下文构建期的 token 预算兜底,作用对象是整组 `tool_calls + tool_output`;\n * - 它不负责工具执行后的原始 observation 落盘预览;\n * - 执行期落盘阈值在 ToolNode observation governance 中维护,二者不要混成一个配置。\n */\n MAX_TOOL_PAIR_TOKENS: 6000,\n\n /**\n * 工具输出(tool_output)在“工作记忆层截断”时的摘要长度上限(Token)\n * - 该值用于控制 `ToolOutputSummarizer` 生成摘要的“信息密度”,避免摘要过短导致信息丢失\n * - 仅影响:超大工具交互对触发截断时(tool_output 会被摘要替换)\n */\n MAX_TOOL_OUTPUT_SUMMARY_TOKENS: 1000,\n \n /**\n * 工具交互保留的最小数量\n * - 即使预算不足,也要保留最近的几组工具交互\n */\n MIN_TOOL_INTERACTIONS_TO_KEEP: 2,\n\n /**\n * P1:最近工具交互(原始 tool_calls/tool_output)的最大保留组数\n * - 目的:只让“最近的行动链”以原始结构进入上下文,避免工具消息膨胀\n * - 注意:这里只统计“工具交互组”(一组 = 一次 tool_calls ↔ tool_output 配对)\n */\n MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP: 2,\n\n /**\n * P1+P3:工作记忆层最多保留的工具交互组总数(超过则直接丢弃)\n * - 目的:对 user 之前的“历史工具交互”做硬上限,避免工具历史过长污染上下文\n * - 注意:这里的“工具交互组”既包括原始 tool_calls/tool_output 配对,也包括被预处理压缩成\n * assistant 文本的“工具执行记录摘要”(metadata.isCompressedToolHistory === true)\n */\n MAX_TOOL_INTERACTION_GROUPS_TO_KEEP: 12,\n \n // === 消息类型优先级定义 ===\n \n /** 核心上下文保留层消息类型 - 第一阶段 */\n CORE_MESSAGE_TYPES: ['system_prompt', 'user_input'] as const,\n \n /** P1优先级内容类型 - Agent专用 */\n P1_CONTENT_TYPES: ['tool_calls', 'tool_output'] as const,\n \n /** P2优先级内容类型 - Agent专用 */\n P2_CONTENT_TYPES: ['final_answer', 'user_input'] as const,\n \n /** P3优先级内容类型 - Agent专用 */\n P3_CONTENT_TYPES: ['historical_tool_calls', 'historical_tool_result'] as const,\n \n // === Token估算配置 ===\n \n /** 平均每个字符的token估算比例 */\n AVG_CHARS_PER_TOKEN: 2.0,\n \n /** 工具调用的额外Token开销估算 */\n TOOL_CALL_OVERHEAD_TOKENS: 50,\n \n // === 模型配置 ===\n \n /**\n * Token 精确估算用的“模型标识”(用于映射到 tiktoken encoding)\n *\n * 说明:\n * - 这里只用于 `TokenCalculator.estimateTokensPrecise(...)` 的 encoding 选择,不用于真实 LLM 调用;\n * - 为避免把某个具体业务模型写死在这里,统一使用 tiktoken 的默认 encoding:cl100k_base。\n */\n TOKEN_ENCODING_NAME: 'cl100k_base',\n \n // === 性能与调试配置 ===\n \n /** 是否启用详细的构建统计 */\n ENABLE_BUILD_STATS: true,\n \n /** 是否启用阶段执行时间统计 */\n ENABLE_TIMING_STATS: true,\n \n /** 上下文构建超时阈值 (毫秒) */\n PROCESSING_TIMEOUT_MS: 1500,\n \n /** 工具交互配对失败警告阈值 */\n TOOL_PAIRING_FAILURE_WARNING_THRESHOLD: 3,\n \n};\n\n/**\n * Agent上下文构建策略配置的类型定义\n */\nexport interface AgentContextBuilderConfig {\n // === 绝对Token限制设置 ===\n DEFAULT_MAX_TOKENS: number;\n RESERVED_FOR_RESPONSE: number;\n \n // === Agent专用工作记忆填充策略 ===\n WORKING_MEMORY_BUDGET_PERCENTAGE: number;\n SUMMARIZATION_TRIGGER_THRESHOLD: number;\n \n // === Agent专用优先级配置 ===\n P1_TOOL_INTERACTION_PRIORITY: number;\n P2_TEXT_CONVERSATION_PRIORITY: number;\n P3_HISTORICAL_TOOL_PRIORITY: number;\n P4_CIRCULAR_FILL_PRIORITY: number;\n MAX_THOUGHTS_TO_KEEP: number;\n \n // === 摘要策略设置 ===\n SUMMARY_BUDGET_PERCENTAGE: number;\n SUMMARY_OLDEST_MESSAGES_PERCENTAGE: number;\n \n // === 工具交互特殊配置 ===\n TOOL_PAIRING_SEARCH_RANGE: number;\n MAX_TOOL_PAIR_TOKENS: number;\n MAX_TOOL_OUTPUT_SUMMARY_TOKENS: number;\n MIN_TOOL_INTERACTIONS_TO_KEEP: number;\n MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP: number;\n MAX_TOOL_INTERACTION_GROUPS_TO_KEEP: number;\n \n // === 消息类型优先级定义 ===\n CORE_MESSAGE_TYPES: readonly string[];\n P1_CONTENT_TYPES: readonly string[];\n P2_CONTENT_TYPES: readonly string[];\n P3_CONTENT_TYPES: readonly string[];\n \n // === Token估算配置 ===\n AVG_CHARS_PER_TOKEN: number;\n TOOL_CALL_OVERHEAD_TOKENS: number;\n \n // === 模型配置 ===\n TOKEN_ENCODING_NAME: string;\n \n // === 性能与调试配置 ===\n ENABLE_BUILD_STATS: boolean;\n ENABLE_TIMING_STATS: boolean;\n PROCESSING_TIMEOUT_MS: number;\n TOOL_PAIRING_FAILURE_WARNING_THRESHOLD: number;\n}\n\n/**\n * Agent专用阶段执行优先级枚举\n */\nexport enum AgentBuildPhase {\n /** 阶段1: 核心上下文保留层 */\n CORE_CONTEXT = 1,\n \n /** 阶段2: 工作记忆填充层 (P1-P4优先级) */\n WORKING_MEMORY = 2,\n \n /** 阶段3: 历史摘要触发层 */\n SUMMARIZATION = 3\n}\n\n/**\n * Agent专用消息优先级枚举\n */\nexport enum AgentMessagePriority {\n /** P1: 工具交互 - 最高优先级 */\n TOOL_INTERACTION = 1,\n \n /** P2: 纯文本对话 - 高优先级 */\n TEXT_CONVERSATION = 2,\n \n /** P3: 历史工具交互 - 中优先级 */\n HISTORICAL_TOOL = 3,\n \n /** P4: 循环填充 - 低优先级 */\n CIRCULAR_FILL = 4\n}\n\n/**\n * Agent上下文构建统计接口\n */\nexport interface AgentContextBuildStats {\n /** 构建开始时间 */\n startTime: number;\n \n /** 各阶段执行时间 */\n phaseTiming: Record<AgentBuildPhase, number>;\n \n /** 各阶段token使用情况 */\n phaseTokenUsage: Record<AgentBuildPhase, { used: number; percentage: number }>;\n \n /** 消息数量统计 */\n messageStats: {\n original: number;\n afterCoreContext: number;\n afterWorkingMemory: number;\n afterSummarization: number;\n };\n \n /** 优先级处理统计 */\n priorityStats: {\n p1ToolInteractions: number;\n p2TextConversations: number;\n p3HistoricalTools: number;\n p4CircularFill: number;\n };\n \n /** 工具交互统计 */\n toolStats: {\n totalToolCalls: number;\n pairedToolCalls: number;\n unpairedToolCalls: number;\n toolPairingSuccessRate: number;\n };\n \n /** 是否触发了摘要机制 */\n summarizationTriggered: boolean;\n \n /** 被摘要的消息数量 */\n summarizedCount?: number;\n \n /** 文档片段是否被截断 */\n documentTruncated: boolean;\n \n /** 总构建时间 */\n totalTime: number;\n}\n\n/**\n * 创建自定义Agent上下文构建配置的辅助函数\n */\nexport function createAgentContextBuilderConfig(\n overrides: Partial<AgentContextBuilderConfig>\n): AgentContextBuilderConfig {\n return {\n ...AGENT_CONTEXT_BUILDER_CONFIG,\n ...overrides\n } as AgentContextBuilderConfig;\n}\n\n// 已移除预算自适应逻辑,统一使用 AGENT_CONTEXT_BUILDER_CONFIG\n\n/**\n * 获取Agent可用Token预算的辅助函数\n */\nexport function getAgentAvailableTokenBudget(totalBudget?: number): number {\n const budget = totalBudget || AGENT_CONTEXT_BUILDER_CONFIG.DEFAULT_MAX_TOKENS;\n return Math.max(0, budget - AGENT_CONTEXT_BUILDER_CONFIG.RESERVED_FOR_RESPONSE);\n}\n\n/**\n * Agent专用摘要触发条件检查函数\n */\nexport function shouldTriggerAgentSummarization(\n currentTokenUsage: number, \n totalBudget: number, \n config?: AgentContextBuilderConfig\n): boolean {\n const activeConfig = config || AGENT_CONTEXT_BUILDER_CONFIG;\n const threshold = totalBudget * activeConfig.SUMMARIZATION_TRIGGER_THRESHOLD;\n return currentTokenUsage >= threshold;\n}\n\n/**\n * 检查工具交互是否需要配对保留\n */\nexport function shouldPairToolInteraction(\n messageRole: string,\n hasToolMetadata: boolean\n): boolean {\n return (messageRole === 'assistant' && hasToolMetadata) || messageRole === 'tool';\n}\n\n/**\n * 验证Agent配置有效性的辅助函数\n */\nexport function validateAgentConfig(config: AgentContextBuilderConfig): boolean {\n // 检查绝对Token限制\n if (config.DEFAULT_MAX_TOKENS <= 0) {\n console.warn('DEFAULT_MAX_TOKENS must be positive');\n return false;\n }\n \n if (config.RESERVED_FOR_RESPONSE <= 0 || config.RESERVED_FOR_RESPONSE >= config.DEFAULT_MAX_TOKENS) {\n console.warn('RESERVED_FOR_RESPONSE must be positive and less than DEFAULT_MAX_TOKENS');\n return false;\n }\n \n // 检查百分比配置是否合理\n if (config.WORKING_MEMORY_BUDGET_PERCENTAGE <= 0 || config.WORKING_MEMORY_BUDGET_PERCENTAGE > 1) {\n console.warn('WORKING_MEMORY_BUDGET_PERCENTAGE should be between 0 and 1');\n return false;\n }\n \n if (config.SUMMARIZATION_TRIGGER_THRESHOLD <= 0 || config.SUMMARIZATION_TRIGGER_THRESHOLD > 1) {\n console.warn('SUMMARIZATION_TRIGGER_THRESHOLD should be between 0 and 1');\n return false;\n }\n \n if (config.SUMMARY_BUDGET_PERCENTAGE <= 0 || config.SUMMARY_BUDGET_PERCENTAGE > 0.5) {\n console.warn('SUMMARY_BUDGET_PERCENTAGE should be between 0 and 0.5');\n return false;\n }\n \n // 检查工具相关配置\n if (config.TOOL_PAIRING_SEARCH_RANGE <= 0) {\n console.warn('TOOL_PAIRING_SEARCH_RANGE should be positive');\n return false;\n }\n \n if (config.MAX_TOOL_PAIR_TOKENS <= 0) {\n console.warn('MAX_TOOL_PAIR_TOKENS should be positive');\n return false;\n }\n\n if (config.MAX_TOOL_OUTPUT_SUMMARY_TOKENS <= 0) {\n console.warn('MAX_TOOL_OUTPUT_SUMMARY_TOKENS should be positive');\n return false;\n }\n\n if (config.MAX_TOOL_OUTPUT_SUMMARY_TOKENS > config.MAX_TOOL_PAIR_TOKENS) {\n console.warn('MAX_TOOL_OUTPUT_SUMMARY_TOKENS should not exceed MAX_TOOL_PAIR_TOKENS');\n return false;\n }\n \n if (config.MIN_TOOL_INTERACTIONS_TO_KEEP < 0) {\n console.warn('MIN_TOOL_INTERACTIONS_TO_KEEP should be non-negative');\n return false;\n }\n\n if (config.MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP < 0) {\n console.warn('MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP should be non-negative');\n return false;\n }\n\n if (config.MAX_TOOL_INTERACTION_GROUPS_TO_KEEP <= 0) {\n console.warn('MAX_TOOL_INTERACTION_GROUPS_TO_KEEP should be positive');\n return false;\n }\n\n if (config.MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP > config.MAX_TOOL_INTERACTION_GROUPS_TO_KEEP) {\n console.warn('MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP should not exceed MAX_TOOL_INTERACTION_GROUPS_TO_KEEP');\n return false;\n }\n\n if (config.AVG_CHARS_PER_TOKEN <= 0) {\n console.warn('AVG_CHARS_PER_TOKEN should be positive');\n return false;\n }\n\n if (config.TOOL_CALL_OVERHEAD_TOKENS < 0) {\n console.warn('TOOL_CALL_OVERHEAD_TOKENS should be non-negative');\n return false;\n }\n\n if (config.TOKEN_ENCODING_NAME.trim().length === 0) {\n console.warn('TOKEN_ENCODING_NAME should not be empty');\n return false;\n }\n \n return true;\n}\n\n/**\n * 获取Agent默认Token配置\n */\nexport function getAgentDefaultTokenConfig(): {\n maxTokens: number;\n reservedForResponse: number;\n availableForContext: number;\n workingMemoryBudget: number;\n} {\n const config = AGENT_CONTEXT_BUILDER_CONFIG;\n const availableForContext = getAgentAvailableTokenBudget();\n \n return {\n maxTokens: config.DEFAULT_MAX_TOKENS,\n reservedForResponse: config.RESERVED_FOR_RESPONSE,\n availableForContext,\n workingMemoryBudget: Math.floor(availableForContext * config.WORKING_MEMORY_BUDGET_PERCENTAGE)\n };\n}\n","export { AgentContextManager } from './AgentContextManager';\nexport type { ContextBuildResult } from './AgentContextManager';\n\nexport {\n AGENT_CONTEXT_BUILDER_CONFIG,\n AgentBuildPhase,\n AgentMessagePriority,\n createAgentContextBuilderConfig,\n validateAgentConfig,\n} from './config';\nexport type { AgentContextBuildStats, AgentContextBuilderConfig } from './config';\n\nexport { ConversationSession } from './ConversationSession';\nexport * from './providers';\n","import type { AgentContextBuilderConfig } from '../config';\nimport {\n BaseContextProvider as SharedBaseContextProvider,\n type IContextProvider as SharedIContextProvider,\n type MessageProcessingState,\n type ProviderContext as SharedProviderContext,\n type ProviderResult,\n type SummarizationCallbacks,\n} from '../../../../shared/providers/base';\n\nexport type {\n MessageProcessingState,\n ProviderResult,\n SummarizationCallbacks,\n} from '../../../../shared/providers/base';\n\nexport type ProviderContext = SharedProviderContext<AgentContextBuilderConfig>;\nexport interface IContextProvider extends SharedIContextProvider<AgentContextBuilderConfig> {}\nexport abstract class BaseContextProvider\n extends SharedBaseContextProvider<AgentContextBuilderConfig>\n implements IContextProvider {}\n","/**\n * @file src/agent/context/providers/AgentCoreContextProvider.ts\n * @description Agent专用核心上下文保留层Provider - 第一阶段上下文构建\n * \n * 🎯 职责: 识别并保留必须保留的核心消息(Agent专用逻辑)\n * 📖 规则: 系统提示词、工具描述、最新用户输入、注入的上下文始终无条件保留\n * ✨ Agent特性: 支持宿主通过 MustKeepPolicy 声明必保留 fence,确保工具调用上下文的完整性\n * 🔧 工具优先: 优先保留工具调用相关的核心消息\n * \n * 🏗️ 架构优化: 工具描述现在由 AgentContextManager 统一管理,而不是在 MessageFormatter 中特殊处理\n * 这确保了架构的一致性和调试的透明性\n */\n\nimport { BaseContextProvider, MessageProcessingState, ProviderContext, ProviderResult } from './base';\nimport type { AiMessage } from '../../../../../contracts';\nimport {\n DEFAULT_MUST_KEEP_POLICY,\n findMatchingTruncationRule,\n type MustKeepPolicy,\n} from '../../../../shared/policies';\n\nexport interface AgentCoreContextProviderOptions {\n mustKeepPolicy?: MustKeepPolicy;\n}\n\n/**\n * Agent专用核心上下文保留层Provider\n * \n * 实现Agent README中描述的第一阶段:核心上下文保留层 (Must-Keep)\n * 内容包括:系统提示词、用户当前请求、宿主显式声明的必保留 fence。\n */\nexport class AgentCoreContextProvider extends BaseContextProvider {\n readonly name = 'AgentCoreContextProvider';\n readonly description = 'Agent核心上下文保留层 - 识别并保留系统提示词、最新用户输入和注入的上下文';\n readonly priority = 1; // 最高优先级\n\n private readonly mustKeepPolicy: MustKeepPolicy;\n\n constructor(options: AgentCoreContextProviderOptions = {}) {\n super();\n this.mustKeepPolicy = options.mustKeepPolicy ?? DEFAULT_MUST_KEEP_POLICY;\n }\n\n async provide(\n states: MessageProcessingState[], \n availableBudget: number, \n context: ProviderContext\n ): Promise<ProviderResult> {\n this.debug('🚀 开始核心上下文保留层处理', {\n totalMessages: states.length,\n availableBudget,\n }, context);\n\n let coreTokens = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n \n // 获取所有原始消息,用于判断最新用户输入\n const allMessages = states.map(s => s.message);\n \n for (let i = 0; i < states.length; i++) {\n const state = states[i];\n const msg = state.message;\n \n // 检查是否为核心消息\n if (this.isCoreMessage(msg, i, allMessages)) {\n let processedContent = msg.content;\n let contentType: MessageProcessingState['contentType'] = 'full';\n const truncationRule = findMatchingTruncationRule(msg, this.mustKeepPolicy);\n \n if (truncationRule) {\n const originalTokens = context.estimateTokens(msg);\n const maxAllowedTokens = Math.floor(context.totalBudget * truncationRule.maxBudgetFraction);\n \n if (originalTokens > maxAllowedTokens) {\n processedContent = this.truncateContent(msg.content, maxAllowedTokens, context.config.AVG_CHARS_PER_TOKEN);\n strategiesApplied.push(truncationRule.strategyName);\n \n this.debug('📄 核心注入消息被截断', {\n id: msg.id,\n originalTokens,\n maxAllowedTokens,\n truncatedTokens: context.estimateTokens({ ...msg, content: processedContent })\n }, context);\n }\n }\n \n // 标记为核心消息\n state.action = 'keep_core';\n state.processedContent = processedContent;\n state.contentType = contentType;\n state.phase = 'CORE_CONTEXT';\n \n // 重新计算Token数量(基于可能被截断的内容)\n state.tokens = context.estimateTokens({ ...msg, content: processedContent });\n coreTokens += state.tokens;\n processedCount++;\n \n this.debug(`✅ 标记为核心消息`, {\n index: i,\n id: msg.id,\n type: msg.type,\n tokens: state.tokens,\n totalCoreTokens: coreTokens\n }, context);\n } else {\n this.debug(`⏭️ 跳过非核心消息`, { \n index: i, \n id: msg.id, \n type: msg.type \n }, context);\n }\n }\n \n this.debug('📊 核心上下文保留层处理完成', {\n coreMessages: processedCount,\n coreTokens,\n remainingBudget: availableBudget - coreTokens\n }, context);\n\n return this.createResult(\n states,\n coreTokens,\n strategiesApplied,\n {\n processedCount,\n skippedCount: states.length - processedCount,\n addedCount: 0\n }\n );\n }\n\n /**\n * 判断是否为核心消息 - Agent专用逻辑\n * \n * 🎯 Agent核心上下文保留规则:\n * 1. 保留 system_prompt(系统级消息)\n * 2. 保留最新的 user 消息 (current_user_request)\n * 3. 保留 MustKeepPolicy 指定的 fence\n * 4. 对命中的 MustKeepPolicy.truncationRules 做 Token 截断\n */\n private isCoreMessage(msg: AiMessage, index: number, allMessages: AiMessage[]): boolean {\n // 规则1: 系统提示词始终无条件保留\n if (this.mustKeepPolicy.alwaysKeepTypes.includes(msg.type) && msg.type !== 'user_input') {\n return true;\n }\n \n // 规则2: 保留最新的用户输入消息 (current_user_request)\n if (msg.type === 'user_input') {\n const lastUserIndex = allMessages.map(m => m.type).lastIndexOf('user_input');\n return index === lastUserIndex;\n }\n \n const fenceKind = msg.metadata?.fenceKind;\n if (fenceKind && this.mustKeepPolicy.alwaysKeepFenceKinds.includes(fenceKind)) {\n return true;\n }\n \n // 🚨 重要:history_summary 不在此处保留,让其进入后续的处理流程\n // 这是解决\"循环累积\"问题的关键 - 旧摘要必须能被新摘要替换\n if (msg.type === 'history_summary') {\n return false;\n }\n \n return false;\n }\n\n /**\n * 内容截断 - 保持完整词汇\n * 复用ContextManager中的逻辑\n */\n private truncateContent(content: string, maxTokens: number, avgCharsPerToken: number): string {\n const maxChars = maxTokens * avgCharsPerToken;\n if (content.length <= maxChars) {\n return content;\n }\n\n // 找到最接近的词汇边界\n const truncated = content.substring(0, maxChars);\n const lastSpaceIndex = truncated.lastIndexOf(' ');\n const result = lastSpaceIndex > maxChars * 0.8 \n ? truncated.substring(0, lastSpaceIndex)\n : truncated;\n \n return result + '...';\n }\n}\n","import type { MessageProcessingState } from '../context/providers/base';\nimport type { AiMessage } from '../../../../contracts';\n\nconst CHECKPOINT_TOOL_NAME = 'context_checkpoint';\n\ntype IndexedEntry<T> = {\n value: T;\n originalIndex: number;\n message: AiMessage;\n};\n\ntype ToolCallRecord = {\n id: string;\n type?: string;\n function?: {\n name?: string;\n arguments?: string;\n };\n};\n\ninterface ToolInteractionGroupBuildOptions {\n /**\n * 工具调用与工具结果允许相隔的最大消息数。\n *\n * 中文备注:超过窗口的 tool_output 不再配对,避免很旧的 tool_calls 被远处结果误粘连。\n */\n maxPairingDistance?: number;\n /** 识别 checkpoint 工具组的工具名。默认保持 0.5.x 的 context_checkpoint。 */\n checkpointToolName?: string;\n}\n\nexport interface ToolInteractionGroupItem<T> {\n toolCallId: string;\n toolName: string;\n toolArgs: Record<string, unknown>;\n toolCall: ToolCallRecord;\n toolOutputs: T[];\n toolOutputMessages: AiMessage[];\n rawOutputs: string[];\n}\n\nexport interface ToolInteractionGroup<T> {\n anchorId: string;\n /** 工具组所属的用户轮次序号:0 表示第一条 user_input 之前,之后每遇到一条 user_input 递增。 */\n runOrdinal: number;\n assistantState: T;\n assistantMessage: AiMessage;\n assistantIndex: number;\n toolOutputs: T[];\n toolOutputMessages: AiMessage[];\n toolOutputIndexes: number[];\n toolCallIds: string[];\n toolNames: string[];\n sourceMessageIds: string[];\n messageIndexes: number[];\n startIndex: number;\n endIndex: number;\n isCheckpointGroup: boolean;\n isComplete: boolean;\n isCompressed: boolean;\n items: ToolInteractionGroupItem<T>[];\n messages: T[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isToolCallRecord(value: unknown): value is ToolCallRecord {\n if (!isRecord(value)) {\n return false;\n }\n return typeof value.id === 'string' && value.id.trim().length > 0;\n}\n\nfunction getToolCalls(message: AiMessage): ToolCallRecord[] {\n const toolCalls = message.metadata?.tool_calls;\n if (!Array.isArray(toolCalls)) {\n return [];\n }\n return toolCalls.filter(isToolCallRecord);\n}\n\nfunction safeParseArgs(rawArgs: string | undefined): Record<string, unknown> {\n if (typeof rawArgs !== 'string' || rawArgs.trim().length === 0) {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(rawArgs);\n return isRecord(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nfunction getRawOutput(message: AiMessage): string {\n const rawOutput = message.metadata?.raw_output;\n if (typeof rawOutput === 'string' && rawOutput.trim().length > 0) {\n return rawOutput;\n }\n return message.content;\n}\n\nfunction hasCheckpointMarker(message: AiMessage): boolean {\n const rawOutput = message.metadata?.raw_output;\n return typeof rawOutput === 'string' && rawOutput.includes('\"context_checkpoint\"');\n}\n\nfunction buildToolInteractionGroups<T>(\n entries: IndexedEntry<T>[],\n options: ToolInteractionGroupBuildOptions = {},\n): ToolInteractionGroup<T>[] {\n type MutableGroup = {\n anchorId: string;\n assistantState: T;\n assistantMessage: AiMessage;\n assistantIndex: number;\n toolOutputs: Array<{ value: T; message: AiMessage; index: number }>;\n sourceMessageIds: Set<string>;\n runOrdinal: number;\n startIndex: number;\n endIndex: number;\n isCheckpointGroup: boolean;\n isCompressed: boolean;\n items: Array<{\n toolCallId: string;\n toolName: string;\n toolArgs: Record<string, unknown>;\n toolCall: ToolCallRecord;\n toolOutputs: Array<{ value: T; message: AiMessage; index: number }>;\n rawOutputs: string[];\n }>;\n };\n\n const groups: MutableGroup[] = [];\n const activeToolCallIdToGroupIndex = new Map<string, number>();\n let currentRunOrdinal = 0;\n const checkpointToolName = options.checkpointToolName ?? CHECKPOINT_TOOL_NAME;\n\n for (const entry of entries) {\n const { message } = entry;\n if (message.role === 'user' && message.type === 'user_input') {\n currentRunOrdinal += 1;\n }\n\n if (message.role === 'assistant' && message.type === 'tool_calls') {\n const toolCalls = getToolCalls(message);\n if (toolCalls.length === 0) {\n continue;\n }\n const groupIndex = groups.length;\n const itemList = toolCalls.map((toolCall) => {\n const toolName =\n typeof toolCall.function?.name === 'string' && toolCall.function.name.trim().length > 0\n ? toolCall.function.name\n : 'unknown_tool';\n return {\n toolCallId: toolCall.id,\n toolName,\n toolArgs: safeParseArgs(toolCall.function?.arguments),\n toolCall,\n toolOutputs: [] as Array<{ value: T; message: AiMessage; index: number }>,\n rawOutputs: [] as string[],\n };\n });\n\n const group: MutableGroup = {\n anchorId: message.id,\n assistantState: entry.value,\n assistantMessage: message,\n assistantIndex: entry.originalIndex,\n toolOutputs: [],\n sourceMessageIds: new Set<string>(message.id ? [message.id] : []),\n runOrdinal: currentRunOrdinal,\n startIndex: entry.originalIndex,\n endIndex: entry.originalIndex,\n isCheckpointGroup: itemList.some((item) => item.toolName === checkpointToolName),\n isCompressed: false,\n items: itemList,\n };\n\n groups.push(group);\n for (const item of itemList) {\n activeToolCallIdToGroupIndex.set(item.toolCallId, groupIndex);\n }\n continue;\n }\n\n if (message.role !== 'tool' || message.type !== 'tool_output') {\n continue;\n }\n\n const toolCallId = message.metadata?.tool_call_id;\n if (typeof toolCallId !== 'string' || toolCallId.trim().length === 0) {\n continue;\n }\n\n const groupIndex = activeToolCallIdToGroupIndex.get(toolCallId);\n if (groupIndex === undefined) {\n continue;\n }\n\n const group = groups[groupIndex];\n if (\n options.maxPairingDistance !== undefined &&\n entry.originalIndex - group.assistantIndex > options.maxPairingDistance\n ) {\n continue;\n }\n const item = group.items.find((candidate) => candidate.toolCallId === toolCallId);\n if (!item) {\n continue;\n }\n\n const outputEntry = { value: entry.value, message, index: entry.originalIndex };\n item.toolOutputs.push(outputEntry);\n item.rawOutputs.push(getRawOutput(message));\n group.toolOutputs.push(outputEntry);\n if (message.id) {\n group.sourceMessageIds.add(message.id);\n }\n group.endIndex = Math.max(group.endIndex, entry.originalIndex);\n if (item.toolName === CHECKPOINT_TOOL_NAME || hasCheckpointMarker(message)) {\n group.isCheckpointGroup = true;\n }\n }\n\n return groups.map((group) => {\n const sortedOutputs = [...group.toolOutputs].sort((left, right) => left.index - right.index);\n const sortedItems = group.items.map((item) => {\n const itemOutputs = [...item.toolOutputs].sort((left, right) => left.index - right.index);\n return {\n toolCallId: item.toolCallId,\n toolName: item.toolName,\n toolArgs: item.toolArgs,\n toolCall: item.toolCall,\n toolOutputs: itemOutputs.map((output) => output.value),\n toolOutputMessages: itemOutputs.map((output) => output.message),\n rawOutputs: [...item.rawOutputs],\n };\n });\n\n return {\n anchorId: group.anchorId,\n runOrdinal: group.runOrdinal,\n assistantState: group.assistantState,\n assistantMessage: group.assistantMessage,\n assistantIndex: group.assistantIndex,\n toolOutputs: sortedOutputs.map((output) => output.value),\n toolOutputMessages: sortedOutputs.map((output) => output.message),\n toolOutputIndexes: sortedOutputs.map((output) => output.index),\n toolCallIds: sortedItems.map((item) => item.toolCallId),\n toolNames: sortedItems.map((item) => item.toolName),\n sourceMessageIds: Array.from(group.sourceMessageIds),\n messageIndexes: [group.assistantIndex, ...sortedOutputs.map((output) => output.index)],\n startIndex: group.startIndex,\n endIndex: group.endIndex,\n isCheckpointGroup: group.isCheckpointGroup,\n isComplete: sortedItems.every((item) => item.toolOutputs.length > 0),\n isCompressed: group.isCompressed,\n items: sortedItems,\n messages: [group.assistantState, ...sortedOutputs.map((output) => output.value)],\n };\n });\n}\n\nexport function collectToolInteractionGroups<T extends MessageProcessingState>(\n states: T[],\n): ToolInteractionGroup<T>[] {\n const entries: IndexedEntry<T>[] = states.map((value, index) => ({\n value,\n originalIndex: index,\n message: value.message,\n }));\n\n return buildToolInteractionGroups(entries);\n}\n\nexport function buildToolInteractionGroupsFromMessages(\n messages: AiMessage[],\n options: {\n startIndex?: number;\n endIndexExclusive?: number;\n } = {},\n): ToolInteractionGroup<AiMessage>[] {\n const startIndex = Math.max(0, options.startIndex ?? 0);\n const endIndexExclusive = Math.min(messages.length, options.endIndexExclusive ?? messages.length);\n const entries = messages.slice(startIndex, endIndexExclusive).map((message, orderIndex) => ({\n value: message,\n originalIndex: startIndex + orderIndex,\n message,\n }));\n return buildToolInteractionGroups(entries);\n}\n\nexport function buildToolInteractionGroupsFromStates(\n states: MessageProcessingState[],\n options: ToolInteractionGroupBuildOptions = {},\n): ToolInteractionGroup<MessageProcessingState>[] {\n const normalizedPositions = getNormalizedStatePositions(states);\n const entries = states.map((state, orderIndex) => ({\n value: state,\n originalIndex: normalizedPositions[orderIndex],\n message: state.message,\n }));\n return buildToolInteractionGroups(entries, options);\n}\n\nexport function findCurrentRunStartIndex(messages: AiMessage[]): number {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role === 'user' && message.type === 'user_input') {\n return index;\n }\n }\n return messages.length;\n}\n\n/** @deprecated 使用 findCurrentRunStartIndex。旧名保留一个 sprint,避免下游 deep import 立刻断裂。 */\nexport const findCurrentRoundStartIndex = findCurrentRunStartIndex;\n\nexport function findLastUserInputOriginalIndex(states: MessageProcessingState[]): number | null {\n const normalizedPositions = getNormalizedStatePositions(states);\n let result: number | null = null;\n for (let orderIndex = 0; orderIndex < states.length; orderIndex += 1) {\n const state = states[orderIndex];\n if (state.message.role !== 'user' || state.message.type !== 'user_input') {\n continue;\n }\n const currentIndex = normalizedPositions[orderIndex];\n result = result === null ? currentIndex : Math.max(result, currentIndex);\n }\n return result;\n}\n\nfunction getNormalizedStatePositions(states: MessageProcessingState[]): number[] {\n const positions: number[] = [];\n let lastPosition = -1;\n for (let orderIndex = 0; orderIndex < states.length; orderIndex += 1) {\n const state = states[orderIndex];\n const rawPosition = typeof state.originalIndex === 'number' ? state.originalIndex : orderIndex;\n if (rawPosition > lastPosition) {\n positions.push(rawPosition);\n lastPosition = rawPosition;\n continue;\n }\n const nextPosition = lastPosition + 1;\n positions.push(nextPosition);\n lastPosition = nextPosition;\n }\n return positions;\n}\n","import type { AgentContextBuilderConfig } from '../../config';\nimport type { MessageProcessingState } from '../base';\nimport type { ToolPairFitResult, DebugFn } from './types';\nimport {\n buildToolInteractionGroupsFromStates,\n type ToolInteractionGroup,\n} from '../../../utils/toolInteractionGroup';\nimport type { AiMessage } from '../../../../../../contracts';\n\n/**\n * 工具对配对器\n *\n * 负责工具调用与工具结果的配对匹配,确保工具交互的完整性\n */\nexport class ToolPairMatcher {\n constructor(private readonly config: AgentContextBuilderConfig) {}\n\n /**\n * 判断是否为\"预处理阶段压缩的工具历史摘要消息\"\n * - 该类消息不再是 tool_calls/tool_output 的原始结构,而是 assistant 的自然语言记录\n * - 但它本质上仍代表一个工具交互组,应该在 P3(历史工具交互)阶段被优先/受限地纳入上下文\n */\n isCompressedToolHistoryMessage(message: AiMessage): boolean {\n const meta = message.metadata;\n return (\n message.role === 'assistant' &&\n message.type === 'final_answer' &&\n typeof meta?.['isCompressedToolHistory'] === 'boolean' &&\n meta['isCompressedToolHistory'] === true\n );\n }\n\n /**\n * 查找工具调用的配对消息\n * 从 assistant 消息向后查找对应的 tool 消息\n */\n findToolCallPair(\n assistantState: MessageProcessingState,\n allStates: MessageProcessingState[]\n ): ToolInteractionGroup<MessageProcessingState> | null {\n return this.findGroupByAnchorId(assistantState.message.id, allStates);\n }\n\n /**\n * 查找工具结果的配对消息\n * 从 tool 消息向前反向查找对应的 assistant 消息\n */\n findToolResultPair(\n toolState: MessageProcessingState,\n allStates: MessageProcessingState[]\n ): ToolInteractionGroup<MessageProcessingState> | null {\n const toolCallId = toolState.message.metadata?.tool_call_id;\n if (!toolCallId) {\n return null;\n }\n const groups = buildToolInteractionGroupsFromStates(allStates);\n for (let index = groups.length - 1; index >= 0; index -= 1) {\n const group = groups[index];\n if (group.toolCallIds.includes(toolCallId) && group.toolOutputs.some((state) => state.message.id === toolState.message.id)) {\n return group;\n }\n }\n return null;\n }\n\n /**\n * 检查工具配对是否能在预算内保留\n */\n canFitToolPair(\n group: ToolInteractionGroup<MessageProcessingState>,\n currentTokens: number,\n budgetLimit: number,\n debugFn?: DebugFn\n ): ToolPairFitResult {\n const pair = group.messages;\n const pairTokens = pair.reduce((sum, state) => sum + state.tokens, 0);\n\n // 检查预算限制\n if (currentTokens + pairTokens > budgetLimit) {\n return {\n canFit: false,\n needsTruncation: true,\n group,\n pair: pair,\n totalTokens: pairTokens,\n reason: 'budget_exceeded'\n };\n }\n\n // 检查单个工具交互对的最大Token限制\n if (pairTokens > this.config.MAX_TOOL_PAIR_TOKENS) {\n debugFn?.('⚠️ 工具交互对超过最大Token限制', {\n pairTokens,\n maxAllowed: this.config.MAX_TOOL_PAIR_TOKENS\n });\n return {\n canFit: false,\n needsTruncation: true,\n group,\n pair: pair,\n totalTokens: pairTokens,\n reason: 'pair_too_large'\n };\n }\n\n return {\n canFit: true,\n needsTruncation: false,\n group,\n pair: pair,\n totalTokens: pairTokens\n };\n }\n\n private findGroupByAnchorId(\n anchorId: string,\n allStates: MessageProcessingState[],\n ): ToolInteractionGroup<MessageProcessingState> | null {\n if (!anchorId) {\n return null;\n }\n const groups = buildToolInteractionGroupsFromStates(allStates);\n return groups.find((group) => group.anchorId === anchorId) ?? null;\n }\n}\n","import type { ToolSummaryProvider } from '../../../shared/preprocessors/base';\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport interface SummarizerConfig {\n fullContentThreshold: number;\n textPreviewLength: number;\n arrayPreviewCount: number;\n objectPreviewFieldCount: number;\n}\n\nexport const DEFAULT_SUMMARIZER_CONFIG: SummarizerConfig = {\n fullContentThreshold: 400,\n textPreviewLength: 200,\n arrayPreviewCount: 3,\n objectPreviewFieldCount: 5,\n};\n\nexport class ToolOutputSummarizer {\n private config: SummarizerConfig;\n\n constructor(config: Partial<SummarizerConfig> = {}) {\n this.config = { ...DEFAULT_SUMMARIZER_CONFIG, ...config };\n }\n\n getSummary(\n toolName: string,\n output: string,\n toolSummaryProvider?: ToolSummaryProvider,\n toolArgs?: UnknownRecord,\n ): string {\n if (!output) {\n return '无输出';\n }\n if (output.length <= this.config.fullContentThreshold) {\n return output;\n }\n if (toolSummaryProvider) {\n const toolSummary = this.tryToolSpecificSummary(toolName, output, toolSummaryProvider, toolArgs);\n if (toolSummary) {\n return toolSummary;\n }\n }\n return this.createGenericSummary(output);\n }\n\n formatToolArgs(args: UnknownRecord): string {\n if (!args || Object.keys(args).length === 0) {\n return '';\n }\n\n return Object.entries(args)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${key}=${JSON.stringify(value)}`)\n .join(', ');\n }\n\n private tryToolSpecificSummary(\n toolName: string,\n output: string,\n toolSummaryProvider: ToolSummaryProvider,\n toolArgs?: UnknownRecord,\n ): string | null {\n if (toolName === 'text_to_image' && toolArgs) {\n const n = typeof toolArgs.n === 'number' ? toolArgs.n : 1;\n return `生成了 ${n} 张图片。`;\n }\n\n try {\n const tool = toolSummaryProvider.getTool(toolName);\n if (tool && typeof tool.getExecutionSummary === 'function') {\n return tool.getExecutionSummary(output);\n }\n } catch (error) {\n console.error(`[ToolOutputSummarizer] Tool '${toolName}' getExecutionSummary failed:`, error);\n }\n\n return null;\n }\n\n private createGenericSummary(output: string): string {\n try {\n const parsed = JSON.parse(output);\n if (Array.isArray(parsed)) {\n return this.summarizeArray(parsed);\n }\n if (typeof parsed === 'object' && parsed !== null) {\n return this.summarizeObject(parsed as UnknownRecord);\n }\n } catch {\n // fall through to text summary\n }\n\n return this.summarizeText(output);\n }\n\n private summarizeArray(parsed: unknown[]): string {\n if (parsed.length === 0) {\n return '返回了空数组';\n }\n\n const preview = parsed\n .slice(0, this.config.arrayPreviewCount)\n .map((item) => {\n const itemStr = JSON.stringify(item);\n return itemStr.length > 30 ? `${itemStr.slice(0, 30)}...` : itemStr;\n })\n .join(', ');\n\n return `返回了${parsed.length}个结果, 前几个是: [${preview}${parsed.length > this.config.arrayPreviewCount ? '...' : ''}]`;\n }\n\n private summarizeObject(parsed: UnknownRecord): string {\n const keys = Object.keys(parsed);\n if (keys.length === 0) {\n return '返回了空对象';\n }\n if (parsed.observation && typeof parsed.observation === 'string') {\n return this.createGenericSummary(parsed.observation);\n }\n const previewKeys = keys.slice(0, this.config.objectPreviewFieldCount).join(', ');\n return `返回了包含[${previewKeys}${keys.length > this.config.objectPreviewFieldCount ? '...' : ''}]等${keys.length}个字段的对象`;\n }\n\n private summarizeText(output: string): string {\n const previewStart = output.slice(0, this.config.textPreviewLength);\n const previewEnd = output.slice(-this.config.textPreviewLength);\n return `返回了${output.length}字符的文本, 开头是: \"${previewStart}...\", 结尾是: \"...${previewEnd}\"`;\n }\n}\n\nexport const createDefaultToolOutputSummarizer = (\n config?: Partial<SummarizerConfig>,\n): ToolOutputSummarizer => new ToolOutputSummarizer(config);\n\nexport const summarizeToolOutput = (\n toolName: string,\n output: string,\n toolSummaryProvider?: ToolSummaryProvider,\n toolArgs?: UnknownRecord,\n config?: Partial<SummarizerConfig>,\n): string => {\n const summarizer = createDefaultToolOutputSummarizer(config);\n return summarizer.getSummary(toolName, output, toolSummaryProvider, toolArgs);\n};\n","import type { AgentContextBuilderConfig } from '../../config';\nimport type { TruncationResult, DebugFn } from './types';\nimport {\n createDefaultToolOutputSummarizer,\n type SummarizerConfig,\n} from '../../../utils/toolOutputSummarizer';\nimport type { ToolInteractionGroup } from '../../../utils/toolInteractionGroup';\nimport type { MessageProcessingState } from '../base';\nimport type { AiMessage } from '../../../../../../contracts';\n\n/**\n * 工具对截断器\n *\n * 负责超大工具对的智能截断,通过摘要技术压缩 tool_output\n */\nexport class ToolPairTruncator {\n constructor(private readonly config: AgentContextBuilderConfig) {}\n\n /**\n * 智能截断超大的工具对\n *\n * 🔥 核心功能:当工具对因尺寸过大无法装入上下文时,\n * 通过智能摘要技术对 tool_output 进行压缩,\n * 确保 Agent 不会丢失关键的工具执行信息\n */\n truncate(\n group: ToolInteractionGroup<MessageProcessingState>,\n estimateTokens: (message: AiMessage) => number,\n debugFn?: DebugFn\n ): TruncationResult {\n if (group.toolOutputs.length === 0) {\n debugFn?.('❌ 截断失败:工具组内没有可截断的 tool_output', {\n anchorId: group.anchorId,\n });\n return { success: false, tokensSaved: 0 };\n }\n const summarizer = createDefaultToolOutputSummarizer(this.createToolOutputSummaryConfig());\n let tokensSaved = 0;\n\n for (const item of group.items) {\n for (let index = 0; index < item.toolOutputs.length; index += 1) {\n const toolOutputState = item.toolOutputs[index];\n const toolOutputMessage = toolOutputState.message;\n const originalOutput = item.rawOutputs[index] ?? toolOutputMessage.content;\n const originalTokens = toolOutputState.tokens;\n const summary = summarizer.getSummary(\n item.toolName,\n originalOutput,\n undefined,\n item.toolArgs,\n );\n\n toolOutputMessage.content = summary;\n toolOutputMessage.metadata = {\n ...toolOutputMessage.metadata,\n truncated: true,\n originalLength: originalOutput.length,\n truncatedLength: summary.length,\n };\n toolOutputState.tokens = estimateTokens(toolOutputMessage);\n tokensSaved += originalTokens - toolOutputState.tokens;\n }\n }\n\n debugFn?.('✅ 工具组截断成功', {\n 锚点消息: group.anchorId,\n 工具数量: group.items.length,\n toolOutput数量: group.toolOutputs.length,\n 节省Token: tokensSaved,\n });\n\n return { success: tokensSaved > 0, tokensSaved };\n }\n\n /**\n * 基于 Agent 配置生成工具输出摘要器配置\n * - 目标:让截断后的 tool_output 摘要长度接近 MAX_TOOL_OUTPUT_SUMMARY_TOKENS\n * - 原则:依然保持\"首尾预览\"结构,提升信息量,但避免无上限膨胀\n */\n private createToolOutputSummaryConfig(): Partial<SummarizerConfig> {\n const maxSummaryChars = Math.floor(this.config.MAX_TOOL_OUTPUT_SUMMARY_TOKENS * this.config.AVG_CHARS_PER_TOKEN);\n // 文本摘要格式包含固定前缀/引号/省略号等,预留一定空间,避免超出目标\n const wrapperReserveChars = 160;\n const previewChars = Math.max(200, Math.floor((maxSummaryChars - wrapperReserveChars) / 2));\n\n return {\n textPreviewLength: previewChars,\n };\n }\n}\n","/**\n * @file src/agent/context-manager/profiles/agent/context/providers/working-memory/ReplacementSourceTagger.ts\n * @description 替换源标记器 - 负责管理消息的替换源ID追踪\n *\n * 🎯 职责:\n * - 为工具组标记替换源ID\n * - 添加替换源ID到消息状态\n *\n * 🔥 核心作用:\n * - 确保在摘要化时能够正确追溯被替换的原始消息ID\n * - 实现精确的历史净化机制\n */\n\nimport type { MessageProcessingState } from '../base';\n\n/**\n * 替换源标记器\n *\n * 负责管理消息的替换源ID追踪,确保摘要化时能够正确追溯被替换的原始消息\n */\nexport class ReplacementSourceTagger {\n /**\n * 为工具组标记替换源\n *\n * 只收集当前工具组中真实被替代的消息 ID,\n * 严禁再向相邻的 user_input / final_answer 扩散,避免后续摘要把无关消息吞掉。\n */\n tagReplacementSources(\n pair: MessageProcessingState[],\n _statePool: MessageProcessingState[]\n ): void {\n const ids = Array.from(new Set(pair.map(state => state.message.id).filter(Boolean)));\n if (ids.length === 0) {\n return;\n }\n\n // 为工具对中的每个消息添加替换源ID\n pair.forEach(state => this.addReplacementSources(state, ids));\n }\n\n /**\n * 添加替换源ID到消息状态\n *\n * 将新的ID合并到现有的 replacementSourceIds 列表中,自动去重\n */\n addReplacementSources(state: MessageProcessingState, ids: string[]): void {\n const existing = state.replacementSourceIds ?? [];\n const merged = new Set<string>([...existing, ...ids]);\n state.replacementSourceIds = Array.from(merged);\n }\n\n /**\n * 查找相邻状态\n *\n * 从指定索引开始,按指定方向查找满足条件的第一个状态\n *\n * @param stateMap 索引到状态的映射\n * @param startIndex 起始索引\n * @param direction 查找方向:-1 向前,1 向后\n * @param predicate 匹配条件\n */\n findAdjacentState(\n stateMap: Map<number, MessageProcessingState>,\n startIndex: number,\n direction: -1 | 1,\n predicate: (state: MessageProcessingState) => boolean\n ): MessageProcessingState | null {\n const indices = Array.from(stateMap.keys());\n if (indices.length === 0) {\n return null;\n }\n const minIndex = Math.min(...indices);\n const maxIndex = Math.max(...indices);\n\n for (let index = startIndex + direction; index >= minIndex && index <= maxIndex; index += direction) {\n const candidate = stateMap.get(index);\n if (candidate && predicate(candidate)) {\n return candidate;\n }\n }\n return null;\n }\n}\n","import type { MessageProcessingState } from '../base';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { HistoricalToolCandidate } from './types';\nimport type { ToolInteractionGroup } from '../../../utils/toolInteractionGroup';\n\n/**\n * 构造 P3 历史工具候选。\n *\n * 中文备注:\n * - compressed 工具历史摘要与 raw tool group 共享同一条“历史工具交互”预算;\n * - 候选按 originalIndex/startIndex 倒序返回,确保越新的历史越先被塞回上下文。\n */\nexport function buildHistoricalToolCandidates(params: {\n allStates: MessageProcessingState[];\n toolGroups: ToolInteractionGroup<MessageProcessingState>[];\n lastUserOriginalIndex: number;\n matcher: ToolPairMatcher;\n}): HistoricalToolCandidate[] {\n const { allStates, toolGroups, lastUserOriginalIndex, matcher } = params;\n const compressedCandidates = allStates\n .filter((state) => {\n if (!matcher.isCompressedToolHistoryMessage(state.message)) {\n return false;\n }\n return typeof state.originalIndex === 'number' && state.originalIndex <= lastUserOriginalIndex;\n })\n .map((state) => ({\n kind: 'compressed' as const,\n sortIndex: state.originalIndex,\n state,\n }));\n\n const groupCandidates = toolGroups\n .filter((group) => group.startIndex <= lastUserOriginalIndex)\n .map((group) => ({\n kind: 'group' as const,\n sortIndex: group.startIndex,\n group,\n }));\n\n return [...compressedCandidates, ...groupCandidates].sort((left, right) => right.sortIndex - left.sortIndex);\n}\n","import type { MessageProcessingState, ProviderContext } from '../base';\nimport {\n buildToolInteractionGroupsFromStates,\n} from '../../../utils/toolInteractionGroup';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { ToolPairTruncator } from './ToolPairTruncator';\nimport type { ReplacementSourceTagger } from './ReplacementSourceTagger';\nimport type { DebugFn, WorkingMemoryRetentionResult } from './types';\n\n/**\n * POST_TOOL_CALL 阶段的特殊保留策略。\n *\n * 中文备注:\n * - 工具刚执行完的下一 tick,最近工具组是模型续写最依赖的短期事实;\n * - 该策略先于常规 P1/P2/P3 执行,并通过 processedIds 防止后续重复计数。\n */\nexport function promoteMostRecentToolPair(params: {\n allStates: MessageProcessingState[];\n processedIds: Set<string>;\n currentTokens: number;\n budgetLimit: number;\n estimateTokens: ProviderContext['estimateTokens'];\n matcher: ToolPairMatcher;\n truncator: ToolPairTruncator;\n tagger: ReplacementSourceTagger;\n debug: DebugFn;\n}): WorkingMemoryRetentionResult {\n const {\n allStates,\n processedIds,\n currentTokens,\n budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n tagger,\n debug,\n } = params;\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n const toolGroups = buildToolInteractionGroupsFromStates(allStates);\n const group = [...toolGroups].reverse().find((candidate) => candidate.isComplete);\n if (!group || processedIds.has(group.anchorId)) {\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n tagger.tagReplacementSources(group.messages, allStates);\n\n const fit = matcher.canFitToolPair(group, currentTokens, budgetLimit, debug);\n if (fit.canFit) {\n for (const state of fit.pair) {\n if (state.action === 'skip') {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n tokensUsed += state.tokens;\n processedCount++;\n }\n processedIds.add(state.message.id);\n }\n strategiesApplied.push('post_tool_call_priority');\n debug('✅ POST_TOOL_CALL:优先保留最近工具交互对', { pairTokens: fit.totalTokens });\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n const truncated = truncator.truncate(group, estimateTokens, debug);\n if (!truncated.success) {\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n const fitAfterTruncation = matcher.canFitToolPair(group, currentTokens, budgetLimit, debug);\n if (!fitAfterTruncation.canFit) {\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n for (const state of fitAfterTruncation.pair) {\n if (state.action === 'skip') {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n tokensUsed += state.tokens;\n processedCount++;\n }\n processedIds.add(state.message.id);\n }\n strategiesApplied.push('post_tool_call_truncation');\n debug('✅ POST_TOOL_CALL:截断后优先保留最近工具交互对', {\n pairTokens: fitAfterTruncation.totalTokens,\n });\n\n return { tokensUsed, processedCount, strategiesApplied };\n}\n","import type { AgentContextBuilderConfig } from '../../config';\nimport type { MessageProcessingState } from '../base';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { DebugFn, WorkingMemoryRetentionResult } from './types';\n\n/**\n * P2:普通文本、历史摘要与 thought 保留策略。\n *\n * 中文备注:\n * - 这里不处理原始工具组,它们属于 P1/P3;\n * - 压缩工具历史摘要也不按普通 assistant 文本处理,避免绕过工具历史总量限制。\n */\nexport function processTextConversations(params: {\n skippedStates: MessageProcessingState[];\n processedIds: Set<string>;\n currentTokens: number;\n budgetLimit: number;\n config: AgentContextBuilderConfig;\n matcher: ToolPairMatcher;\n debug: DebugFn;\n}): WorkingMemoryRetentionResult {\n const {\n skippedStates,\n processedIds,\n currentTokens,\n budgetLimit,\n config,\n matcher,\n debug,\n } = params;\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n let thoughtsKeptCount = 0;\n\n for (let i = skippedStates.length - 1; i >= 0; i -= 1) {\n const state = skippedStates[i];\n\n if (currentTokens + tokensUsed >= budgetLimit) {\n debug('💰 达到预算限制,停止纯文本对话填充', {\n currentTokens: currentTokens + tokensUsed,\n budgetLimit,\n });\n break;\n }\n\n if (state.action !== 'skip' || processedIds.has(state.message.id)) {\n continue;\n }\n\n if (state.message.role === 'system' && state.message.type === 'history_summary') {\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n markWorkingMemory(state);\n tokensUsed += state.tokens;\n processedCount++;\n processedIds.add(state.message.id);\n strategiesApplied.push('history_summary');\n debug('✅ P2保留历史摘要', {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed,\n });\n }\n continue;\n }\n\n if (\n state.message.role === 'user' &&\n !state.message.metadata?.tool_name &&\n state.message.metadata?.fragmentType !== 'document'\n ) {\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n markWorkingMemory(state);\n tokensUsed += state.tokens;\n processedCount++;\n strategiesApplied.push('text_conversation');\n debug('✅ P2保留用户文本消息', {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed,\n });\n }\n continue;\n }\n\n if (\n state.message.role === 'assistant' &&\n !state.message.metadata?.tool_name &&\n !state.message.metadata?.tool_calls &&\n state.message.type !== 'tool_calls'\n ) {\n if (matcher.isCompressedToolHistoryMessage(state.message)) {\n continue;\n }\n\n if (state.message.type === 'thought') {\n if (thoughtsKeptCount < config.MAX_THOUGHTS_TO_KEEP) {\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n markWorkingMemory(state);\n tokensUsed += state.tokens;\n processedCount++;\n thoughtsKeptCount++;\n strategiesApplied.push('thought_processing');\n debug('✅ P2保留thought消息', {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed,\n });\n }\n }\n continue;\n }\n\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n markWorkingMemory(state);\n tokensUsed += state.tokens;\n processedCount++;\n strategiesApplied.push('text_conversation');\n debug('✅ P2保留助手文本消息', {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed,\n });\n }\n }\n }\n\n return { tokensUsed, processedCount, strategiesApplied };\n}\n\nfunction markWorkingMemory(state: MessageProcessingState): void {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n}\n","import type { MessageProcessingState, ProviderContext } from '../base';\nimport type { ToolInteractionGroup } from '../../../utils/toolInteractionGroup';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { ToolPairTruncator } from './ToolPairTruncator';\nimport type { DebugFn } from './types';\n\n/**\n * 工具组保留原语。\n *\n * 中文备注:\n * - P1、P3 都要保证 tool_call 与 tool_output 成对保留;\n * - 这里集中处理“直接装入 / 截断后装入 / 截断后仍超限”的协议细节。\n */\nexport function keepToolGroup(params: {\n group: ToolInteractionGroup<MessageProcessingState>;\n processedIds: Set<string>;\n currentTokens: number;\n budgetLimit: number;\n estimateTokens: ProviderContext['estimateTokens'];\n matcher: ToolPairMatcher;\n truncator: ToolPairTruncator;\n debug: DebugFn;\n directStrategy: string;\n truncatedStrategy: string;\n directLog: string;\n truncatedLog: string;\n truncationFailedLog: string;\n stopWhenTruncatedDoesNotFit: boolean;\n}): {\n tokensUsed: number;\n processedCount: number;\n strategiesApplied: string[];\n kept: boolean;\n stop: boolean;\n} {\n const {\n group,\n processedIds,\n currentTokens,\n budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n debug,\n } = params;\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n\n const fit = matcher.canFitToolPair(group, currentTokens, budgetLimit, debug);\n if (fit.canFit) {\n for (const pairState of fit.pair) {\n if (pairState.action === 'skip') {\n markWorkingMemory(pairState);\n tokensUsed += pairState.tokens;\n processedCount++;\n }\n processedIds.add(pairState.message.id);\n }\n strategiesApplied.push(params.directStrategy);\n debug(params.directLog, {\n anchorId: group.anchorId,\n pairSize: fit.pair.length,\n tokens: fit.totalTokens,\n });\n return { tokensUsed, processedCount, strategiesApplied, kept: true, stop: false };\n }\n\n const truncationResult = truncator.truncate(group, estimateTokens, debug);\n if (!truncationResult.success) {\n debug(params.truncationFailedLog, {\n anchorId: group.anchorId,\n pairSize: group.messages.length,\n tokens: group.messages.reduce((sum, state) => sum + state.tokens, 0),\n });\n return { tokensUsed, processedCount, strategiesApplied, kept: false, stop: false };\n }\n\n const fitAfterTruncation = matcher.canFitToolPair(group, currentTokens, budgetLimit, debug);\n if (!fitAfterTruncation.canFit) {\n if (params.stopWhenTruncatedDoesNotFit) {\n debug('💰 截断后仍无法装入预算,停止继续保留更旧工具对(保持结构一致)', {\n pairTokens: fitAfterTruncation.totalTokens,\n budgetLimit,\n });\n }\n return {\n tokensUsed,\n processedCount,\n strategiesApplied,\n kept: false,\n stop: params.stopWhenTruncatedDoesNotFit,\n };\n }\n\n for (const pairState of fitAfterTruncation.pair) {\n if (pairState.action === 'skip') {\n markWorkingMemory(pairState);\n tokensUsed += pairState.tokens;\n processedCount++;\n }\n processedIds.add(pairState.message.id);\n }\n strategiesApplied.push(params.truncatedStrategy);\n debug(params.truncatedLog, {\n anchorId: group.anchorId,\n pairSize: fitAfterTruncation.pair.length,\n tokens: fitAfterTruncation.totalTokens,\n truncatedTokens: truncationResult.tokensSaved,\n });\n return { tokensUsed, processedCount, strategiesApplied, kept: true, stop: false };\n}\n\nexport function markWorkingMemory(state: MessageProcessingState): void {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n}\n","import type { MessageProcessingState, ProviderContext } from '../base';\nimport type { ToolInteractionGroup } from '../../../utils/toolInteractionGroup';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { ToolPairTruncator } from './ToolPairTruncator';\nimport type { ReplacementSourceTagger } from './ReplacementSourceTagger';\nimport { keepToolGroup } from './ToolGroupKeeper';\nimport type { DebugFn, ToolInteractionRetentionResult } from './types';\n\n/**\n * P1:当前轮工具交互保留。\n *\n * 中文备注:\n * - 当前轮工具组优先保留,不受“历史工具组数量”上限影响;\n * - 历史工具组只在 P1 中保留最近 N 组,剩余交给 P3 统一处理。\n */\nexport function processToolInteractions(params: {\n allStates: MessageProcessingState[];\n toolGroups: ToolInteractionGroup<MessageProcessingState>[];\n processedIds: Set<string>;\n currentTokens: number;\n budgetLimit: number;\n estimateTokens: ProviderContext['estimateTokens'];\n maxToolPairsToKeep: number;\n minToolPairsToKeep: number;\n lastUserOriginalIndex: number | null;\n matcher: ToolPairMatcher;\n truncator: ToolPairTruncator;\n tagger: ReplacementSourceTagger;\n debug: DebugFn;\n}): ToolInteractionRetentionResult {\n const {\n allStates,\n toolGroups,\n processedIds,\n currentTokens,\n budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n tagger,\n debug,\n } = params;\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n let historicalToolGroupsKept = 0;\n const maxToolPairsToKeep = Math.max(0, Math.floor(params.maxToolPairsToKeep));\n const minToolPairsToKeep = Math.min(\n maxToolPairsToKeep,\n Math.max(0, Math.floor(params.minToolPairsToKeep)),\n );\n const lastUserOriginalIndex = params.lastUserOriginalIndex;\n\n for (let index = toolGroups.length - 1; index >= 0; index -= 1) {\n const group = toolGroups[index];\n const isInCurrentTurn =\n lastUserOriginalIndex === null\n ? true\n : group.startIndex > lastUserOriginalIndex;\n\n if (!isInCurrentTurn && historicalToolGroupsKept >= maxToolPairsToKeep) {\n break;\n }\n\n const shouldForceKeepForMinimum = historicalToolGroupsKept < minToolPairsToKeep;\n if (!shouldForceKeepForMinimum && currentTokens + tokensUsed >= budgetLimit) {\n debug('💰 达到预算限制,停止工具交互填充', {\n currentTokens: currentTokens + tokensUsed,\n budgetLimit,\n });\n break;\n }\n\n if (processedIds.has(group.anchorId)) {\n continue;\n }\n\n if (!group.isComplete) {\n debug('⚠️ 跳过不完整工具组,避免破坏协议顺序', {\n anchorId: group.anchorId,\n toolCallIds: group.toolCallIds,\n });\n continue;\n }\n\n tagger.tagReplacementSources(group.messages, allStates);\n const kept = keepToolGroup({\n group,\n processedIds,\n currentTokens: currentTokens + tokensUsed,\n budgetLimit: shouldForceKeepForMinimum ? Number.MAX_SAFE_INTEGER : budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n debug,\n directStrategy: 'tool_interaction_pairing',\n truncatedStrategy: 'tool_interaction_truncation',\n directLog: '✅ P1保留工具交互对',\n truncatedLog: '✅ P1截断工具交互对',\n truncationFailedLog: '❌ P1截断工具交互对失败',\n stopWhenTruncatedDoesNotFit: true,\n });\n\n tokensUsed += kept.tokensUsed;\n processedCount += kept.processedCount;\n strategiesApplied.push(...kept.strategiesApplied);\n\n if (kept.stop) {\n break;\n }\n if (kept.kept && !isInCurrentTurn) {\n historicalToolGroupsKept++;\n }\n }\n\n return { tokensUsed, processedCount, strategiesApplied, historicalToolGroupsKept };\n}\n","import type { MessageProcessingState, ProviderContext } from '../base';\nimport type { ToolInteractionGroup } from '../../../utils/toolInteractionGroup';\nimport type { ToolPairMatcher } from './ToolPairMatcher';\nimport type { ToolPairTruncator } from './ToolPairTruncator';\nimport type { ReplacementSourceTagger } from './ReplacementSourceTagger';\nimport { buildHistoricalToolCandidates } from './HistoricalToolCandidates';\nimport { keepToolGroup, markWorkingMemory } from './ToolGroupKeeper';\nimport type { DebugFn, HistoricalToolRetentionResult } from './types';\n\n/**\n * P3:历史工具交互保留。\n *\n * 中文备注:\n * - compressed 工具摘要与 raw 工具组共享 maxToolGroupsToKeep;\n * - 这里只处理最后一条 user_input 之前的历史段。\n */\nexport function processHistoricalToolInteractions(params: {\n allStates: MessageProcessingState[];\n toolGroups: ToolInteractionGroup<MessageProcessingState>[];\n processedIds: Set<string>;\n currentTokens: number;\n budgetLimit: number;\n estimateTokens: ProviderContext['estimateTokens'];\n maxToolGroupsToKeep: number;\n minToolGroupsToKeep: number;\n alreadyKeptToolGroups: number;\n lastUserOriginalIndex: number;\n matcher: ToolPairMatcher;\n truncator: ToolPairTruncator;\n tagger: ReplacementSourceTagger;\n debug: DebugFn;\n}): HistoricalToolRetentionResult {\n const {\n allStates,\n toolGroups,\n processedIds,\n currentTokens,\n budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n tagger,\n debug,\n } = params;\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n let toolGroupsKept = 0;\n const maxToolGroupsToKeep = Math.max(0, Math.floor(params.maxToolGroupsToKeep));\n const minToolGroupsToKeep = Math.min(\n params.alreadyKeptToolGroups + maxToolGroupsToKeep,\n Math.max(0, Math.floor(params.minToolGroupsToKeep)),\n );\n\n const candidates = buildHistoricalToolCandidates({\n allStates,\n toolGroups,\n lastUserOriginalIndex: params.lastUserOriginalIndex,\n matcher,\n });\n for (const candidate of candidates) {\n if (toolGroupsKept >= maxToolGroupsToKeep) {\n break;\n }\n\n const shouldForceKeepForMinimum = params.alreadyKeptToolGroups + toolGroupsKept < minToolGroupsToKeep;\n if (!shouldForceKeepForMinimum && currentTokens + tokensUsed >= budgetLimit) {\n debug('💰 达到预算限制,停止历史工具交互填充', {\n currentTokens: currentTokens + tokensUsed,\n budgetLimit,\n });\n break;\n }\n\n if (candidate.kind === 'compressed') {\n const state = candidate.state;\n if (processedIds.has(state.message.id) || state.action !== 'skip') {\n continue;\n }\n if (!shouldForceKeepForMinimum && currentTokens + tokensUsed + state.tokens > budgetLimit) {\n continue;\n }\n markWorkingMemory(state);\n tokensUsed += state.tokens;\n processedCount++;\n processedIds.add(state.message.id);\n toolGroupsKept++;\n strategiesApplied.push('compressed_tool_history');\n continue;\n }\n\n const group = candidate.group;\n if (processedIds.has(group.anchorId) || !group.isComplete) {\n continue;\n }\n\n tagger.tagReplacementSources(group.messages, allStates);\n const kept = keepToolGroup({\n group,\n processedIds,\n currentTokens: currentTokens + tokensUsed,\n budgetLimit: shouldForceKeepForMinimum ? Number.MAX_SAFE_INTEGER : budgetLimit,\n estimateTokens,\n matcher,\n truncator,\n debug,\n directStrategy: 'historical_tool_interaction',\n truncatedStrategy: 'historical_tool_interaction_truncation',\n directLog: '✅ P3保留历史工具交互',\n truncatedLog: '✅ P3截断历史工具交互对',\n truncationFailedLog: '❌ P3截断历史工具交互对失败',\n stopWhenTruncatedDoesNotFit: false,\n });\n\n tokensUsed += kept.tokensUsed;\n processedCount += kept.processedCount;\n strategiesApplied.push(...kept.strategiesApplied);\n if (kept.kept) {\n toolGroupsKept++;\n }\n }\n\n return { tokensUsed, processedCount, strategiesApplied, toolGroupsKept };\n}\n","/**\n * @file src/agent/context/providers/AgentWorkingMemoryProvider.ts\n * @description Agent专用工作记忆填充层Provider - 第二阶段上下文构建\n *\n * 🎯 职责: 实现Agent的P1-P3优先级填充策略\n * 📖 策略: P1(工具交互) > P2(纯文本对话) > P3(历史工具交互)\n * ✨ Agent特性: 工具调用优先级、配对保留策略\n * 🔧 核心逻辑: 保留工具调用时,必须确保其对应的另一半也被保留\n */\n\nimport { BaseContextProvider, MessageProcessingState, ProviderContext, ProviderResult } from './base';\nimport {\n createAgentContextBuilderConfig,\n type AgentContextBuilderConfig,\n} from '../config';\nimport {\n ToolPairMatcher,\n ToolPairTruncator,\n ReplacementSourceTagger,\n processHistoricalToolInteractions,\n processTextConversations,\n processToolInteractions,\n promoteMostRecentToolPair,\n} from './working-memory';\nimport type { DebugFn } from './working-memory';\nimport {\n buildToolInteractionGroupsFromStates,\n findLastUserInputOriginalIndex,\n} from '../../utils/toolInteractionGroup';\n\n/**\n * Agent专用工作记忆填充层Provider\n *\n * 实现Agent README中描述的第二阶段:工作记忆填充层 (Working Memory)\n * 工具调用为最高优先级,确保工具交互的完整性\n */\nexport class AgentWorkingMemoryProvider extends BaseContextProvider {\n readonly name = 'AgentWorkingMemoryProvider';\n readonly description = 'Agent工作记忆填充层 - 工具优先的反向填充策略,支持配对保留';\n readonly priority = 2; // 仅次于核心上下文\n\n private readonly matcher: ToolPairMatcher;\n private readonly truncator: ToolPairTruncator;\n private readonly tagger: ReplacementSourceTagger;\n private readonly config: AgentContextBuilderConfig;\n\n constructor(customConfig?: Partial<AgentContextBuilderConfig>) {\n super();\n this.config = createAgentContextBuilderConfig(customConfig ?? {});\n this.matcher = new ToolPairMatcher(this.config);\n this.truncator = new ToolPairTruncator(this.config);\n this.tagger = new ReplacementSourceTagger();\n }\n\n /**\n * 类型守卫:用于安全读取 ProviderContext 上的\"扩展字段\"\n * 注意:ProviderContext 本身是稳定契约,扩展字段来自编排层(不应污染接口定义)。\n */\n private isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n\n /**\n * 读取当前上下文阶段(如果编排层提供了 currentPhase)\n * - 禁止 any 类型断言:这里用 Record 逐层收窄。\n */\n private readCurrentPhase(context: ProviderContext): string | undefined {\n const ctx = context as unknown;\n if (!this.isRecord(ctx)) return undefined;\n const currentPhase = ctx['currentPhase'];\n if (!this.isRecord(currentPhase)) return undefined;\n const phase = currentPhase['phase'];\n return typeof phase === 'string' ? phase : undefined;\n }\n\n /**\n * 创建调试函数\n */\n private createDebugFn(context: ProviderContext): DebugFn {\n return (message: string, data?: Record<string, unknown>) => {\n this.debug(message, data, context);\n };\n }\n\n async provide(\n states: MessageProcessingState[],\n availableBudget: number,\n context: ProviderContext\n ): Promise<ProviderResult> {\n // 使用统一配置\n const config = this.config;\n\n this.debug('🧠 开始Agent工作记忆填充层处理', {\n totalMessages: states.length,\n availableBudget,\n config: {\n budgetPercentage: config.WORKING_MEMORY_BUDGET_PERCENTAGE\n }\n }, context);\n\n // 计算当前已使用的Token (核心上下文)\n const coreTokens = this.calculateUsedTokens(states);\n let workingMemoryTokens = coreTokens;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n\n // 中文备注:工作记忆比例以本次“输入总预算”为基准。availableBudget 已经被 pipeline\n // 扣过核心层 token;如果再用它乘比例,会把核心消息重复扣一次,导致上下文过早收缩。\n const workingMemoryBudget = Math.floor(context.totalBudget * config.WORKING_MEMORY_BUDGET_PERCENTAGE);\n const remainingBudget = workingMemoryBudget - coreTokens;\n\n if (remainingBudget <= 0 && config.MIN_TOOL_INTERACTIONS_TO_KEEP <= 0) {\n this.debug('⚠️ 核心上下文已用尽预算,跳过工作记忆填充', {\n coreTokens,\n workingMemoryBudget\n }, context);\n return this.createResult(states, 0, [], { processedCount: 0, skippedCount: 0, addedCount: 0 });\n }\n\n // 🔥 阶段感知:POST_TOOL_CALL 优先保留\"最近一对\"工具交互(tool_calls ↔ tool_output)\n const processedIds = new Set<string>();\n const inPostToolCall = this.readCurrentPhase(context) === 'post_tool_call';\n if (inPostToolCall) {\n const pri = promoteMostRecentToolPair({\n allStates: states,\n processedIds,\n currentTokens: workingMemoryTokens,\n budgetLimit: workingMemoryBudget,\n estimateTokens: context.estimateTokens,\n matcher: this.matcher,\n truncator: this.truncator,\n tagger: this.tagger,\n debug: this.createDebugFn(context),\n });\n workingMemoryTokens += pri.tokensUsed;\n processedCount += pri.processedCount;\n strategiesApplied.push(...pri.strategiesApplied);\n }\n\n // 获取所有跳过的消息状态,用于填充\n const skippedStates = states.filter(s => s.action === 'skip');\n const toolGroups = buildToolInteractionGroupsFromStates(states, {\n maxPairingDistance: config.TOOL_PAIRING_SEARCH_RANGE,\n });\n\n // === Agent专用逻辑:工具优先填充策略 ===\n const maxToolGroupsTotal = config.MAX_TOOL_INTERACTION_GROUPS_TO_KEEP;\n const maxRecentToolPairs = config.MAX_RECENT_TOOL_INTERACTIONS_TO_KEEP;\n let historicalToolGroupsKept = 0;\n\n // 计算\"当前轮次起点(最后一条 user_input)\"的 originalIndex\n const lastUserOriginalIndex = findLastUserInputOriginalIndex(states);\n\n // P1 优先级:工具交互(tool_calls 和 tool 消息)- 配对保留\n this.debug('🔧 P1优先级:开始处理工具交互(配对保留)', { remainingBudget: workingMemoryBudget - workingMemoryTokens });\n const p1Result = processToolInteractions({\n allStates: states,\n toolGroups,\n processedIds,\n currentTokens: workingMemoryTokens,\n budgetLimit: workingMemoryBudget,\n estimateTokens: context.estimateTokens,\n maxToolPairsToKeep: Math.min(maxRecentToolPairs, maxToolGroupsTotal),\n minToolPairsToKeep: config.MIN_TOOL_INTERACTIONS_TO_KEEP,\n lastUserOriginalIndex,\n matcher: this.matcher,\n truncator: this.truncator,\n tagger: this.tagger,\n debug: this.createDebugFn(context),\n });\n\n workingMemoryTokens += p1Result.tokensUsed;\n processedCount += p1Result.processedCount;\n strategiesApplied.push(...p1Result.strategiesApplied);\n historicalToolGroupsKept += p1Result.historicalToolGroupsKept;\n\n // P2 优先级:纯文本对话(user 和 assistant 纯文本消息)\n if (workingMemoryTokens < workingMemoryBudget) {\n this.debug('💬 P2优先级:开始处理纯文本对话', {\n remainingBudget: workingMemoryBudget - workingMemoryTokens\n });\n const p2Result = processTextConversations({\n skippedStates,\n processedIds,\n currentTokens: workingMemoryTokens,\n budgetLimit: workingMemoryBudget,\n config,\n matcher: this.matcher,\n debug: this.createDebugFn(context),\n });\n\n workingMemoryTokens += p2Result.tokensUsed;\n processedCount += p2Result.processedCount;\n strategiesApplied.push(...p2Result.strategiesApplied);\n }\n\n // P3 优先级:历史工具交互(第3组及以前的工具交互)\n if (workingMemoryTokens < workingMemoryBudget && lastUserOriginalIndex !== null) {\n this.debug('📚 P3优先级:开始处理历史工具交互', {\n remainingBudget: workingMemoryBudget - workingMemoryTokens\n });\n const remainingToolGroups = Math.max(0, maxToolGroupsTotal - historicalToolGroupsKept);\n const p3Result = processHistoricalToolInteractions({\n allStates: states,\n toolGroups,\n processedIds,\n currentTokens: workingMemoryTokens,\n budgetLimit: workingMemoryBudget,\n estimateTokens: context.estimateTokens,\n maxToolGroupsToKeep: remainingToolGroups,\n minToolGroupsToKeep: config.MIN_TOOL_INTERACTIONS_TO_KEEP,\n alreadyKeptToolGroups: historicalToolGroupsKept,\n lastUserOriginalIndex,\n matcher: this.matcher,\n truncator: this.truncator,\n tagger: this.tagger,\n debug: this.createDebugFn(context),\n });\n\n workingMemoryTokens += p3Result.tokensUsed;\n processedCount += p3Result.processedCount;\n strategiesApplied.push(...p3Result.strategiesApplied);\n }\n\n const finalTokensUsed = workingMemoryTokens - coreTokens;\n\n this.debug('📊 Agent工作记忆填充层处理完成', {\n workingMemoryMessages: processedCount,\n workingMemoryTokens: finalTokensUsed,\n totalTokensUsed: workingMemoryTokens,\n remainingBudget: availableBudget - workingMemoryTokens\n }, context);\n\n return this.createResult(\n states,\n finalTokensUsed,\n strategiesApplied,\n {\n processedCount,\n skippedCount: skippedStates.length - processedCount,\n addedCount: 0\n }\n );\n }\n\n /**\n * 计算当前已使用的Token数\n */\n private calculateUsedTokens(states: MessageProcessingState[]): number {\n return states\n .filter(s => s.action.startsWith('keep_'))\n .reduce((total, state) => total + state.tokens, 0);\n }\n\n}\n","export enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\ntype LogPayload = Record<string, unknown> | undefined;\n\nconst DEFAULT_LEVEL = LogLevel.DEBUG;\n\nfunction formatPrefix(level: keyof Console, moduleName: string): string {\n return `[${new Date().toISOString()}] [${level.toUpperCase()}] [${moduleName}]`;\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return level >= DEFAULT_LEVEL;\n}\n\nexport class Logger {\n constructor(private readonly moduleName: string) {}\n\n debug(message: string, data?: LogPayload): void {\n this.log(LogLevel.DEBUG, 'debug', message, data);\n }\n\n info(message: string, data?: LogPayload): void {\n this.log(LogLevel.INFO, 'info', message, data);\n }\n\n warn(message: string, data?: LogPayload): void {\n this.log(LogLevel.WARN, 'warn', message, data);\n }\n\n error(message: string, data?: LogPayload): void {\n this.log(LogLevel.ERROR, 'error', message, data);\n }\n\n private log(level: LogLevel, method: keyof Console, message: string, data?: LogPayload): void {\n if (!shouldLog(level)) {\n return;\n }\n const prefix = formatPrefix(method, this.moduleName);\n const fullMessage = `${prefix} ${message}`;\n if (data === undefined) {\n switch (method) {\n case 'debug':\n console.debug(fullMessage);\n break;\n case 'info':\n console.info(fullMessage);\n break;\n case 'warn':\n console.warn(fullMessage);\n break;\n case 'error':\n console.error(fullMessage);\n break;\n default:\n console.log(fullMessage);\n }\n return;\n }\n switch (method) {\n case 'debug':\n console.debug(fullMessage, data);\n break;\n case 'info':\n console.info(fullMessage, data);\n break;\n case 'warn':\n console.warn(fullMessage, data);\n break;\n case 'error':\n console.error(fullMessage, data);\n break;\n default:\n console.log(fullMessage, data);\n }\n }\n}\n","/**\n * @file src/agent/context-manager/profiles/agent/context/providers/CheckpointSummarizationProvider.ts\n * @description 上下文检查点 Provider(根因级语义修正版):\n *\n * ✅ checkpoint 是一个“正常工具调用”,必须以 tool_calls → tool_output 的形式按顺序保留在历史中,\n * 也必须按顺序进入发送给 LLM 的 messages(而不是被替换成 system history_summary 顶置到最前)。\n *\n * 🎯 checkpoint 的职责是“清理 checkpoint 之前的旧历史”,而不是“把 checkpoint 本身变成摘要”:\n * - 保留:Must-Keep(system_prompt / 最新 user_input / 必保留 fence 等)、checkpoint 工具对、\n * 以及 checkpoint 之前最近 N 对工具交互(默认 N=2)。\n * - 清理:checkpoint 之前更旧的工具对 / final_answer / thought / 旧 history_summary 等。\n *\n * ✅ 设计原则:\n * - checkpoint 只影响“本轮发给 LLM 的 messages 选择”,不生成任何 system 摘要事件;\n * - 数据库仍然落全量事实历史:裁剪不会影响持久化/回放,只影响本轮 LLM 输入。\n */\n\nimport {\n BaseContextProvider,\n type MessageProcessingState,\n type ProviderContext,\n type ProviderResult,\n} from './base';\nimport { CHECKPOINT_MARKER_TYPE } from '../../../../shared/checkpointMarker';\nimport { Logger } from '../../../../../shared/logger';\nimport {\n buildToolInteractionGroupsFromStates,\n type ToolInteractionGroup,\n} from '../../utils/toolInteractionGroup';\n\nconst logger = new Logger('CheckpointSummarizationProvider');\n\nconst CHECKPOINT_TOOL_NAME = 'context_checkpoint';\nconst DEFAULT_KEEP_PAIRS_BEFORE_CHECKPOINT = 2;\n\ntype UnknownRecord = Record<string, unknown>;\nfunction isRecord(v: unknown): v is UnknownRecord {\n return !!v && typeof v === 'object' && !Array.isArray(v);\n}\n\n/**\n * 从 tool_output 消息的 content 中尝试解析 checkpoint 标记\n * 返回 summary 字符串或 null\n */\nfunction extractCheckpointSummary(content: string): string | null {\n try {\n const parsed = JSON.parse(content) as Record<string, unknown>;\n // StructuredToolResult 格式:{ data: { _type, summary }, observation }\n const data = parsed['data'];\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n const rec = data as Record<string, unknown>;\n if (rec['_type'] === CHECKPOINT_MARKER_TYPE && typeof rec['summary'] === 'string') {\n return rec['summary'];\n }\n }\n // 兼容直接格式\n if (parsed['_type'] === CHECKPOINT_MARKER_TYPE && typeof parsed['summary'] === 'string') {\n return parsed['summary'] as string;\n }\n } catch {\n // content 不是 JSON,跳过\n }\n return null;\n}\n\n/**\n * 从 tool_output 消息中提取 checkpoint summary(严格模式):\n * - 仅使用 metadata.raw_output(原始 JSON)\n * - 不解析 content,避免与 observation(给 AI 的纯文本)语义混淆\n */\nfunction extractCheckpointSummaryFromToolOutputMessage(message: {\n content?: unknown;\n metadata?: Record<string, unknown> | undefined;\n}): string | null {\n const rawOutput = message.metadata?.['raw_output'];\n if (typeof rawOutput === 'string') {\n return extractCheckpointSummary(rawOutput);\n }\n\n return null;\n}\n\nexport interface CheckpointSummarizationProviderOptions {\n /** checkpoint 之前保留的最近工具交互轮数。 */\n keepPairsBefore?: number;\n /** 触发 checkpoint 裁剪的工具名。默认 context_checkpoint。 */\n triggerToolName?: string;\n}\n\nexport class CheckpointSummarizationProvider extends BaseContextProvider {\n readonly name = 'CheckpointSummarizationProvider';\n readonly description = '上下文检查点 - 保留 checkpoint 工具对,裁剪其之前旧历史';\n readonly priority = 2.5;\n\n private readonly keepPairsBefore: number;\n private readonly triggerToolName: string;\n\n constructor(options: CheckpointSummarizationProviderOptions = {}) {\n super();\n this.keepPairsBefore = normalizeNonNegativeInteger(\n options.keepPairsBefore,\n DEFAULT_KEEP_PAIRS_BEFORE_CHECKPOINT,\n );\n this.triggerToolName = normalizeTriggerToolName(options.triggerToolName);\n }\n\n async provide(\n states: MessageProcessingState[],\n availableBudget: number,\n context: ProviderContext,\n ): Promise<ProviderResult> {\n // 1) 在 states 中搜索 context_checkpoint 的 tool_output\n const checkpointResult = this.findCheckpoint(states);\n if (!checkpointResult) {\n return this.createResult(states, 0, [], {\n processedCount: 0,\n skippedCount: 0,\n addedCount: 0,\n });\n }\n\n const { checkpointGroup } = checkpointResult;\n\n logger.info('🔄 检测到 checkpoint,开始执行 checkpoint 前历史清理', {\n totalStates: states.length,\n checkpointAnchorId: checkpointGroup.anchorId,\n triggerToolName: this.triggerToolName,\n keepPairsBefore: this.keepPairsBefore,\n });\n const keepBefore = this.findRecentToolPairIndicesBeforeCheckpoint(states, checkpointGroup.startIndex);\n\n const keepSet = new Set<number>([\n ...checkpointGroup.messageIndexes,\n ...keepBefore,\n ]);\n\n // 2.2) 强制提升保留工具交互的 action:checkpoint 与其前两对工具对必须进入最终 messages\n let promotedKeepCount = 0;\n for (const idx of keepSet) {\n const state = states[idx];\n if (!state) continue;\n if (state.action === 'skip') {\n state.action = 'keep_working_memory';\n state.phase = 'CHECKPOINT';\n promotedKeepCount++;\n }\n }\n\n // 3) 选择要裁剪的候选(仅限 checkpoint 之前)\n const candidatesToPurge: MessageProcessingState[] = [];\n for (let i = 0; i < states.length; i++) {\n if (i >= checkpointGroup.startIndex) {\n // checkpoint 本身以及之后的消息:全部不参与 purge(只做预算筛选)\n continue;\n }\n const s = states[i];\n const msg = s.message;\n\n // Must-Keep:永远不 purge(由 CoreContextProvider 标记)\n if (s.action === 'keep_core' && msg.type !== 'history_summary') {\n continue;\n }\n // 系统提示词类:永远不 purge(history_summary 除外)\n if (msg.role === 'system' && msg.type !== 'history_summary') {\n continue;\n }\n // checkpoint 前最近 N 对工具交互:不 purge\n if (keepSet.has(i)) {\n continue;\n }\n\n candidatesToPurge.push(s);\n }\n\n if (candidatesToPurge.length === 0) {\n logger.info('⏭️ 无可清理的 checkpoint 前历史,跳过 purge');\n return this.createResult(states, 0, [], {\n processedCount: 0,\n skippedCount: 0,\n addedCount: 0,\n });\n }\n\n // 4) 立即在本 tick 的 states 中应用裁剪:把候选全部降级为 skip(即不进 LLM messages)\n let demotedCount = 0;\n for (const s of candidatesToPurge) {\n if (s.action !== 'skip') {\n s.action = 'skip';\n s.phase = 'CHECKPOINT_PURGED';\n demotedCount++;\n }\n }\n\n logger.info('✅ Checkpoint 前历史裁剪完成', {\n purgedCount: candidatesToPurge.length,\n promotedKeepCount,\n demotedCount,\n });\n\n return this.createResult(\n states,\n 0,\n ['checkpoint_trim_before'],\n {\n processedCount: candidatesToPurge.length,\n skippedCount: 0,\n addedCount: 0,\n },\n );\n }\n\n /**\n * 在 states 中查找 context_checkpoint 工具的 observation\n * 返回 { summary, checkpointStateIndex } 或 null\n */\n private findCheckpoint(\n states: MessageProcessingState[],\n ): { summary: string; checkpointGroup: ToolInteractionGroup<MessageProcessingState> } | null {\n const groups = buildToolInteractionGroupsFromStates(states, {\n checkpointToolName: this.triggerToolName,\n });\n for (let index = groups.length - 1; index >= 0; index -= 1) {\n const group = groups[index];\n const summary = this.extractCheckpointSummaryFromGroup(group);\n if (summary) {\n return { summary, checkpointGroup: group };\n }\n }\n return null;\n }\n\n /**\n * 找到 checkpoint 之前最近 N 轮工具交互 indices\n * - 仅扫描 checkpoint tool_calls 之前的历史段\n */\n private findRecentToolPairIndicesBeforeCheckpoint(states: MessageProcessingState[], beforeIndexExclusive: number): number[] {\n if (this.keepPairsBefore <= 0) {\n return [];\n }\n\n const indices: number[] = [];\n const groups = buildToolInteractionGroupsFromStates(states, {\n checkpointToolName: this.triggerToolName,\n })\n .filter((group) => group.startIndex < beforeIndexExclusive && group.isComplete && !group.isCheckpointGroup)\n .slice(-this.keepPairsBefore);\n for (const group of groups) {\n indices.push(...group.messageIndexes);\n }\n return indices;\n }\n\n private extractCheckpointSummaryFromGroup(\n group: ToolInteractionGroup<MessageProcessingState>,\n ): string | null {\n if (!group.toolNames.includes(this.triggerToolName)) {\n return null;\n }\n for (const message of group.toolOutputMessages) {\n const summary = extractCheckpointSummaryFromToolOutputMessage(message);\n if (summary) {\n return summary;\n }\n }\n return null;\n }\n\n // 中文备注:这里不做“跨 tick 幂等事件锚点”,因为本 Provider 是纯裁剪逻辑,重复运行是幂等的。\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return fallback;\n }\n return Math.max(0, Math.floor(value));\n}\n\nfunction normalizeTriggerToolName(value: string | undefined): string {\n const candidate = value?.trim();\n return candidate && candidate.length > 0 ? candidate : CHECKPOINT_TOOL_NAME;\n}\n","/**\n * @file src/agent/context-manager/profiles/agent/context/providers/index.ts\n * @description Agent profile provider 协议与实现导出\n */\n\nexport * from './base';\n\nexport { AgentCoreContextProvider } from './AgentCoreContextProvider';\nexport { AgentWorkingMemoryProvider } from './AgentWorkingMemoryProvider';\nexport { CheckpointSummarizationProvider } from './CheckpointSummarizationProvider';\nexport { SummarizationProvider } from '../../../../shared/providers';\nimport { ContextProviderRegistry as SharedContextProviderRegistry } from '../../../../shared/providers';\nimport type { AgentContextBuilderConfig } from '../config';\n\nexport class ContextProviderRegistry extends SharedContextProviderRegistry<AgentContextBuilderConfig> {}\n","import type { LlmRequestMessage, TokenizerPort } from '../ports';\nimport { TokenCalculator } from './TokenCalculator';\n\nexport interface DefaultTokenizerPortConfig {\n /** tiktoken encoding 名,默认沿用 TokenCalculator 的 cl100k_base 近似路径。 */\n encoding?: string;\n /** tiktoken 不可用或不指定 encoding 时的字符/token 兜底比。 */\n avgCharsPerToken?: number;\n /** 单个 tool_call 的额外 token 开销估算。 */\n toolCallOverhead?: number;\n}\n\n/**\n * linnkit 默认 tokenizer。\n *\n * 中文备注:\n * - 这是 TokenCalculator 的薄包装,保持 0.7.x 默认行为;\n * - host 不注入 TokenizerPort 时,context-manager 自动使用该实现;\n * - 只用于上下文 budget 估算,不用于计费。\n */\nexport class DefaultTokenizerPort implements TokenizerPort {\n constructor(private readonly config: DefaultTokenizerPortConfig = {}) {}\n\n estimateText(text: string, _modelId?: string): number {\n return TokenCalculator.estimateTokens(text, {\n encoding: this.config.encoding,\n avgCharsPerToken: this.config.avgCharsPerToken,\n });\n }\n\n estimateMessage(message: LlmRequestMessage, _modelId?: string): number {\n return TokenCalculator.estimateMessageTokens(message, {\n encoding: this.config.encoding,\n avgCharsPerToken: this.config.avgCharsPerToken,\n toolCallOverhead: this.config.toolCallOverhead,\n });\n }\n}\n\nexport function createDefaultTokenizerPort(config: DefaultTokenizerPortConfig = {}): TokenizerPort {\n return new DefaultTokenizerPort(config);\n}\n","import type {\n MessageProcessingState,\n ProviderContext,\n} from './providers/base';\nimport {\n SUMMARIZATION_FAILED_ERROR_CODE,\n isContextProviderError,\n} from './providers/base';\nimport type { ContextProviderRegistry } from './providers/registry';\nimport type { AiMessage, RuntimeEvent } from '../../contracts';\nimport type { ContextTraceCollector } from './context-trace';\n\nexport interface ContextPipelineStats<TPhase extends PropertyKey> {\n phaseTiming: Record<TPhase, number>;\n phaseTokenUsage: Record<TPhase, { used: number; percentage: number }>;\n messageStats: {\n original: number;\n afterCoreContext: number;\n afterWorkingMemory: number;\n afterSummarization: number;\n };\n}\n\nexport interface RunContextPipelineOptions<\n TConfig,\n TContext extends ProviderContext<TConfig>,\n TPhase extends PropertyKey,\n TStats extends ContextPipelineStats<TPhase>,\n> {\n messages: AiMessage[];\n totalBudget: number;\n buildStats: TStats;\n providerRegistry: ContextProviderRegistry<TConfig>;\n providerContext: TContext;\n estimateTokens: (message: AiMessage) => number;\n getPhaseByProviderName: (providerName: string) => TPhase | null;\n debug?: (message: string, data?: Record<string, unknown>) => void;\n contextTrace?: ContextTraceCollector;\n}\n\nexport interface RunContextPipelineResult {\n finalMessages: AiMessage[];\n finalTokens: number;\n strategiesApplied: string[];\n events: RuntimeEvent[];\n states: MessageProcessingState[];\n}\n\nexport async function runContextPipeline<\n TConfig,\n TContext extends ProviderContext<TConfig>,\n TPhase extends PropertyKey,\n TStats extends ContextPipelineStats<TPhase>,\n>(options: RunContextPipelineOptions<TConfig, TContext, TPhase, TStats>): Promise<RunContextPipelineResult> {\n const {\n messages,\n totalBudget,\n buildStats,\n providerRegistry,\n providerContext,\n estimateTokens,\n getPhaseByProviderName,\n debug,\n contextTrace,\n } = options;\n\n let states: MessageProcessingState[] = messages.map((message, index) => ({\n message,\n originalIndex: index,\n action: 'skip',\n tokens: estimateTokens(message),\n }));\n\n const providers = providerRegistry.getAllProviders();\n let availableBudget = totalBudget;\n const allStrategiesApplied: string[] = [];\n const allEvents: RuntimeEvent[] = [];\n\n debug?.('🎯 [ContextPipeline] 开始 Provider 链式处理', {\n totalProviders: providers.length,\n providerOrder: providers.map(provider => `${provider.name}(优先级:${provider.priority})`),\n });\n\n for (const provider of providers) {\n const phaseStartTime = performance.now();\n\n if (provider.shouldSkip?.(states, availableBudget, providerContext)) {\n debug?.(`⏭️ 跳过Provider: ${provider.name}`, { availableBudget });\n contextTrace?.recordProvider({\n providerName: provider.name,\n skipped: true,\n durationMs: performance.now() - phaseStartTime,\n beforeStates: states,\n afterStates: states,\n tokensUsed: 0,\n strategiesApplied: [],\n remainingBudget: availableBudget,\n });\n continue;\n }\n\n debug?.(`🔄 执行Provider: ${provider.name}`, { availableBudget });\n\n try {\n const beforeStates = cloneStatesForTrace(states);\n const result = await provider.provide(states, availableBudget, providerContext);\n\n states = result.states;\n\n if (result.events && result.events.length > 0) {\n allEvents.push(...result.events);\n debug?.('📦 收集到事件', {\n provider: provider.name,\n eventCount: result.events.length,\n eventTypes: result.events.map(event => event.type),\n });\n }\n\n availableBudget -= result.tokensUsed;\n allStrategiesApplied.push(...result.strategiesApplied);\n contextTrace?.recordProvider({\n providerName: provider.name,\n skipped: false,\n durationMs: performance.now() - phaseStartTime,\n beforeStates,\n afterStates: states,\n tokensUsed: result.tokensUsed,\n strategiesApplied: result.strategiesApplied,\n remainingBudget: availableBudget,\n });\n\n const phaseName = getPhaseByProviderName(provider.name);\n if (phaseName !== null) {\n buildStats.phaseTiming[phaseName] = performance.now() - phaseStartTime;\n buildStats.phaseTokenUsage[phaseName] = {\n used: result.tokensUsed,\n percentage: (result.tokensUsed / totalBudget) * 100,\n };\n }\n\n debug?.(`✅ Provider完成: ${provider.name}`, {\n tokensUsed: result.tokensUsed,\n remainingBudget: availableBudget,\n processedCount: result.stats.processedCount,\n strategiesApplied: result.strategiesApplied,\n });\n } catch (error) {\n debug?.(`❌ Provider失败: ${provider.name}`, { error });\n\n if (isFatalProviderError(error)) {\n throw error;\n }\n }\n }\n\n buildStats.messageStats.afterCoreContext = states.filter(state => state.action === 'keep_core').length;\n buildStats.messageStats.afterWorkingMemory = states.filter(state => state.action.startsWith('keep_')).length;\n buildStats.messageStats.afterSummarization = states.filter(state => state.action !== 'skip').length;\n\n const finalMessages = generateFinalMessages(states);\n const finalTokens = finalMessages.reduce((total, message) => total + estimateTokens(message), 0);\n contextTrace?.recordMessageDecisions(states);\n\n return {\n finalMessages,\n finalTokens,\n strategiesApplied: [...new Set(allStrategiesApplied)],\n events: allEvents,\n states,\n };\n}\n\nfunction cloneStatesForTrace(states: ReadonlyArray<MessageProcessingState>): MessageProcessingState[] {\n return states.map(state => ({ ...state }));\n}\n\nexport function generateFinalMessages(states: MessageProcessingState[]): AiMessage[] {\n const sysPromptMessages: MessageProcessingState[] = [];\n const summaryMessages: MessageProcessingState[] = [];\n const otherMessages: MessageProcessingState[] = [];\n\n for (const state of states) {\n if (!state.action.startsWith('keep_')) {\n continue;\n }\n\n if (state.message.type === 'system_prompt') {\n sysPromptMessages.push(state);\n } else if (state.message.type === 'history_summary') {\n summaryMessages.push(state);\n } else {\n otherMessages.push(state);\n }\n }\n\n sysPromptMessages.sort((a, b) => a.originalIndex - b.originalIndex);\n summaryMessages.sort((a, b) => a.originalIndex - b.originalIndex);\n otherMessages.sort((a, b) => a.originalIndex - b.originalIndex);\n\n const finalStates: MessageProcessingState[] = [\n ...sysPromptMessages,\n ...summaryMessages,\n ...otherMessages,\n ];\n\n return finalStates.map(state => {\n const { id, role, type, timestamp, metadata } = state.message;\n return {\n id,\n role,\n type,\n content: state.processedContent || state.message.content,\n timestamp,\n ...(metadata && { metadata }),\n } as AiMessage;\n });\n}\n\nfunction isFatalProviderError(error: unknown): boolean {\n return (\n isContextProviderError(error) &&\n error.code === SUMMARIZATION_FAILED_ERROR_CODE &&\n error.fatal === true\n );\n}\n","import { Logger } from '../../shared/logger';\nimport type { ContextProviderRegistry } from './providers/registry';\nimport type { ProviderContext } from './providers/base';\nimport { createDefaultTokenizerPort } from '../../shared/defaultTokenizerPort';\nimport {\n runContextPipeline,\n type ContextPipelineStats,\n type RunContextPipelineResult,\n} from './context-pipeline';\nimport type { AiMessage } from '../../contracts';\nimport type { LlmRequestMessage, TokenizerPort } from '../../ports';\nimport type { ContextTraceCollector } from './context-trace';\n\nexport interface ContextManagerBaseConfig {\n AVG_CHARS_PER_TOKEN: number;\n TOOL_CALL_OVERHEAD_TOKENS?: number;\n TOKEN_ENCODING_NAME?: string;\n}\n\nexport interface ContextManagerBaseOptions<TConfig, TRegistry> {\n debugMode?: boolean;\n customConfig?: Partial<TConfig>;\n providerRegistry?: TRegistry;\n tokenizer?: TokenizerPort;\n tokenizerModelId?: string;\n}\n\ninterface ContextManagerBaseInit<TConfig, TRegistry> {\n defaultConfig: TConfig;\n validateConfig: (config: TConfig) => boolean;\n createRegistry: () => TRegistry;\n loggerName: string;\n invalidConfigMessage: string;\n}\n\nexport abstract class ContextManagerBase<\n TConfig extends ContextManagerBaseConfig,\n TRegistry extends ContextProviderRegistry<TConfig>,\n> {\n protected config: TConfig;\n protected debugMode: boolean;\n protected providerRegistry: TRegistry;\n protected logger: Logger;\n protected tokenizer: TokenizerPort;\n protected tokenizerModelId?: string;\n private readonly validateConfigFn: (config: TConfig) => boolean;\n private readonly invalidConfigMessage: string;\n private readonly hasCustomTokenizer: boolean;\n\n protected constructor(\n options: ContextManagerBaseOptions<TConfig, TRegistry>,\n init: ContextManagerBaseInit<TConfig, TRegistry>,\n ) {\n this.debugMode = options.debugMode ?? false;\n this.config = options.customConfig\n ? { ...init.defaultConfig, ...options.customConfig }\n : init.defaultConfig;\n this.providerRegistry = options.providerRegistry ?? init.createRegistry();\n this.logger = new Logger(init.loggerName);\n this.validateConfigFn = init.validateConfig;\n this.invalidConfigMessage = init.invalidConfigMessage;\n this.hasCustomTokenizer = options.tokenizer !== undefined;\n this.tokenizer = options.tokenizer ?? this.createDefaultTokenizer();\n this.tokenizerModelId = options.tokenizerModelId;\n\n if (!this.validateConfigFn(this.config)) {\n throw new Error(this.invalidConfigMessage);\n }\n }\n\n private createDefaultTokenizer(): TokenizerPort {\n return createDefaultTokenizerPort({\n encoding: this.config.TOKEN_ENCODING_NAME,\n avgCharsPerToken: this.config.AVG_CHARS_PER_TOKEN,\n toolCallOverhead: this.config.TOOL_CALL_OVERHEAD_TOKENS,\n });\n }\n\n protected estimateTokens(message: AiMessage): number {\n return this.tokenizer.estimateMessage(message as LlmRequestMessage, this.tokenizerModelId);\n }\n\n protected debug(message: string, data?: Record<string, unknown>): void {\n if (this.debugMode) {\n this.logger.debug(message, data);\n }\n }\n\n protected runPipeline<\n TContext extends ProviderContext<TConfig>,\n TPhase extends PropertyKey,\n TStats extends ContextPipelineStats<TPhase>,\n >(options: {\n messages: AiMessage[];\n totalBudget: number;\n buildStats: TStats;\n providerContext: TContext;\n getPhaseByProviderName: (providerName: string) => TPhase | null;\n contextTrace?: ContextTraceCollector;\n }): Promise<RunContextPipelineResult> {\n return runContextPipeline({\n messages: options.messages,\n totalBudget: options.totalBudget,\n buildStats: options.buildStats,\n providerRegistry: this.providerRegistry,\n providerContext: options.providerContext,\n estimateTokens: message => this.estimateTokens(message),\n getPhaseByProviderName: options.getPhaseByProviderName,\n debug: (message, data) => this.debug(message, data),\n contextTrace: options.contextTrace,\n });\n }\n\n getConfig(): TConfig {\n return { ...this.config };\n }\n\n updateConfig(newConfig: Partial<TConfig>): void {\n this.config = { ...this.config, ...newConfig };\n if (!this.validateConfigFn(this.config)) {\n throw new Error(this.invalidConfigMessage);\n }\n if (!this.hasCustomTokenizer) {\n this.tokenizer = this.createDefaultTokenizer();\n }\n }\n\n /**\n * 更新传给 TokenizerPort 的模型 ID。\n *\n * 中文备注:同一个 context manager 被复用到不同模型时,host 必须同步更新这里;\n * AgentMessageOrchestrator 会按 request 自动处理,直接使用 ContextManager 的高级接入方才需要手动调用。\n */\n updateTokenizerModelId(modelId: string | undefined): void {\n this.tokenizerModelId = modelId;\n }\n}\n","import type { AiMessage, RuntimeEvent } from '../../contracts';\nimport type { ContextTrace } from './context-trace';\n\nexport interface RecommendationStats {\n phaseTokenUsage: Record<PropertyKey, { used: number; percentage: number }>;\n summarizationTriggered: boolean;\n summarizedCount?: number;\n documentTruncated: boolean;\n totalTime: number;\n}\n\nexport interface BuildContextResultOptions<TBuildStats> {\n finalMessages: AiMessage[];\n finalTokens: number;\n totalBudget: number;\n originalCount: number;\n strategiesApplied: string[];\n buildStats: TBuildStats;\n enableBuildStats: boolean;\n estimateTokens: (message: AiMessage) => number;\n coreTypes: readonly string[];\n recommendations: string[];\n events?: RuntimeEvent[];\n contextTrace?: ContextTrace;\n}\n\nexport function buildContextResult<TBuildStats>(\n options: BuildContextResultOptions<TBuildStats>,\n) {\n const {\n finalMessages,\n finalTokens,\n totalBudget,\n originalCount,\n strategiesApplied,\n buildStats,\n enableBuildStats,\n estimateTokens,\n coreTypes,\n recommendations,\n events = [],\n contextTrace,\n } = options;\n\n const tokenDistribution = calculateTokenDistribution(\n finalMessages,\n estimateTokens,\n coreTypes,\n );\n\n const processingStats = {\n originalCount,\n keptCount: finalMessages.length,\n truncatedCount: originalCount - finalMessages.length,\n tokenDistribution,\n strategiesApplied,\n recommendations,\n buildStats: enableBuildStats ? buildStats : undefined,\n };\n\n return {\n messages: finalMessages,\n tokenUsage: { used: finalTokens, remaining: totalBudget - finalTokens },\n processingStats,\n truncated: originalCount !== finalMessages.length,\n truncatedCount:\n originalCount > finalMessages.length\n ? originalCount - finalMessages.length\n : undefined,\n strategies: {\n applied: strategiesApplied,\n recommendations,\n },\n events,\n ...(contextTrace ? { contextTrace } : {}),\n };\n}\n\nexport function generateContextRecommendations(\n stats: RecommendationStats,\n options: {\n totalBudget: number;\n processingTimeoutMs: number;\n largeSummarizationWarningThreshold?: number;\n },\n): string[] {\n const recommendations: string[] = [];\n const usagePercentage =\n Object.values(stats.phaseTokenUsage).reduce(\n (sum, phase) => sum + phase.used,\n 0,\n ) / options.totalBudget;\n\n if (usagePercentage > 0.9) {\n recommendations.push('预算使用率较高,建议增加Token预算或减少输入长度');\n }\n\n if (stats.documentTruncated) {\n recommendations.push('文档片段被截断,建议分批处理或增加文档片段预算');\n }\n\n const summaryWarningThreshold =\n options.largeSummarizationWarningThreshold ?? 10;\n if (\n stats.summarizationTriggered &&\n (stats.summarizedCount || 0) > summaryWarningThreshold\n ) {\n recommendations.push('大量历史消息被摘要,建议定期清理对话历史');\n }\n\n if (stats.totalTime > options.processingTimeoutMs) {\n recommendations.push('上下文构建耗时较长,建议优化消息预处理流程');\n }\n\n return recommendations;\n}\n\nfunction calculateTokenDistribution(\n finalMessages: AiMessage[],\n estimateTokens: (message: AiMessage) => number,\n coreTypes: readonly string[],\n): Record<string, number> {\n const tokenDistribution: Record<string, number> = {\n core_context: 0,\n working_memory: 0,\n summarization: 0,\n };\n const lastUserIndex = finalMessages\n .map(message => message.type)\n .lastIndexOf('user_input');\n\n finalMessages.forEach((message, index) => {\n const token = estimateTokens(message);\n if (message.metadata?.messageType === 'summary') {\n tokenDistribution.summarization += token;\n } else if (\n coreTypes.includes(message.type) ||\n (message.type === 'user_input' && index === lastUserIndex)\n ) {\n tokenDistribution.core_context += token;\n } else {\n tokenDistribution.working_memory += token;\n }\n });\n\n return tokenDistribution;\n}\n","import type { AgentProfileRequest } from '../contracts';\nimport { ConversationSession } from './ConversationSession';\nimport { \n AGENT_CONTEXT_BUILDER_CONFIG,\n AgentBuildPhase,\n AgentContextBuildStats,\n validateAgentConfig,\n AgentContextBuilderConfig\n} from './config';\nimport { \n ProviderContext,\n ContextProviderRegistry,\n SummarizationCallbacks\n} from './providers';\nimport {\n ContextManagerBase,\n type ContextManagerBaseOptions,\n} from '../../../shared/context-manager-base';\nimport {\n buildContextResult,\n generateContextRecommendations,\n} from '../../../shared/context-result';\nimport { ContextTraceCollector, type ContextTrace } from '../../../shared/context-trace';\nimport type { GenerateRequest, GenerateResponse } from '../../chat/contracts';\nimport type {\n AgentSpecContextPolicy,\n AgentSpecContextTracePolicy,\n AiMessage,\n RuntimeEvent,\n} from '../../../../contracts';\nimport type { TokenizerPort } from '../../../../ports';\n\n/**\n * Agent 专用的 Provider 上下文\n * 继承自基础 ProviderContext,并添加 Agent 特有的信息\n */\nexport interface AgentProviderContext extends ProviderContext {\n agentRequest: AgentProfileRequest;\n}\n\n/**\n * 上下文构建结果接口\n */\nexport interface ContextBuildResult {\n /** 构建后的消息列表 */\n messages: AiMessage[];\n \n /** Token使用情况 */\n tokenUsage: {\n used: number;\n remaining: number;\n };\n \n /** 处理统计信息 */\n processingStats: {\n originalCount: number;\n keptCount: number;\n truncatedCount: number;\n tokenDistribution: Record<string, number>;\n strategiesApplied: string[];\n recommendations: string[];\n buildStats?: AgentContextBuildStats;\n };\n \n /** 是否进行了截断 */\n truncated: boolean;\n \n /** 截断的消息数量 */\n truncatedCount?: number;\n \n /** 应用的策略列表 */\n strategies: {\n applied: string[];\n recommendations: string[];\n };\n \n /** 🔥 新增:Provider生成的运行时事件(如摘要事件) */\n events?: RuntimeEvent[];\n\n /** ContextTrace:解释本次上下文构建如何保留/裁剪消息。 */\n contextTrace?: ContextTrace;\n}\n\n/**\n * Agent专用智能上下文管理器\n * \n * 🎯 核心职责: \n * 1. 编排Provider执行,构建优化的上下文\n * 2. 保证工具调用的完整性和配对保留\n * 3. 使用统一配置,不感知对话阶段\n * \n * 🏗️ 架构特性:\n * - Provider策略模式: 实现高内聚、低耦合\n * - 责任链模式: 按优先级编排Provider\n * - 专注于Provider编排,不负责消息构建\n */\nexport class AgentContextManager extends ContextManagerBase<\n AgentContextBuilderConfig,\n ContextProviderRegistry\n> {\n\n constructor(options: {\n debugMode?: boolean;\n customConfig?: Partial<AgentContextBuilderConfig>;\n providerRegistry?: ContextProviderRegistry;\n tokenizer?: TokenizerPort;\n tokenizerModelId?: string;\n } = {}) {\n super(options as ContextManagerBaseOptions<\n AgentContextBuilderConfig,\n ContextProviderRegistry\n >, {\n defaultConfig: AGENT_CONTEXT_BUILDER_CONFIG,\n validateConfig: validateAgentConfig,\n createRegistry: () => new ContextProviderRegistry(),\n loggerName: 'AgentContextManager',\n invalidConfigMessage: 'Invalid AgentContextManager configuration',\n });\n\n this.debug('🏗️ [Agent上下文管理器] 初始化完成', {\n providersCount: this.providerRegistry.getAllProviders().length\n });\n }\n\n /**\n * 主入口:为Agent构建智能上下文\n * 专门处理预处理过的消息,专注于上下文优化\n */\n async buildContextFromPreprocessedMessages(\n request: AgentProfileRequest,\n conversationSession: ConversationSession,\n preprocessedMessages: AiMessage[],\n totalBudget: number,\n callbacks?: SummarizationCallbacks,\n phaseOverride?: AgentBuildPhase, // 保留参数兼容性,但不再使用\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>,\n traceOptions?: {\n policy?: AgentSpecContextTracePolicy;\n effectiveContextPolicy?: AgentSpecContextPolicy;\n },\n ): Promise<ContextBuildResult> {\n // 计算摘要触发相关信息\n const summarizationThreshold = this.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n const summarizationTokenThreshold = Math.floor(totalBudget * summarizationThreshold);\n \n this.debug('🎯 [Agent上下文管理器] 开始上下文构建', { \n requestQuery: request.query.substring(0, 50),\n preprocessedMessageCount: preprocessedMessages.length,\n totalBudget,\n 摘要触发阈值: `${(summarizationThreshold * 100).toFixed(0)}%`,\n 摘要Token阈值: summarizationTokenThreshold\n });\n\n const startTime = performance.now();\n const buildStats: AgentContextBuildStats = this.initializeBuildStats(startTime, preprocessedMessages.length);\n\n try {\n // 创建 ProviderContext\n const enhancedContext: AgentProviderContext = {\n totalBudget,\n config: this.config,\n debugMode: this.debugMode,\n estimateTokens: (msg: AiMessage) => this.estimateTokens(msg),\n summarizationCallbacks: callbacks,\n generate,\n agentRequest: request\n };\n const contextTrace = ContextTraceCollector.create({\n policy: traceOptions?.policy,\n effectivePolicy: traceOptions?.effectiveContextPolicy,\n totalBudget,\n originalCount: preprocessedMessages.length,\n });\n\n // 核心流程:编排各个Provider按优先级处理预处理过的消息\n const { finalMessages, finalTokens, strategiesApplied, events } =\n await this.runPipeline({\n messages: preprocessedMessages,\n totalBudget,\n buildStats,\n providerContext: enhancedContext,\n getPhaseByProviderName: providerName => this.getPhaseByProviderName(providerName),\n contextTrace,\n });\n \n const endTime = performance.now();\n buildStats.totalTime = endTime - startTime;\n \n // 计算摘要触发相关信息\n const summarizationThreshold = this.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n const summarizationTokenThreshold = Math.floor(totalBudget * summarizationThreshold);\n \n this.debug('✅ [Agent上下文管理器] 上下文构建完成', {\n 预处理消息: preprocessedMessages.length,\n 最终消息: finalMessages.length,\n Token使用: finalTokens,\n 总预算: totalBudget,\n 使用率: `${((finalTokens / totalBudget) * 100).toFixed(1)}%`,\n 摘要触发阈值: `${(summarizationThreshold * 100).toFixed(0)}%`,\n 摘要Token阈值: summarizationTokenThreshold,\n 总耗时: `${buildStats.totalTime.toFixed(2)}ms`\n });\n\n return this.buildFinalResult(\n finalMessages, \n finalTokens, \n totalBudget, \n preprocessedMessages.length, \n strategiesApplied, \n buildStats,\n events,\n contextTrace?.build(finalMessages, finalTokens),\n );\n\n } catch (error) {\n this.debug('❌ [Agent上下文管理器] 上下文构建失败', { error });\n throw new Error(`Agent context building failed: ${error}`);\n }\n }\n\n // ------------------- 核心Provider编排方法 -------------------\n\n // ------------------- 辅助方法 -------------------\n\n /**\n * 根据Provider名称获取对应的阶段名称\n */\n private getPhaseByProviderName(providerName: string): AgentBuildPhase | null {\n const phaseMap: Record<string, AgentBuildPhase> = {\n 'CoreContextProvider': AgentBuildPhase.CORE_CONTEXT,\n 'WorkingMemoryProvider': AgentBuildPhase.WORKING_MEMORY,\n 'SummarizationProvider': AgentBuildPhase.SUMMARIZATION\n };\n return phaseMap[providerName] || null;\n }\n\n private initializeBuildStats(startTime: number, originalMessageCount: number): AgentContextBuildStats {\n return {\n startTime,\n phaseTiming: {} as Record<AgentBuildPhase, number>,\n phaseTokenUsage: {} as Record<AgentBuildPhase, { used: number; percentage: number }>,\n messageStats: {\n original: originalMessageCount,\n afterCoreContext: 0,\n afterWorkingMemory: 0,\n afterSummarization: 0\n },\n priorityStats: {\n p1ToolInteractions: 0,\n p2TextConversations: 0,\n p3HistoricalTools: 0,\n p4CircularFill: 0\n },\n toolStats: {\n totalToolCalls: 0,\n pairedToolCalls: 0,\n unpairedToolCalls: 0,\n toolPairingSuccessRate: 0\n },\n summarizationTriggered: false,\n documentTruncated: false,\n totalTime: 0\n };\n }\n\n private buildFinalResult(\n finalMessages: AiMessage[],\n finalTokens: number,\n totalBudget: number,\n originalCount: number,\n strategiesApplied: string[],\n buildStats: AgentContextBuildStats,\n events: RuntimeEvent[] = [], // 🔥 新增:事件列表\n contextTrace?: ContextTrace,\n ): ContextBuildResult {\n const recommendations = this.generateRecommendations(buildStats, totalBudget);\n return buildContextResult({\n finalMessages,\n finalTokens,\n totalBudget,\n originalCount,\n strategiesApplied,\n buildStats,\n enableBuildStats: this.config.ENABLE_BUILD_STATS,\n estimateTokens: message => this.estimateTokens(message),\n coreTypes: this.config.CORE_MESSAGE_TYPES,\n recommendations,\n events,\n contextTrace,\n });\n }\n /**\n * 生成优化建议\n */\n private generateRecommendations(stats: AgentContextBuildStats, totalBudget: number): string[] {\n return generateContextRecommendations(stats, {\n totalBudget,\n processingTimeoutMs: this.config.PROCESSING_TIMEOUT_MS,\n });\n }\n}\n","import type { AiMessage, AssistantMessage } from '../../../../contracts';\n\n/**\n * 对话会话管理类\n * \n * 单一职责:管理当前会话的消息存储和基础CRUD操作\n * - 存储和检索消息\n * - 维护对话历史的完整性\n * - 提供基础的消息查询功能\n * \n * 不负责:Token管理、智能截断、优先级分析(这些由WorkingContextManager处理)\n */\nexport class ConversationSession {\n private messages: AiMessage[];\n private systemPrompt: string;\n\n /**\n * 构造函数\n * @param systemPrompt 系统提示词\n */\n constructor(systemPrompt: string) {\n this.systemPrompt = systemPrompt;\n this.messages = []; // 初始化为空数组\n \n // 🔥 核心修复:仅当systemPrompt有实际内容时才添加系统消息\n if (systemPrompt && systemPrompt.trim()) {\n this.messages.push({\n id: `system_${Date.now()}`,\n role: 'system',\n type: 'system_prompt',\n content: systemPrompt,\n timestamp: Date.now()\n });\n }\n }\n\n /**\n * 添加消息到会话\n * @param role 消息角色\n * @param content 消息内容\n */\n addMessage(role: 'user' | 'assistant', content: string): void {\n if (role === 'user') {\n this.messages.push({\n id: `user_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'user',\n type: 'user_input',\n content,\n timestamp: Date.now()\n });\n } else {\n this.messages.push({\n id: `assistant_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'assistant',\n type: 'final_answer',\n content,\n timestamp: Date.now()\n });\n }\n }\n\n /**\n * 添加用户消息\n * @param content 用户消息内容\n * @param id 可选的消息ID,如果不提供则自动生成\n */\n addUserMessage(content: string, id?: string): void {\n this.messages.push({\n id: id || `user_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'user',\n type: 'user_input',\n content,\n timestamp: Date.now()\n });\n }\n\n /**\n * 添加助手消息,可能包含工具调用\n * @param content 文本内容(可选)\n * @param type 消息类型\n * @param metadata 消息元数据(可选)\n * @param id 可选的消息ID,如果不提供则自动生成\n */\n addAssistantMessage(\n content: string | null, \n type: AssistantMessage['type'],\n metadata?: AiMessage['metadata'],\n id?: string\n ): void {\n const message: AiMessage = {\n id: id || `assistant_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'assistant',\n type: type,\n content: content || '',\n timestamp: Date.now(),\n metadata\n };\n this.messages.push(message);\n }\n\n /**\n * 添加从历史记录加载的工具输出消息\n * @param content 消息内容\n * @param metadata 消息元数据\n */\n addToolOutputMessage(content: string, metadata: AiMessage['metadata']): void {\n const toolCallId = metadata?.tool_call_id;\n if (!toolCallId) {\n console.warn('[ConversationSession] Skipping tool output message without tool_call_id');\n return;\n }\n\n const message: AiMessage = {\n id: `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'tool',\n type: 'tool_output',\n content,\n timestamp: Date.now(),\n metadata,\n };\n this.messages.push(message);\n }\n\n /**\n * 添加工具调用的响应结果\n * @param toolCallId 工具调用的唯一ID\n * @param content 工具执行返回的结果(通常是字符串格式)\n * @param toolName 工具名称(可选)\n * @param id 可选的消息ID,如果不提供则自动生成\n */\n addToolResponse(toolCallId: string, content: string, toolName?: string, id?: string): void {\n this.messages.push({\n id: id || `tool_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n role: 'tool',\n type: 'tool_output',\n // 🔥 新增:OpenAI 兼容字段 name,用于标识工具名\n ...(toolName ? { name: toolName } : {}),\n content,\n timestamp: Date.now(),\n metadata: {\n tool_call_id: toolCallId,\n tool_name: toolName\n }\n });\n }\n\n /**\n * 追加一条已构造完成的消息。\n *\n * 中文备注:\n * - 该方法用于回放阶段写入“已是最终形态”的消息,例如 `history_summary`;\n * - 这样 core 侧只依赖最小写入端口,不需要直接感知 `ConversationSession` 的私有字段结构。\n */\n appendMessage(message: AiMessage): void {\n this.messages.push(message);\n }\n\n /**\n * 获取完整的对话历史记录\n * @returns 消息数组\n */\n getHistory(): AiMessage[] {\n return [...this.messages]; // 返回副本,避免外部修改\n }\n\n /**\n * 清空对话历史,只保留系统提示词\n */\n clear(): void {\n this.messages = [\n {\n id: `system_${Date.now()}`,\n role: 'system',\n type: 'system_prompt',\n content: this.systemPrompt,\n timestamp: Date.now()\n }\n ];\n }\n\n /**\n * 更新系统提示词\n * @param newSystemPrompt 新的系统提示词\n */\n updateSystemPrompt(newSystemPrompt: string): void {\n this.systemPrompt = newSystemPrompt;\n \n // 更新历史记录中的系统消息\n if (this.messages.length > 0 && this.messages[0].role === 'system') {\n this.messages[0].content = newSystemPrompt;\n } else {\n // 如果第一条不是系统消息,则插入系统消息\n this.messages.unshift({\n id: `system_${Date.now()}`,\n role: 'system',\n type: 'system_prompt',\n content: newSystemPrompt,\n timestamp: Date.now()\n });\n }\n }\n\n /**\n * 获取当前系统提示词\n * @returns 系统提示词字符串\n */\n getSystemPrompt(): string {\n return this.systemPrompt;\n }\n\n /**\n * 获取消息总数(不包括系统消息)\n * @returns 消息数量\n */\n getMessageCount(): number {\n return this.messages.filter(msg => msg.role !== 'system').length;\n }\n\n /**\n * 获取最近的n条用户消息\n * @param n 消息数量\n * @returns 用户消息数组\n */\n getRecentUserMessages(n: number): AiMessage[] {\n return this.messages\n .filter(msg => msg.role === 'user')\n .slice(-n);\n }\n\n /**\n * 获取最近的n条助手消息\n * @param n 消息数量 \n * @returns 助手消息数组\n */\n getRecentAssistantMessages(n: number): AiMessage[] {\n return this.messages\n .filter(msg => msg.role === 'assistant')\n .slice(-n);\n }\n\n /**\n * 检查是否有待处理的工具调用\n * @returns 是否有未响应的工具调用\n */\n hasPendingToolCalls(): boolean {\n // 从后往前查找最近的assistant消息\n for (let i = this.messages.length - 1; i >= 0; i--) {\n const msg = this.messages[i];\n \n if (msg.role === 'assistant' && msg.metadata?.tool_calls && msg.metadata.tool_calls.length > 0) {\n // 检查这些工具调用是否都有对应的tool响应\n const toolCallIds = msg.metadata.tool_calls.map(tc => tc.id);\n const toolResponseIds = this.messages\n .slice(i + 1)\n .filter(m => m.role === 'tool')\n .map(m => m.metadata?.tool_call_id)\n .filter(id => id !== undefined);\n\n // 如果有工具调用ID没有对应的响应,说明有待处理的工具调用\n return !toolCallIds.every(id => toolResponseIds.includes(id));\n }\n \n // 如果遇到user消息,说明这一轮对话已结束\n if (msg.role === 'user') {\n break;\n }\n }\n \n return false;\n }\n\n /**\n * 获取待处理的工具调用\n * @returns 待处理的工具调用数组\n */\n getPendingToolCalls(): Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }> {\n for (let i = this.messages.length - 1; i >= 0; i--) {\n const msg = this.messages[i];\n \n if (msg.role === 'assistant' && msg.metadata?.tool_calls && msg.metadata.tool_calls.length > 0) {\n const toolCallIds = msg.metadata.tool_calls.map(tc => tc.id);\n const toolResponseIds = this.messages\n .slice(i + 1)\n .filter(m => m.role === 'tool')\n .map(m => m.metadata?.tool_call_id)\n .filter(id => id !== undefined);\n\n // 返回没有响应的工具调用\n return msg.metadata.tool_calls.filter(tc => !toolResponseIds.includes(tc.id));\n }\n \n if (msg.role === 'user') {\n break;\n }\n }\n \n return [];\n }\n\n /**\n * 将历史记录序列化为JSON\n * @returns JSON字符串\n */\n serialize(): string {\n return JSON.stringify({\n systemPrompt: this.systemPrompt,\n messages: this.messages\n });\n }\n\n /**\n * 从JSON反序列化历史记录\n * @param json JSON字符串\n * @returns ConversationSession实例\n */\n static deserialize(json: string): ConversationSession {\n const data = JSON.parse(json);\n const session = new ConversationSession(data.systemPrompt);\n // 兼容性处理:支持旧的数据格式\n const messages = data.messages || data.history || [];\n \n // 如果没有系统消息,就使用默认的系统消息\n if (messages.length === 0 || messages[0].role !== 'system') {\n session.messages = [\n {\n id: `system_${Date.now()}`,\n role: 'system',\n type: 'system_prompt',\n content: data.systemPrompt,\n timestamp: new Date()\n },\n ...messages\n ];\n } else {\n session.messages = messages;\n }\n \n return session;\n }\n}\n\n// 🔥 优化:移除别名,统一使用ConversationSession\n// 如需向后兼容,可以在需要的地方单独导入\n","export { AgentMessageOrchestrator } from './AgentMessageOrchestrator';\nexport type { AgentOrchestratorOptions, AgentProcessingResult } from './AgentMessageOrchestrator';\n","import { \n IPreprocessor, \n PreprocessorContext, \n PreprocessorResult,\n type ToolReplayProtocolPolicy,\n} from './base';\nimport {\n CurrentTurnMessageAssembler,\n FenceLifetimePreprocessor,\n HistoryPurificationPreprocessor,\n} from '../../../shared/preprocessors';\nimport type { FenceRegistry } from '../../../shared/fences';\nimport {\n ToolHistoryCompressorPreprocessor,\n type ToolHistoryCompressorOptions,\n} from './toolHistoryCompressor';\nimport { ToolReplayProtocolGuardPreprocessor } from './toolReplayProtocolGuard';\nimport type { AiMessage } from '../../../../contracts';\nimport { isContextProviderError } from '../../../shared/providers/base';\n\n// 重新导出公共接口\nexport * from './base';\nexport {\n CurrentTurnMessageAssembler,\n FenceLifetimePreprocessor,\n HistoryPurificationPreprocessor,\n} from '../../../shared/preprocessors';\nexport * from './toolHistoryCompressor';\nexport * from './toolReplayProtocolGuard';\n\nexport interface DefaultAgentPreprocessorRegistryOptions {\n fenceRegistry?: FenceRegistry;\n toolHistory?: ToolHistoryCompressorOptions;\n providerReplay?: ToolReplayProtocolPolicy;\n}\n\n/**\n * 预处理器注册表 - 管理所有预处理器及其执行顺序\n */\nexport class PreprocessorRegistry {\n private preprocessors: Map<string, IPreprocessor> = new Map();\n\n /**\n * 注册预处理器\n */\n register(preprocessor: IPreprocessor): void {\n if (this.preprocessors.has(preprocessor.name)) {\n throw new Error(`Preprocessor with name '${preprocessor.name}' is already registered`);\n }\n this.preprocessors.set(preprocessor.name, preprocessor);\n }\n\n /**\n * 获取指定名称的预处理器\n */\n getPreprocessor(name: string): IPreprocessor | undefined {\n return this.preprocessors.get(name);\n }\n\n /**\n * 获取所有预处理器,按优先级排序\n */\n getAllPreprocessors(): IPreprocessor[] {\n return Array.from(this.preprocessors.values())\n .sort((a, b) => a.priority - b.priority);\n }\n\n /**\n * 获取已注册的预处理器名称列表\n */\n getRegisteredNames(): string[] {\n return Array.from(this.preprocessors.keys());\n }\n\n /**\n * 检查是否已注册指定预处理器\n */\n isRegistered(name: string): boolean {\n return this.preprocessors.has(name);\n }\n\n /**\n * 获取注册的预处理器数量\n */\n getCount(): number {\n return this.preprocessors.size;\n }\n}\n\n/**\n * 预处理管道 - 按顺序执行所有预处理器\n */\nexport class PreprocessorPipeline {\n private registry: PreprocessorRegistry;\n private context: PreprocessorContext;\n\n constructor(\n registry: PreprocessorRegistry, \n context: PreprocessorContext = {}\n ) {\n this.registry = registry;\n this.context = context;\n }\n\n /**\n * 执行完整的预处理管道\n * \n * @param messages 输入消息列表\n * @returns 预处理管道的汇总结果\n */\n async process(messages: AiMessage[]): Promise<PreprocessorPipelineResult> {\n const startTime = performance.now();\n let currentMessages = messages;\n const pipelineResults: Array<{ preprocessor: string; result: PreprocessorResult }> = [];\n const appliedStrategies = new Set<string>();\n\n this.debug('🚀 开始Agent预处理管道', {\n 初始消息数: messages.length,\n 预处理器数量: this.registry.getCount()\n });\n\n // 获取所有预处理器,按优先级排序\n const preprocessors = this.registry.getAllPreprocessors();\n\n // 按优先级顺序执行每个预处理器\n for (const preprocessor of preprocessors) {\n this.debug(`🔄 执行预处理器: ${preprocessor.name}`, {\n 优先级: preprocessor.priority,\n 当前消息数: currentMessages.length\n });\n\n try {\n // 检查是否应该跳过\n if (preprocessor.shouldSkip?.(currentMessages, this.context)) {\n this.debug(`⏭️ 跳过预处理器: ${preprocessor.name}`, {});\n continue;\n }\n\n // 执行预处理\n const result = await preprocessor.process(currentMessages, this.context);\n \n // 记录结果\n pipelineResults.push({\n preprocessor: preprocessor.name,\n result\n });\n\n // 更新消息列表以供下一个预处理器使用\n currentMessages = result.messages;\n \n // 收集应用的策略\n result.appliedStrategies.forEach((strategy: string) => appliedStrategies.add(strategy));\n\n this.debug(`✅ 预处理器完成: ${preprocessor.name}`, {\n 输入消息: result.stats.originalCount,\n 输出消息: result.stats.processedCount,\n 移除消息: result.stats.removedCount,\n 修改消息: result.stats.modifiedCount,\n 应用策略: result.appliedStrategies\n });\n\n } catch (error) {\n this.debug(`❌ 预处理器失败: ${preprocessor.name}`, { error });\n if (isContextProviderError(error) && error.fatal) {\n throw error;\n }\n // 预处理器失败不应该中断整个管道,继续执行后续预处理器\n console.warn(`Agent Preprocessor ${preprocessor.name} failed:`, error);\n }\n }\n\n const endTime = performance.now();\n const processingTime = endTime - startTime;\n\n this.debug('🏁 Agent预处理管道完成', {\n 原始消息数: messages.length,\n 最终消息数: currentMessages.length,\n 总移除数: messages.length - currentMessages.length,\n 执行时间: `${processingTime.toFixed(2)}ms`,\n 应用策略: Array.from(appliedStrategies)\n });\n\n return {\n messages: currentMessages,\n pipelineStats: {\n originalCount: messages.length,\n finalCount: currentMessages.length,\n totalRemovedCount: messages.length - currentMessages.length,\n processingTime,\n preprocessorsExecuted: pipelineResults.length,\n appliedStrategies: Array.from(appliedStrategies)\n },\n individualResults: pipelineResults\n };\n }\n\n /**\n * 更新预处理上下文\n */\n updateContext(newContext: Partial<PreprocessorContext>): void {\n this.context = { ...this.context, ...newContext };\n }\n\n /**\n * 获取当前上下文\n */\n getContext(): PreprocessorContext {\n return { ...this.context };\n }\n\n /**\n * 调试日志\n */\n private debug(message: string, data?: Record<string, unknown>): void {\n if (this.context.debugMode) {\n console.log(`[AgentPreprocessorPipeline] ${message}`, data);\n }\n }\n}\n\n/**\n * 预处理管道结果接口\n */\nexport interface PreprocessorPipelineResult {\n /** 预处理后的消息列表 */\n messages: AiMessage[];\n \n /** 管道级别的统计信息 */\n pipelineStats: {\n originalCount: number;\n finalCount: number;\n totalRemovedCount: number;\n processingTime: number;\n preprocessorsExecuted: number;\n appliedStrategies: string[];\n };\n \n /** 各个预处理器的详细结果 */\n individualResults: Array<{\n preprocessor: string;\n result: PreprocessorResult;\n }>;\n}\n\n// ================= 默认配置 =================\n\n/**\n * 创建默认的Agent预处理器注册表\n * \n * 🔥 这里定义了Agent预处理管道的默认配置:\n * 1. ToolHistoryCompressorPreprocessor (priority: 0) - 工具历史保留/删除,最先执行\n * 2. ToolReplayProtocolGuardPreprocessor (priority: 0.5) - 工具回放协议守卫,仅治理历史轮次\n * 3. HistoryPurificationPreprocessor (priority: 1) - Agent历史净化,在压缩后执行\n * \n * 💡 未来可扩展:\n * 3. AgentToolCallValidationPreprocessor (priority: 2) - 工具调用验证\n * 4. AgentContextOptimizationPreprocessor (priority: 3) - 上下文优化\n */\nexport function createDefaultAgentPreprocessorRegistry(\n options: DefaultAgentPreprocessorRegistryOptions = {},\n): PreprocessorRegistry {\n const registry = new PreprocessorRegistry();\n \n // 注册工具历史保留预处理器 - 优先级0,最先执行\n registry.register(new ToolHistoryCompressorPreprocessor(options.toolHistory));\n\n // 注册工具回放协议守卫 - 压缩后、净化前执行,避免旧工具组伪装为结构化 replay\n registry.register(new ToolReplayProtocolGuardPreprocessor({ policy: options.providerReplay }));\n \n // 注册Agent历史净化预处理器 - 优先级1,在压缩后执行\n // 🔥 使用共享实现,配置 Agent 模式的日志前缀\n registry.register(new HistoryPurificationPreprocessor({ logPrefix: 'Agent-HistoryPurification' }));\n\n if (options.fenceRegistry) {\n registry.register(new CurrentTurnMessageAssembler({ fenceRegistry: options.fenceRegistry }));\n registry.register(new FenceLifetimePreprocessor({ fenceRegistry: options.fenceRegistry }));\n }\n \n // 未来可以在这里注册更多Agent专用预处理器:\n // registry.register(new AgentToolCallValidationPreprocessor());\n // registry.register(new AgentContextOptimizationPreprocessor());\n // registry.register(new AgentDeduplicationPreprocessor());\n \n return registry;\n}\n\n/**\n * 创建默认的Agent预处理管道\n * \n * @param context 预处理上下文配置\n * @returns 配置好的Agent预处理管道实例\n */\nexport function createDefaultAgentPreprocessorPipeline(\n context: PreprocessorContext = {},\n options: DefaultAgentPreprocessorRegistryOptions = {},\n): PreprocessorPipeline {\n const registry = createDefaultAgentPreprocessorRegistry(options);\n return new PreprocessorPipeline(registry, context);\n}\n","import type { ToolSummaryProvider } from '../../../shared/preprocessors/base';\nimport type { AiMessage } from '../../../../contracts';\n\nexport type MissingSidecarBehavior = 'allow' | 'degrade_to_text' | 'provider_empty_replay_field';\n\nexport interface ToolReplayProtocolPolicy {\n provider?: string;\n requiresReasoningDetailsForToolReplay?: boolean;\n missingSidecarBehavior?: MissingSidecarBehavior;\n}\n\n/**\n * Preprocessor context object\n */\nexport interface PreprocessorContext {\n debugMode?: boolean;\n model?: string;\n toolReplayProtocolPolicy?: ToolReplayProtocolPolicy;\n toolSummaryProvider?: ToolSummaryProvider;\n}\n\n/**\n * Result of a preprocessor run\n */\nexport interface PreprocessorResult {\n /** 预处理后的消息列表 */\n messages: AiMessage[];\n /** 预处理统计信息 */\n stats: {\n /** 原始消息数量 */\n originalCount: number;\n /** 处理后消息数量 */\n processedCount: number;\n /** 被移除的消息数量 */\n removedCount: number;\n /** 被修改的消息数量 */\n modifiedCount: number;\n };\n /** 应用的策略列表 */\n appliedStrategies: string[];\n}\n\n/**\n * 预处理器接口 - 管道模式的核心契约\n */\nexport interface IPreprocessor {\n /** 预处理器名称 */\n readonly name: string;\n \n /** 预处理器描述 */\n readonly description: string;\n \n /** 执行顺序优先级 (数字越小越先执行) */\n readonly priority: number;\n\n /**\n * 预处理方法 - 管道模式的核心方法\n * \n * @param messages 输入的消息列表\n * @param context 预处理上下文\n * @returns 预处理结果\n */\n process(\n messages: AiMessage[], \n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n /**\n * 可选:判断是否应该跳过此预处理器\n * \n * @param messages 输入的消息列表\n * @param context 预处理上下文\n * @returns true表示跳过,false表示执行\n */\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean;\n}\n\n/**\n * 预处理器基类 - 提供通用功能实现\n */\nexport abstract class BasePreprocessor implements IPreprocessor {\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly priority: number;\n\n abstract process(\n messages: AiMessage[], \n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n /**\n * 默认的跳过逻辑 - 子类可以覆盖\n */\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean {\n return false; // 默认不跳过\n }\n\n /**\n * 创建预处理结果的辅助方法\n */\n protected createResult(\n originalMessages: AiMessage[],\n processedMessages: AiMessage[],\n appliedStrategies: string[],\n modifiedCount: number = 0\n ): PreprocessorResult {\n const removedCount = originalMessages.length - processedMessages.length;\n \n return {\n messages: processedMessages,\n stats: {\n originalCount: originalMessages.length,\n processedCount: processedMessages.length,\n removedCount,\n modifiedCount\n },\n appliedStrategies\n };\n }\n\n /**\n * 调试日志辅助方法\n */\n protected debug(message: string, data?: Record<string, unknown>, context?: PreprocessorContext): void {\n if (context?.debugMode) {\n console.log(`[${this.name}] ${message}`, data);\n }\n }\n}\n","import { generateMessageId } from '../../../../shared/ids';\nimport {\n BasePreprocessor,\n PreprocessorContext,\n PreprocessorResult,\n} from './base';\nimport { createDefaultToolOutputSummarizer } from '../utils/toolOutputSummarizer';\nimport {\n buildToolInteractionGroupsFromMessages,\n findCurrentRunStartIndex,\n type ToolInteractionGroup,\n} from '../utils/toolInteractionGroup';\nimport type { AiMessage } from '../../../../contracts';\nimport {\n ContextProviderError,\n TOOL_HISTORY_OVERFLOW_ERROR_CODE,\n} from '../../../shared/providers/base';\n\nconst CHECKPOINT_TOOL_NAME = 'context_checkpoint';\nconst DEFAULT_KEEP_LATEST_TOOL_PAIRS = 2;\nconst DEFAULT_KEEP_LATEST_RUNS = 1;\nconst DEFAULT_MAX_INTERACTION_GROUPS = 12;\n\nexport type ToolHistoryCompressionStrategy = 'per-pair' | 'per-run' | 'none';\nexport type ToolHistoryOverflowStrategy = 'keep-latest' | 'fail-fast';\nexport type ToolHistoryRetentionMode = 'drop' | 'compress';\n\nexport interface ToolHistoryCompressorOptions {\n strategy?: ToolHistoryCompressionStrategy;\n retentionMode?: ToolHistoryRetentionMode;\n keepLatestToolPairs?: number;\n keepLatestRuns?: number;\n maxInteractionGroups?: number;\n overflowStrategy?: ToolHistoryOverflowStrategy;\n maxPairTokens?: number;\n maxOutputSummaryTokens?: number;\n}\n\ntype NormalizedToolHistoryCompressorOptions = {\n strategy: ToolHistoryCompressionStrategy;\n retentionMode: ToolHistoryRetentionMode;\n keepLatestToolPairs: number;\n keepLatestRuns: number;\n maxInteractionGroups: number;\n overflowStrategy: ToolHistoryOverflowStrategy;\n};\n\n/**\n * 工具历史保留预处理器。\n *\n * 三种策略边界:\n * - per-pair:按全局最近 N 组完整工具交互保留,其余按 retentionMode 处理。\n * - per-run:按 user_input 划分 run,完整保留最近 K 个历史 run 内的工具组,避免腰斩同一轮工具链。\n * - none:不做常规压缩,仅在 maxInteractionGroups 显式触发时执行安全阀。\n *\n * retentionMode 边界:\n * - drop:默认行为。旧工具组超过保留窗口后直接移除,避免改写历史前缀和制造伪 final_answer。\n * - compress:兼容旧行为。把旧工具组替换为自然语言摘要,用于小上下文或审计友好的历史线索保留。\n *\n * 注意:单个 tool_output 的 token 截断不在这里做,那是 WorkingMemory 阶段\n * ToolPairTruncator 的职责;本处理器只决定“工具组是原样保留、删除,还是压缩为摘要消息”。\n */\nexport class ToolHistoryCompressorPreprocessor extends BasePreprocessor {\n readonly name = 'ToolHistoryCompressorPreprocessor';\n readonly description = '工具历史保留处理器 - 按策略保留、删除或压缩较早的历史工具调用对';\n readonly priority = 0;\n\n private summarizer = createDefaultToolOutputSummarizer();\n private readonly options: NormalizedToolHistoryCompressorOptions;\n\n constructor(options: ToolHistoryCompressorOptions = {}) {\n super();\n this.options = {\n strategy: options.strategy ?? 'per-run',\n retentionMode: options.retentionMode ?? 'drop',\n keepLatestToolPairs: normalizeNonNegativeInteger(\n options.keepLatestToolPairs,\n DEFAULT_KEEP_LATEST_TOOL_PAIRS,\n ),\n keepLatestRuns: normalizeNonNegativeInteger(\n options.keepLatestRuns,\n DEFAULT_KEEP_LATEST_RUNS,\n ),\n maxInteractionGroups: normalizeNonNegativeInteger(\n options.maxInteractionGroups,\n DEFAULT_MAX_INTERACTION_GROUPS,\n ),\n overflowStrategy: options.overflowStrategy ?? 'keep-latest',\n };\n }\n\n async process(\n messages: AiMessage[],\n context: PreprocessorContext,\n ): Promise<PreprocessorResult> {\n this.debug('🔧 开始工具历史保留处理', {\n 原始消息数: messages.length,\n }, context);\n\n const currentRunStartIndex = findCurrentRunStartIndex(messages);\n const historyMessages = messages.slice(0, currentRunStartIndex);\n const currentRunMessages = messages.slice(currentRunStartIndex);\n\n this.debug('📊 消息分段分析', {\n 历史消息数: historyMessages.length,\n 当前轮次消息数: currentRunMessages.length,\n 当前轮次起点索引: currentRunStartIndex,\n 工具保留策略: this.options.strategy,\n 历史工具保留模式: this.options.retentionMode,\n }, context);\n\n const processedHistory = this.processToolCallPairsInHistory(historyMessages, context);\n\n const finalMessages = [...processedHistory, ...currentRunMessages];\n const originalCount = messages.length;\n const processedCount = finalMessages.length;\n const removedCount = originalCount - processedCount;\n const appliedStrategies = removedCount > 0\n ? [this.options.retentionMode === 'compress' ? 'tool_history_compression' : 'tool_history_drop']\n : [];\n\n this.debug('✅ 工具历史保留处理完成', {\n 原始消息: originalCount,\n 处理后消息: processedCount,\n 减少消息: removedCount,\n Token节省估计: `约${removedCount * 50}个Token`,\n }, context);\n\n return this.createResult(\n messages,\n finalMessages,\n appliedStrategies,\n 0,\n );\n }\n\n shouldSkip(messages: AiMessage[], context: PreprocessorContext): boolean {\n const hasToolCalls = messages.some((msg) =>\n (msg.role === 'assistant' && msg.type === 'tool_calls') ||\n (msg.role === 'tool' && msg.type === 'tool_output'),\n );\n\n if (!hasToolCalls) {\n this.debug('⏭️ 无工具调用消息,跳过历史压缩', {}, context);\n return true;\n }\n\n return false;\n }\n\n private processToolCallPairsInHistory(\n historyMessages: AiMessage[],\n context: PreprocessorContext,\n ): AiMessage[] {\n if (historyMessages.length < 2) {\n return historyMessages;\n }\n\n const groups = buildToolInteractionGroupsFromMessages(historyMessages);\n if (groups.length === 0) {\n this.debug('🤔 在历史记录中未找到有效的工具交互组,跳过压缩', {}, context);\n return historyMessages;\n }\n\n const completeGroups = groups.filter((group) => group.isComplete);\n const keepGroups = this.enforceMaxInteractionGroups(\n this.selectGroupsToKeep(completeGroups),\n context,\n );\n const keepAnchorIds = new Set(keepGroups.map((group) => group.anchorId));\n\n const messagesToRemove = new Set<number>();\n const replacementMap = new Map<number, AiMessage>();\n\n for (const group of groups) {\n if (!group.isComplete || keepAnchorIds.has(group.anchorId)) {\n continue;\n }\n if (this.options.retentionMode === 'compress') {\n const compressedMessage = this.compressToolInteractionGroup(group, context);\n replacementMap.set(group.assistantIndex, compressedMessage);\n }\n for (const messageIndex of group.messageIndexes) {\n messagesToRemove.add(messageIndex);\n }\n }\n\n if (messagesToRemove.size === 0) {\n return historyMessages;\n }\n\n const finalResult: AiMessage[] = [];\n for (let i = 0; i < historyMessages.length; i++) {\n if (messagesToRemove.has(i)) {\n if (replacementMap.has(i)) {\n const replacement = replacementMap.get(i);\n if (replacement) {\n finalResult.push(replacement);\n }\n }\n } else {\n finalResult.push(historyMessages[i]);\n }\n }\n\n return finalResult;\n }\n\n private selectGroupsToKeep(\n completeGroups: Array<ToolInteractionGroup<AiMessage>>,\n ): Array<ToolInteractionGroup<AiMessage>> {\n const keepAnchorIds = new Set<string>();\n const latestCheckpointGroup = findLatestCheckpointGroup(completeGroups);\n\n if (this.options.strategy === 'none') {\n for (const group of completeGroups) {\n keepAnchorIds.add(group.anchorId);\n }\n } else if (this.options.strategy === 'per-run') {\n const maxRunOrdinal = completeGroups.reduce(\n (maxOrdinal, group) => Math.max(maxOrdinal, group.runOrdinal),\n 0,\n );\n const minRunOrdinal = Math.max(0, maxRunOrdinal - this.options.keepLatestRuns + 1);\n for (const group of completeGroups) {\n if (group.runOrdinal >= minRunOrdinal) {\n keepAnchorIds.add(group.anchorId);\n }\n }\n } else {\n const nonCheckpointGroups = completeGroups.filter((group) => !group.isCheckpointGroup);\n if (this.options.keepLatestToolPairs > 0) {\n for (const group of nonCheckpointGroups.slice(-this.options.keepLatestToolPairs)) {\n keepAnchorIds.add(group.anchorId);\n }\n }\n }\n\n if (latestCheckpointGroup) {\n keepAnchorIds.add(latestCheckpointGroup.anchorId);\n }\n\n return completeGroups.filter((group) => keepAnchorIds.has(group.anchorId));\n }\n\n private enforceMaxInteractionGroups(\n groupsToKeep: Array<ToolInteractionGroup<AiMessage>>,\n context: PreprocessorContext,\n ): Array<ToolInteractionGroup<AiMessage>> {\n if (groupsToKeep.length <= this.options.maxInteractionGroups) {\n return groupsToKeep;\n }\n\n if (this.options.overflowStrategy === 'fail-fast') {\n throw new ContextProviderError({\n code: TOOL_HISTORY_OVERFLOW_ERROR_CODE,\n fatal: true,\n providerName: this.name,\n message: `工具历史交互组数量 ${groupsToKeep.length} 超过上限 ${this.options.maxInteractionGroups}`,\n });\n }\n\n const latestCheckpointGroup = findLatestCheckpointGroup(groupsToKeep);\n const selectedAnchorIds = new Set<string>();\n if (latestCheckpointGroup) {\n selectedAnchorIds.add(latestCheckpointGroup.anchorId);\n }\n\n const sortedByLatestAction = [...groupsToKeep].sort((left, right) => right.endIndex - left.endIndex);\n for (const group of sortedByLatestAction) {\n if (selectedAnchorIds.size >= this.options.maxInteractionGroups) {\n break;\n }\n selectedAnchorIds.add(group.anchorId);\n }\n\n this.debug('⚠️ 工具历史交互组超过上限,按最近行动裁剪', {\n 原始保留组数: groupsToKeep.length,\n 裁剪后组数: selectedAnchorIds.size,\n 上限: this.options.maxInteractionGroups,\n }, context);\n\n return groupsToKeep.filter((group) => selectedAnchorIds.has(group.anchorId));\n }\n\n private compressToolInteractionGroup(\n group: ToolInteractionGroup<AiMessage>,\n context: PreprocessorContext,\n ): AiMessage {\n const summaryParts: string[] = [];\n for (const item of group.items) {\n const formattedArgs = this.summarizer.formatToolArgs(item.toolArgs);\n const argsPart = formattedArgs ? `(参数:${formattedArgs})` : '';\n const outputSummaries = item.rawOutputs.map((rawOutput) =>\n this.summarizer.getSummary(item.toolName, rawOutput, context.toolSummaryProvider, item.toolArgs),\n );\n const mergedSummary = outputSummaries.join(';');\n summaryParts.push(`我已经调用了工具「${item.toolName}」${argsPart},并得到了结果:${mergedSummary}`);\n }\n\n const compressedContent = `${summaryParts.join(';')},我需要思考下一步行动`;\n\n return {\n id: generateMessageId(),\n role: 'assistant',\n type: 'final_answer',\n content: compressedContent,\n timestamp: group.assistantMessage.timestamp,\n metadata: {\n isCompressedToolHistory: true,\n replacementSourceIds: group.sourceMessageIds,\n compressedToolCallIds: group.toolCallIds,\n compressedToolNames: group.toolNames,\n toolInteractionGroupSize: group.items.length,\n containsCheckpoint: group.isCheckpointGroup,\n },\n };\n }\n}\n\nfunction normalizeNonNegativeInteger(value: number | undefined, fallback: number): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n return fallback;\n }\n return Math.max(0, Math.floor(value));\n}\n\nfunction findLatestCheckpointGroup<T>(\n groups: Array<ToolInteractionGroup<T>>,\n): ToolInteractionGroup<T> | undefined {\n return groups\n .filter((group) => group.isCheckpointGroup)\n .sort((left, right) => left.endIndex - right.endIndex)\n .at(-1);\n}\n","import { generateMessageId } from '../../../../shared/ids';\nimport type { AiMessage } from '../../../../contracts';\nimport {\n BasePreprocessor,\n PreprocessorContext,\n PreprocessorResult,\n type ToolReplayProtocolPolicy,\n} from './base';\nimport {\n buildToolInteractionGroupsFromMessages,\n findCurrentRunStartIndex,\n type ToolInteractionGroup,\n} from '../utils/toolInteractionGroup';\n\nexport interface ToolReplayProtocolGuardOptions {\n policy?: ToolReplayProtocolPolicy;\n priority?: number;\n}\n\nexport function resolveToolReplayProtocolPolicy(\n context: PreprocessorContext,\n explicitPolicy?: ToolReplayProtocolPolicy,\n): ToolReplayProtocolPolicy {\n if (explicitPolicy) {\n return explicitPolicy;\n }\n\n if (context.toolReplayProtocolPolicy) {\n return context.toolReplayProtocolPolicy;\n }\n\n return {\n missingSidecarBehavior: 'allow',\n };\n}\n\nfunction hasReasoningDetails(message: AiMessage): boolean {\n const reasoningDetails = message.metadata?.reasoning_details;\n return Array.isArray(reasoningDetails) && reasoningDetails.length > 0;\n}\n\nfunction stringifyRecord(record: Record<string, unknown>): string {\n try {\n return JSON.stringify(record);\n } catch {\n return '{}';\n }\n}\n\nfunction buildDegradedToolReplayMessage(group: ToolInteractionGroup<AiMessage>): AiMessage {\n const lines: string[] = [];\n const assistantContent = group.assistantMessage.content.trim();\n if (assistantContent) {\n lines.push(assistantContent);\n }\n\n for (const item of group.items) {\n lines.push(`Tool call ${item.toolName} args=${stringifyRecord(item.toolArgs)}`);\n const outputs = item.rawOutputs.length > 0 ? item.rawOutputs : [''];\n for (const rawOutput of outputs) {\n lines.push(`Tool result ${item.toolCallId}: ${rawOutput}`);\n }\n }\n\n return {\n id: generateMessageId(),\n role: 'assistant',\n type: 'final_answer',\n content: lines.join('\\n\\n'),\n timestamp: group.assistantMessage.timestamp,\n metadata: {\n isDegradedToolReplay: true,\n degradationReason: 'missing_required_reasoning_details',\n replacementSourceIds: group.sourceMessageIds,\n degradedToolCallIds: group.toolCallIds,\n degradedToolNames: group.toolNames,\n toolInteractionGroupSize: group.items.length,\n },\n };\n}\n\nfunction markProviderEmptyReplayField(message: AiMessage, group: ToolInteractionGroup<AiMessage>): AiMessage {\n return {\n ...message,\n metadata: {\n ...message.metadata,\n provider_empty_replay_field: true,\n providerSidecarMissingBehavior: 'provider_empty_replay_field',\n providerSidecarMissingReason: 'missing_required_reasoning_details',\n providerSidecarMissingSourceIds: group.sourceMessageIds,\n providerSidecarMissingToolCallIds: group.toolCallIds,\n providerSidecarMissingToolNames: group.toolNames,\n },\n };\n}\n\n/**\n * Agent 工具回放协议守卫。\n *\n * 中文说明:\n * - 正向链路必须优先保证真实 provider sidecar 不丢;\n * - 这里仅处理“已经进入历史轮次”的旧工具组,避免它们继续伪装成结构化 replay;\n * - 当前轮次的工具组不在这里降级,否则会掩盖新链路丢 sidecar 的根因。\n */\nexport class ToolReplayProtocolGuardPreprocessor extends BasePreprocessor {\n readonly name = 'ToolReplayProtocolGuardPreprocessor';\n readonly description = '工具回放协议守卫 - 对要求 provider sidecar 的历史工具组执行结构化回放治理';\n readonly priority: number;\n\n private readonly explicitPolicy?: ToolReplayProtocolPolicy;\n\n constructor(options: ToolReplayProtocolGuardOptions = {}) {\n super();\n this.priority = options.priority ?? 0.5;\n this.explicitPolicy = options.policy;\n }\n\n shouldSkip(messages: AiMessage[], context: PreprocessorContext): boolean {\n if (!messages.some((message) => message.role === 'assistant' && message.type === 'tool_calls')) {\n return true;\n }\n const policy = resolveToolReplayProtocolPolicy(context, this.explicitPolicy);\n return policy.requiresReasoningDetailsForToolReplay !== true\n || policy.missingSidecarBehavior === undefined\n || policy.missingSidecarBehavior === 'allow';\n }\n\n async process(messages: AiMessage[], context: PreprocessorContext): Promise<PreprocessorResult> {\n const policy = resolveToolReplayProtocolPolicy(context, this.explicitPolicy);\n if (\n policy.requiresReasoningDetailsForToolReplay !== true\n || policy.missingSidecarBehavior === undefined\n || policy.missingSidecarBehavior === 'allow'\n ) {\n return this.createResult(messages, messages, [], 0);\n }\n\n const currentRoundStartIndex = findCurrentRunStartIndex(messages);\n const groups = buildToolInteractionGroupsFromMessages(messages);\n const groupsToDegrade = groups.filter((group) => {\n return group.isComplete\n && group.endIndex < currentRoundStartIndex\n && !hasReasoningDetails(group.assistantMessage);\n });\n\n if (groupsToDegrade.length === 0) {\n return this.createResult(messages, messages, [], 0);\n }\n\n if (policy.missingSidecarBehavior === 'provider_empty_replay_field') {\n const groupByAssistantIndex = new Map<number, ToolInteractionGroup<AiMessage>>();\n for (const group of groupsToDegrade) {\n groupByAssistantIndex.set(group.assistantIndex, group);\n }\n const processedMessages = messages.map((message, index) => {\n const group = groupByAssistantIndex.get(index);\n return group ? markProviderEmptyReplayField(message, group) : message;\n });\n\n this.debug('已标记缺少 provider sidecar 的历史工具组由 provider 空字段回放', {\n provider: policy.provider,\n markedGroupCount: groupsToDegrade.length,\n }, context);\n\n return this.createResult(\n messages,\n processedMessages,\n ['tool_replay_protocol_guard'],\n groupsToDegrade.length,\n );\n }\n\n const replacementByAssistantIndex = new Map<number, AiMessage>();\n const indexesToRemove = new Set<number>();\n for (const group of groupsToDegrade) {\n replacementByAssistantIndex.set(group.assistantIndex, buildDegradedToolReplayMessage(group));\n for (const messageIndex of group.messageIndexes) {\n indexesToRemove.add(messageIndex);\n }\n }\n\n const processedMessages: AiMessage[] = [];\n for (let index = 0; index < messages.length; index += 1) {\n if (!indexesToRemove.has(index)) {\n processedMessages.push(messages[index]);\n continue;\n }\n const replacement = replacementByAssistantIndex.get(index);\n if (replacement) {\n processedMessages.push(replacement);\n }\n }\n\n this.debug('已降级缺少 provider sidecar 的历史工具组', {\n provider: policy.provider,\n degradedGroupCount: groupsToDegrade.length,\n }, context);\n\n return this.createResult(\n messages,\n processedMessages,\n ['tool_replay_protocol_guard'],\n groupsToDegrade.length,\n );\n }\n}\n","/**\n * @file src/agent/shared/llmTelemetryContext.ts\n *\n * @description\n * LLM Telemetry 上下文(用于审计/统计,不进入模型上下文,不落库到 EventStore)。\n *\n * 中文备注(设计约束):\n * - 某些“多阶段/多子任务”的审计需要一个可聚合的数据源;\n * - 这些数据不适合塞进 RuntimeEvent(会污染主时间轴、跨端联动成本高);\n * - 因此这里用 AsyncLocalStorage 提供“同一条异步链路内可写入/可聚合”的基础设施;\n * - 默认不启用:只有当业务侧显式用 `withLLMTelemetryContext(...)` 包裹执行链路时才会收集。\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nexport type LlmUsageRaw = {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n /**\n * 兼容:部分 mock/自研 adapter 只返回 usage.tokens\n */\n tokens?: number;\n};\n\nexport type NormalizedLlmUsage = {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n};\n\nexport type LLMTelemetryContext = {\n /**\n * 预留:用于业务侧注入“聚合维度”。\n *\n * 中文备注:\n * - 该字段不进入模型上下文、不落库,仅用于本地统计/审计聚合;\n * - 建议只放稳定标识(如 conversationId/turnId/runId 等),避免塞入大对象。\n */\n scope?: {\n conversationId?: string;\n turnId?: string;\n runId?: string;\n stepId?: string;\n stepIndex?: number;\n };\n};\n\nexport type LlmCallTelemetry = {\n modelId: string;\n stream: boolean;\n startedAt: number;\n durationMs: number;\n usage?: NormalizedLlmUsage;\n};\n\ntype Store = {\n ctx: LLMTelemetryContext;\n calls: LlmCallTelemetry[];\n};\n\nconst als = new AsyncLocalStorage<Store>();\n\n/**\n * 轻量规范化:把 provider 的 usage(不同字段名)收敛为统一结构。\n */\nexport function normalizeLlmUsage(usage: unknown): NormalizedLlmUsage | undefined {\n if (!usage || typeof usage !== 'object' || Array.isArray(usage)) return undefined;\n const rec = usage as Record<string, unknown>;\n\n const promptTokensRaw = rec['prompt_tokens'];\n const completionTokensRaw = rec['completion_tokens'];\n const totalTokensRaw = rec['total_tokens'];\n const tokensRaw = rec['tokens'];\n\n const promptTokens = typeof promptTokensRaw === 'number' && Number.isFinite(promptTokensRaw) ? promptTokensRaw : 0;\n const completionTokens =\n typeof completionTokensRaw === 'number' && Number.isFinite(completionTokensRaw) ? completionTokensRaw : 0;\n const totalFromExplicit =\n typeof totalTokensRaw === 'number' && Number.isFinite(totalTokensRaw) ? totalTokensRaw : undefined;\n const totalFromTokens = typeof tokensRaw === 'number' && Number.isFinite(tokensRaw) ? tokensRaw : undefined;\n\n const totalTokens = totalFromExplicit ?? totalFromTokens ?? promptTokens + completionTokens;\n\n if (promptTokens === 0 && completionTokens === 0 && totalTokens === 0) return undefined;\n\n return { promptTokens, completionTokens, totalTokens };\n}\n\nexport function getCurrentLLMTelemetryContext(): LLMTelemetryContext | undefined {\n return als.getStore()?.ctx;\n}\n\nexport function recordLlmCallTelemetry(entry: LlmCallTelemetry): void {\n const store = als.getStore();\n if (!store) return;\n store.calls.push(entry);\n}\n\nexport async function withLLMTelemetryContext<T>(\n ctx: LLMTelemetryContext,\n fn: () => Promise<T>\n): Promise<{ value: T; calls: LlmCallTelemetry[] }> {\n const parent = als.getStore();\n const merged: LLMTelemetryContext = {\n ...(parent?.ctx ?? {}),\n ...(ctx ?? {}),\n };\n const store: Store = { ctx: merged, calls: [] };\n const value = await als.run(store, fn);\n return { value, calls: store.calls };\n}\n","import type { SystemReminderContext } from './types';\nexport { DEFAULT_CONTEXT_CHECKPOINT_TOOL_NAME } from '../../shared/checkpointMarker';\n\nimport { DEFAULT_CONTEXT_CHECKPOINT_TOOL_NAME } from '../../shared/checkpointMarker';\n\nexport function readNonEmptyStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .map((item) => (typeof item === 'string' ? item.trim() : ''))\n .filter((item) => item.length > 0);\n}\n\nexport function toDisplayStep(nodeSwitches: number): number {\n return Math.ceil(nodeSwitches / 2);\n}\n\nexport function readContextCheckpointToolName(ctx: SystemReminderContext): string {\n const configured = ctx.executorLocal?.contextCheckpointToolName;\n return typeof configured === 'string' && configured.trim().length > 0\n ? configured.trim()\n : DEFAULT_CONTEXT_CHECKPOINT_TOOL_NAME;\n}\n\nfunction isRuntimeEventLike(value: unknown): value is { type: unknown } {\n return !!value && typeof value === 'object' && !Array.isArray(value) && 'type' in value;\n}\n\n/**\n * 统计“本轮请求内”的工具调用次数(LLM 决策层)。\n *\n * 中文备注:只统计最后一个 user_input 之后的 tool_call_decision,避免旧事件或 ToolNode\n * 复用 action 语义时把同一轮工具调用重复计数。\n */\nexport function countToolCallsInCurrentRequest(history: ReadonlyArray<unknown>): number {\n let startIdx = 0;\n for (let index = history.length - 1; index >= 0; index -= 1) {\n const event = history[index];\n if (!isRuntimeEventLike(event)) continue;\n if (event.type === 'user_input') {\n startIdx = index + 1;\n break;\n }\n }\n\n let count = 0;\n for (let index = startIdx; index < history.length; index += 1) {\n const event = history[index];\n if (!isRuntimeEventLike(event)) continue;\n if (event.type === 'tool_call_decision') {\n count += 1;\n }\n }\n return count;\n}\n","import {\n countToolCallsInCurrentRequest,\n readContextCheckpointToolName,\n readNonEmptyStrings,\n toDisplayStep,\n} from './helpers';\nimport type { SystemReminderContentTemplate, SystemReminderContext } from './types';\n\nexport const maxStepsForceFinalAnswerTemplate: SystemReminderContentTemplate = () => [\n '你已达到最大步数限制:本轮工具已被禁用。',\n '你必须立刻给出最终答案,不要再尝试调用任何工具。',\n '若信息不完整,请明确说明关键假设和缺口,并给出当前最好的可用回答。',\n].join('\\n');\n\nexport const lastStepsHintTemplate: SystemReminderContentTemplate = (ctx) => {\n const el = ctx.executorLocal;\n if (!el) return '';\n const maxSteps = el.maxSteps;\n const stepCount = el.stepCount;\n const remainingSteps = el.remainingSteps;\n if (typeof maxSteps !== 'number' || typeof stepCount !== 'number' || typeof remainingSteps !== 'number') {\n return '';\n }\n\n const displayMaxSteps = toDisplayStep(maxSteps);\n const displayStepCount = toDisplayStep(stepCount);\n const displayRemainingSteps = toDisplayStep(remainingSteps);\n const finalStepPolicy = el.finalStepPolicy ?? 'final_answer';\n\n if (finalStepPolicy === 'force_tools') {\n const forcedTools = readNonEmptyStrings(el.finalStepForcedTools);\n const toolsText = forcedTools.length > 0 ? forcedTools.join(', ') : '(未配置 forcedTools)';\n return [\n `步数提醒:你当前处于第 ${displayStepCount}/${displayMaxSteps} 步,还剩 ${displayRemainingSteps} 步。`,\n `当剩余 1 步时:你必须立刻调用工具:${toolsText}(系统将只保留这些工具)。`,\n '最后 1 步将用于执行工具,因此不要在最后一步才尝试再调用其他工具。',\n ].join('\\n');\n }\n\n return [\n `步数提醒:你当前处于第 ${displayStepCount}/${displayMaxSteps} 步,还剩 ${displayRemainingSteps} 步。`,\n '建议你结束无关推理/无关工具调用,确保在步数耗尽前完成任务。',\n ].join('\\n');\n};\n\nexport const toolCallStreakTemplate: SystemReminderContentTemplate = (ctx) => {\n const count = countToolCallsInCurrentRequest(ctx.history);\n return [\n `你已连续执行了 ${count} 次工具调用。`,\n '如果问题比较复杂,考虑创建sub-agent,也就是task,以降低上下文占用。',\n '如果问题即将解决,请忽略本条提醒。',\n ].join('\\n');\n};\n\nexport const periodicTaskstateReflectionTemplate: SystemReminderContentTemplate = (ctx) => {\n const stepCount = ctx.executorLocal?.stepCount ?? 0;\n const displayStep = toDisplayStep(stepCount);\n return [\n `你已执行了 ${displayStep} 步。请暂停当前工作,花一步反思和整理:`,\n '1. 回顾你最近的 taskstate_write 输出,确认当前工作方向正确(没有偏离 Goal)。',\n '2. 调用 taskstate_write 更新 progress 和 next_steps,如有必要调整 current_plan。',\n '3. 如果任务复杂但尚未创建 TaskState,现在是创建的好时机。',\n '完成整理后继续执行任务。',\n ].join('\\n');\n};\n\nexport const contextBudgetWarningTemplate: SystemReminderContentTemplate = (ctx) => {\n const stepCount = ctx.executorLocal?.stepCount ?? 0;\n const maxSteps = ctx.executorLocal?.maxSteps ?? 0;\n const displayStep = toDisplayStep(stepCount);\n const displayMax = toDisplayStep(maxSteps);\n const checkpointToolName = readContextCheckpointToolName(ctx);\n return [\n `⚠️ 上下文预算告警:你已执行了 ${displayStep}/${displayMax} 步,上下文空间即将耗尽。`,\n '你必须立即执行以下操作以避免上下文溢出:',\n '1. 调用sharedmemory_write工具,将当前发现、总结、思考或者任何重要信息详细写入sharedmemory。',\n `2. 调用 ${checkpointToolName} 工具,传入 summary(阶段过渡摘要)和 taskstate(最新任务状态)。`,\n ' 这会一次性完成\"保存状态 + 清理历史\",checkpoint tool_output 中会保留你的 TaskState 快照。',\n '3. 清理后你的上下文将只保留:checkpoint 工具对(含摘要 + TaskState)+ 最近 2 对工具交互。重要信息会通过sharedmemory保存。',\n ].join('\\n');\n};\n\nexport const BUILTIN_SYSTEM_REMINDER_TEMPLATES: Record<string, SystemReminderContentTemplate> = {\n maxStepsForceFinalAnswer: maxStepsForceFinalAnswerTemplate,\n lastStepsHint: lastStepsHintTemplate,\n toolCallStreak: toolCallStreakTemplate,\n periodicTaskstateReflection: periodicTaskstateReflectionTemplate,\n contextBudgetWarning: contextBudgetWarningTemplate,\n};\n","import type { AgentSpecSystemReminderTrigger } from '../../contracts';\nimport { countToolCallsInCurrentRequest, readContextCheckpointToolName } from './helpers';\nimport type { SystemReminderContext, SystemReminderTriggerEvaluator } from './types';\n\nfunction readNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction getTriggerThreshold(trigger: AgentSpecSystemReminderTrigger): number | undefined {\n return readNumber(trigger.threshold);\n}\n\nexport const phaseEqualsTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const expected = readString(trigger.value);\n return !!expected && ctx.executorLocal?.phase === expected;\n};\n\nexport const remainingStepsLeqTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const remainingSteps = readNumber(ctx.executorLocal?.remainingSteps);\n const threshold = getTriggerThreshold(trigger) ?? readNumber(ctx.executorLocal?.lastStepsHintThreshold);\n if (remainingSteps === undefined || threshold === undefined || threshold <= 0) return false;\n if (ctx.executorLocal?.phase === 'force_final_answer') return false;\n return remainingSteps <= threshold;\n};\n\nexport const stepCountModuloTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const stepCount = readNumber(ctx.executorLocal?.stepCount);\n const period = readNumber(trigger.period) ?? getTriggerThreshold(trigger);\n const minStep = readNumber(trigger.minStep) ?? period;\n if (stepCount === undefined || period === undefined || period <= 0) return false;\n if (ctx.executorLocal?.phase === 'force_final_answer') return false;\n if (stepCount < (minStep ?? 0)) return false;\n return stepCount % period === 0;\n};\n\nexport const toolCallStreakTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const threshold = getTriggerThreshold(trigger) ?? 10;\n if (threshold <= 0) return false;\n const count = countToolCallsInCurrentRequest(ctx.history);\n if (count < threshold) return false;\n return trigger.moduloStep === false ? true : count % threshold === 0;\n};\n\nexport const budgetWarningTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const toolName = readString(trigger.toolName) ?? readContextCheckpointToolName(ctx);\n const tools = ctx.request.availableTools;\n if (!Array.isArray(tools) || !tools.includes(toolName)) return false;\n\n const stepCount = readNumber(ctx.executorLocal?.stepCount);\n const maxSteps = readNumber(ctx.executorLocal?.maxSteps);\n const ratio = readNumber(trigger.ratio) ?? 0.9;\n if (stepCount === undefined || maxSteps === undefined || maxSteps <= 0) return false;\n if (ctx.executorLocal?.phase === 'force_final_answer') return false;\n\n const threshold = Math.floor(maxSteps * ratio);\n return stepCount >= threshold && stepCount < threshold + 4;\n};\n\nexport const agentHasToolTrigger: SystemReminderTriggerEvaluator = (ctx, trigger) => {\n const toolName = readString(trigger.toolName) ?? readString(trigger.value);\n if (!toolName || !Array.isArray(ctx.request.availableTools)) return false;\n return ctx.request.availableTools.includes(toolName);\n};\n\nexport const BUILTIN_SYSTEM_REMINDER_TRIGGERS: Record<string, SystemReminderTriggerEvaluator> = {\n 'phase-equals': phaseEqualsTrigger,\n 'remaining-steps-leq': remainingStepsLeqTrigger,\n 'step-count-modulo': stepCountModuloTrigger,\n 'tool-call-streak': toolCallStreakTrigger,\n 'budget-warning': budgetWarningTrigger,\n 'agent-has-tool': agentHasToolTrigger,\n};\n","import { BUILTIN_SYSTEM_REMINDER_TEMPLATES } from './templates';\nimport { BUILTIN_SYSTEM_REMINDER_TRIGGERS } from './triggers';\nimport type {\n SystemReminderContentTemplate,\n SystemReminderRule,\n SystemReminderRuleDefinition,\n SystemReminderTriggerEvaluator,\n} from './types';\n\nexport class SystemReminderRegistry {\n private readonly triggers = new Map<string, SystemReminderTriggerEvaluator>();\n private readonly templates = new Map<string, SystemReminderContentTemplate>();\n\n constructor(seed?: {\n triggers?: Record<string, SystemReminderTriggerEvaluator>;\n templates?: Record<string, SystemReminderContentTemplate>;\n }) {\n for (const [kind, evaluator] of Object.entries(seed?.triggers ?? {})) {\n this.registerTriggerKind(kind, evaluator);\n }\n for (const [name, template] of Object.entries(seed?.templates ?? {})) {\n this.registerContentTemplate(name, template);\n }\n }\n\n registerTriggerKind(kind: string, evaluator: SystemReminderTriggerEvaluator): void {\n const normalized = kind.trim();\n if (!normalized) {\n throw new Error('[SystemReminderRegistry] trigger kind 不能为空');\n }\n this.triggers.set(normalized, evaluator);\n }\n\n registerContentTemplate(name: string, template: SystemReminderContentTemplate): void {\n const normalized = name.trim();\n if (!normalized) {\n throw new Error('[SystemReminderRegistry] content template 不能为空');\n }\n this.templates.set(normalized, template);\n }\n\n buildRule(definition: SystemReminderRuleDefinition): SystemReminderRule | undefined {\n const trigger = this.triggers.get(definition.trigger.kind);\n const template = this.templates.get(definition.contentTemplate);\n if (!trigger || !template) {\n return undefined;\n }\n\n return {\n id: definition.id,\n when: (ctx) => trigger(ctx, definition.trigger),\n build: (ctx) => template(ctx, definition.contentArgs),\n };\n }\n}\n\nexport function createDefaultSystemReminderRegistry(): SystemReminderRegistry {\n return new SystemReminderRegistry({\n triggers: BUILTIN_SYSTEM_REMINDER_TRIGGERS,\n templates: BUILTIN_SYSTEM_REMINDER_TEMPLATES,\n });\n}\n\nexport const defaultSystemReminderRegistry = createDefaultSystemReminderRegistry();\n","/**\n * @file runtime-kernel/events/agentEvents.ts\n * @description graph 主执行链使用的最小 Agent 事件契约\n *\n * 中文备注:\n * - 该文件只承载 runtime-kernel 主链路真正需要识别的事件子集;\n * - 目标是让 `executor` / `llmNode` / `eventMappers` 不再反向依赖宿主或产品层事件定义;\n * - host/product 层若有更丰富的事件,只要结构兼容,仍可在边界透传进来。\n */\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport interface AgentEvent {\n type: string;\n timestamp: number;\n id?: string;\n /**\n * 中文备注:\n * - 该标记只在运行期内存中使用,用于避免同一事件被 SSE 重复分发;\n * - 不属于持久化协议字段。\n */\n __dispatched_via_sse__?: true;\n}\n\ninterface BaseToolLifecycleAgentEvent extends AgentEvent {\n tool_name: string;\n tool_args: Record<string, unknown>;\n tool_calls?: unknown[];\n tool_call_id?: string;\n phase?: 'start' | 'update' | 'complete' | 'error';\n status?: 'loading' | 'success' | 'error';\n payload?: Record<string, unknown>;\n meta?: Record<string, unknown>;\n}\n\nexport interface ThoughtEvent extends AgentEvent {\n type: 'thought';\n content: string;\n delta?: string;\n is_complete?: boolean;\n meta?: Record<string, unknown>;\n thought_message_id?: string;\n}\n\nexport interface ToolCallDecisionEvent extends BaseToolLifecycleAgentEvent {\n type: 'tool_call_decision';\n}\n\nexport interface ToolProcessEvent extends BaseToolLifecycleAgentEvent {\n type: 'tool_process';\n}\n\nexport interface ObservationEvent extends AgentEvent {\n type: 'observation';\n tool_name: string;\n tool_call_id?: string;\n output: string;\n success?: boolean;\n payload?: Record<string, unknown>;\n duration_ms?: number;\n}\n\nexport interface FinalAnswerEvent extends AgentEvent {\n type: 'final_answer';\n answer: string;\n answer_id?: string;\n answerId?: string;\n reasoning_details?: unknown[];\n meta?: Record<string, unknown>;\n}\n\nexport interface ErrorEvent extends AgentEvent {\n type: 'error';\n error: string;\n details?: string;\n}\n\nexport interface StreamChunkEvent extends AgentEvent {\n type: 'stream_chunk';\n content: string;\n answer_id?: string;\n seq?: number;\n is_last?: boolean;\n isLast?: boolean;\n}\n\nexport interface ProviderSidecarEvent extends AgentEvent {\n type: 'provider_sidecar';\n reasoning_details?: unknown[];\n}\n\nexport type AnyAgentEvent =\n | ThoughtEvent\n | ToolCallDecisionEvent\n | ToolProcessEvent\n | ObservationEvent\n | FinalAnswerEvent\n | ErrorEvent\n | StreamChunkEvent\n | ProviderSidecarEvent;\n\nexport function isMarkedAsSseDispatched(event: unknown): boolean {\n return isRecord(event) && event['__dispatched_via_sse__'] === true;\n}\n\nexport function readAgentEventAnswerId(event: unknown): string | undefined {\n if (!isRecord(event)) return undefined;\n\n const snake = event['answer_id'];\n if (typeof snake === 'string' && snake.trim().length > 0) {\n return snake.trim();\n }\n\n const camel = event['answerId'];\n if (typeof camel === 'string' && camel.trim().length > 0) {\n return camel.trim();\n }\n\n return undefined;\n}\n\nexport function readAgentEventSeq(event: unknown): number | undefined {\n if (!isRecord(event)) return undefined;\n const value = event['seq'];\n return Number.isInteger(value) ? Number(value) : undefined;\n}\n","import type { AiMessage, RuntimeEvent, ToolCallWire } from '../../contracts';\nimport type { ToolPresentationPort } from '../tools/ports';\n\nexport interface EventMappingContext {\n conversationId: string;\n turnId: string;\n timestamp?: number;\n /**\n * 事件级扩展元数据(透传到 SSE/RuntimeEvent.metadata)。\n *\n * 中文备注:这里只放跨事件归类信息,不放 ui.hidden 这类单事件展示语义。\n */\n metadata?: Record<string, unknown>;\n}\n\nexport interface SSEMappingOptions {\n emitSse?: boolean;\n skipAlreadyDispatched?: boolean;\n toolPresentationPort?: ToolPresentationPort;\n}\n\nexport interface RuntimeMappingOptions {\n collectRuntime?: boolean;\n skipIncomplete?: boolean;\n toolPresentationPort?: ToolPresentationPort;\n}\n\n/**\n * RuntimeEvent 回放所需的最小会话内存端口。\n *\n * 中文备注:\n * - core 只依赖“写入消息”的最小能力;\n * - 具体产品实现只要结构兼容即可接入。\n */\nexport interface ConversationMemoryPort {\n addUserMessage(content: string, id?: string): void;\n addAssistantMessage(\n content: string | null,\n type: AiMessage['type'] & ('thought' | 'final_answer' | 'tool_calls'),\n metadata?: AiMessage['metadata'],\n id?: string\n ): void;\n addToolResponse(toolCallId: string, content: string, toolName?: string, id?: string): void;\n appendMessage(message: AiMessage): void;\n}\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object' && !Array.isArray(value);\n\nexport const isToolCallWire = (value: unknown): value is ToolCallWire => {\n if (!isRecord(value)) return false;\n if (typeof value.id !== 'string') return false;\n if (value.type !== 'function') return false;\n const fn = value.function;\n return isRecord(fn) && typeof fn.name === 'string' && typeof fn.arguments === 'string';\n};\n\nexport function resolveToolDisplayOptions(\n toolName: string,\n toolPresentationPort?: ToolPresentationPort,\n) {\n return toolPresentationPort?.getDisplayOptions(toolName);\n}\n\nexport function readAnswerIdFromEvent(event: unknown): string | undefined {\n if (!isRecord(event)) return undefined;\n const value = event['answerId'];\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nexport function readMetaFromEvent(event: unknown): Record<string, unknown> | undefined {\n if (!isRecord(event)) return undefined;\n const value = event['meta'];\n return isRecord(value) ? value : undefined;\n}\n\nexport type HistorySummaryRuntimeEvent = RuntimeEvent & {\n type: 'history_summary';\n content: string;\n replaces_start_message_id?: string;\n replaces_end_message_id?: string;\n original_message_count?: number;\n compression_ratio?: number;\n generated_by?: string;\n included_old_summary?: boolean;\n replaced_message_ids?: string[];\n summary_seq?: number;\n};\n","import {\n AnyAgentEvent,\n ErrorEvent as AgentErrorEvent,\n FinalAnswerEvent as AgentFinalAnswerEvent,\n ObservationEvent as AgentObservationEvent,\n StreamChunkEvent as AgentStreamChunkEvent,\n ThoughtEvent as AgentThoughtEvent,\n ToolCallDecisionEvent as AgentToolCallDecisionEvent,\n ToolProcessEvent as AgentToolProcessEvent,\n readAgentEventAnswerId,\n readAgentEventSeq,\n} from './agentEvents';\nimport {\n RuntimeEvent,\n createErrorEvent,\n createFinalAnswerChunkEvent,\n createFinalAnswerEvent,\n createThoughtEvent,\n createToolCallDecisionEvent,\n createToolOutputEvent,\n createToolProcessEvent,\n} from '../../contracts';\nimport { generateMessageId } from '../../shared/ids';\nimport {\n type EventMappingContext,\n type RuntimeMappingOptions,\n isRecord,\n readAnswerIdFromEvent,\n readMetaFromEvent,\n resolveToolDisplayOptions,\n} from './provider-sidecar';\n\nexport function agentEventToRuntime(\n agentEvent: AnyAgentEvent | RuntimeEvent,\n context: EventMappingContext,\n options: RuntimeMappingOptions = {},\n): RuntimeEvent | null {\n if (!agentEvent || typeof agentEvent !== 'object') return null;\n\n if (isRecord(agentEvent) && agentEvent['type'] === 'history_summary') {\n const evt = agentEvent as RuntimeEvent;\n if (context.metadata) {\n evt.metadata = { ...(evt.metadata ?? {}), ...context.metadata };\n }\n return evt;\n }\n\n const typed = agentEvent as AnyAgentEvent;\n const { conversationId, turnId } = context;\n const timestamp = typed.timestamp ?? context.timestamp ?? Date.now();\n const id = typed.id ?? generateMessageId();\n const contextMeta = context.metadata;\n\n switch (typed.type) {\n case 'thought':\n return mapThoughtToRuntime(typed as AgentThoughtEvent, context, options, id, timestamp);\n\n case 'tool_call_decision':\n case 'tool_process':\n return mapToolProgressToRuntime(typed, context, options, id, timestamp);\n\n case 'observation': {\n const observationEvent = typed as AgentObservationEvent;\n const toolName = observationEvent.tool_name || 'unknown_tool';\n const toolCallId = observationEvent.tool_call_id || `call_${id}`;\n const success = observationEvent.success ?? !/^错误[::]/i.test(String(observationEvent.output ?? ''));\n const payload = observationEvent.payload || {};\n const event = createToolOutputEvent(\n id,\n conversationId,\n turnId,\n toolName,\n toolCallId,\n observationEvent.output,\n success ? 'success' : 'error',\n { timestamp, payload, duration_ms: payload.duration_ms as number | undefined },\n );\n event.ephemeral = false;\n if (contextMeta) event.metadata = { ...(event.metadata ?? {}), ...contextMeta };\n return event;\n }\n\n case 'final_answer': {\n const finalAnswerEvent = typed as AgentFinalAnswerEvent;\n const answerIdFromSnake =\n typeof finalAnswerEvent.answer_id === 'string' && finalAnswerEvent.answer_id.trim().length > 0\n ? finalAnswerEvent.answer_id.trim()\n : undefined;\n return createFinalAnswerEvent(\n id,\n conversationId,\n turnId,\n answerIdFromSnake ?? readAnswerIdFromEvent(finalAnswerEvent) ?? `answer_${turnId}`,\n finalAnswerEvent.answer ?? '',\n {\n timestamp,\n reasoning_details: Array.isArray(finalAnswerEvent.reasoning_details)\n ? finalAnswerEvent.reasoning_details\n : undefined,\n meta: readMetaFromEvent(finalAnswerEvent),\n },\n );\n }\n\n case 'error': {\n const errorEvent = typed as AgentErrorEvent;\n return createErrorEvent(id, conversationId, turnId, errorEvent.error ?? 'Unknown error', {\n timestamp,\n details: errorEvent.details,\n });\n }\n\n case 'stream_chunk':\n return mapStreamChunkToRuntime(typed as AgentStreamChunkEvent, context, id, timestamp);\n\n default:\n return null;\n }\n}\n\nfunction mapThoughtToRuntime(\n thoughtEvent: AgentThoughtEvent,\n context: EventMappingContext,\n options: RuntimeMappingOptions,\n id: string,\n timestamp: number,\n): RuntimeEvent | null {\n const isComplete = 'is_complete' in thoughtEvent ? Boolean(thoughtEvent.is_complete) : false;\n if (options.skipIncomplete && !isComplete) return null;\n\n const thoughtMessageId =\n typeof thoughtEvent.thought_message_id === 'string' && thoughtEvent.thought_message_id.length > 0\n ? thoughtEvent.thought_message_id\n : undefined;\n const runtimeEvent = createThoughtEvent(id, context.conversationId, context.turnId, thoughtEvent.content ?? '', {\n timestamp,\n thought_message_id: thoughtMessageId,\n delta: thoughtEvent.delta,\n is_complete: isComplete,\n });\n if (!isComplete) runtimeEvent.ephemeral = true;\n const thoughtMeta = isRecord(thoughtEvent.meta) ? thoughtEvent.meta : undefined;\n if (context.metadata || thoughtMeta) {\n runtimeEvent.metadata = { ...(runtimeEvent.metadata ?? {}), ...(context.metadata ?? {}), ...(thoughtMeta ?? {}) };\n }\n return runtimeEvent;\n}\n\nfunction mapToolProgressToRuntime(\n toolEvent: AgentToolCallDecisionEvent | AgentToolProcessEvent,\n context: EventMappingContext,\n options: RuntimeMappingOptions,\n id: string,\n timestamp: number,\n): RuntimeEvent {\n const toolName = toolEvent.tool_name || 'unknown_tool';\n const toolCallId = toolEvent.tool_call_id || `call_${id}`;\n const meta = toolEvent.meta && typeof toolEvent.meta === 'object' ? { ...toolEvent.meta } : {};\n const displayOptions = resolveToolDisplayOptions(toolName, options.toolPresentationPort);\n if (displayOptions && !meta.displayOptions) meta.displayOptions = displayOptions;\n\n const event = toolEvent.type === 'tool_call_decision'\n ? createToolCallDecisionEvent(id, context.conversationId, context.turnId, toolName, toolCallId, {\n timestamp,\n phase: toolEvent.phase ?? 'start',\n status: toolEvent.status ?? 'loading',\n args: toolEvent.tool_args || {},\n payload: toolEvent.payload || {},\n meta,\n })\n : createToolProcessEvent(id, context.conversationId, context.turnId, toolName, toolCallId, {\n timestamp,\n phase: toolEvent.phase ?? 'start',\n status: toolEvent.status ?? 'loading',\n args: toolEvent.tool_args || {},\n payload: toolEvent.payload || {},\n meta,\n });\n event.ephemeral = meta.ephemeral === true;\n if (context.metadata) event.metadata = { ...(event.metadata ?? {}), ...context.metadata };\n return event;\n}\n\nfunction mapStreamChunkToRuntime(\n streamEvent: AgentStreamChunkEvent,\n context: EventMappingContext,\n id: string,\n timestamp: number,\n): RuntimeEvent | null {\n const text = streamEvent.content ?? '';\n if (!text) return null;\n const answerId = readAgentEventAnswerId(streamEvent) ?? `answer_${context.turnId}`;\n const seq = readAgentEventSeq(streamEvent) ?? 0;\n const isLast = Boolean(\n ('isLast' in streamEvent && streamEvent.isLast) ||\n ('is_last' in streamEvent && streamEvent.is_last),\n );\n const chunkEvent = createFinalAnswerChunkEvent(id, context.conversationId, context.turnId, answerId, seq, text, {\n timestamp,\n is_last: isLast,\n });\n chunkEvent.ephemeral = true;\n if (context.metadata) chunkEvent.metadata = { ...(chunkEvent.metadata ?? {}), ...context.metadata };\n return chunkEvent;\n}\n","import type {\n AiMessage,\n RuntimeEvent,\n ThoughtEvent as RuntimeThoughtEvent,\n ToolCallDecisionEvent as RuntimeToolCallDecisionEvent,\n ToolOutputEvent as RuntimeToolOutputEvent,\n FinalAnswerEvent as RuntimeFinalAnswerEvent,\n UserInputEvent as RuntimeUserInputEvent,\n ToolCallWire,\n} from '../../contracts';\nimport {\n type ConversationMemoryPort,\n type HistorySummaryRuntimeEvent,\n isToolCallWire,\n} from './provider-sidecar';\n\nexport function applyRuntimeEventToMemory(event: RuntimeEvent, memory: ConversationMemoryPort): void {\n if (!event || !memory) return;\n\n switch (event.type) {\n case 'user_input': {\n const userEvent = event as RuntimeUserInputEvent;\n memory.addUserMessage(userEvent.content || '', userEvent.id);\n break;\n }\n\n case 'tool_call_decision':\n applyToolCallDecision(event as RuntimeToolCallDecisionEvent, memory);\n break;\n\n case 'tool_output':\n applyToolOutput(event as RuntimeToolOutputEvent, memory);\n break;\n\n case 'final_answer': {\n const answerEvent = event as RuntimeFinalAnswerEvent;\n const answerContent = answerEvent.content || '';\n if (answerContent.trim()) {\n const metadata = Array.isArray(answerEvent.reasoning_details)\n ? { reasoning_details: answerEvent.reasoning_details }\n : undefined;\n memory.addAssistantMessage(answerContent, 'final_answer', metadata, answerEvent.id);\n }\n break;\n }\n\n case 'thought': {\n const thoughtEvent = event as RuntimeThoughtEvent;\n memory.addAssistantMessage(thoughtEvent.content || '', 'thought', undefined, thoughtEvent.id);\n break;\n }\n\n case 'history_summary':\n applyHistorySummary(event as HistorySummaryRuntimeEvent, memory);\n break;\n\n case 'error':\n break;\n\n default:\n break;\n }\n}\n\nfunction applyToolCallDecision(event: RuntimeToolCallDecisionEvent, memory: ConversationMemoryPort): void {\n const payload = event.payload || {};\n const toolCalls = Array.isArray(payload.tool_calls)\n ? payload.tool_calls.filter(isToolCallWire)\n : [];\n const toolArgs = event.args || payload.args || {};\n const toolCallId = event.tool_call_id ||\n (toolCalls.length > 0 ? toolCalls[0].id : `call_${event.id || Date.now()}`);\n\n const normalizedToolCalls: ToolCallWire[] = toolCalls.length > 0\n ? toolCalls\n : [\n {\n id: toolCallId,\n type: 'function',\n function: { name: event.tool_name, arguments: JSON.stringify(toolArgs || {}) },\n },\n ];\n const reasoningDetails = Array.isArray(payload.reasoning_details)\n ? payload.reasoning_details\n : undefined;\n\n memory.addAssistantMessage(\n null,\n 'tool_calls',\n {\n tool_calls: normalizedToolCalls,\n ...(reasoningDetails ? { reasoning_details: reasoningDetails } : {}),\n },\n event.id,\n );\n}\n\nfunction applyToolOutput(event: RuntimeToolOutputEvent, memory: ConversationMemoryPort): void {\n if (!event.tool_call_id) return;\n const payload = event.payload || {};\n const outputValue = payload.result ?? payload.output ?? event.output;\n let serializedOutput: string;\n if (typeof outputValue === 'string') {\n serializedOutput = outputValue;\n } else {\n try {\n serializedOutput = JSON.stringify(outputValue ?? '');\n } catch {\n serializedOutput = String(outputValue ?? '');\n }\n }\n memory.addToolResponse(String(event.tool_call_id), serializedOutput, event.tool_name, event.id);\n}\n\nfunction applyHistorySummary(summaryEvent: HistorySummaryRuntimeEvent, memory: ConversationMemoryPort): void {\n const summaryMetadata: AiMessage['metadata'] = {\n messageType: 'summary',\n generatedBy: summaryEvent.generated_by || 'AgentSummarizationProvider',\n originalMessageCount: summaryEvent.original_message_count,\n compressionRatio: summaryEvent.compression_ratio,\n includedOldSummary: summaryEvent.included_old_summary,\n replacesStartMessageId: summaryEvent.replaces_start_message_id,\n replacesEndMessageId: summaryEvent.replaces_end_message_id,\n replacedMessageIds: Array.isArray(summaryEvent.replaced_message_ids) ? summaryEvent.replaced_message_ids : [],\n summarySeq: summaryEvent.summary_seq || 0,\n };\n\n const summaryMessage: AiMessage = {\n id: summaryEvent.id,\n role: 'system',\n type: 'history_summary',\n content: summaryEvent.content || '',\n timestamp: summaryEvent.timestamp,\n metadata: summaryMetadata,\n };\n\n memory.appendMessage(summaryMessage);\n}\n","import {\n AnyAgentEvent,\n ErrorEvent as AgentErrorEvent,\n FinalAnswerEvent as AgentFinalAnswerEvent,\n ObservationEvent as AgentObservationEvent,\n StreamChunkEvent as AgentStreamChunkEvent,\n ThoughtEvent as AgentThoughtEvent,\n ToolCallDecisionEvent as AgentToolCallDecisionEvent,\n ToolProcessEvent as AgentToolProcessEvent,\n isMarkedAsSseDispatched,\n readAgentEventAnswerId,\n readAgentEventSeq,\n} from './agentEvents';\nimport {\n createSSEErrorEvent,\n createSSEFinalAnswerChunkEvent,\n createSSEFinalAnswerEvent,\n createSSEThoughtEvent,\n createSSEToolCallDecisionEvent,\n createSSEToolOutputEvent,\n createSSEToolProcessEvent,\n type SSEEvent,\n} from '../../contracts';\nimport { generateMessageId } from '../../shared/ids';\nimport {\n type EventMappingContext,\n type SSEMappingOptions,\n isRecord,\n readAnswerIdFromEvent,\n readMetaFromEvent,\n resolveToolDisplayOptions,\n} from './provider-sidecar';\n\nexport function agentEventToSSE(\n agentEvent: AnyAgentEvent,\n context: EventMappingContext,\n options: SSEMappingOptions = {},\n): SSEEvent | null {\n if (!agentEvent || typeof agentEvent !== 'object') return null;\n if (options.skipAlreadyDispatched && isMarkedAsSseDispatched(agentEvent)) return null;\n\n const { conversationId, turnId } = context;\n const timestamp = agentEvent.timestamp ?? context.timestamp ?? Date.now();\n const id = agentEvent.id ?? generateMessageId();\n const contextMeta = context.metadata;\n\n switch (agentEvent.type) {\n case 'thought': {\n const thoughtEvent = agentEvent as AgentThoughtEvent;\n const rawContent = 'content' in thoughtEvent ? thoughtEvent.content : '';\n const delta = 'delta' in thoughtEvent ? thoughtEvent.delta : '';\n const isComplete = 'is_complete' in thoughtEvent ? Boolean(thoughtEvent.is_complete) : false;\n const thoughtMessageId =\n typeof thoughtEvent.thought_message_id === 'string' && thoughtEvent.thought_message_id.length > 0\n ? thoughtEvent.thought_message_id\n : undefined;\n\n const sse = createSSEThoughtEvent(id, conversationId, turnId, {\n thought_message_id: thoughtMessageId,\n content: isComplete ? (rawContent ?? '') : undefined,\n delta: !isComplete ? (delta ?? rawContent) : undefined,\n is_complete: isComplete,\n });\n sse.timestamp = timestamp;\n const thoughtMeta = isRecord(thoughtEvent.meta) ? thoughtEvent.meta : undefined;\n if (contextMeta || thoughtMeta) {\n sse.metadata = { ...(contextMeta ?? {}), ...(thoughtMeta ?? {}) };\n }\n return sse;\n }\n\n case 'tool_call_decision':\n case 'tool_process':\n return mapToolProgressToSse(agentEvent, context, options, id, timestamp);\n\n case 'observation': {\n const observationEvent = agentEvent as AgentObservationEvent;\n const toolName = observationEvent.tool_name || 'unknown_tool';\n const toolCallId = observationEvent.tool_call_id || `call_${id}`;\n const status: 'success' | 'error' = observationEvent.success === false ? 'error' : 'success';\n const payload = observationEvent.payload || {};\n const duration = payload.duration_ms as number | undefined;\n const sse = createSSEToolOutputEvent(\n id,\n conversationId,\n turnId,\n toolName,\n toolCallId,\n status,\n observationEvent.output,\n { timestamp, payload, duration_ms: duration },\n );\n sse.timestamp = timestamp;\n if (contextMeta) sse.metadata = contextMeta;\n return sse;\n }\n\n case 'stream_chunk': {\n const streamEvent = agentEvent as AgentStreamChunkEvent;\n const text = streamEvent.content ?? '';\n if (!text) return null;\n const answerId = readAgentEventAnswerId(streamEvent) ?? `answer_${turnId}`;\n const seq = readAgentEventSeq(streamEvent) ?? 0;\n const isLast = Boolean(\n ('isLast' in streamEvent && streamEvent.isLast) ||\n ('is_last' in streamEvent && streamEvent.is_last),\n );\n const sse = createSSEFinalAnswerChunkEvent(id, conversationId, turnId, answerId, seq, text, {\n is_last: isLast,\n });\n sse.timestamp = timestamp;\n if (contextMeta) sse.metadata = contextMeta;\n return sse;\n }\n\n case 'final_answer': {\n const finalAnswerEvent = agentEvent as AgentFinalAnswerEvent;\n const answer = finalAnswerEvent.answer ?? '';\n const answerIdFromSnake =\n typeof finalAnswerEvent.answer_id === 'string' && finalAnswerEvent.answer_id.trim().length > 0\n ? finalAnswerEvent.answer_id.trim()\n : undefined;\n const answerId = answerIdFromSnake ?? readAnswerIdFromEvent(finalAnswerEvent) ?? `answer_${turnId}`;\n const sse = createSSEFinalAnswerEvent(id, conversationId, turnId, answerId, answer, {\n meta: readMetaFromEvent(finalAnswerEvent),\n });\n sse.timestamp = timestamp;\n if (contextMeta) sse.metadata = contextMeta;\n return sse;\n }\n\n case 'error': {\n const errorEvent = agentEvent as AgentErrorEvent;\n const sse = createSSEErrorEvent(id, conversationId, turnId, errorEvent.error ?? 'Unknown error', {\n details: errorEvent.details,\n });\n sse.timestamp = timestamp;\n if (contextMeta) sse.metadata = contextMeta;\n return sse;\n }\n\n default:\n return null;\n }\n}\n\nfunction mapToolProgressToSse(\n agentEvent: AgentToolCallDecisionEvent | AgentToolProcessEvent,\n context: EventMappingContext,\n options: SSEMappingOptions,\n id: string,\n timestamp: number,\n): SSEEvent {\n const toolName = agentEvent.tool_name || 'unknown_tool';\n const toolCallId = agentEvent.tool_call_id || `call_${id}`;\n const phase = agentEvent.phase ?? 'start';\n const status = agentEvent.status ?? 'loading';\n const args = agentEvent.tool_args || {};\n const payload = agentEvent.payload || {};\n const meta = agentEvent.meta && typeof agentEvent.meta === 'object' ? { ...agentEvent.meta } : {};\n const displayOptions = resolveToolDisplayOptions(toolName, options.toolPresentationPort);\n if (displayOptions && !meta.displayOptions) meta.displayOptions = displayOptions;\n\n const sse = agentEvent.type === 'tool_call_decision'\n ? createSSEToolCallDecisionEvent(id, context.conversationId, context.turnId, toolName, toolCallId, phase, status, {\n timestamp,\n args,\n payload,\n meta,\n })\n : createSSEToolProcessEvent(id, context.conversationId, context.turnId, toolName, toolCallId, phase, status, {\n timestamp,\n args,\n payload,\n meta,\n });\n sse.timestamp = timestamp;\n if (context.metadata) sse.metadata = context.metadata;\n return sse;\n}\n","/**\n * @file src/agent/runtime-kernel/events/eventMappers.ts\n * @brief 统一事件映射器兼容出口\n *\n * @description\n * 具体职责已拆分:\n * - sse-projection.ts:AnyAgentEvent → SSEEvent\n * - agent-to-runtime.ts:AnyAgentEvent → RuntimeEvent\n * - runtime-to-ai-message.ts:RuntimeEvent → ConversationMemoryPort\n * - provider-sidecar.ts:sidecar/tool_call/displayOptions 相关共享工具与类型\n */\n\nimport type { AnyAgentEvent } from './agentEvents';\nimport type { RuntimeEvent } from '../../contracts';\nimport { agentEventToRuntime } from './agent-to-runtime';\nimport {\n type ConversationMemoryPort,\n type EventMappingContext,\n type RuntimeMappingOptions,\n type SSEMappingOptions,\n} from './provider-sidecar';\nimport { applyRuntimeEventToMemory } from './runtime-to-ai-message';\nimport { agentEventToSSE } from './sse-projection';\n\nexport { agentEventToRuntime } from './agent-to-runtime';\nexport {\n type ConversationMemoryPort,\n type EventMappingContext,\n type RuntimeMappingOptions,\n type SSEMappingOptions,\n} from './provider-sidecar';\nexport { applyRuntimeEventToMemory } from './runtime-to-ai-message';\nexport { agentEventToSSE } from './sse-projection';\n\n/**\n * 统一的事件映射器。\n *\n * 中文备注:\n * - 保持旧调用方式 `eventMapper.xxx` 不变;\n * - 新逻辑不要继续写回本文件,按职责放到拆分后的模块。\n */\nexport const eventMapper = {\n /**\n * 将 AgentEvent 转换为 SSEEvent。\n */\n agentToSse: agentEventToSSE,\n\n /**\n * 将 AgentEvent 转换为 RuntimeEvent。\n */\n agentToRuntime: agentEventToRuntime,\n\n /**\n * 将 RuntimeEvent 应用到 ConversationMemoryPort。\n */\n applyToMemory: applyRuntimeEventToMemory,\n\n /**\n * 批量处理 AgentEvent → SSEEvent + RuntimeEvent。\n */\n agentToBoth: (\n agentEvent: AnyAgentEvent,\n context: EventMappingContext,\n options: { sseOptions?: SSEMappingOptions; runtimeOptions?: RuntimeMappingOptions } = {},\n ) => {\n const sseEvent = agentEventToSSE(agentEvent, context, options.sseOptions);\n const runtimeEvent = agentEventToRuntime(agentEvent, context, options.runtimeOptions);\n return { sseEvent, runtimeEvent };\n },\n\n /**\n * 批量重建内存。\n */\n rebuildMemory: (events: RuntimeEvent[], memory: ConversationMemoryPort) => {\n for (const event of events) {\n applyRuntimeEventToMemory(event, memory);\n }\n },\n};\n","export { eventMapper } from './eventMappers';\nexport {\n describeRuntimeEventLifecycle,\n getRuntimeEventUiProjectionKind,\n isCheckpointHistorySummaryEvent,\n isToolCallDecisionEvent,\n shouldReplayRuntimeEventToUi,\n shouldEnterAgentContext,\n shouldEmitRuntimeEventToSse,\n shouldPersistRuntimeEvent,\n} from './eventGovernance';\n\nexport type { AnyAgentEvent } from './agentEvents';\nexport type { ConversationMemoryPort, EventMappingContext } from './eventMappers';\nexport type { RuntimeEventLifecycleDecision } from './eventGovernance';\n","import type { RuntimeEvent } from '../../contracts';\n\n/**\n * 中文备注:\n * - 本文件是事件生命周期治理的唯一入口;\n * - 目标是把“是否持久化 / 是否进入上下文 / 是否属于工具决策”这些规则从散落判断收敛到单点;\n * - 后续新增事件时,优先修改这里,而不是去 bridge / orchestrator / converter / projector 各补一份条件。\n */\n\ntype TypedEvent = {\n type: string;\n metadata?: Record<string, unknown>;\n content?: string;\n};\n\nexport type RuntimeEventUiProjectionKind =\n | 'hidden'\n | 'user_input'\n | 'thought'\n | 'final_answer'\n | 'final_answer_chunk'\n | 'tool_call_decision'\n | 'tool_process'\n | 'tool_output'\n | 'requires_user_interaction'\n | 'audit_envelope'\n | 'todo_updated'\n | 'subrun_trace'\n | 'error'\n | 'stream_end'\n | 'history_summary'\n | 'checkpoint_history_summary'\n | 'unsupported';\n\nexport type RuntimeEventRealtimeChannel = 'event_bus_sse' | 'none';\n\nexport interface RuntimeEventLifecycleDecision {\n uiProjectionKind: RuntimeEventUiProjectionKind;\n persist: boolean;\n replayToUi: boolean;\n enterAgentContext: boolean;\n realtimeChannel: RuntimeEventRealtimeChannel;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nexport function isToolCallDecisionEvent<T extends { type: string }>(\n event: T,\n): event is T & { type: 'tool_call_decision' } {\n return event.type === 'tool_call_decision';\n}\n\nexport function isToolProcessEvent<T extends { type: string }>(\n event: T,\n): event is T & { type: 'tool_process' } {\n return event.type === 'tool_process';\n}\n\nexport function isTodoUpdatedRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'todo_updated' }> {\n return event.type === 'todo_updated';\n}\n\nexport function isSubRunTraceRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'subrun_trace' }> {\n return event.type === 'subrun_trace';\n}\n\nexport function isStreamEndRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'stream_end' }> {\n return event.type === 'stream_end';\n}\n\nexport function isRequiresUserInteractionRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'requires_user_interaction' }> {\n return event.type === 'requires_user_interaction';\n}\n\nexport function isAuditEnvelopeRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'audit_envelope' }> {\n return event.type === 'audit_envelope';\n}\n\nexport function isControlRuntimeEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'control' }> {\n return event.type === 'control';\n}\n\nexport function isHiddenUserInputEvent(event: RuntimeEvent): boolean {\n if (event.type !== 'user_input') {\n return false;\n }\n\n const metadata = isRecord(event.metadata) ? event.metadata : undefined;\n const ui = metadata && isRecord(metadata.ui) ? metadata.ui : undefined;\n return ui?.presentation === 'hidden';\n}\n\nexport function isEmptyTerminalAssistantRuntimeEvent(event: RuntimeEvent): boolean {\n if (event.type !== 'thought' && event.type !== 'final_answer') {\n return false;\n }\n\n return event.content.trim().length === 0;\n}\n\nexport function shouldPersistRuntimeEvent(event: RuntimeEvent): boolean {\n return describeRuntimeEventLifecycle(event).persist;\n}\n\nexport function shouldReplayRuntimeEventToUi(event: RuntimeEvent): boolean {\n return describeRuntimeEventLifecycle(event).replayToUi;\n}\n\nexport function shouldEnterAgentContext(event: RuntimeEvent): boolean {\n return describeRuntimeEventLifecycle(event).enterAgentContext;\n}\n\nexport function shouldCreateToolCallMessage(event: TypedEvent): boolean {\n return isToolCallDecisionEvent(event);\n}\n\nexport function isCheckpointHistorySummaryEvent(\n event: RuntimeEvent,\n): event is Extract<RuntimeEvent, { type: 'history_summary' }> {\n if (event.type !== 'history_summary') {\n return false;\n }\n\n const metadata = isRecord(event.metadata) ? event.metadata : undefined;\n return metadata?.summary_kind === 'checkpoint';\n}\n\nexport function getRuntimeEventUiProjectionKind(\n event: RuntimeEvent,\n): RuntimeEventUiProjectionKind {\n if (isHiddenUserInputEvent(event)) {\n return 'hidden';\n }\n\n switch (event.type) {\n case 'user_input':\n return 'user_input';\n case 'thought':\n return 'thought';\n case 'final_answer':\n return 'final_answer';\n case 'final_answer_chunk':\n return 'final_answer_chunk';\n case 'tool_call_decision':\n return 'tool_call_decision';\n case 'tool_process':\n return 'tool_process';\n case 'tool_output':\n return 'tool_output';\n case 'requires_user_interaction':\n return 'requires_user_interaction';\n case 'audit_envelope':\n return 'audit_envelope';\n case 'todo_updated':\n return 'todo_updated';\n case 'subrun_trace':\n return 'subrun_trace';\n case 'error':\n return 'error';\n case 'stream_end':\n return 'stream_end';\n case 'history_summary':\n return isCheckpointHistorySummaryEvent(event)\n ? 'checkpoint_history_summary'\n : 'history_summary';\n default:\n return 'unsupported';\n }\n}\n\nexport function describeRuntimeEventLifecycle(\n event: RuntimeEvent,\n): RuntimeEventLifecycleDecision {\n const uiProjectionKind = getRuntimeEventUiProjectionKind(event);\n const persist = event.ephemeral !== true && !isToolProcessEvent(event);\n\n const replayToUi =\n uiProjectionKind !== 'hidden' &&\n uiProjectionKind !== 'audit_envelope' &&\n uiProjectionKind !== 'final_answer_chunk' &&\n uiProjectionKind !== 'unsupported';\n\n const enterAgentContext = (() => {\n if (isTodoUpdatedRuntimeEvent(event)) {\n return false;\n }\n\n if (isSubRunTraceRuntimeEvent(event)) {\n return false;\n }\n\n if (isStreamEndRuntimeEvent(event)) {\n return false;\n }\n\n if (isRequiresUserInteractionRuntimeEvent(event)) {\n return false;\n }\n\n if (isAuditEnvelopeRuntimeEvent(event)) {\n return false;\n }\n\n if (isControlRuntimeEvent(event)) {\n return false;\n }\n\n if (isHiddenUserInputEvent(event)) {\n return false;\n }\n\n if (isToolProcessEvent(event)) {\n return false;\n }\n\n if (event.type === 'final_answer_chunk') {\n return false;\n }\n\n if (isEmptyTerminalAssistantRuntimeEvent(event)) {\n return false;\n }\n\n return true;\n })();\n\n const realtimeChannel: RuntimeEventRealtimeChannel = (() => {\n switch (uiProjectionKind) {\n case 'thought':\n case 'final_answer':\n case 'final_answer_chunk':\n case 'tool_call_decision':\n case 'tool_process':\n case 'tool_output':\n case 'requires_user_interaction':\n case 'todo_updated':\n case 'subrun_trace':\n case 'error':\n return 'event_bus_sse';\n case 'audit_envelope':\n return 'none';\n default:\n return 'none';\n }\n })();\n\n return {\n uiProjectionKind,\n persist,\n replayToUi,\n enterAgentContext,\n realtimeChannel,\n };\n}\n\nexport function shouldEmitRuntimeEventToSse(event: RuntimeEvent): boolean {\n return describeRuntimeEventLifecycle(event).realtimeChannel === 'event_bus_sse';\n}\n","import type { AuditEnvelope } from '../../contracts';\nimport type { AuditPort } from '../../ports';\n\nexport interface ConsoleAuditOptions {\n sink?: Pick<Console, 'info'>;\n}\n\nexport function createConsoleAudit(options: ConsoleAuditOptions = {}): AuditPort {\n const sink = options.sink ?? console;\n return {\n emit(envelope: AuditEnvelope): void {\n sink.info('[linnkit:audit]', envelope);\n },\n };\n}\n\nexport const consoleAudit = createConsoleAudit();\n","import { events as runtimeEvents } from '../../../../runtime-kernel';\nimport type { FinalAnswerEvent, RuntimeEvent, ToolOutputEvent, AiMessage } from '../../../../contracts';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isHistorySummaryEvent(event: RuntimeEvent): event is RuntimeEvent & {\n type: 'history_summary';\n content: string;\n original_message_count?: number;\n compression_ratio?: number;\n generated_by?: string;\n included_old_summary?: boolean;\n replaced_message_ids?: string[];\n summary_seq?: number;\n} {\n return 'type' in event && event.type === 'history_summary';\n}\n\nexport function convertEventToAiMessage(event: RuntimeEvent): AiMessage {\n if (isHistorySummaryEvent(event)) {\n const replacedIds = Array.isArray(event.replaced_message_ids) ? event.replaced_message_ids : [];\n\n console.log('[Agent-eventConverter] 📋 摘要事件转换:', {\n summaryId: event.id,\n replacedCount: replacedIds.length,\n summarySeq: event.summary_seq,\n 示例ID: replacedIds.slice(0, 3),\n });\n\n return {\n id: event.id,\n role: 'system',\n type: 'history_summary',\n content: event.content || '',\n timestamp: event.timestamp,\n metadata: {\n messageType: 'summary',\n originalMessageCount: event.original_message_count,\n compressionRatio: event.compression_ratio,\n generatedBy: event.generated_by,\n includedOldSummary: event.included_old_summary,\n replacedMessageIds: replacedIds,\n summarySeq: event.summary_seq,\n },\n };\n }\n\n switch (event.type) {\n case 'user_input':\n return {\n id: event.id,\n role: 'user',\n type: 'user_input',\n content: event.content || '',\n timestamp: event.timestamp,\n };\n\n case 'thought':\n return {\n id: event.id,\n role: 'assistant',\n type: 'thought',\n content: event.content || '',\n timestamp: event.timestamp,\n };\n\n case 'tool_call_decision':\n return {\n id: event.id,\n role: 'assistant',\n type: 'tool_calls',\n content: '',\n timestamp: event.timestamp,\n metadata: {\n tool_calls: (() => {\n type UnknownRecord = Record<string, unknown>;\n const isRecord = (v: unknown): v is UnknownRecord =>\n !!v && typeof v === 'object' && !Array.isArray(v);\n\n const payload = (event as { payload?: unknown }).payload;\n const toolCallsFromPayload = (() => {\n if (!isRecord(payload)) return undefined;\n const raw = payload['tool_calls'];\n return Array.isArray(raw) ? raw : undefined;\n })();\n\n if (toolCallsFromPayload && toolCallsFromPayload.length > 0) {\n return toolCallsFromPayload;\n }\n\n return [\n {\n id: event.tool_call_id || '',\n type: 'function' as const,\n function: {\n name: event.tool_name || 'unknown',\n arguments: JSON.stringify(event.args || {}),\n },\n },\n ];\n })(),\n reasoning_details: (() => {\n type UnknownRecord = Record<string, unknown>;\n const isRecord = (v: unknown): v is UnknownRecord =>\n !!v && typeof v === 'object' && !Array.isArray(v);\n const payload = (event as { payload?: unknown }).payload;\n if (!isRecord(payload)) return undefined;\n const rd = payload['reasoning_details'];\n return Array.isArray(rd) ? rd : undefined;\n })(),\n },\n };\n\n case 'tool_output': {\n const observationFromPayload = (() => {\n const payload = (event as ToolOutputEvent).payload;\n if (!isRecord(payload)) return undefined;\n const result = payload['result'];\n if (!isRecord(result)) return undefined;\n const obs = result['observation'];\n return typeof obs === 'string' && obs.trim().length > 0 ? obs : undefined;\n })();\n\n const rawOutput = (() => {\n const payload = (event as ToolOutputEvent).payload;\n if (isRecord(payload)) {\n const out = payload['output'];\n if (typeof out === 'string' && out.trim().length > 0) {\n return out;\n }\n }\n if (typeof event.output === 'string') {\n return event.output;\n }\n try {\n return JSON.stringify(event.output ?? '');\n } catch {\n return String(event.output ?? '');\n }\n })();\n\n const outputContent = observationFromPayload ?? rawOutput;\n\n return {\n id: event.id,\n role: 'tool',\n type: 'tool_output',\n content: outputContent,\n timestamp: event.timestamp,\n metadata: {\n tool_call_id: event.tool_call_id,\n tool_name: event.tool_name,\n raw_output: rawOutput,\n ...(observationFromPayload ? { observation: observationFromPayload } : {}),\n },\n };\n }\n\n case 'final_answer':\n return {\n id: event.id,\n role: 'assistant',\n type: 'final_answer',\n content: event.content || '',\n timestamp: event.timestamp,\n metadata: {\n reasoning_details: Array.isArray(event.reasoning_details) ? event.reasoning_details : undefined,\n },\n };\n\n default:\n console.warn(`[eventConverter] Unsupported event type: ${event.type}`);\n return {\n id: event.id,\n role: 'assistant',\n type: 'final_answer',\n content: '',\n timestamp: event.timestamp || Date.now(),\n };\n }\n}\n\nexport function convertEventsToAiMessages(events: RuntimeEvent[]): AiMessage[] {\n const filtered = events.filter((event) => runtimeEvents.shouldEnterAgentContext(event));\n return filtered.map((event) => convertEventToAiMessage(event));\n}\n\nexport function convertAiMessageToEvent(\n message: AiMessage,\n overrides?: Partial<RuntimeEvent>\n): RuntimeEvent {\n const base = {\n id: message.id,\n timestamp: message.timestamp,\n conversation_id: '',\n turn_id: '',\n version: 1,\n ...overrides,\n };\n\n switch (message.role) {\n case 'user':\n return {\n ...base,\n type: 'user_input',\n content: message.content,\n } as RuntimeEvent;\n\n case 'tool':\n return {\n ...base,\n type: 'tool_output',\n tool_name: message.metadata?.tool_name || 'unknown',\n tool_call_id: message.metadata?.tool_call_id || '',\n output: message.metadata?.raw_output || message.content,\n status: 'success',\n } as RuntimeEvent;\n\n case 'assistant':\n if (message.type === 'thought') {\n return {\n ...base,\n type: 'thought',\n content: message.content,\n } as RuntimeEvent;\n }\n\n return {\n ...base,\n type: 'final_answer',\n content: message.content,\n answer_id: (overrides as Partial<FinalAnswerEvent> | undefined)?.answer_id,\n is_complete: true,\n reasoning_details: Array.isArray(message.metadata?.reasoning_details)\n ? message.metadata.reasoning_details\n : undefined,\n } as RuntimeEvent;\n default:\n return {\n ...base,\n type: 'user_input',\n content: message.content,\n } as RuntimeEvent;\n }\n}\n","import type { AgentProfileRequest } from '../contracts';\nimport {\n AgentContextManager,\n type AgentBuildPhase,\n type ContextBuildResult,\n ConversationSession,\n} from '../context';\nimport {\n AGENT_CONTEXT_BUILDER_CONFIG,\n type AgentContextBuilderConfig,\n} from '../context/config';\nimport type { SummarizationCallbacks } from '../context/providers/base';\nimport type { ContextProviderRegistry } from '../context/providers';\nimport {\n type PreprocessorPipeline,\n type PreprocessorPipelineResult,\n createDefaultAgentPreprocessorPipeline,\n type ToolReplayProtocolPolicy,\n} from '../preprocessors';\nimport { ToolManager } from '../tools/ToolManager';\nimport type { AgentTaskResolver } from '../tasks/base';\nimport { convertEventsToAiMessages } from '../utils/eventConverter';\nimport type { GenerateRequest, GenerateResponse } from '../../chat/contracts';\nimport type { AgentSpecContextPolicy, AiMessage, RuntimeEvent } from '../../../../contracts';\nimport type { TokenizerPort } from '../../../../ports';\nimport type { FenceRegistry } from '../../../shared/fences';\nimport {\n contextPolicyToContextBuilderConfig,\n contextPolicyToPreprocessorOptions,\n} from '../../../shared/agentSpecAdapter';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction readOptionalStringProperty(value: unknown, key: string): string | undefined {\n if (!isRecord(value)) return undefined;\n const candidate = value[key];\n return typeof candidate === 'string' && candidate.trim().length > 0 ? candidate : undefined;\n}\n\nexport interface AgentOrchestratorOptions {\n tokenBudget: {\n maxTokens: number;\n reservedForResponse: number;\n };\n processing: {\n debugMode?: boolean;\n preserveMetadata?: boolean;\n };\n model?: string;\n resolveToolReplayProtocolPolicy?: (params: {\n request: AgentProfileRequest;\n modelId: string;\n }) => ToolReplayProtocolPolicy | undefined;\n resolveContextPolicy?: (request: AgentProfileRequest) => AgentSpecContextPolicy | undefined;\n createProviderRegistry?: (params: {\n request: AgentProfileRequest;\n contextPolicy: AgentSpecContextPolicy | undefined;\n contextBuilderConfig: Partial<AgentContextBuilderConfig>;\n }) => ContextProviderRegistry;\n taskResolver: AgentTaskResolver;\n providerRegistry: ContextProviderRegistry;\n fenceRegistry?: FenceRegistry;\n tokenizer?: TokenizerPort;\n}\n\nexport interface AgentProcessingResult {\n messages: AiMessage[];\n contextBuildResult: ContextBuildResult;\n metadata: {\n originalCount: number;\n processedCount: number;\n tokenUsage: {\n estimated: number;\n budget: number;\n remaining: number;\n };\n processingStats: ContextBuildResult['processingStats'];\n truncated: boolean;\n truncatedCount?: number;\n };\n}\n\ninterface EffectiveContextBudget {\n maxTokens: number;\n reservedForResponse: number;\n totalBudget: number;\n}\n\nexport class AgentMessageOrchestrator {\n private agentContextManager: AgentContextManager;\n private options: AgentOrchestratorOptions;\n private readonly taskResolver: AgentTaskResolver;\n private baseContextConfig: Partial<AgentContextBuilderConfig>;\n\n constructor(options: AgentOrchestratorOptions) {\n this.options = options;\n this.taskResolver = options.taskResolver;\n this.baseContextConfig = {\n DEFAULT_MAX_TOKENS: options.tokenBudget.maxTokens,\n RESERVED_FOR_RESPONSE: options.tokenBudget.reservedForResponse,\n WORKING_MEMORY_BUDGET_PERCENTAGE: AGENT_CONTEXT_BUILDER_CONFIG.WORKING_MEMORY_BUDGET_PERCENTAGE,\n SUMMARIZATION_TRIGGER_THRESHOLD: AGENT_CONTEXT_BUILDER_CONFIG.SUMMARIZATION_TRIGGER_THRESHOLD,\n SUMMARY_BUDGET_PERCENTAGE: AGENT_CONTEXT_BUILDER_CONFIG.SUMMARY_BUDGET_PERCENTAGE,\n SUMMARY_OLDEST_MESSAGES_PERCENTAGE: AGENT_CONTEXT_BUILDER_CONFIG.SUMMARY_OLDEST_MESSAGES_PERCENTAGE,\n };\n this.agentContextManager = new AgentContextManager({\n debugMode: options.processing.debugMode,\n customConfig: this.baseContextConfig,\n providerRegistry: options.providerRegistry,\n tokenizer: options.tokenizer,\n tokenizerModelId: options.model,\n });\n }\n\n private buildPreprocessorPipelineForRequest(\n toolManager: ToolManager,\n request: AgentProfileRequest,\n contextPolicy: AgentSpecContextPolicy | undefined,\n ): PreprocessorPipeline {\n return createDefaultAgentPreprocessorPipeline({\n debugMode: this.options.processing.debugMode,\n model: this.resolvePreprocessorModel(request),\n toolSummaryProvider: toolManager.getSummaryProvider(),\n }, {\n fenceRegistry: this.options.fenceRegistry,\n ...contextPolicyToPreprocessorOptions(contextPolicy),\n });\n }\n\n private resolvePreprocessorModel(request: AgentProfileRequest): string {\n return readOptionalStringProperty(request, 'model_id')\n ?? readOptionalStringProperty(request, 'modelId')\n ?? this.options.model\n ?? 'default';\n }\n\n private resolveContextPolicy(request: AgentProfileRequest): AgentSpecContextPolicy | undefined {\n return this.options.resolveContextPolicy?.(request);\n }\n\n private applyContextPolicy(\n request: AgentProfileRequest,\n contextPolicy: AgentSpecContextPolicy | undefined,\n ): Partial<AgentContextBuilderConfig> {\n const contextBuilderConfig = {\n ...this.baseContextConfig,\n ...(contextPolicy ? contextPolicyToContextBuilderConfig(contextPolicy) : {}),\n };\n const providerRegistry = this.options.createProviderRegistry?.({\n request,\n contextPolicy,\n contextBuilderConfig,\n }) ?? this.options.providerRegistry;\n\n this.agentContextManager = new AgentContextManager({\n debugMode: this.options.processing.debugMode,\n customConfig: contextBuilderConfig,\n providerRegistry,\n tokenizer: this.options.tokenizer,\n tokenizerModelId: this.resolvePreprocessorModel(request),\n });\n\n return contextBuilderConfig;\n }\n\n private resolveEffectiveContextBudget(\n contextBuilderConfig: Partial<AgentContextBuilderConfig>,\n ): EffectiveContextBudget {\n const maxTokens = contextBuilderConfig.DEFAULT_MAX_TOKENS ?? this.options.tokenBudget.maxTokens;\n const reservedForResponse =\n contextBuilderConfig.RESERVED_FOR_RESPONSE ?? this.options.tokenBudget.reservedForResponse;\n\n return {\n maxTokens,\n reservedForResponse,\n // 中文备注:ContextManager 接收的是“可放入上下文的输入预算”,不是模型完整窗口。\n // 因此单个 agent 通过 contextPolicy.budget 覆盖预算时,这里必须同步使用覆盖后的值。\n totalBudget: maxTokens - reservedForResponse,\n };\n }\n\n async processAgentConversation(\n request: AgentProfileRequest,\n history: RuntimeEvent[],\n toolManager: ToolManager,\n callbacks?: SummarizationCallbacks,\n extraOptions?: {\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>;\n }\n ): Promise<AgentProcessingResult> {\n const historyCount = history.length;\n\n this.debug('Starting agent conversation processing', {\n requestQuery: request.query.substring(0, 50),\n historyEventCount: historyCount,\n availableTools: request.availableTools || 'all_tools',\n });\n\n const startTime = performance.now();\n\n try {\n const historyMessages = convertEventsToAiMessages(history);\n this.debug('Converted history events to messages', {\n eventCount: history.length,\n messageCount: historyMessages.length,\n });\n\n const allMessages = this.buildCompleteMessageList(request, historyMessages);\n this.debug('Built complete message list', { totalCount: allMessages.length });\n\n const contextPolicy = this.resolveContextPolicy(request);\n const contextBuilderConfig = this.applyContextPolicy(request, contextPolicy);\n const effectiveContextBudget = this.resolveEffectiveContextBudget(contextBuilderConfig);\n\n const preprocessorPipeline = this.buildPreprocessorPipelineForRequest(toolManager, request, contextPolicy);\n const modelId = this.resolvePreprocessorModel(request);\n preprocessorPipeline.updateContext({\n model: modelId,\n toolReplayProtocolPolicy: this.options.resolveToolReplayProtocolPolicy?.({\n request,\n modelId,\n }),\n });\n\n const preprocessResult = await this.runPreprocessorPipeline(preprocessorPipeline, allMessages);\n this.debug('Preprocessor pipeline completed', {\n originalCount: allMessages.length,\n processedCount: preprocessResult.messages.length,\n appliedStrategies: preprocessResult.pipelineStats.appliedStrategies,\n });\n\n const tempSession = new ConversationSession('');\n tempSession.getHistory().length = 0;\n preprocessResult.messages.forEach((msg) => {\n tempSession.getHistory().push(msg);\n });\n\n const contextResult = await this.buildContextFromPreprocessedMessages(\n request,\n tempSession,\n preprocessResult.messages,\n callbacks,\n undefined,\n extraOptions?.generate,\n contextPolicy,\n effectiveContextBudget.totalBudget,\n );\n this.debug('Context built', { afterContextCount: contextResult.messages.length });\n\n if (this.options.processing.debugMode) {\n console.log(\n '[AgentMessageOrchestrator] DEBUG: Messages after context build:',\n JSON.stringify(\n contextResult.messages.map((m) => ({\n id: m.id,\n ts: m.timestamp,\n role: m.role,\n type: m.type,\n content: m.content.substring(0, 50),\n })),\n null,\n 2\n )\n );\n }\n\n const endTime = performance.now();\n const processingTime = endTime - startTime;\n\n this.debug('Processing completed', {\n processingTime: `${processingTime.toFixed(2)}ms`,\n finalMessageCount: contextResult.messages.length,\n });\n\n return {\n messages: contextResult.messages,\n contextBuildResult: contextResult,\n metadata: {\n originalCount: allMessages.length,\n processedCount: contextResult.messages.length,\n tokenUsage: {\n estimated: contextResult.tokenUsage.used,\n budget: effectiveContextBudget.totalBudget,\n remaining: contextResult.tokenUsage.remaining,\n },\n processingStats: contextResult.processingStats,\n truncated: contextResult.truncated,\n truncatedCount: contextResult.truncatedCount,\n },\n };\n } catch (error) {\n this.debug('Processing failed', { error });\n throw new Error(`Agent message processing failed: ${error}`);\n }\n }\n\n private buildCompleteMessageList(request: AgentProfileRequest, historyMessages: AiMessage[]): AiMessage[] {\n const task = this.taskResolver(request.promptKey);\n return task.buildMessages(request, historyMessages);\n }\n\n private async runPreprocessorPipeline(\n preprocessorPipeline: PreprocessorPipeline,\n messages: AiMessage[],\n ): Promise<PreprocessorPipelineResult> {\n return preprocessorPipeline.process(messages);\n }\n\n private async buildContextFromPreprocessedMessages(\n request: AgentProfileRequest,\n conversationSession: ConversationSession,\n messages: AiMessage[],\n callbacks?: SummarizationCallbacks,\n phaseOverride?: AgentBuildPhase,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>,\n contextPolicy?: AgentSpecContextPolicy,\n totalBudget?: number,\n ): Promise<ContextBuildResult> {\n const resolvedTotalBudget =\n totalBudget ?? this.options.tokenBudget.maxTokens - this.options.tokenBudget.reservedForResponse;\n\n const contextResult = await this.agentContextManager.buildContextFromPreprocessedMessages(\n request,\n conversationSession,\n messages,\n resolvedTotalBudget,\n callbacks,\n phaseOverride,\n generate,\n {\n policy: contextPolicy?.contextTrace,\n effectiveContextPolicy: contextPolicy,\n },\n );\n\n if (this.options.processing.debugMode) {\n this.debug('Context build result', {\n original: contextResult.processingStats.originalCount,\n kept: contextResult.processingStats.keptCount,\n truncated: contextResult.processingStats.truncatedCount,\n strategies: contextResult.strategies.applied,\n tokenUsage: contextResult.tokenUsage,\n recommendations: contextResult.strategies.recommendations,\n buildStats: contextResult.processingStats.buildStats,\n });\n }\n\n return contextResult;\n }\n\n private debug(message: string, data?: Record<string, unknown>): void {\n if (this.options.processing.debugMode) {\n console.log(`[AgentMessageOrchestrator] ${message}`, data);\n }\n }\n\n updateOptions(newOptions: Partial<AgentOrchestratorOptions>): void {\n this.options = {\n ...this.options,\n ...newOptions,\n tokenBudget: { ...this.options.tokenBudget, ...newOptions.tokenBudget },\n processing: { ...this.options.processing, ...newOptions.processing },\n };\n this.baseContextConfig = {\n ...this.baseContextConfig,\n DEFAULT_MAX_TOKENS: this.options.tokenBudget.maxTokens,\n RESERVED_FOR_RESPONSE: this.options.tokenBudget.reservedForResponse,\n };\n this.agentContextManager.updateConfig(this.baseContextConfig);\n this.agentContextManager.updateTokenizerModelId(this.options.model);\n }\n\n getContextManager(): AgentContextManager {\n return this.agentContextManager;\n }\n\n getContextInfo(): { config: AgentContextBuilderConfig } {\n return {\n config: this.agentContextManager.getConfig(),\n };\n }\n}\n","export { BaseAgentTask } from './BaseAgentTask';\nexport type { IAgentTask, AgentTaskResolver, IAgentTaskRegistry } from './base';\n","/**\n * @file src/agent/context-manager/profiles/agent/tasks/BaseAgentTask.ts\n * @description Agent任务的抽象基类 - 处理Agent通用逻辑\n *\n * 🔥 重构:借鉴 BaseConversationalTask 的轻量级设计\n * 专注于核心消息构建,将复杂的上下文管理交给 AgentContextManager\n */\n\nimport type { AgentProfileRequest } from '../contracts';\nimport { IAgentTask } from './base';\nimport { generateMessageId } from '../../../../shared/ids';\nimport type { AiMessage, PersistentMetadata } from '../../../../contracts';\nimport type {\n FenceDescriptor,\n FenceInjection,\n FencePlacement,\n FenceRegistry,\n} from '../../../shared/fences';\n\nexport interface BaseAgentTaskOptions {\n fenceRegistry?: FenceRegistry;\n}\n\n/**\n * Agent任务的抽象基类\n *\n * @abstract\n * @description\n * 现在只负责构建 Agent 任务的核心消息骨架:\n * - system prompt\n * - host-provided context injection messages\n * - 当前 user query\n * - 按时序附加 history\n */\nexport abstract class BaseAgentTask implements IAgentTask {\n abstract readonly name: string;\n\n private readonly fenceRegistry?: FenceRegistry;\n\n constructor(options: BaseAgentTaskOptions = {}) {\n this.fenceRegistry = options.fenceRegistry;\n }\n\n protected abstract getSystemPrompt(request: AgentProfileRequest): string;\n\n public getSystemPromptForRequest(request: AgentProfileRequest): string {\n return this.getSystemPrompt(request);\n }\n\n buildMessages(request: AgentProfileRequest, history: AiMessage[]): AiMessage[] {\n const messages: AiMessage[] = [];\n const fenceMessages = this.createFenceMessages(request.fences ?? []);\n\n const systemPrompt = this.getSystemPrompt(request);\n if (systemPrompt && systemPrompt.trim()) {\n messages.push({\n id: generateMessageId(),\n role: 'system',\n type: 'system_prompt',\n content: systemPrompt,\n timestamp: Date.now(),\n });\n }\n\n messages.push(...fenceMessages['after-system']);\n\n const currentUserIndex = findCurrentUserInputIndex(history, request.query);\n const historyBeforeCurrentUser = currentUserIndex === -1 ? history : history.slice(0, currentUserIndex);\n const currentUserMessage = currentUserIndex === -1\n ? this.createCurrentUserMessage(request.query)\n : history[currentUserIndex];\n const historyAfterCurrentUser = currentUserIndex === -1 ? [] : history.slice(currentUserIndex + 1);\n\n messages.push(...historyBeforeCurrentUser);\n messages.push(...fenceMessages['before-current-user']);\n\n if (currentUserMessage) {\n messages.push(currentUserMessage);\n }\n\n messages.push(...fenceMessages['after-current-user']);\n messages.push(...historyAfterCurrentUser);\n this.insertAfterLastToolResult(messages, fenceMessages['after-last-tool-result']);\n\n return messages;\n }\n\n private createCurrentUserMessage(query: string): AiMessage | null {\n const content = query.trim();\n if (!content) {\n return null;\n }\n\n return {\n id: generateMessageId(),\n role: 'user',\n type: 'user_input',\n content,\n timestamp: Date.now(),\n };\n }\n\n private createFenceMessages(fences: FenceInjection[]): Record<FencePlacement, AiMessage[]> {\n const grouped: Record<FencePlacement, AiMessage[]> = {\n 'after-system': [],\n 'before-current-user': [],\n 'after-current-user': [],\n 'after-last-tool-result': [],\n };\n\n if (fences.length === 0) {\n return grouped;\n }\n\n if (!this.fenceRegistry) {\n throw new Error('Fence injections require a FenceRegistry.');\n }\n\n for (const fence of fences) {\n const descriptor = this.fenceRegistry.get(fence.kind);\n if (!descriptor) {\n throw new Error(`Fence kind \"${fence.kind}\" is not registered.`);\n }\n grouped[descriptor.placement].push(this.createFenceMessage(fence, descriptor));\n }\n\n return grouped;\n }\n\n private createFenceMessage(fence: FenceInjection, descriptor: FenceDescriptor): AiMessage {\n const metadata: PersistentMetadata = {\n ...fence.metadata,\n fenceKind: fence.kind,\n fenceAttrs: fence.attrs ?? {},\n fencePlacement: descriptor.placement,\n };\n\n return {\n id: generateMessageId(),\n role: descriptor.llmRole,\n type: 'context_injection',\n content: fence.content,\n timestamp: Date.now(),\n metadata,\n };\n }\n\n private insertAfterLastToolResult(messages: AiMessage[], fenceMessages: AiMessage[]): void {\n if (fenceMessages.length === 0) {\n return;\n }\n const lastToolIndex = findLastIndex(messages, message => message.role === 'tool' && message.type === 'tool_output');\n if (lastToolIndex === -1) {\n messages.push(...fenceMessages);\n return;\n }\n messages.splice(lastToolIndex + 1, 0, ...fenceMessages);\n }\n\n processResponse(rawResponse: string): string {\n return rawResponse;\n }\n\n processStreamChunk(chunk: string): string {\n return chunk;\n }\n}\n\nfunction findLastIndex<T>(items: T[], predicate: (item: T) => boolean): number {\n for (let index = items.length - 1; index >= 0; index--) {\n if (predicate(items[index])) {\n return index;\n }\n }\n return -1;\n}\n\nfunction findCurrentUserInputIndex(history: AiMessage[], query: string): number {\n const normalizedQuery = query.trim();\n if (!normalizedQuery) {\n return -1;\n }\n\n for (let index = history.length - 1; index >= 0; index -= 1) {\n const message = history[index];\n if (\n message.role === 'user' &&\n message.type === 'user_input' &&\n message.content.trim() === normalizedQuery\n ) {\n return index;\n }\n }\n\n return -1;\n}\n","export { ToolManager } from './ToolManager';\nexport type { DynamicToolContext, ToolManagerRegistry } from './ToolManager';\n","import type { AgentProfileRequest } from '../contracts';\nimport type { ToolSummaryProvider } from '../../../shared/preprocessors/base';\nimport type { ToolArgs } from 'linnkit/runtime-kernel';\n\nexport interface ToolManagerRegistry extends ToolSummaryProvider {\n getAvailableToolNames(toolNames?: string[]): string[];\n validateToolCall(\n toolName: string,\n args: ToolArgs,\n ): { success: boolean; error?: string };\n}\n\nexport interface DynamicToolContext {\n request: AgentProfileRequest;\n}\n\nexport class ToolManager {\n private readonly registry: ToolManagerRegistry;\n\n constructor(registry: ToolManagerRegistry) {\n this.registry = registry;\n }\n\n getAvailableToolNames(context: DynamicToolContext): string[] {\n return this.registry.getAvailableToolNames(context.request.availableTools);\n }\n\n validateToolCall(\n toolName: string,\n args: ToolArgs,\n context: DynamicToolContext\n ): { success: boolean; error?: string } {\n void context;\n return this.registry.validateToolCall(toolName, args);\n }\n\n getSummaryProvider(): ToolSummaryProvider {\n return this.registry;\n }\n}\n","export * from './eventConverter';\nexport * from './toolInteractionGroup';\nexport * from './toolOutputSummarizer';\n","/**\n * @file src/chat/context/config.ts\n * @description 上下文构建策略配置 - 多阶段智能填充配置中心\n * \n * 🎯 目的: 为ContextManager提供所有策略参数的可配置中心\n * 📖 详情: 实现README中描述的3阶段上下文构建策略\n */\n\n/**\n * 上下文构建器核心配置\n * \n * 🎯 统一管理所有Token限制、触发条件和策略参数\n * 基于README第183-205行的规格实现\n */\nexport const CONTEXT_BUILDER_CONFIG = {\n // === 绝对Token限制设置 ===\n \n /** 默认最大Token预算上限 */\n DEFAULT_MAX_TOKENS: 120000,\n \n /** 响应预留Token数 */\n RESERVED_FOR_RESPONSE: 2000,\n \n /** 系统提示词预留token数 (v4.0架构中暂未使用,予以保留以备未来扩展) */\n // SYSTEM_PROMPT_RESERVED_TOKENS: 2000, // 决定暂时注释而不是删除,以便追溯\n \n // --- 百分比相关配置说明 ---\n //\n // 除非特殊说明,以下所有百分比配置的基准都是【可用上下文总预算】。\n // 【可用上下文总预算】 = DEFAULT_MAX_TOKENS - RESERVED_FOR_RESPONSE\n // 例如,在 8k 模型和 2k 响应预留的情况下,基准预算为 6000 Token。\n //\n // ---\n\n // === 工作记忆填充策略 ===\n \n /**\n * 工作记忆填充目标百分比 (当前未使用)。\n * - **说明**: 在当前架构中,WorkingMemoryProvider会尽力填充100%可用预算,\n * 而摘要触发由SummarizationProvider基于SUMMARIZATION_TRIGGER_THRESHOLD控制。\n * 此配置项预留以备未来需要精确控制填充上限时使用。\n */\n // BUDGET_PERCENTAGE: 0.90,\n \n /**\n * 摘要触发阈值百分比。\n * - **基准**: 可用上下文总预算。\n * - **说明**: 当已用Token总量(精确计算后)超过此百分比时,将触发摘要机制。\n * 例如,0.85 表示使用量超过85%就触发摘要。\n */\n SUMMARIZATION_TRIGGER_THRESHOLD: 0.7,\n \n // === 摘要策略设置 ===\n \n /**\n * 摘要消息长度上限百分比。\n * - **基准**: 可用上下文总预算。\n * - **说明**: AI生成的摘要文本,其Token长度不应超过此百分比。\n * 用于限制摘要本身的体积,确保对话可持续。\n */\n SUMMARY_BUDGET_PERCENTAGE: 0.10,\n \n /**\n * 选取摘要候选消息的比例。\n * - **基准**: 符合摘要条件的消息**数量** (非Token)。\n * - **说明**: 在触发摘要时,从符合条件的历史消息中,选取最老的百分之多少来进行压缩。\n * 例如,0.8 表示选取最老的80%的消息作为摘要的原材料。\n */\n SUMMARY_OLDEST_MESSAGES_PERCENTAGE: 0.80,\n \n // === 文档处理策略 ===\n \n /**\n * 文档片段最大占比。\n * - **基准**: 可用上下文总预算。\n * - **说明**: 为保证核心请求的完整性,在极端情况下,单个文档片段的Token数会被截断,\n * 确保其不超过此百分比。这是一个“硬上限”。\n */\n DOCUMENT_FRAGMENT_MAX_PERCENTAGE: 0.20,\n \n // === 思维链回补策略 ===\n \n /** 最多回补最近几次对话的思维链 */\n THINKING_RECALL_COUNT: 2,\n \n // === 消息类型优先级定义 ===\n \n /** 核心上下文保留层消息类型 (Must-Keep) - 第一阶段 */\n CORE_MESSAGE_TYPES: ['system_prompt', 'user_input', 'document_fragment'] as const,\n \n /** 优先填充内容类型 (P1) - 第二阶段优先 */\n PRIORITY_CONTENT_TYPES: ['final_answer', 'task_completion', 'user_input'] as const,\n \n /** 次要填充内容类型 (P2) - 第二阶段次优先 */\n SECONDARY_CONTENT_TYPES: ['thought'] as const,\n \n // === Token估算配置 ===\n \n /** 平均每个字符的token估算比例 (用于快速预估) */\n AVG_CHARS_PER_TOKEN: 2.0,\n \n // === 模型配置 ===\n \n /**\n * Token 精确估算用的“模型标识”(用于映射到 tiktoken encoding)\n *\n * 说明:\n * - 这里只用于 `TokenCalculator.estimateTokensPrecise(...)` 的 encoding 选择,不用于真实 LLM 调用;\n * - 为避免把某个具体业务模型写死在这里,统一使用 tiktoken 的默认 encoding:cl100k_base。\n */\n TOKEN_ENCODING_NAME: 'cl100k_base',\n \n // === 性能与调试配置 ===\n \n /** 是否启用详细的构建统计 */\n ENABLE_BUILD_STATS: true,\n \n /** 是否启用阶段执行时间统计 */\n ENABLE_TIMING_STATS: true,\n \n /** 上下文构建超时阈值 (毫秒) */\n PROCESSING_TIMEOUT_MS: 1000,\n \n /** 大量摘要消息警告阈值 */\n LARGE_SUMMARIZATION_WARNING_THRESHOLD: 5,\n \n} as const;\n\n/**\n * 上下文构建策略配置的类型定义\n * 使用通用类型(如 number)而不是字面量类型,以增加灵活性\n */\nexport type ContextBuilderConfig = {\n // 绝对Token限制\n readonly DEFAULT_MAX_TOKENS: number;\n readonly RESERVED_FOR_RESPONSE: number;\n // readonly SYSTEM_PROMPT_RESERVED_TOKENS: number;\n \n // 工作记忆填充策略 (当前未使用)\n // readonly BUDGET_PERCENTAGE: number;\n readonly SUMMARIZATION_TRIGGER_THRESHOLD: number;\n \n // 摘要策略\n readonly SUMMARY_BUDGET_PERCENTAGE: number;\n readonly SUMMARY_OLDEST_MESSAGES_PERCENTAGE: number;\n \n // 文档处理策略\n readonly DOCUMENT_FRAGMENT_MAX_PERCENTAGE: number;\n \n // 思维链回补策略\n readonly THINKING_RECALL_COUNT: number;\n \n // 消息类型定义\n readonly CORE_MESSAGE_TYPES: readonly ('system_prompt' | 'user_input' | 'document_fragment')[];\n readonly PRIORITY_CONTENT_TYPES: readonly ('final_answer' | 'task_completion' | 'user_input')[];\n readonly SECONDARY_CONTENT_TYPES: readonly ('thought')[];\n \n // Token估算配置\n readonly AVG_CHARS_PER_TOKEN: number;\n \n // 模型配置\n readonly TOKEN_ENCODING_NAME: string;\n \n // 性能与调试配置\n readonly ENABLE_BUILD_STATS: boolean;\n readonly ENABLE_TIMING_STATS: boolean;\n readonly PROCESSING_TIMEOUT_MS: number;\n readonly LARGE_SUMMARIZATION_WARNING_THRESHOLD: number;\n};\n\n/**\n * 阶段执行优先级枚举\n * 用于标识和排序3个构建阶段\n */\nexport enum BuildPhase {\n /** 阶段1: 核心上下文保留层 */\n CORE_CONTEXT = 1,\n \n /** 阶段2: 工作记忆填充层 */\n WORKING_MEMORY = 2,\n \n /** 阶段3: 历史摘要触发层 */\n SUMMARIZATION = 3\n}\n\n/**\n * 消息优先级枚举\n * 用于工作记忆填充时的优先级排序\n */\nexport enum MessagePriority {\n /** 最高优先级: 系统消息和用户输入 */\n CRITICAL = 1,\n \n /** 高优先级: AI最终回答 */\n HIGH = 2,\n \n /** 中优先级: 用户上下文信息 */\n MEDIUM = 3,\n \n /** 低优先级: AI思考过程 */\n LOW = 4\n}\n\n/**\n * 上下文构建统计接口\n */\nexport interface ContextBuildStats {\n /** 构建开始时间 */\n startTime: number;\n \n /** 各阶段执行时间 */\n phaseTiming: Record<BuildPhase, number>;\n \n /** 各阶段token使用情况 */\n phaseTokenUsage: Record<BuildPhase, { used: number; percentage: number }>;\n \n /** 消息数量统计 */\n messageStats: {\n original: number;\n afterCoreContext: number;\n afterWorkingMemory: number;\n afterSummarization: number;\n };\n \n /** 是否触发了摘要机制 */\n summarizationTriggered: boolean;\n \n /** 被摘要的消息数量 */\n summarizedCount?: number;\n \n /** 文档片段是否被截断 */\n documentTruncated: boolean;\n \n /** 总构建时间 */\n totalTime: number;\n}\n\n/**\n * 创建自定义上下文构建配置的辅助函数\n * 允许覆盖默认配置的任何部分\n */\nexport function createContextBuilderConfig(\n overrides: Partial<ContextBuilderConfig>\n): ContextBuilderConfig {\n return {\n ...CONTEXT_BUILDER_CONFIG,\n ...overrides\n };\n}\n\n// 已移除预算自适应逻辑,统一使用 CONTEXT_BUILDER_CONFIG\n\n/**\n * 验证配置有效性的辅助函数\n */\nexport function validateConfig(config: ContextBuilderConfig): boolean {\n // 检查绝对Token限制\n if (config.DEFAULT_MAX_TOKENS <= 0) {\n console.warn('DEFAULT_MAX_TOKENS must be positive');\n return false;\n }\n \n if (config.RESERVED_FOR_RESPONSE <= 0 || config.RESERVED_FOR_RESPONSE >= config.DEFAULT_MAX_TOKENS) {\n console.warn('RESERVED_FOR_RESPONSE must be positive and less than DEFAULT_MAX_TOKENS');\n return false;\n }\n \n // 检查百分比配置是否合理\n // BUDGET_PERCENTAGE 验证已移除,因为该配置项当前未被使用\n \n if (config.SUMMARIZATION_TRIGGER_THRESHOLD <= 0 || config.SUMMARIZATION_TRIGGER_THRESHOLD > 1) {\n console.warn('SUMMARIZATION_TRIGGER_THRESHOLD should be between 0 and 1');\n return false;\n }\n \n if (config.SUMMARY_BUDGET_PERCENTAGE <= 0 || config.SUMMARY_BUDGET_PERCENTAGE > 0.5) {\n console.warn('SUMMARY_BUDGET_PERCENTAGE should be between 0 and 0.5');\n return false;\n }\n \n if (config.DOCUMENT_FRAGMENT_MAX_PERCENTAGE <= 0 || config.DOCUMENT_FRAGMENT_MAX_PERCENTAGE > 0.5) {\n console.warn('DOCUMENT_FRAGMENT_MAX_PERCENTAGE should be between 0 and 0.5');\n return false;\n }\n \n // 检查各阶段百分比总和是否合理 (当前跳过,因为BUDGET_PERCENTAGE未被使用)\n // const totalPercentage = config.BUDGET_PERCENTAGE + config.SUMMARY_BUDGET_PERCENTAGE;\n // if (totalPercentage > 1) {\n // console.warn('Sum of BUDGET_PERCENTAGE and SUMMARY_BUDGET_PERCENTAGE exceeds 1');\n // return false;\n // }\n \n // 检查计数配置\n if (config.THINKING_RECALL_COUNT < 0) {\n console.warn('THINKING_RECALL_COUNT should be non-negative');\n return false;\n }\n \n if (config.LARGE_SUMMARIZATION_WARNING_THRESHOLD < 0) {\n console.warn('LARGE_SUMMARIZATION_WARNING_THRESHOLD should be non-negative');\n return false;\n }\n \n return true;\n}\n\n/**\n * 获取可用Token预算的辅助函数\n * @param totalBudget 总预算(可选,使用默认值)\n * @returns 可用于上下文构建的Token数量\n */\nexport function getAvailableTokenBudget(totalBudget?: number): number {\n const budget = totalBudget || CONTEXT_BUILDER_CONFIG.DEFAULT_MAX_TOKENS;\n return Math.max(0, budget - CONTEXT_BUILDER_CONFIG.RESERVED_FOR_RESPONSE);\n}\n\n/**\n * 获取默认Token配置的辅助函数\n * @returns Token预算配置对象\n */\nexport function getDefaultTokenConfig(): {\n maxTokens: number;\n reservedForResponse: number;\n availableForContext: number;\n} {\n const config = CONTEXT_BUILDER_CONFIG;\n return {\n maxTokens: config.DEFAULT_MAX_TOKENS,\n reservedForResponse: config.RESERVED_FOR_RESPONSE,\n availableForContext: getAvailableTokenBudget()\n };\n}\n\n/**\n * 检查Token预算是否充足的辅助函数\n * @param requiredTokens 需要的Token数量\n * @param totalBudget 总预算(可选,使用默认值)\n * @returns 是否有足够的Token预算\n */\nexport function hasEnoughTokenBudget(requiredTokens: number, totalBudget?: number): boolean {\n const availableBudget = getAvailableTokenBudget(totalBudget);\n return requiredTokens <= availableBudget;\n}\n\n/**\n * 获取推荐的摘要触发条件检查函数\n * @param currentTokenUsage 当前Token使用量\n * @param totalBudget 总预算\n * @param config 配置对象(可选,使用自适应配置)\n * @returns 是否应该触发摘要\n */\nexport function shouldTriggerSummarization(\n currentTokenUsage: number, \n totalBudget: number, \n config?: ContextBuilderConfig\n): boolean {\n const activeConfig = config || CONTEXT_BUILDER_CONFIG;\n const threshold = totalBudget * activeConfig.SUMMARIZATION_TRIGGER_THRESHOLD;\n return currentTokenUsage >= threshold;\n}","import type { ContextBuilderConfig } from '../config';\nimport {\n BaseContextProvider as SharedBaseContextProvider,\n type IContextProvider as SharedIContextProvider,\n type MessageProcessingState,\n type ProviderContext as SharedProviderContext,\n type ProviderResult,\n type SummarizationCallbacks,\n} from '../../../../shared/providers/base';\n\nexport type {\n MessageProcessingState,\n ProviderResult,\n SummarizationCallbacks,\n} from '../../../../shared/providers/base';\n\nexport type ProviderContext = SharedProviderContext<ContextBuilderConfig>;\nexport interface IContextProvider extends SharedIContextProvider<ContextBuilderConfig> {}\nexport abstract class BaseContextProvider\n extends SharedBaseContextProvider<ContextBuilderConfig>\n implements IContextProvider {}\n","/**\n * @file src/chat/context/providers/CoreContextProvider.ts\n * @description 核心上下文保留层Provider - 第一阶段上下文构建\n * \n * 🎯 职责: 识别并保留必须保留的核心消息\n * 📖 规则: 系统提示词、最新用户输入、文档片段始终无条件保留\n * ✨ 特性: 支持文档片段智能截断,确保核心请求的完整性\n */\n\nimport { BaseContextProvider, MessageProcessingState, ProviderContext, ProviderResult } from './base';\nimport type { AiMessage } from '../../../../../contracts';\n\n/**\n * 核心上下文保留层Provider\n * \n * 实现README中描述的第一阶段:核心上下文保留层 (Must-Keep)\n * 内容包括:系统提示词、用户意图块(最新用户输入+相关上下文信息)\n */\nexport class CoreContextProvider extends BaseContextProvider {\n readonly name = 'CoreContextProvider';\n readonly description = '核心上下文保留层 - 识别并保留系统提示词、最新用户输入和文档片段';\n readonly priority = 1; // 最高优先级\n\n async provide(\n states: MessageProcessingState[], \n availableBudget: number, \n context: ProviderContext\n ): Promise<ProviderResult> {\n this.debug('🚀 开始核心上下文保留层处理', {\n totalMessages: states.length,\n availableBudget,\n config: {\n documentFragmentMaxPercentage: context.config.DOCUMENT_FRAGMENT_MAX_PERCENTAGE\n }\n }, context);\n\n let coreTokens = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n \n // 获取所有原始消息,用于判断最新用户输入\n const allMessages = states.map(s => s.message);\n \n for (let i = 0; i < states.length; i++) {\n const state = states[i];\n const msg = state.message;\n \n // 检查是否为核心消息\n if (this.isCoreMessage(msg, i, allMessages)) {\n let processedContent = msg.content;\n let contentType: MessageProcessingState['contentType'] = 'full';\n \n // 文档片段截断逻辑 - 极端情况处理\n if (msg.type === 'document_fragment') {\n const originalTokens = context.estimateTokens(msg);\n const maxAllowedTokens = Math.floor(context.totalBudget * context.config.DOCUMENT_FRAGMENT_MAX_PERCENTAGE);\n \n if (originalTokens > maxAllowedTokens) {\n processedContent = this.truncateContent(msg.content, maxAllowedTokens, context.config.AVG_CHARS_PER_TOKEN);\n strategiesApplied.push('document_truncation');\n \n this.debug(`📄 文档片段被截断`, {\n id: msg.id,\n originalTokens,\n maxAllowedTokens,\n truncatedTokens: context.estimateTokens({ ...msg, content: processedContent })\n }, context);\n }\n }\n \n // 标记为核心消息\n state.action = 'keep_core';\n state.processedContent = processedContent;\n state.contentType = contentType;\n state.phase = 'CORE_CONTEXT';\n \n // 重新计算Token数量(基于可能被截断的内容)\n state.tokens = context.estimateTokens({ ...msg, content: processedContent });\n coreTokens += state.tokens;\n processedCount++;\n \n this.debug(`✅ 标记为核心消息`, {\n index: i,\n id: msg.id,\n type: msg.type,\n tokens: state.tokens,\n totalCoreTokens: coreTokens\n }, context);\n } else {\n this.debug(`⏭️ 跳过非核心消息`, { \n index: i, \n id: msg.id, \n type: msg.type \n }, context);\n }\n }\n \n this.debug('📊 核心上下文保留层处理完成', {\n coreMessages: processedCount,\n coreTokens,\n remainingBudget: availableBudget - coreTokens\n }, context);\n\n return this.createResult(\n states,\n coreTokens,\n strategiesApplied,\n {\n processedCount,\n skippedCount: states.length - processedCount,\n addedCount: 0\n }\n );\n }\n\n /**\n * 判断是否为核心消息\n * 🔥 关键设计:只保留真正的核心消息\n */\n private isCoreMessage(msg: AiMessage, index: number, allMessages: AiMessage[]): boolean {\n // 核心消息类型:系统提示词和文档片段始终无条件保留\n if (msg.type === 'system_prompt' || msg.type === 'document_fragment') {\n return true;\n }\n \n // README规则:最新的user_input也算核心消息\n if (msg.type === 'user_input') {\n const lastUserIndex = allMessages.map(m => m.type).lastIndexOf('user_input');\n return index === lastUserIndex;\n }\n \n // 🚨 重要:history_summary 不在此处保留,让其进入后续的处理流程\n // 这是解决\"循环累积\"问题的关键 - 旧摘要必须能被新摘要替换\n // 参考 AgentCoreContextProvider 的实现\n if (msg.type === 'history_summary') {\n return false;\n }\n \n return false;\n }\n\n /**\n * 内容截断 - 保持完整词汇\n * 复用ContextManager中的逻辑\n */\n private truncateContent(content: string, maxTokens: number, avgCharsPerToken: number): string {\n const maxChars = maxTokens * avgCharsPerToken;\n if (content.length <= maxChars) {\n return content;\n }\n\n // 找到最接近的词汇边界\n const truncated = content.substring(0, maxChars);\n const lastSpaceIndex = truncated.lastIndexOf(' ');\n const result = lastSpaceIndex > maxChars * 0.8 \n ? truncated.substring(0, lastSpaceIndex)\n : truncated;\n \n return result + '...';\n }\n}","/**\n * @file src/chat/context/providers/WorkingMemoryProvider.ts\n * @description 工作记忆填充层Provider - 第二阶段上下文构建\n * \n * 🎯 职责: 使用剩余预算,从最近的历史消息开始反向逐条填充\n * 📖 策略: P1优先级(最终回答) + P2优先级(思维链回补)\n * ✨ 特性: 智能内容提取,最大化保留对话的\"事实\"和\"结论\"\n *\n * 🧩 说明(Chat 与工具消息):\n * - Chat 模式下,来自 Agent 历史的 `tool_calls/tool_output` 默认会被 `ToolHistoryFilterPreprocessor` 过滤掉,\n * 因此本 Provider 不承担“工具交互优先级/配对保留”等职责(这些属于 AgentWorkingMemoryProvider)。\n */\n\nimport { BaseContextProvider, MessageProcessingState, ProviderContext, ProviderResult } from './base';\nimport type { AiMessage } from '../../../../../contracts';\n\n/**\n * 工作记忆填充层Provider\n * \n * 实现README中描述的第二阶段:工作记忆填充层 (Working Memory)\n * 使用剩余预算反向填充,优先保留最终回答,其次回补思维链\n */\nexport class WorkingMemoryProvider extends BaseContextProvider {\n readonly name = 'WorkingMemoryProvider';\n readonly description = '工作记忆填充层 - 反向填充最终回答和思维链,最大化保留对话事实';\n readonly priority = 2; // 仅次于核心上下文\n\n async provide(\n states: MessageProcessingState[], \n availableBudget: number, \n context: ProviderContext\n ): Promise<ProviderResult> {\n this.debug('🧠 开始工作记忆填充层处理', {\n totalMessages: states.length,\n availableBudget,\n config: {\n thinkingRecallCount: context.config.THINKING_RECALL_COUNT\n }\n }, context);\n\n // 计算当前已使用的Token (核心上下文)\n const coreTokens = this.calculateUsedTokens(states);\n let workingMemoryTokens = coreTokens;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n\n // 获取所有跳过的消息状态,用于填充\n const skippedStates = states.filter(s => s.action === 'skip');\n\n // === P1 优先级:反向填充最终回答部分 ===\n this.debug('🎯 P1优先级:开始标记最终回答部分');\n const p1Result = await this.processP1Priority(\n skippedStates, \n workingMemoryTokens, \n availableBudget, \n context\n );\n \n workingMemoryTokens += p1Result.tokensUsed;\n processedCount += p1Result.processedCount;\n strategiesApplied.push(...p1Result.strategiesApplied);\n\n // === P2 优先级:回补思维链 ===\n if (workingMemoryTokens < availableBudget) {\n this.debug('🧠 P2优先级:开始标记思维链回补');\n const p2Result = await this.processP2Priority(\n states, \n workingMemoryTokens, \n availableBudget, \n context\n );\n \n workingMemoryTokens += p2Result.tokensUsed;\n processedCount += p2Result.processedCount;\n strategiesApplied.push(...p2Result.strategiesApplied);\n }\n\n const finalTokensUsed = workingMemoryTokens - coreTokens;\n\n this.debug('📊 工作记忆填充层处理完成', {\n workingMemoryMessages: processedCount,\n workingMemoryTokens: finalTokensUsed,\n totalTokensUsed: workingMemoryTokens,\n remainingBudget: availableBudget - workingMemoryTokens\n }, context);\n\n return this.createResult(\n states,\n finalTokensUsed,\n strategiesApplied,\n {\n processedCount,\n skippedCount: skippedStates.length - processedCount,\n addedCount: 0\n }\n );\n }\n\n /**\n * P1优先级处理:反向填充最终回答部分\n */\n private async processP1Priority(\n skippedStates: MessageProcessingState[],\n currentTokens: number,\n budgetLimit: number,\n context: ProviderContext\n ): Promise<{ tokensUsed: number; processedCount: number; strategiesApplied: string[] }> {\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n\n // 反向遍历跳过的消息\n for (let i = skippedStates.length - 1; i >= 0; i--) {\n const state = skippedStates[i];\n \n if (currentTokens + tokensUsed >= budgetLimit) {\n this.debug('💰 达到预算限制,停止P1填充', { \n currentTokens: currentTokens + tokensUsed, \n budgetLimit \n }, context);\n break;\n }\n\n // 处理 assistant final_answer 消息\n if (state.message.role === 'assistant' && state.message.type === 'final_answer') {\n const finalAnswerContent = this.extractFinalAnswerContent(state.message);\n if (finalAnswerContent) {\n const finalAnswerTokens = context.estimateTokens({ \n ...state.message, \n content: finalAnswerContent \n });\n \n if (currentTokens + tokensUsed + finalAnswerTokens <= budgetLimit) {\n state.action = 'keep_working_memory';\n state.processedContent = finalAnswerContent;\n state.tokens = finalAnswerTokens;\n state.contentType = 'final_answer_only';\n state.phase = 'WORKING_MEMORY';\n \n tokensUsed += finalAnswerTokens;\n processedCount++;\n strategiesApplied.push('final_answer_extraction');\n \n this.debug(`✅ P1标记assistant消息`, {\n id: state.message.id,\n tokens: finalAnswerTokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n } else {\n this.debug(`❌ P1超出预算`, { \n id: state.message.id, \n wouldExceed: currentTokens + tokensUsed + finalAnswerTokens,\n budgetLimit \n }, context);\n }\n }\n }\n // 新增:处理 assistant task_completion 消息(完整保留,不做<think>剥离)\n else if (state.message.role === 'assistant' && state.message.type === 'task_completion') {\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n // contentType 维持默认 'full'\n tokensUsed += state.tokens;\n processedCount++;\n strategiesApplied.push('task_completion_preservation');\n\n this.debug(`✅ P1标记task_completion消息`, {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n } else {\n this.debug(`❌ P1超出预算(task_completion)`, { \n id: state.message.id, \n wouldExceed: currentTokens + tokensUsed + state.tokens,\n budgetLimit \n }, context);\n }\n }\n // 处理其他优先级消息 (final_answer, user_input)\n else if (state.message.type === 'final_answer' || state.message.type === 'user_input') {\n if (currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n tokensUsed += state.tokens;\n processedCount++;\n \n this.debug(`✅ P1标记优先级消息`, {\n id: state.message.id,\n type: state.message.type,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n }\n }\n }\n\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n /**\n * P2优先级处理:回补思维链 + 历史摘要\n * \n * 💬 处理顺序(参考 AgentWorkingMemoryProvider):\n * 1. 首先处理 history_summary(如果有)\n * 2. 然后回补思维链\n */\n private async processP2Priority(\n states: MessageProcessingState[],\n currentTokens: number,\n budgetLimit: number,\n context: ProviderContext\n ): Promise<{ tokensUsed: number; processedCount: number; strategiesApplied: string[] }> {\n let tokensUsed = 0;\n let processedCount = 0;\n const strategiesApplied: string[] = [];\n\n // 🔥 新增:优先处理历史摘要(参考 AgentWorkingMemoryProvider)\n // 此时已由HistoryPurificationPreprocessor清理,最多只会有一条摘要\n for (const state of states) {\n if (state.message.role === 'system' && state.message.type === 'history_summary') {\n if (state.action === 'skip' && currentTokens + tokensUsed + state.tokens <= budgetLimit) {\n state.action = 'keep_working_memory';\n state.phase = 'WORKING_MEMORY';\n tokensUsed += state.tokens;\n processedCount++;\n strategiesApplied.push('history_summary');\n \n this.debug(`✅ P2保留历史摘要`, {\n id: state.message.id,\n tokens: state.tokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n }\n break; // 最多只有一条摘要,找到后退出\n }\n }\n\n // 获取最近保留的 assistant final_answer 消息\n const recentFinalAnswers = states\n .filter(s => s.action === 'keep_working_memory' && \n s.message.role === 'assistant' && \n s.message.type === 'final_answer')\n .slice(-context.config.THINKING_RECALL_COUNT);\n\n for (const finalAnswerState of recentFinalAnswers) {\n if (currentTokens + tokensUsed >= budgetLimit) {\n this.debug('💰 达到预算限制,停止P2回补', { \n currentTokens: currentTokens + tokensUsed, \n budgetLimit \n }, context);\n break;\n }\n\n // 寻找对应的独立 thought 消息\n // 关键修复:仅在 final_answer 消息紧邻的前一条消息是 thought 时才进行回补\n const finalAnswerIndex = finalAnswerState.originalIndex;\n let thoughtState: MessageProcessingState | undefined = undefined;\n\n if (finalAnswerIndex > 0) {\n const potentialThoughtState = states[finalAnswerIndex - 1];\n if (\n potentialThoughtState &&\n potentialThoughtState.action === 'skip' &&\n potentialThoughtState.message.role === 'assistant' &&\n potentialThoughtState.message.type === 'thought'\n ) {\n thoughtState = potentialThoughtState;\n }\n }\n\n if (thoughtState && currentTokens + tokensUsed + thoughtState.tokens <= budgetLimit) {\n thoughtState.action = 'keep_working_memory';\n thoughtState.phase = 'WORKING_MEMORY';\n thoughtState.contentType = 'thinking_only';\n \n tokensUsed += thoughtState.tokens;\n processedCount++;\n strategiesApplied.push('independent_thinking_recall');\n\n this.debug(`✅ P2回补独立思维链`, {\n thoughtId: thoughtState.message.id,\n finalAnswerId: finalAnswerState.message.id,\n tokens: thoughtState.tokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n }\n }\n\n // 新增:Fallback 回补 - 当没有可用的 final_answer 配对时,按最近顺序回补少量 thought\n if (processedCount === 0 && currentTokens + tokensUsed < budgetLimit) {\n let recalled = 0;\n for (let i = states.length - 1; i >= 0; i--) {\n if (recalled >= context.config.THINKING_RECALL_COUNT) break;\n const s = states[i];\n if (s.action !== 'skip') continue;\n if (s.message.role === 'assistant' && s.message.type === 'thought') {\n if (currentTokens + tokensUsed + s.tokens <= budgetLimit) {\n s.action = 'keep_working_memory';\n s.phase = 'WORKING_MEMORY';\n s.contentType = 'thinking_only';\n tokensUsed += s.tokens;\n processedCount++;\n recalled++;\n strategiesApplied.push('independent_thinking_recall_fallback');\n this.debug(`✅ P2回补(无配对)思维链`, {\n thoughtId: s.message.id,\n tokens: s.tokens,\n totalTokens: currentTokens + tokensUsed\n }, context);\n } else {\n break;\n }\n }\n }\n }\n\n return { tokensUsed, processedCount, strategiesApplied };\n }\n\n /**\n * 计算当前已使用的Token数\n */\n private calculateUsedTokens(states: MessageProcessingState[]): number {\n return states\n .filter(s => s.action.startsWith('keep_'))\n .reduce((total, state) => total + state.tokens, 0);\n }\n\n /**\n * 提取AI消息的最终回答部分(移除<think>标签内容)\n */\n private extractFinalAnswerContent(message: AiMessage): string {\n const thinkRegex = /<think>([\\s\\S]*?)<\\/think>/gi;\n return message.content.replace(thinkRegex, '').trim();\n }\n}\n","/**\n * @file src/agent/context-manager/profiles/chat/context/providers/index.ts\n * @description Chat profile provider 协议与实现导出\n */\n\nexport * from './base';\n\nexport { CoreContextProvider } from './CoreContextProvider';\nexport { WorkingMemoryProvider } from './WorkingMemoryProvider';\nexport { SummarizationProvider } from '../../../../shared/providers';\nimport { ContextProviderRegistry as SharedContextProviderRegistry } from '../../../../shared/providers';\nimport type { ContextBuilderConfig } from '../config';\n\nexport class ContextProviderRegistry extends SharedContextProviderRegistry<ContextBuilderConfig> {}\n","import type { ChatMessage } from '../contracts';\nimport { generateMessageId } from '../../../../shared/ids';\nimport type { AiMessage, UserMessage } from '../../../../contracts';\n\nexport function aiMessageToChatMessage(aiMessage: AiMessage): ChatMessage {\n return {\n id: aiMessage.id,\n timestamp: aiMessage.timestamp,\n role: aiMessage.role,\n content: aiMessage.content,\n type: aiMessage.type,\n metadata: aiMessage.metadata,\n };\n}\n\nexport function chatMessageToAiMessage(\n chatMessage: ChatMessage,\n options: { id?: string; timestamp?: number } = {},\n): AiMessage {\n const { role, content, type, metadata, id: chatId } = chatMessage;\n const id = options.id || chatId || generateMessageId();\n\n const base = {\n id,\n content,\n timestamp: chatMessage.timestamp || options.timestamp || Date.now(),\n metadata,\n };\n\n switch (role) {\n case 'system': {\n const allowedSystemTypes = ['system_prompt', 'history_summary'] as const;\n const finalSystemType = (allowedSystemTypes as readonly string[]).includes(String(type))\n ? (type as typeof allowedSystemTypes[number])\n : 'system_prompt';\n return { ...base, role, type: finalSystemType };\n }\n case 'user': {\n const userType = type || 'user_input';\n if (\n ['user_input', 'context_before', 'context_after', 'document_fragment', 'image', 'task_request'].includes(\n userType,\n )\n ) {\n return { ...base, role, type: userType as UserMessage['type'] };\n }\n throw new Error(`Invalid type \"${userType}\" for role \"user\"`);\n }\n case 'assistant': {\n if (type === 'thought' || type === 'final_answer' || type === 'task_completion') {\n return { ...base, role, type };\n }\n throw new Error(`Invalid or missing type \"${type}\" for role \"assistant\"`);\n }\n default:\n throw new Error(`Unknown role: ${role}`);\n }\n}\n","import { \n CONTEXT_BUILDER_CONFIG,\n BuildPhase,\n ContextBuildStats,\n validateConfig,\n ContextBuilderConfig\n} from './config';\nimport { \n IContextProvider, \n ProviderContext,\n ContextProviderRegistry,\n SummarizationCallbacks\n} from './providers';\nimport {\n ContextManagerBase,\n type ContextManagerBaseOptions,\n} from '../../../shared/context-manager-base';\nimport {\n buildContextResult,\n generateContextRecommendations,\n} from '../../../shared/context-result';\nimport type { GenerateRequest, GenerateResponse } from '../contracts';\nimport type { AiMessage, RuntimeEvent } from '../../../../contracts';\nimport type { TokenizerPort } from '../../../../ports';\n\n/**\n * 上下文构建结果接口 - 与TokenBudgetManager保持兼容\n */\nexport interface ContextBuildResult {\n /** 构建后的消息列表 */\n messages: AiMessage[];\n \n /** Token使用情况 */\n tokenUsage: {\n used: number;\n remaining: number;\n };\n \n /** 处理统计信息 - 兼容TokenBudgetManager格式 */\n processingStats: {\n originalCount: number;\n keptCount: number;\n truncatedCount: number;\n tokenDistribution: Record<string, number>;\n strategiesApplied: string[];\n recommendations: string[];\n // 新增的上下文构建统计\n buildStats?: ContextBuildStats;\n };\n \n /** 是否进行了截断 */\n truncated: boolean;\n \n /** 截断的消息数量 */\n truncatedCount?: number;\n \n /** 应用的策略列表 */\n strategies: {\n applied: string[];\n recommendations: string[];\n };\n \n /** 🔥 新增:Provider生成的运行时事件(如摘要事件) */\n events?: RuntimeEvent[];\n}\n\n/**\n * 智能上下文管理器 - Provider编排器\n * \n * 🎯 职责: 编排各个ContextProvider,协调3阶段上下文构建流程\n * 🏗️ 架构: 策略模式 + 责任链模式,实现高内聚、低耦合\n */\nexport class ContextManager extends ContextManagerBase<\n ContextBuilderConfig,\n ContextProviderRegistry\n> {\n\n constructor(options: {\n debugMode?: boolean;\n customConfig?: Partial<ContextBuilderConfig>;\n providerRegistry?: ContextProviderRegistry;\n tokenizer?: TokenizerPort;\n tokenizerModelId?: string;\n } = {}) {\n super(options as ContextManagerBaseOptions<ContextBuilderConfig, ContextProviderRegistry>, {\n defaultConfig: CONTEXT_BUILDER_CONFIG,\n validateConfig,\n createRegistry: () => new ContextProviderRegistry(),\n loggerName: 'ContextManager',\n invalidConfigMessage: 'Invalid ContextManager configuration',\n });\n }\n\n /**\n * 主入口:构建智能上下文 - Provider编排模式\n */\n async buildContext(\n messages: AiMessage[], \n totalBudget: number,\n callbacks?: SummarizationCallbacks,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>\n ): Promise<ContextBuildResult> {\n // 计算摘要触发相关信息\n const summarizationThreshold = this.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n const summarizationTokenThreshold = Math.floor(totalBudget * summarizationThreshold);\n \n this.debug('🎯 [Chat上下文管理器] 开始上下文构建', { \n 原始消息数: messages.length, \n 总预算: totalBudget,\n 摘要触发阈值: `${(summarizationThreshold * 100).toFixed(0)}%`,\n 摘要Token阈值: summarizationTokenThreshold\n });\n\n const startTime = performance.now();\n const buildStats: ContextBuildStats = this.initializeBuildStats(startTime, messages.length);\n\n try {\n // 🔥 核心流程:编排各个Provider按优先级处理\n const providerContext: ProviderContext = {\n totalBudget,\n config: this.config,\n debugMode: this.debugMode,\n estimateTokens: message => this.estimateTokens(message),\n summarizationCallbacks: callbacks,\n generate,\n };\n\n const { finalMessages, finalTokens, strategiesApplied, events } =\n await this.runPipeline({\n messages,\n totalBudget,\n buildStats,\n providerContext,\n getPhaseByProviderName: providerName => this.getPhaseByProviderName(providerName),\n });\n \n const endTime = performance.now();\n buildStats.totalTime = endTime - startTime;\n \n // 计算摘要触发相关信息\n const summarizationThreshold = this.config.SUMMARIZATION_TRIGGER_THRESHOLD;\n const summarizationTokenThreshold = Math.floor(totalBudget * summarizationThreshold);\n \n this.debug('✅ [Chat上下文管理器] 上下文构建完成', {\n 原始消息: messages.length,\n 最终消息: finalMessages.length,\n Token使用: finalTokens,\n 总预算: totalBudget,\n 使用率: `${((finalTokens / totalBudget) * 100).toFixed(1)}%`,\n 摘要触发阈值: `${(summarizationThreshold * 100).toFixed(0)}%`,\n 摘要Token阈值: summarizationTokenThreshold,\n 总耗时: `${buildStats.totalTime.toFixed(2)}ms`\n });\n\n return this.buildFinalResult(\n finalMessages, \n finalTokens, \n totalBudget, \n messages.length, \n strategiesApplied, \n buildStats,\n events // 🔥 传递收集的事件\n );\n\n } catch (error) {\n this.debug('❌ [Chat上下文管理器] 上下文构建失败', { error });\n throw new Error(`Context building failed with Provider orchestration: ${error}`);\n }\n }\n\n // ------------------- Provider编排核心方法 -------------------\n\n /**\n * 根据Provider名称获取对应的阶段名称\n */\n private getPhaseByProviderName(providerName: string): BuildPhase | null {\n const phaseMap: Record<string, BuildPhase> = {\n 'CoreContextProvider': BuildPhase.CORE_CONTEXT,\n 'WorkingMemoryProvider': BuildPhase.WORKING_MEMORY,\n 'SummarizationProvider': BuildPhase.SUMMARIZATION\n };\n return phaseMap[providerName] || null;\n }\n\n // ------------------- Provider编排辅助方法 -------------------\n\n private initializeBuildStats(startTime: number, originalMessageCount: number): ContextBuildStats {\n return {\n startTime,\n phaseTiming: {} as Record<BuildPhase, number>,\n phaseTokenUsage: {} as Record<BuildPhase, { used: number; percentage: number }>,\n messageStats: {\n original: originalMessageCount,\n afterCoreContext: 0,\n afterWorkingMemory: 0,\n afterSummarization: 0\n },\n summarizationTriggered: false,\n documentTruncated: false,\n totalTime: 0\n };\n }\n\n private buildFinalResult(\n finalMessages: AiMessage[],\n finalTokens: number,\n totalBudget: number,\n originalCount: number,\n strategiesApplied: string[],\n buildStats: ContextBuildStats,\n events: RuntimeEvent[] = [] // 🔥 新增:事件列表\n ): ContextBuildResult {\n const recommendations = this.generateRecommendations(buildStats, totalBudget);\n return buildContextResult({\n finalMessages,\n finalTokens,\n totalBudget,\n originalCount,\n strategiesApplied,\n buildStats,\n enableBuildStats: this.config.ENABLE_BUILD_STATS,\n estimateTokens: message => this.estimateTokens(message),\n coreTypes: this.config.CORE_MESSAGE_TYPES,\n recommendations,\n events,\n });\n }\n /**\n * 生成优化建议\n */\n private generateRecommendations(stats: ContextBuildStats, totalBudget: number): string[] {\n return generateContextRecommendations(stats, {\n totalBudget,\n processingTimeoutMs: this.config.PROCESSING_TIMEOUT_MS,\n largeSummarizationWarningThreshold:\n this.config.LARGE_SUMMARIZATION_WARNING_THRESHOLD,\n });\n }\n /**\n * 获取Provider注册表(用于测试或调试)\n */\n getProviderRegistry(): ContextProviderRegistry {\n return this.providerRegistry;\n }\n\n /**\n * 注册新的Provider\n */\n registerProvider(provider: IContextProvider): void {\n this.providerRegistry.register(provider);\n }\n}\n","import type { AiMessage } from '../../../../contracts';\n\n/**\n * 预处理器上下文 - 为管道模式提供的轻量级上下文\n */\nexport interface PreprocessorContext {\n /** 调试模式开关 */\n debugMode?: boolean;\n /** 可选的元数据传递 */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * 预处理结果接口\n */\nexport interface PreprocessorResult {\n /** 预处理后的消息列表 */\n messages: AiMessage[];\n /** 预处理统计信息 */\n stats: {\n /** 原始消息数量 */\n originalCount: number;\n /** 处理后消息数量 */\n processedCount: number;\n /** 被移除的消息数量 */\n removedCount: number;\n /** 被修改的消息数量 */\n modifiedCount: number;\n };\n /** 应用的策略列表 */\n appliedStrategies: string[];\n}\n\n/**\n * 预处理器接口 - 管道模式的核心契约\n */\nexport interface IPreprocessor {\n /** 预处理器名称 */\n readonly name: string;\n \n /** 预处理器描述 */\n readonly description: string;\n \n /** 执行顺序优先级 (数字越小越先执行) */\n readonly priority: number;\n\n /**\n * 预处理方法 - 管道模式的核心方法\n * \n * @param messages 输入的消息列表\n * @param context 预处理上下文\n * @returns 预处理结果\n */\n process(\n messages: AiMessage[], \n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n /**\n * 可选:判断是否应该跳过此预处理器\n * \n * @param messages 输入的消息列表\n * @param context 预处理上下文\n * @returns true表示跳过,false表示执行\n */\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean;\n}\n\n/**\n * 预处理器基类 - 提供通用功能实现\n */\nexport abstract class BasePreprocessor implements IPreprocessor {\n abstract readonly name: string;\n abstract readonly description: string;\n abstract readonly priority: number;\n\n abstract process(\n messages: AiMessage[], \n context: PreprocessorContext\n ): Promise<PreprocessorResult>;\n\n /**\n * 默认的跳过逻辑 - 子类可以覆盖\n */\n shouldSkip?(messages: AiMessage[], context: PreprocessorContext): boolean {\n return false; // 默认不跳过\n }\n\n /**\n * 创建预处理结果的辅助方法\n */\n protected createResult(\n originalMessages: AiMessage[],\n processedMessages: AiMessage[],\n appliedStrategies: string[],\n modifiedCount: number = 0\n ): PreprocessorResult {\n const removedCount = originalMessages.length - processedMessages.length;\n \n return {\n messages: processedMessages,\n stats: {\n originalCount: originalMessages.length,\n processedCount: processedMessages.length,\n removedCount,\n modifiedCount\n },\n appliedStrategies\n };\n }\n\n /**\n * 调试日志辅助方法\n */\n protected debug(message: string, data?: Record<string, unknown>, context?: PreprocessorContext): void {\n if (context?.debugMode) {\n console.log(`[${this.name}] ${message}`, data);\n }\n }\n}\n","import {\n BasePreprocessor,\n type PreprocessorContext,\n type PreprocessorResult,\n} from './base';\nimport type { AiMessage } from '../../../../contracts';\n\ninterface UserQuoteMetadata {\n text: string;\n source?: Record<string, unknown>;\n}\n\nexport interface UserQuoteLifetimeConfig {\n keepLatestUserInputs?: number;\n priority?: number;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readUserQuoteMetadata(metadata: AiMessage['metadata']): UserQuoteMetadata | undefined {\n const quote = metadata?.user_quote;\n if (!isRecord(quote) || typeof quote.text !== 'string') {\n return undefined;\n }\n\n return {\n text: quote.text,\n source: isRecord(quote.source) ? quote.source : undefined,\n };\n}\n\nexport class UserQuoteLifetimePreprocessor extends BasePreprocessor {\n readonly name = 'UserQuoteLifetimePreprocessor';\n readonly description = 'chat 兼容层:限制 <user_quote> 在历史中的生效轮数';\n readonly priority: number;\n\n private readonly keepLatestUserInputs: number;\n\n constructor(config: UserQuoteLifetimeConfig = {}) {\n super();\n this.keepLatestUserInputs = config.keepLatestUserInputs ?? 2;\n this.priority = config.priority ?? 3;\n }\n\n async process(messages: AiMessage[], context: PreprocessorContext): Promise<PreprocessorResult> {\n this.debug('🧹 开始处理 chat 用户引用寿命', {\n 原始消息数: messages.length,\n 保留用户输入条数: this.keepLatestUserInputs,\n }, context);\n\n if (messages.length === 0) {\n return this.createResult(messages, messages, [], 0);\n }\n\n const userInputIndices = messages\n .map((msg, index) => ({ msg, index }))\n .filter(({ msg }) => msg.role === 'user' && msg.type === 'user_input')\n .map(({ index }) => index);\n\n if (userInputIndices.length === 0) {\n return this.createResult(messages, messages, [], 0);\n }\n\n const keepCount = Math.max(1, this.keepLatestUserInputs);\n const cutoff = Math.max(0, userInputIndices.length - keepCount);\n const indicesToStrip = userInputIndices.slice(0, cutoff);\n const keptIndices = userInputIndices.slice(cutoff);\n\n const processedMessages: AiMessage[] = [...messages];\n let modifiedCount = 0;\n\n for (const index of indicesToStrip) {\n const { message, modified } = this.stripUserQuoteFromMessage(processedMessages[index]);\n if (modified) {\n processedMessages[index] = message;\n modifiedCount++;\n }\n }\n\n for (const index of keptIndices) {\n const { message, modified } = this.ensureUserQuoteOnMessage(processedMessages[index]);\n if (modified) {\n processedMessages[index] = message;\n modifiedCount++;\n }\n }\n\n return this.createResult(\n messages,\n processedMessages,\n modifiedCount > 0 ? ['user_quote_lifetime'] : [],\n modifiedCount,\n );\n }\n\n private stripUserQuoteFromMessage(\n message: AiMessage,\n ): { message: AiMessage; modified: boolean } {\n let modified = false;\n let newContent = message.content;\n\n if (newContent.includes('<user_quote')) {\n const replaced = newContent.replace(/<user_quote[\\s\\S]*?<\\/user_quote>\\s*/gm, '').trimStart();\n if (replaced !== newContent) {\n newContent = replaced;\n modified = true;\n }\n }\n\n let newMetadata = message.metadata;\n if (message.metadata?.user_quote) {\n newMetadata = { ...message.metadata };\n delete newMetadata.user_quote;\n modified = true;\n }\n\n if (!modified) {\n return { message, modified: false };\n }\n\n return {\n message: {\n ...message,\n content: newContent,\n ...(newMetadata ? { metadata: newMetadata } : {}),\n },\n modified: true,\n };\n }\n\n private ensureUserQuoteOnMessage(\n message: AiMessage,\n ): { message: AiMessage; modified: boolean } {\n const quote = readUserQuoteMetadata(message.metadata);\n if (!quote || message.content.includes('<user_quote')) {\n return { message, modified: false };\n }\n\n const quoteText = quote.text.trim();\n if (!quoteText) {\n return { message, modified: false };\n }\n\n const source = quote.source ?? {};\n const attrs: string[] = [];\n if (typeof source.doc_id === 'string') attrs.push(`source_doc=\"${source.doc_id}\"`);\n if (typeof source.block_id === 'string') attrs.push(`block_id=\"${source.block_id}\"`);\n if (typeof source.start === 'number') attrs.push(`start=\"${source.start}\"`);\n if (typeof source.end === 'number') attrs.push(`end=\"${source.end}\"`);\n\n const openTag = attrs.length > 0 ? `<user_quote ${attrs.join(' ')}>` : '<user_quote>';\n const quoteBlock = `${openTag}\\n${quoteText}\\n</user_quote>`;\n const queryBlock = `<user_query>\\n${message.content.trim()}\\n</user_query>`;\n\n return {\n message: {\n ...message,\n content: `${quoteBlock}\\n${queryBlock}`,\n },\n modified: true,\n };\n }\n}\n","import {\n BasePreprocessor,\n PreprocessorContext,\n PreprocessorResult\n} from './base';\nimport type { AiMessage } from '../../../../contracts';\n\n/**\n * 工具历史过滤器预处理器\n *\n * 过滤掉Agent模式产生的、与Chat模式不兼容的工具调用历史消息。\n */\nexport class ToolHistoryFilterPreprocessor extends BasePreprocessor {\n readonly name = 'ToolHistoryFilterPreprocessor';\n readonly description = '移除Agent历史记录中与Chat模式不兼容的工具调用消息';\n readonly priority = 2; // 在历史净化之后执行\n\n /**\n * 功能: 执行工具历史过滤处理。\n * @param messages {AiMessage[]} 输入的消息列表。\n * @param context {PreprocessorContext} 预处理上下文。\n * @returns {Promise<PreprocessorResult>} 过滤后的结果。\n * @side-effects 无\n */\n async process(\n messages: AiMessage[],\n context: PreprocessorContext\n ): Promise<PreprocessorResult> {\n this.debug('🧹 开始过滤工具调用历史', {\n 原始消息数: messages.length\n }, context);\n\n const filteredMessages = messages.filter(msg => {\n const isToolCall = msg.role === 'assistant' && msg.type === 'tool_calls';\n const isToolOutput = msg.role === 'tool' && msg.type === 'tool_output';\n return !isToolCall && !isToolOutput;\n });\n\n const removedCount = messages.length - filteredMessages.length;\n const appliedStrategies = removedCount > 0 ? ['tool_history_filtering'] : [];\n\n this.debug('✅ 工具历史过滤完成', {\n 原始消息: messages.length,\n 过滤后消息: filteredMessages.length,\n 移除消息: removedCount\n }, context);\n\n return this.createResult(\n messages,\n filteredMessages,\n appliedStrategies,\n 0\n );\n }\n\n /**\n * 功能: 判断是否应跳过此预处理器。\n * @param messages {AiMessage[]} 输入的消息列表。\n * @param context {PreprocessorContext} 预处理上下文。\n * @returns {boolean} 如果没有工具相关的消息,则返回 true 跳过。\n * @side-effects 无\n */\n shouldSkip(messages: AiMessage[], context: PreprocessorContext): boolean {\n const hasToolMessages = messages.some(msg =>\n (msg.role === 'assistant' && msg.type === 'tool_calls') ||\n (msg.role === 'tool' && msg.type === 'tool_output')\n );\n\n if (!hasToolMessages) {\n this.debug('⏭️ 无工具调用历史,跳过过滤', {}, context);\n return true;\n }\n\n return false;\n }\n}\n","import { \n IPreprocessor, \n PreprocessorContext, \n PreprocessorResult \n} from './base';\nimport {\n HistoryPurificationPreprocessor,\n} from '../../../shared/preprocessors';\nimport { UserQuoteLifetimePreprocessor } from './userQuoteLifetime';\nimport { ToolHistoryFilterPreprocessor } from './toolHistoryFilter';\nimport type { AiMessage } from '../../../../contracts';\n\n// 重新导出公共接口\nexport * from './base';\nexport { HistoryPurificationPreprocessor } from '../../../shared/preprocessors';\nexport * from './toolHistoryFilter';\nexport * from './userQuoteLifetime';\n\n/**\n * 预处理器注册表 - 管理所有预处理器及其执行顺序\n */\nexport class PreprocessorRegistry {\n private preprocessors: Map<string, IPreprocessor> = new Map();\n\n /**\n * 注册预处理器\n */\n register(preprocessor: IPreprocessor): void {\n if (this.preprocessors.has(preprocessor.name)) {\n throw new Error(`Preprocessor with name '${preprocessor.name}' is already registered`);\n }\n this.preprocessors.set(preprocessor.name, preprocessor);\n }\n\n /**\n * 获取指定名称的预处理器\n */\n getPreprocessor(name: string): IPreprocessor | undefined {\n return this.preprocessors.get(name);\n }\n\n /**\n * 获取所有预处理器,按优先级排序\n */\n getAllPreprocessors(): IPreprocessor[] {\n return Array.from(this.preprocessors.values())\n .sort((a, b) => a.priority - b.priority);\n }\n\n /**\n * 获取已注册的预处理器名称列表\n */\n getRegisteredNames(): string[] {\n return Array.from(this.preprocessors.keys());\n }\n\n /**\n * 检查是否已注册指定预处理器\n */\n isRegistered(name: string): boolean {\n return this.preprocessors.has(name);\n }\n\n /**\n * 获取注册的预处理器数量\n */\n getCount(): number {\n return this.preprocessors.size;\n }\n}\n\n/**\n * 预处理管道 - 按顺序执行所有预处理器\n */\nexport class PreprocessorPipeline {\n private registry: PreprocessorRegistry;\n private context: PreprocessorContext;\n\n constructor(\n registry: PreprocessorRegistry, \n context: PreprocessorContext = {}\n ) {\n this.registry = registry;\n this.context = context;\n }\n\n /**\n * 执行完整的预处理管道\n * \n * @param messages 输入消息列表\n * @returns 预处理管道的汇总结果\n */\n async process(messages: AiMessage[]): Promise<PreprocessorPipelineResult> {\n const startTime = performance.now();\n let currentMessages = messages;\n const pipelineResults: Array<{ preprocessor: string; result: PreprocessorResult }> = [];\n const appliedStrategies = new Set<string>();\n\n this.debug('🚀 开始预处理管道', {\n 初始消息数: messages.length,\n 预处理器数量: this.registry.getCount()\n });\n\n // 获取所有预处理器,按优先级排序\n const preprocessors = this.registry.getAllPreprocessors();\n\n // 按优先级顺序执行每个预处理器\n for (const preprocessor of preprocessors) {\n this.debug(`🔄 执行预处理器: ${preprocessor.name}`, {\n 优先级: preprocessor.priority,\n 当前消息数: currentMessages.length\n });\n\n try {\n // 检查是否应该跳过\n if (preprocessor.shouldSkip?.(currentMessages, this.context)) {\n this.debug(`⏭️ 跳过预处理器: ${preprocessor.name}`, {});\n continue;\n }\n\n // 执行预处理\n const result = await preprocessor.process(currentMessages, this.context);\n \n // 记录结果\n pipelineResults.push({\n preprocessor: preprocessor.name,\n result\n });\n\n // 更新消息列表以供下一个预处理器使用\n currentMessages = result.messages;\n \n // 收集应用的策略\n result.appliedStrategies.forEach(strategy => appliedStrategies.add(strategy));\n\n this.debug(`✅ 预处理器完成: ${preprocessor.name}`, {\n 输入消息: result.stats.originalCount,\n 输出消息: result.stats.processedCount,\n 移除消息: result.stats.removedCount,\n 修改消息: result.stats.modifiedCount,\n 应用策略: result.appliedStrategies\n });\n\n } catch (error) {\n this.debug(`❌ 预处理器失败: ${preprocessor.name}`, { error });\n // 预处理器失败不应该中断整个管道,继续执行后续预处理器\n console.warn(`Preprocessor ${preprocessor.name} failed:`, error);\n }\n }\n\n const endTime = performance.now();\n const processingTime = endTime - startTime;\n\n this.debug('🏁 预处理管道完成', {\n 原始消息数: messages.length,\n 最终消息数: currentMessages.length,\n 总移除数: messages.length - currentMessages.length,\n 执行时间: `${processingTime.toFixed(2)}ms`,\n 应用策略: Array.from(appliedStrategies)\n });\n\n return {\n messages: currentMessages,\n pipelineStats: {\n originalCount: messages.length,\n finalCount: currentMessages.length,\n totalRemovedCount: messages.length - currentMessages.length,\n processingTime,\n preprocessorsExecuted: pipelineResults.length,\n appliedStrategies: Array.from(appliedStrategies)\n },\n individualResults: pipelineResults\n };\n }\n\n /**\n * 更新预处理上下文\n */\n updateContext(newContext: Partial<PreprocessorContext>): void {\n this.context = { ...this.context, ...newContext };\n }\n\n /**\n * 获取当前上下文\n */\n getContext(): PreprocessorContext {\n return { ...this.context };\n }\n\n /**\n * 调试日志\n */\n private debug(message: string, data?: Record<string, unknown>): void {\n if (this.context.debugMode) {\n console.log(`[PreprocessorPipeline] ${message}`, data);\n }\n }\n}\n\n/**\n * 预处理管道结果接口\n */\nexport interface PreprocessorPipelineResult {\n /** 预处理后的消息列表 */\n messages: AiMessage[];\n \n /** 管道级别的统计信息 */\n pipelineStats: {\n originalCount: number;\n finalCount: number;\n totalRemovedCount: number;\n processingTime: number;\n preprocessorsExecuted: number;\n appliedStrategies: string[];\n };\n \n /** 各个预处理器的详细结果 */\n individualResults: Array<{\n preprocessor: string;\n result: PreprocessorResult;\n }>;\n}\n\n// ================= 默认配置 =================\n\n/**\n * 创建默认的预处理器注册表\n * \n * 🔥 这里定义了预处理管道的默认配置:\n * 1. HistoryPurificationPreprocessor (priority: 1) - 历史净化,最先执行\n * \n * 💡 扩展示例:\n * 2. PIIScrubbingPreprocessor (priority: 2) - PII数据清洗\n * 3. FormatNormalizationPreprocessor (priority: 3) - 格式标准化\n */\nexport function createDefaultPreprocessorRegistry(): PreprocessorRegistry {\n const registry = new PreprocessorRegistry();\n \n // 注册历史净化预处理器 - 优先级1,最先执行\n // 🔥 使用共享实现,配置 Chat 模式的日志前缀\n registry.register(new HistoryPurificationPreprocessor({ logPrefix: 'Chat-HistoryPurification' }));\n \n // 注册工具历史过滤器 - 优先级2,移除Agent工具消息\n registry.register(new ToolHistoryFilterPreprocessor());\n\n // 注册用户引用寿命控制器 - 优先级3,清理过期引用\n registry.register(\n new UserQuoteLifetimePreprocessor({\n keepLatestUserInputs: 2,\n priority: 3,\n })\n );\n\n // 未来可以在这里注册更多预处理器:\n // registry.register(new PIIScrubbingPreprocessor());\n // registry.register(new FormatNormalizationPreprocessor());\n // registry.register(new DeduplicationPreprocessor());\n \n return registry;\n}\n\n/**\n * 创建默认的预处理管道\n * \n * @param context 预处理上下文配置\n * @returns 配置好的预处理管道实例\n */\nexport function createDefaultPreprocessorPipeline(\n context: PreprocessorContext = {}\n): PreprocessorPipeline {\n const registry = createDefaultPreprocessorRegistry();\n return new PreprocessorPipeline(registry, context);\n}\n","import type { AgentProfileRequest } from '../agent/contracts';\nimport type { GenerateRequest } from './contracts';\nimport { aiMessageToChatMessage } from './utils/messageAdapters';\nimport type { AiMessage } from '../../../contracts';\n\nexport interface ChatGenerateRequestAdapterInput extends AgentProfileRequest {\n context_before?: string;\n context_after?: string;\n current_paragraph?: string;\n document_fragment?: string;\n document_title?: string;\n project_metadata?: {\n id?: string;\n name?: string;\n description?: string;\n };\n document_metadata?: {\n id?: string;\n title?: string;\n };\n user_quote?: {\n text: string;\n source?: Record<string, unknown>;\n display_label?: string;\n };\n completionLengthHint?: string;\n recentRejections?: GenerateRequest['recentRejections'];\n}\n\n/**\n * Product request adapter:\n * - keeps AgentInvokeRequest -> GenerateRequest conversion out of orchestrator core\n * - makes the remaining app-specific request shape explicit and replaceable\n */\nexport function buildGenerateRequestFromAgentRequest(\n request: ChatGenerateRequestAdapterInput,\n conversationHistory: AiMessage[],\n): GenerateRequest {\n return {\n prompt: request.query,\n documentFragment: request.document_fragment,\n conversationHistory: conversationHistory.map((message) => aiMessageToChatMessage(message)),\n promptKey: request.promptKey,\n contextBefore: request.context_before,\n contextAfter: request.context_after,\n currentBlockContent: request.current_paragraph,\n current_paragraph: request.current_paragraph,\n projectMetadata: request.project_metadata\n ? {\n id: request.project_metadata.id,\n name: request.project_metadata.name,\n description: request.project_metadata.description,\n }\n : undefined,\n documentMetadata: request.document_metadata\n ? {\n id: request.document_metadata.id,\n title: request.document_metadata.title || request.document_title,\n }\n : (request.document_title ? { title: request.document_title } : undefined),\n userQuote: request.user_quote\n ? {\n text: request.user_quote.text,\n source: request.user_quote.source,\n displayLabel: request.user_quote.display_label,\n }\n : undefined,\n completionLengthHint: request.completionLengthHint,\n recentRejections: request.recentRejections,\n };\n}\n","import type { ChatMessage, GenerateRequest, GenerateResponse } from '../contracts';\nimport { chatMessageToAiMessage } from '../utils/messageAdapters';\nimport { ContextManager, ContextBuildResult } from '../context';\nimport { CONTEXT_BUILDER_CONFIG } from '../context/config';\nimport type { ContextBuilderConfig } from '../context/config';\nimport type { SummarizationCallbacks } from '../context/providers/base';\nimport type { ContextProviderRegistry } from '../context/providers';\nimport { \n PreprocessorPipeline, \n createDefaultPreprocessorPipeline,\n PreprocessorPipelineResult \n} from '../preprocessors';\nimport { messageFormatter } from '../../../shared/MessageFormatter';\nimport type { AgentProfileRequest } from '../../agent/contracts';\nimport type { ChatTaskResolver } from '../tasks/base';\nimport { generateMessageId } from '../../../../shared/ids';\nimport { buildGenerateRequestFromAgentRequest } from '../request-adapters';\nimport type { AiMessage } from '../../../../contracts';\nimport type { TokenizerPort } from '../../../../ports';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction readOptionalStringProperty(value: unknown, key: string): string | undefined {\n if (!isRecord(value)) return undefined;\n const candidate = value[key];\n return typeof candidate === 'string' && candidate.trim().length > 0 ? candidate : undefined;\n}\n\n/**\n * 编排器配置选项\n */\nexport interface OrchestratorOptions {\n /** Token预算配置 (现在由ContextManager内部管理,但保留API以兼容旧用法) */\n tokenBudget: {\n maxTokens: number;\n reservedForResponse: number;\n };\n \n /** 处理选项 */\n processing: {\n enableMerge?: boolean;\n enableBatch?: boolean;\n debugMode?: boolean;\n preserveMetadata?: boolean;\n };\n \n /** 系统提示词 */\n systemPrompt?: string;\n \n /** 模型名称 (用于精确Token计算) */\n model?: string;\n\n /** 任务解析器 */\n taskResolver: ChatTaskResolver;\n providerRegistry: ContextProviderRegistry;\n tokenizer?: TokenizerPort;\n}\n\n/**\n * 处理结果接口\n */\nexport interface ProcessingResult {\n /** 处理后的消息 (AI引擎格式) */\n messages: ChatMessage[];\n \n /** 完整的上下文构建结果,包含详细统计信息 */\n contextBuildResult: ContextBuildResult;\n \n /** 处理元信息 */\n metadata: {\n originalCount: number;\n processedCount: number;\n tokenUsage: {\n estimated: number;\n budget: number;\n remaining: number;\n };\n processingStats: ContextBuildResult['processingStats'];\n truncated: boolean;\n truncatedCount?: number;\n };\n}\n\n/**\n * 消息处理编排器\n * \n * 实现完整的处理流程:解析 → 分发 → 上下文构建 → 注入系统提示词 → 转换\n */\nexport class MessageOrchestrator {\n private contextManager: ContextManager;\n private preprocessorPipeline: PreprocessorPipeline;\n private options: OrchestratorOptions;\n private readonly taskResolver: ChatTaskResolver;\n\n constructor(options: OrchestratorOptions) {\n this.options = options;\n this.taskResolver = options.taskResolver;\n \n // 初始化预处理管道\n this.preprocessorPipeline = createDefaultPreprocessorPipeline({\n debugMode: options.processing.debugMode\n });\n \n // 初始化新的上下文管理器\n this.contextManager = new ContextManager({\n debugMode: options.processing.debugMode,\n // 允许通过 OrchestratorOptions 覆盖默认配置\n customConfig: CONTEXT_BUILDER_CONFIG,\n providerRegistry: options.providerRegistry,\n tokenizer: options.tokenizer,\n tokenizerModelId: options.model,\n });\n }\n\n /**\n * 🔥 新增:与 AgentOrchestrator 对称的主方法\n * 负责从 AgentProfileRequest 构建完整的初始消息列表,然后进行处理\n */\n async processChatConversation(\n request: AgentProfileRequest,\n callbacks?: SummarizationCallbacks,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>\n ): Promise<ProcessingResult> {\n console.log('[Chat-Orchestrator] 🚀 开始 Chat 对话处理');\n this.contextManager.updateTokenizerModelId(this.resolveTokenizerModelId(request));\n\n // 🔥 1. [预处理] 首先对原始历史记录进行净化\n const originalHistory = request.conversationHistory || [];\n const preprocessResult = await this.runPreprocessorPipeline(originalHistory);\n console.log(`[Chat-Orchestrator] 🧹 历史净化完成: ${originalHistory.length} -> ${preprocessResult.messages.length} 条`);\n\n // 2. 将 AgentProfileRequest 转换为 GenerateRequest 格式,并注入净化后的历史\n const generateRequest = buildGenerateRequestFromAgentRequest(\n request,\n preprocessResult.messages,\n );\n\n this.debug(`Converting AgentProfileRequest to GenerateRequest`, {\n promptKey: request.promptKey,\n originalHistoryCount: originalHistory.length,\n purifiedHistoryCount: preprocessResult.messages.length,\n });\n\n // 3. 获取任务并调用其 buildMessages 方法\n const task = this.taskResolver(request.promptKey);\n const initialChatMessages = task.buildMessages(generateRequest);\n \n this.debug(`Task built ${initialChatMessages.length} initial messages using purified history`, {\n promptKey: request.promptKey,\n taskType: task.constructor.name,\n });\n\n // 4. 将 ChatMessage[] 转换为 AiMessage[] 以供后续处理\n const initialAiMessages: AiMessage[] = initialChatMessages.map((chatMsg, index) => \n chatMessageToAiMessage(chatMsg, { \n id: chatMsg.id || generateMessageId(), \n timestamp: chatMsg.timestamp || (Date.now() - (initialChatMessages.length - index))\n })\n );\n \n // 5. [上下文构建] - 调用ContextManager (不再需要内部预处理)\n const finalResult = await this.buildAndFinalizeContext(initialAiMessages, callbacks, generate);\n\n this.debug('✅ Chat 对话处理完成', {\n hasCallbacks: !!callbacks,\n onSummarizationStart: !!callbacks?.onSummarizationStart,\n onSummarizationEnd: !!callbacks?.onSummarizationEnd,\n });\n\n console.log('[Chat-Orchestrator] ✅ Chat 对话处理完成');\n return finalResult;\n }\n\n /**\n * 核心编排方法 - 处理一个预构建好的对话历史\n */\n async processConversation(\n messages: AiMessage[],\n callbacks?: SummarizationCallbacks,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>\n ): Promise<ProcessingResult> {\n this.debug('Starting conversation processing', { messageCount: messages.length });\n \n const startTime = performance.now();\n \n try {\n // 1. [解析验证] - 确保消息结构和内容的基本有效性\n const validMessages = this.parseAndValidateMessages(messages);\n this.debug('Parsed and validated messages', { validCount: validMessages.length });\n \n // 🔥 注意: 此方法现在主要由内部调用,预处理已在 processChatConversation 中完成\n // 因此,我们直接进入上下文构建\n \n // 3. [上下文构建] - 调用ContextManager在Token预算内构建最优消息组合\n const contextResult = await this.buildContext(validMessages, callbacks, generate);\n this.debug('Context built', { afterContextCount: contextResult.messages.length });\n \n if (this.options.processing.debugMode) {\n console.log('[MessageOrchestrator] DEBUG: Messages after context build:', JSON.stringify(\n contextResult.messages.map(m => ({ id: m.id, ts: m.timestamp, role: m.role, type: m.type, content: m.content.substring(0, 50) })),\n null,\n 2\n ));\n }\n \n // 4. [最终格式化] - 将内部AiMessage格式转换为外部API的ChatMessage格式\n const chatMessages = this.convertToChatMessages(contextResult.messages);\n \n const endTime = performance.now();\n const processingTime = endTime - startTime;\n \n if (this.options.processing.debugMode) {\n console.log('[MessageOrchestrator] DEBUG: Final ChatMessages for AI Engine:', JSON.stringify(\n chatMessages.map(m => ({ id: m.id, ts: m.timestamp, role: m.role, type: m.type, content: m.content.substring(0, 50) })),\n null,\n 2\n ));\n }\n \n this.debug('Processing completed', { \n processingTime: `${processingTime.toFixed(2)}ms`,\n finalMessageCount: chatMessages.length\n });\n \n // 构建处理结果\n return {\n messages: chatMessages,\n contextBuildResult: contextResult,\n metadata: {\n originalCount: messages.length,\n processedCount: chatMessages.length,\n tokenUsage: {\n estimated: contextResult.tokenUsage.used,\n budget: this.options.tokenBudget.maxTokens,\n remaining: contextResult.tokenUsage.remaining\n },\n processingStats: contextResult.processingStats,\n truncated: contextResult.truncated,\n truncatedCount: contextResult.truncatedCount\n }\n };\n \n } catch (error) {\n this.debug('Processing failed', { error });\n throw new Error(`Message processing failed: ${error}`);\n }\n }\n\n /**\n * 封装了 buildContext 和 convertToChatMessages 的逻辑\n */\n private async buildAndFinalizeContext(\n messages: AiMessage[],\n callbacks?: SummarizationCallbacks,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>\n ): Promise<ProcessingResult> {\n const contextResult = await this.buildContext(messages, callbacks, generate);\n const chatMessages = this.convertToChatMessages(contextResult.messages);\n\n return {\n messages: chatMessages,\n contextBuildResult: contextResult,\n metadata: {\n originalCount: messages.length, // 注意:这里的 originalCount 是净化后的数量\n processedCount: chatMessages.length,\n tokenUsage: {\n estimated: contextResult.tokenUsage.used,\n budget: this.options.tokenBudget.maxTokens,\n remaining: contextResult.tokenUsage.remaining\n },\n processingStats: contextResult.processingStats,\n truncated: contextResult.truncated,\n truncatedCount: contextResult.truncatedCount\n }\n };\n }\n \n /**\n * 1. 解析和验证消息 - 直接使用原始消息,不进行格式转换\n */\n private parseAndValidateMessages(messages: AiMessage[]): AiMessage[] {\n this.debug('开始解析和验证消息', { originalCount: messages.length });\n \n // 直接验证原始消息,不使用historyFormatter\n const validMessages = messages.filter(message => {\n // 结构验证\n if (!message.id || !message.role || !message.type || typeof message.content !== 'string') {\n this.debug('消息结构无效', { id: message.id, type: message.type });\n return false;\n }\n \n // 内容验证\n if (!message.content.trim()) {\n this.debug('消息内容为空', { id: message.id });\n return false;\n }\n \n return true;\n });\n \n this.debug('消息解析完成', {\n 原始消息数: messages.length,\n 验证通过: validMessages.length,\n 被过滤: messages.length - validMessages.length\n });\n \n return validMessages;\n }\n\n /**\n * 🔥 2. [预处理管道] - 运行所有注册的预处理器\n */\n private async runPreprocessorPipeline(messages: AiMessage[]): Promise<PreprocessorPipelineResult> {\n return await this.preprocessorPipeline.process(messages);\n }\n\n private resolveTokenizerModelId(request?: AgentProfileRequest): string | undefined {\n return readOptionalStringProperty(request, 'model_id')\n ?? readOptionalStringProperty(request, 'modelId')\n ?? this.options.model;\n }\n\n /**\n * 3. [上下文构建] - 调用ContextManager进行智能Token预算和消息构建\n */\n private async buildContext(\n messages: AiMessage[],\n callbacks?: SummarizationCallbacks,\n generate?: (request: GenerateRequest) => Promise<GenerateResponse>\n ): Promise<ContextBuildResult> {\n const totalBudget = this.options.tokenBudget.maxTokens - this.options.tokenBudget.reservedForResponse;\n \n // 委托给专门的上下文管理器处理\n const contextResult = await this.contextManager.buildContext(\n messages,\n totalBudget,\n callbacks,\n generate\n );\n \n if (this.options.processing.debugMode) {\n this.debug('Context build result', {\n original: contextResult.processingStats.originalCount,\n kept: contextResult.processingStats.keptCount,\n truncated: contextResult.processingStats.truncatedCount,\n strategies: contextResult.strategies.applied,\n tokenUsage: contextResult.tokenUsage,\n recommendations: contextResult.strategies.recommendations,\n buildStats: contextResult.processingStats.buildStats\n });\n }\n \n return contextResult;\n }\n\n /**\n * 4. [最终格式化] - 将内部AiMessage格式转换为外部API的ChatMessage格式\n */\n private convertToChatMessages(messages: AiMessage[]): ChatMessage[] {\n // 关键修复:使用专用的 MessageFormatter 来确保格式正确且无冗余数据\n // 🔥 Chat模式:不使用native tools,使用chat模式\n return messageFormatter.format(messages, { nativeTools: false, mode: 'chat' });\n }\n\n /**\n * 调试日志\n */\n private debug(message: string, data?: Record<string, unknown>): void {\n if (this.options.processing.debugMode) {\n console.log(`[MessageOrchestrator] ${message}`, data);\n }\n }\n\n /**\n * 更新配置\n */\n updateOptions(newOptions: Partial<OrchestratorOptions>): void {\n this.options = {\n ...this.options,\n ...newOptions,\n tokenBudget: { ...this.options.tokenBudget, ...newOptions.tokenBudget },\n processing: { ...this.options.processing, ...newOptions.processing }\n };\n \n // 同步更新上下文管理器配置\n if (newOptions.processing?.debugMode !== undefined) {\n // 这是一个示例,实际中可能需要更复杂的配置更新逻辑\n }\n this.contextManager.updateTokenizerModelId(this.options.model);\n }\n\n /**\n * 获取预算管理器 (用于高级配置) - 已更新为上下文管理器\n */\n getContextManager(): ContextManager {\n return this.contextManager;\n }\n\n /**\n * 获取预算管理状态 - 已更新为上下文管理状态\n */\n getContextInfo(): {\n config: ContextBuilderConfig;\n } {\n return {\n config: this.contextManager.getConfig()\n };\n }\n}\n\n/**\n * 🔥 工厂函数:创建默认配置的 MessageOrchestrator\n */\n","/**\n * @file src/agent/context-manager/profiles/chat/tasks/BaseConversationalTask.ts\n * \n * @brief 对话型任务的抽象基类 - 处理多轮对话场景的通用逻辑\n * \n * @description\n * BaseConversationalTask 是所有需要处理对话历史的任务的抽象基类。\n * \n * 🔥 设计理念(参考 BaseAgentTask):\n * - Task层:构建核心的、必须的消息(系统提示词 + 文档上下文 + 当前用户输入)\n * - ContextManager层:处理复杂的上下文管理、历史编排、Token优化\n * \n * 它封装了对话型任务的标准流程:\n * 1. 添加系统提示词(由子类实现)\n * 2. 添加文档上下文(如果提供)\n * 3. 添加当前用户输入(如果历史中没有用户消息)\n * 4. 附加完整的对话历史(不做任何过滤,保留所有消息包括 history_summary)\n * \n * 与工具型任务的区别:\n * - 工具型任务:使用 useSimpleProcessing=true,不处理对话历史,专注于单次请求\n * - 对话型任务:处理完整的对话上下文,支持多轮对话\n */\n\nimport type { GenerateRequest, ChatMessage } from '../contracts';\nimport { IChatTask } from './base';\n\n/**\n * 对话型任务的抽象基类\n * \n * @abstract\n * @description\n * 🔥 参考 BaseAgentTask 的轻量级设计,专注于核心消息构建\n * \n * 所有需要处理对话历史的任务都应该继承此类。\n * 该基类实现了标准的对话上下文构建流程,子类只需要实现系统提示词的获取。\n * \n * 重要特性:\n * - 不过滤任何历史消息,完整保留对话历史(包括 history_summary)\n * - 复杂的上下文管理由 ContextManager 层处理\n */\nexport abstract class BaseConversationalTask implements IChatTask {\n /**\n * 对话型任务默认使用完整处理链路(MessageOrchestrator)\n */\n readonly useSimpleProcessing = false;\n\n /**\n * 抽象方法:子类必须实现此方法来提供特定的系统提示词\n * \n * @abstract\n * @returns 系统提示词字符串\n */\n protected abstract getSystemPrompt(request: GenerateRequest): string;\n\n /**\n * 构建对话消息的标准流程\n * \n * @description\n * 🔥 参考 BaseAgentTask 的实现,实现了所有对话型任务都需要的标准流程:\n * 1. 添加系统提示词 - Task层拥有对系统指令的完全控制权\n * 2. 添加文档片段(如果有)\n * 3. 添加当前用户输入(仅当历史中没有用户消息时)\n * 4. 附加完整的对话历史(不做任何过滤,保留所有消息包括 history_summary)\n * \n * @param request 生成请求\n * @returns 构建好的消息数组\n */\n buildMessages(request: GenerateRequest): ChatMessage[] {\n const messages: ChatMessage[] = [];\n \n // 1. 添加系统提示词 - Task层拥有对系统指令的完全控制权\n const systemPrompt = this.getSystemPrompt(request);\n messages.push({\n role: 'system', \n content: systemPrompt, \n type: 'system_prompt'\n });\n\n // 2. 获取对话历史(不做任何过滤,完全参考 BaseAgentTask 的实现)\n const history: ChatMessage[] = request.conversationHistory || [];\n \n // 🔥 关键修复:检查历史中是否已包含用户消息(参考 BaseAgentTask 的逻辑)\n const hasUserMessageInHistory = history.some(m => m.role === 'user');\n \n // 3. 如果有文档片段,添加文档上下文\n const supplementalSections: string[] = [];\n const projectName = request.projectMetadata?.name?.trim();\n const projectDescription = request.projectMetadata?.description?.trim();\n const documentTitle = request.documentMetadata?.title?.trim();\n\n if (projectName || projectDescription) {\n const projectLines: string[] = [];\n if (projectName) {\n projectLines.push(`project name: ${projectName}`);\n }\n if (projectDescription) {\n projectLines.push(`project description: ${projectDescription}`);\n }\n supplementalSections.push(`<project_context>\\n${projectLines.join('\\n')}\\n</project_context>`);\n }\n\n if ((documentTitle || request.documentFragment?.trim())) {\n const documentLines: string[] = [];\n if (documentTitle) {\n documentLines.push(`document title: ${documentTitle}`);\n }\n if (request.documentFragment && request.documentFragment.trim()) {\n documentLines.push('document fragment:');\n documentLines.push(request.documentFragment.trim());\n }\n supplementalSections.push(`<document_context>\\n${documentLines.join('\\n')}\\n</document_context>`);\n }\n\n if (supplementalSections.length > 0) {\n messages.push({\n role: 'user',\n content: supplementalSections.join('\\n\\n'),\n type: 'document_fragment'\n });\n }\n \n // 4. 🔥 只有在历史中没有用户消息时,才添加当前用户输入\n // 这避免了在重复调用时添加重复的用户输入\n if (!hasUserMessageInHistory) {\n messages.push({\n role: 'user', \n content: request.prompt.trim(),\n type: 'user_input'\n });\n }\n \n // 5. 🔥 将完整的、时序正确的历史记录附加到新构建的消息后面(参考 BaseAgentTask)\n // 不做任何过滤,保留所有消息(包括 history_summary)\n // 如果存在 userQuote,则在附加前对“最后一条用户输入”进行内容重写:\n // <user_quote ...>引用内容</user_quote>\n // <user_query>用户问题</user_query>\n let finalHistory = history;\n\n if (request.userQuote && history.length > 0) {\n // 从后往前找到最后一条用户输入消息\n const lastUserIndex = [...history]\n .map((msg, idx) => ({ msg, idx }))\n .reverse()\n .find(entry => entry.msg.role === 'user' && (entry.msg.type === 'user_input' || !entry.msg.type))?.idx;\n\n if (lastUserIndex !== undefined) {\n const quote = request.userQuote;\n const source = (quote.source || {}) as Record<string, unknown>;\n const attrs: string[] = [];\n\n if (typeof source.doc_id === 'string') {\n attrs.push(`source_doc=\"${source.doc_id}\"`);\n }\n if (typeof source.block_id === 'string') {\n attrs.push(`block_id=\"${source.block_id}\"`);\n }\n if (typeof source.start === 'number') {\n attrs.push(`start=\"${source.start}\"`);\n }\n if (typeof source.end === 'number') {\n attrs.push(`end=\"${source.end}\"`);\n }\n\n const openTag = attrs.length > 0\n ? `<user_quote ${attrs.join(' ')}>`\n : '<user_quote>';\n\n const quoteText = quote.text.trim();\n const promptText = request.prompt.trim();\n\n const quoteBlock = `${openTag}\\n${quoteText}\\n</user_quote>`;\n const queryBlock = `<user_query>\\n${promptText}\\n</user_query>`;\n const combined = `${quoteBlock}\\n${queryBlock}`;\n\n finalHistory = history.slice();\n finalHistory[lastUserIndex] = {\n ...finalHistory[lastUserIndex],\n content: combined,\n };\n }\n }\n\n messages.push(...finalHistory);\n \n return messages;\n }\n\n /**\n * 默认的响应处理 - 保留完整内容包括思考过程\n * \n * @description\n * 对话型任务通常保留完整的响应内容,包括 <think> 标签,\n * 让用户看到AI的思考过程。子类可以覆盖此方法来实现特定的处理逻辑。\n * \n * @param rawResponse LLM返回的原始响应\n * @returns 处理后的响应文本\n */\n processResponse(rawResponse: string): string {\n // 默认保留完整的响应内容,包括思考过程\n return rawResponse;\n }\n\n /**\n * 默认的流式块处理 - 直接返回原块\n * \n * @description\n * 对话型任务通常直接返回原始流式块,保留所有内容包括思考过程。\n * 子类可以覆盖此方法来实现特定的处理逻辑。\n * \n * @param chunk 流式内容块\n * @returns 处理后的内容块\n */\n processStreamChunk(chunk: string): string {\n // 默认直接返回原块,保留所有内容包括思考过程\n return chunk;\n }\n}\n","import type { ChatMessage } from '../contracts';\nimport type { RuntimeEvent, AiMessage } from '../../../../contracts';\n\n/**\n * 类型守卫:检查是否为 history_summary 事件\n */\nfunction isHistorySummaryEvent(event: RuntimeEvent): event is RuntimeEvent & {\n type: 'history_summary';\n content: string;\n original_message_count?: number;\n compression_ratio?: number;\n generated_by?: string;\n included_old_summary?: boolean;\n replaced_message_ids?: string[];\n summary_seq?: number;\n} {\n return 'type' in event && event.type === 'history_summary';\n}\n\n/**\n * 将 RuntimeEvent 转换为 ChatMessage\n * (供 HistoryBuilder 使用,用于 Chat 模式的历史构建)\n */\nexport function convertEventToChatMessage(event: RuntimeEvent): ChatMessage | null {\n console.debug('[Chat-eventConverter] 🛈 Incoming event', {\n id: event.id,\n type: event.type,\n hasMetadata: !!event.metadata,\n metadataKeys: event.metadata ? Object.keys(event.metadata) : [],\n });\n // 处理 history_summary (使用类型守卫)\n if (isHistorySummaryEvent(event)) {\n return {\n role: 'system',\n content: event.content || '',\n type: 'history_summary',\n id: event.id,\n timestamp: event.timestamp,\n metadata: {\n messageType: 'summary',\n originalMessageCount: event.original_message_count,\n compressionRatio: event.compression_ratio,\n generatedBy: event.generated_by,\n includedOldSummary: event.included_old_summary,\n replacedMessageIds: event.replaced_message_ids,\n summarySeq: event.summary_seq,\n }\n };\n }\n \n switch (event.type) {\n case 'user_input': {\n if (!event.content) return null;\n const metadata = event.metadata ? { ...event.metadata } : undefined;\n return {\n role: 'user',\n content: String(event.content),\n type: 'user_input',\n id: event.id, // 🔥 保留 ID,用于历史净化的范围定位\n timestamp: event.timestamp,\n ...(metadata ? { metadata } : {}),\n };\n }\n \n case 'thought': {\n if (!event.content) return null;\n const metadata = event.metadata ? { ...event.metadata } : undefined;\n return {\n role: 'assistant',\n content: String(event.content),\n type: 'thought',\n id: event.id, // 🔥 保留 ID\n timestamp: event.timestamp,\n ...(metadata ? { metadata } : {}),\n };\n }\n \n case 'final_answer': {\n if (!event.content) return null;\n const metadata = event.metadata ? { ...event.metadata } : undefined;\n return {\n role: 'assistant',\n content: String(event.content),\n type: 'final_answer',\n id: event.id, // 🔥 保留 ID\n timestamp: event.timestamp,\n ...(metadata ? { metadata } : {}),\n };\n }\n \n // 🔥 Chat 模式下跳过工具调用事件(tool_call_decision / tool_process / tool_output)\n // 这些事件没有对应的 ChatMessage type,且 Chat 模式不需要展示工具调用细节\n case 'tool_call_decision':\n case 'tool_process':\n case 'tool_output':\n return null;\n\n // 🔥 UI-only 子过程过程流:即使落库也不进入 Chat 历史消息\n case 'subrun_trace':\n return null;\n \n default:\n // 对于未知类型,返回 null\n console.warn(`[Chat-eventConverter] Unsupported event type: ${event.type}`);\n return null;\n }\n}\n\n/**\n * 批量转换 RuntimeEvent 数组为 ChatMessage 数组\n * (用于 Chat 模式的历史构建)\n */\nexport function convertEventsToChatMessages(events: RuntimeEvent[]): ChatMessage[] {\n const messages: ChatMessage[] = [];\n \n for (const event of events) {\n const message = convertEventToChatMessage(event);\n if (message) {\n messages.push(message);\n console.debug('[Chat-eventConverter] ✅ Converted event', {\n id: event.id,\n type: event.type,\n metadataKeys: message.metadata ? Object.keys(message.metadata) : [],\n });\n }\n }\n \n return messages;\n}\n\n/**\n * 将 ChatMessage 转换为 AiMessage\n * (用于将 ChatMessage 转换为内部使用的 AiMessage 格式)\n */\nexport function chatMessageToAiMessage(message: ChatMessage, options?: { id?: string; timestamp?: number }): AiMessage {\n return {\n id: message.id || options?.id || `msg-${Date.now()}`,\n role: message.role,\n type: message.type || 'final_answer',\n content: message.content,\n timestamp: message.timestamp || options?.timestamp || Date.now(),\n ...(message.metadata && { metadata: message.metadata })\n } as AiMessage;\n}\n"]}