@downcity/agent 1.1.430 → 1.1.437
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.
- package/README.md +13 -11
- package/bin/agent/Agent.d.ts +3 -3
- package/bin/agent/Agent.d.ts.map +1 -1
- package/bin/agent/Agent.js +38 -8
- package/bin/agent/Agent.js.map +1 -1
- package/bin/agent/AgentInstructions.js +2 -2
- package/bin/agent/AgentInstructions.js.map +1 -1
- package/bin/agent/AgentMemoryStorage.d.ts.map +1 -1
- package/bin/agent/AgentMemoryStorage.js +1 -0
- package/bin/agent/AgentMemoryStorage.js.map +1 -1
- package/bin/agent/AgentSessions.d.ts +5 -1
- package/bin/agent/AgentSessions.d.ts.map +1 -1
- package/bin/agent/AgentSessions.js +17 -9
- package/bin/agent/AgentSessions.js.map +1 -1
- package/bin/executor/Executor.d.ts +9 -27
- package/bin/executor/Executor.d.ts.map +1 -1
- package/bin/executor/Executor.js +32 -127
- package/bin/executor/Executor.js.map +1 -1
- package/bin/executor/composer/system/default/SystemPromptAssets.d.ts +0 -4
- package/bin/executor/composer/system/default/SystemPromptAssets.d.ts.map +1 -1
- package/bin/executor/composer/system/default/SystemPromptAssets.js +0 -5
- package/bin/executor/composer/system/default/SystemPromptAssets.js.map +1 -1
- package/bin/executor/core-engine/CoreEngineContextCompaction.d.ts +3 -9
- package/bin/executor/core-engine/CoreEngineContextCompaction.d.ts.map +1 -1
- package/bin/executor/core-engine/CoreEngineContextCompaction.js +4 -130
- package/bin/executor/core-engine/CoreEngineContextCompaction.js.map +1 -1
- package/bin/executor/core-engine/CoreEngineRunner.d.ts +3 -30
- package/bin/executor/core-engine/CoreEngineRunner.d.ts.map +1 -1
- package/bin/executor/core-engine/CoreEngineRunner.js +38 -194
- package/bin/executor/core-engine/CoreEngineRunner.js.map +1 -1
- package/bin/executor/core-engine/CoreEngineSignals.d.ts +6 -6
- package/bin/executor/core-engine/CoreEngineSignals.d.ts.map +1 -1
- package/bin/executor/core-engine/CoreEngineSignals.js +1 -1
- package/bin/executor/core-engine/CoreEngineSignals.js.map +1 -1
- package/bin/executor/messages/SessionAttachmentMapper.d.ts +2 -2
- package/bin/executor/messages/SessionAttachmentMapper.d.ts.map +1 -1
- package/bin/executor/messages/SessionAttachmentMapper.js.map +1 -1
- package/bin/executor/messages/SessionMessageLog.d.ts +3 -3
- package/bin/executor/messages/SessionMessageLog.d.ts.map +1 -1
- package/bin/executor/messages/SessionMessageLog.js.map +1 -1
- package/bin/executor/messages/SessionModelMessages.d.ts +0 -3
- package/bin/executor/messages/SessionModelMessages.d.ts.map +1 -1
- package/bin/executor/messages/SessionModelMessages.js +80 -97
- package/bin/executor/messages/SessionModelMessages.js.map +1 -1
- package/bin/executor/model/ModelStepRunner.d.ts +2 -6
- package/bin/executor/model/ModelStepRunner.d.ts.map +1 -1
- package/bin/executor/model/ModelStepRunner.js +0 -28
- package/bin/executor/model/ModelStepRunner.js.map +1 -1
- package/bin/executor/services/ExecutorRecoveryPolicy.d.ts +7 -64
- package/bin/executor/services/ExecutorRecoveryPolicy.d.ts.map +1 -1
- package/bin/executor/services/ExecutorRecoveryPolicy.js +29 -45
- package/bin/executor/services/ExecutorRecoveryPolicy.js.map +1 -1
- package/bin/executor/types/SessionHistoryMeta.d.ts +1 -3
- package/bin/executor/types/SessionHistoryMeta.d.ts.map +1 -1
- package/bin/executor/types/SessionHistoryMeta.js +1 -1
- package/bin/index.d.ts +9 -13
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +2 -4
- package/bin/index.js.map +1 -1
- package/bin/session/DefaultSessionComposer.d.ts +13 -7
- package/bin/session/DefaultSessionComposer.d.ts.map +1 -1
- package/bin/session/DefaultSessionComposer.js +26 -21
- package/bin/session/DefaultSessionComposer.js.map +1 -1
- package/bin/session/Session.d.ts +12 -19
- package/bin/session/Session.d.ts.map +1 -1
- package/bin/session/Session.js +70 -202
- package/bin/session/Session.js.map +1 -1
- package/bin/session/SessionComposition.d.ts +0 -2
- package/bin/session/SessionComposition.d.ts.map +1 -1
- package/bin/session/SessionComposition.js +30 -54
- package/bin/session/SessionComposition.js.map +1 -1
- package/bin/session/SessionLoop.d.ts +17 -16
- package/bin/session/SessionLoop.d.ts.map +1 -1
- package/bin/session/SessionLoop.js +217 -320
- package/bin/session/SessionLoop.js.map +1 -1
- package/bin/session/SessionMessages.d.ts +52 -44
- package/bin/session/SessionMessages.d.ts.map +1 -1
- package/bin/session/SessionMessages.js +285 -187
- package/bin/session/SessionMessages.js.map +1 -1
- package/bin/session/SessionQueue.d.ts +1 -1
- package/bin/session/SessionQueue.d.ts.map +1 -1
- package/bin/session/SessionQueue.js +2 -1
- package/bin/session/SessionQueue.js.map +1 -1
- package/bin/session/SessionState.d.ts +3 -7
- package/bin/session/SessionState.d.ts.map +1 -1
- package/bin/session/SessionState.js +50 -89
- package/bin/session/SessionState.js.map +1 -1
- package/bin/session/SessionSystem.d.ts +5 -1
- package/bin/session/SessionSystem.d.ts.map +1 -1
- package/bin/session/SessionSystem.js +40 -0
- package/bin/session/SessionSystem.js.map +1 -1
- package/bin/session/SessionTitle.d.ts +3 -3
- package/bin/session/SessionTitle.d.ts.map +1 -1
- package/bin/session/SessionTitle.js +2 -2
- package/bin/session/browse/Browse.d.ts +32 -46
- package/bin/session/browse/Browse.d.ts.map +1 -1
- package/bin/session/browse/Browse.js +104 -360
- package/bin/session/browse/Browse.js.map +1 -1
- package/bin/session/browse/SessionMessageTimeline.d.ts.map +1 -1
- package/bin/session/browse/SessionMessageTimeline.js +61 -37
- package/bin/session/browse/SessionMessageTimeline.js.map +1 -1
- package/bin/session/composer/policies/AdaptivePartContextPolicy.d.ts +35 -0
- package/bin/session/composer/policies/AdaptivePartContextPolicy.d.ts.map +1 -0
- package/bin/session/composer/policies/AdaptivePartContextPolicy.js +256 -0
- package/bin/session/composer/policies/AdaptivePartContextPolicy.js.map +1 -0
- package/bin/session/composer/policies/FullHistoryContextPolicy.d.ts +24 -0
- package/bin/session/composer/policies/FullHistoryContextPolicy.d.ts.map +1 -0
- package/bin/session/composer/policies/FullHistoryContextPolicy.js +31 -0
- package/bin/session/composer/policies/FullHistoryContextPolicy.js.map +1 -0
- package/bin/session/composer/policies/SessionSummaryPrompts.d.ts +16 -0
- package/bin/session/composer/policies/SessionSummaryPrompts.d.ts.map +1 -0
- package/bin/session/composer/policies/SessionSummaryPrompts.js +32 -0
- package/bin/session/composer/policies/SessionSummaryPrompts.js.map +1 -0
- package/bin/session/execution/SessionAssistantOutputAdapter.d.ts +15 -4
- package/bin/session/execution/SessionAssistantOutputAdapter.d.ts.map +1 -1
- package/bin/session/execution/SessionAssistantOutputAdapter.js +7 -3
- package/bin/session/execution/SessionAssistantOutputAdapter.js.map +1 -1
- package/bin/session/messages/{SessionActionMessageWriter.d.ts → SessionAgentActionPartWriter.d.ts} +7 -7
- package/bin/session/messages/SessionAgentActionPartWriter.d.ts.map +1 -0
- package/bin/session/messages/{SessionActionMessageWriter.js → SessionAgentActionPartWriter.js} +7 -7
- package/bin/session/messages/SessionAgentActionPartWriter.js.map +1 -0
- package/bin/session/messages/SessionAgentContent.d.ts +10 -0
- package/bin/session/messages/SessionAgentContent.d.ts.map +1 -0
- package/bin/session/messages/SessionAgentContent.js +44 -0
- package/bin/session/messages/SessionAgentContent.js.map +1 -0
- package/bin/session/messages/SessionAgentMessageState.d.ts +50 -0
- package/bin/session/messages/SessionAgentMessageState.d.ts.map +1 -0
- package/bin/session/messages/SessionAgentMessageState.js +283 -0
- package/bin/session/messages/SessionAgentMessageState.js.map +1 -0
- package/bin/session/messages/{SessionAssistantMessageWriter.d.ts → SessionAgentMessageWriter.d.ts} +22 -8
- package/bin/session/messages/SessionAgentMessageWriter.d.ts.map +1 -0
- package/bin/session/messages/{SessionAssistantMessageWriter.js → SessionAgentMessageWriter.js} +54 -42
- package/bin/session/messages/SessionAgentMessageWriter.js.map +1 -0
- package/bin/session/messages/SessionForkMessageFiles.d.ts +11 -0
- package/bin/session/messages/SessionForkMessageFiles.d.ts.map +1 -1
- package/bin/session/messages/SessionForkMessageFiles.js +8 -2
- package/bin/session/messages/SessionForkMessageFiles.js.map +1 -1
- package/bin/session/messages/SessionMessageInteractionWriter.d.ts +6 -6
- package/bin/session/messages/SessionMessageInteractionWriter.d.ts.map +1 -1
- package/bin/session/messages/SessionMessageInteractionWriter.js +4 -4
- package/bin/session/messages/SessionMessageInteractionWriter.js.map +1 -1
- package/bin/session/messages/SessionMessageText.d.ts +3 -3
- package/bin/session/messages/SessionMessageText.d.ts.map +1 -1
- package/bin/session/messages/SessionMessageText.js +0 -2
- package/bin/session/messages/SessionMessageText.js.map +1 -1
- package/bin/session/messages/SessionTurnFileDiffData.d.ts +3 -3
- package/bin/session/messages/SessionTurnFileDiffData.d.ts.map +1 -1
- package/bin/session/messages/SessionTurnFileDiffData.js.map +1 -1
- package/bin/session/messages/SessionUserMessage.d.ts +3 -3
- package/bin/session/messages/SessionUserMessage.d.ts.map +1 -1
- package/bin/session/messages/SessionUserMessage.js +6 -3
- package/bin/session/messages/SessionUserMessage.js.map +1 -1
- package/bin/session/preview/SessionMessagePreview.d.ts.map +1 -1
- package/bin/session/preview/SessionMessagePreview.js +25 -9
- package/bin/session/preview/SessionMessagePreview.js.map +1 -1
- package/bin/session/runtime/SessionTurnCompletion.d.ts +15 -0
- package/bin/session/runtime/SessionTurnCompletion.d.ts.map +1 -0
- package/bin/session/runtime/SessionTurnCompletion.js +126 -0
- package/bin/session/runtime/SessionTurnCompletion.js.map +1 -0
- package/bin/session/runtime/SessionTurnContext.d.ts.map +1 -1
- package/bin/session/runtime/SessionTurnContext.js +14 -19
- package/bin/session/runtime/SessionTurnContext.js.map +1 -1
- package/bin/session/runtime/SessionTurnFileDiff.d.ts +12 -0
- package/bin/session/runtime/SessionTurnFileDiff.d.ts.map +1 -0
- package/bin/session/runtime/SessionTurnFileDiff.js +71 -0
- package/bin/session/runtime/SessionTurnFileDiff.js.map +1 -0
- package/bin/session/storage/LocalSessionDataStore.d.ts +6 -41
- package/bin/session/storage/LocalSessionDataStore.d.ts.map +1 -1
- package/bin/session/storage/LocalSessionDataStore.js +19 -101
- package/bin/session/storage/LocalSessionDataStore.js.map +1 -1
- package/bin/session/storage/LocalSessionStore.d.ts +13 -5
- package/bin/session/storage/LocalSessionStore.d.ts.map +1 -1
- package/bin/session/storage/LocalSessionStore.js +153 -30
- package/bin/session/storage/LocalSessionStore.js.map +1 -1
- package/bin/session/storage/LocalStorePaths.d.ts +4 -16
- package/bin/session/storage/LocalStorePaths.d.ts.map +1 -1
- package/bin/session/storage/LocalStorePaths.js +7 -31
- package/bin/session/storage/LocalStorePaths.js.map +1 -1
- package/bin/session/storage/Metadata.d.ts +4 -4
- package/bin/session/storage/Metadata.d.ts.map +1 -1
- package/bin/session/storage/Metadata.js +3 -11
- package/bin/session/storage/Metadata.js.map +1 -1
- package/bin/session/storage/RuntimeSessionPort.d.ts +4 -4
- package/bin/session/storage/RuntimeSessionPort.d.ts.map +1 -1
- package/bin/session/storage/RuntimeSessionPort.js +3 -3
- package/bin/session/storage/RuntimeSessionPort.js.map +1 -1
- package/bin/session/storage/SessionStorageCodec.d.ts +59 -0
- package/bin/session/storage/SessionStorageCodec.d.ts.map +1 -0
- package/bin/session/storage/SessionStorageCodec.js +331 -0
- package/bin/session/storage/SessionStorageCodec.js.map +1 -0
- package/bin/session/storage/SessionStorageSchema.d.ts +11 -0
- package/bin/session/storage/SessionStorageSchema.d.ts.map +1 -0
- package/bin/session/storage/SessionStorageSchema.js +131 -0
- package/bin/session/storage/SessionStorageSchema.js.map +1 -0
- package/bin/session/storage/SqliteSessionStorage.d.ts +120 -0
- package/bin/session/storage/SqliteSessionStorage.d.ts.map +1 -0
- package/bin/session/storage/SqliteSessionStorage.js +581 -0
- package/bin/session/storage/SqliteSessionStorage.js.map +1 -0
- package/bin/tools/ask/AskQuestionsTool.d.ts.map +1 -1
- package/bin/tools/ask/AskQuestionsTool.js +3 -1
- package/bin/tools/ask/AskQuestionsTool.js.map +1 -1
- package/bin/types/action/ActionResult.d.ts +9 -9
- package/bin/types/action/ActionResult.d.ts.map +1 -1
- package/bin/types/action/ActionResult.js +1 -1
- package/bin/types/agent/AgentOptions.d.ts +10 -0
- package/bin/types/agent/AgentOptions.d.ts.map +1 -1
- package/bin/types/agent/AgentStorage.d.ts +3 -1
- package/bin/types/agent/AgentStorage.d.ts.map +1 -1
- package/bin/types/agent/SessionActor.d.ts +0 -9
- package/bin/types/agent/SessionActor.d.ts.map +1 -1
- package/bin/types/agent/SessionTypes.d.ts +5 -5
- package/bin/types/agent/SessionTypes.d.ts.map +1 -1
- package/bin/types/executor/SessionAssistantOutput.d.ts +15 -4
- package/bin/types/executor/SessionAssistantOutput.d.ts.map +1 -1
- package/bin/types/executor/SessionTurnContext.d.ts +17 -19
- package/bin/types/executor/SessionTurnContext.d.ts.map +1 -1
- package/bin/types/sdk/AgentSessionAction.d.ts +1 -1
- package/bin/types/sdk/AgentSessionAction.js +1 -1
- package/bin/types/sdk/AgentSessionPrompt.d.ts +14 -5
- package/bin/types/sdk/AgentSessionPrompt.d.ts.map +1 -1
- package/bin/types/sdk/AgentSessionPrompt.js +1 -1
- package/bin/types/sdk/AgentSessionPrompt.js.map +1 -1
- package/bin/types/session/AdaptivePartContextPolicy.d.ts +31 -0
- package/bin/types/session/AdaptivePartContextPolicy.d.ts.map +1 -0
- package/bin/types/session/AdaptivePartContextPolicy.js +7 -0
- package/bin/types/session/AdaptivePartContextPolicy.js.map +1 -0
- package/bin/types/session/{SessionAssistantMessageState.d.ts → SessionAgentMessageState.d.ts} +7 -7
- package/bin/types/session/SessionAgentMessageState.d.ts.map +1 -0
- package/bin/types/session/{SessionAssistantMessageState.js → SessionAgentMessageState.js} +1 -1
- package/bin/types/session/SessionAgentMessageState.js.map +1 -0
- package/bin/types/session/SessionCommand.d.ts +19 -7
- package/bin/types/session/SessionCommand.d.ts.map +1 -1
- package/bin/types/session/SessionComposer.d.ts +43 -43
- package/bin/types/session/SessionComposer.d.ts.map +1 -1
- package/bin/types/session/SessionComposer.js +2 -2
- package/bin/types/session/SessionComposition.d.ts +2 -5
- package/bin/types/session/SessionComposition.d.ts.map +1 -1
- package/bin/types/session/SessionContextPolicy.d.ts +70 -0
- package/bin/types/session/SessionContextPolicy.d.ts.map +1 -0
- package/bin/types/session/SessionContextPolicy.js +8 -0
- package/bin/types/session/SessionContextPolicy.js.map +1 -0
- package/bin/types/session/SessionExecution.d.ts +5 -32
- package/bin/types/session/SessionExecution.d.ts.map +1 -1
- package/bin/types/session/SessionLoop.d.ts +3 -5
- package/bin/types/session/SessionLoop.d.ts.map +1 -1
- package/bin/types/session/SessionMessages.d.ts +18 -28
- package/bin/types/session/SessionMessages.d.ts.map +1 -1
- package/bin/types/session/SessionOptions.d.ts +5 -5
- package/bin/types/session/SessionOptions.d.ts.map +1 -1
- package/bin/types/session/SessionPort.d.ts +8 -9
- package/bin/types/session/SessionPort.d.ts.map +1 -1
- package/bin/types/session/SessionState.d.ts +2 -5
- package/bin/types/session/SessionState.d.ts.map +1 -1
- package/bin/types/session/SessionSystem.d.ts +14 -0
- package/bin/types/session/SessionSystem.d.ts.map +1 -1
- package/bin/types/session/SessionTool.d.ts +2 -2
- package/bin/types/session/SessionTool.d.ts.map +1 -1
- package/bin/types/session/SessionTurnCompletion.d.ts +23 -0
- package/bin/types/session/SessionTurnCompletion.d.ts.map +1 -0
- package/bin/types/session/SessionTurnCompletion.js +8 -0
- package/bin/types/session/SessionTurnCompletion.js.map +1 -0
- package/bin/types/session/SessionTurnFileDiff.d.ts +42 -0
- package/bin/types/session/SessionTurnFileDiff.d.ts.map +1 -0
- package/bin/types/session/SessionTurnFileDiff.js +8 -0
- package/bin/types/session/SessionTurnFileDiff.js.map +1 -0
- package/bin/types/store/LocalStore.d.ts +6 -13
- package/bin/types/store/LocalStore.d.ts.map +1 -1
- package/bin/types/store/LocalStore.js +1 -1
- package/bin/types/store/SessionStorage.d.ts +103 -0
- package/bin/types/store/SessionStorage.d.ts.map +1 -0
- package/bin/types/store/SessionStorage.js +8 -0
- package/bin/types/store/SessionStorage.js.map +1 -0
- package/bin/types/store/SessionStore.d.ts +5 -3
- package/bin/types/store/SessionStore.d.ts.map +1 -1
- package/package.json +2 -2
- package/scripts/core-engine-context-compaction.test.mjs +96 -219
- package/scripts/core-engine-model-stream.test.mjs +2 -4
- package/scripts/executor-failure-result.test.mjs +14 -17
- package/scripts/session-agent-message-part-order.test.mjs +63 -0
- package/scripts/session-initialization.test.mjs +141 -0
- package/scripts/session-message-timeline.test.mjs +5 -6
- package/scripts/session-messages-error-part.test.mjs +175 -0
- package/scripts/session-messages-error.test.mjs +47 -6
- package/scripts/session-prompt-idempotency.test.mjs +91 -0
- package/scripts/session-queue.test.mjs +13 -12
- package/scripts/session-storage-sqlite.test.mjs +209 -0
- package/scripts/session-turn-context.test.mjs +21 -33
- package/src/agent/Agent.ts +48 -12
- package/src/agent/AgentInstructions.ts +2 -2
- package/src/agent/AgentMemoryStorage.ts +1 -0
- package/src/agent/AgentSessions.ts +31 -12
- package/src/executor/Executor.ts +47 -184
- package/src/executor/README.md +12 -13
- package/src/executor/composer/system/default/SystemPromptAssets.ts +0 -6
- package/src/executor/core-engine/CoreEngineContextCompaction.ts +3 -135
- package/src/executor/core-engine/CoreEngineRunner.ts +51 -273
- package/src/executor/core-engine/CoreEngineSignals.ts +9 -9
- package/src/executor/messages/SessionAttachmentMapper.ts +4 -4
- package/src/executor/messages/SessionMessageLog.ts +3 -3
- package/src/executor/messages/SessionModelMessages.ts +85 -103
- package/src/executor/model/ModelStepRunner.ts +9 -41
- package/src/executor/services/ExecutorRecoveryPolicy.ts +34 -127
- package/src/executor/types/SessionHistoryMeta.ts +1 -3
- package/src/index.ts +39 -47
- package/src/session/DefaultSessionComposer.ts +33 -30
- package/src/session/Session.ts +96 -227
- package/src/session/SessionComposition.ts +28 -65
- package/src/session/SessionLoop.ts +267 -370
- package/src/session/SessionMessages.ts +363 -242
- package/src/session/SessionQueue.ts +3 -2
- package/src/session/SessionState.ts +55 -101
- package/src/session/SessionSystem.ts +51 -1
- package/src/session/SessionTitle.ts +4 -4
- package/src/session/browse/Browse.ts +182 -468
- package/src/session/browse/SessionMessageTimeline.ts +63 -38
- package/src/session/composer/policies/AdaptivePartContextPolicy.ts +307 -0
- package/src/session/composer/policies/FullHistoryContextPolicy.ts +36 -0
- package/src/session/composer/policies/SessionSummaryPrompts.ts +42 -0
- package/src/session/execution/SessionAssistantOutputAdapter.ts +25 -11
- package/src/session/messages/{SessionActionMessageWriter.ts → SessionAgentActionPartWriter.ts} +8 -8
- package/src/session/messages/SessionAgentContent.ts +56 -0
- package/src/session/messages/SessionAgentMessageState.ts +378 -0
- package/src/session/messages/{SessionAssistantMessageWriter.ts → SessionAgentMessageWriter.ts} +89 -60
- package/src/session/messages/SessionForkMessageFiles.ts +25 -1
- package/src/session/messages/SessionMessageInteractionWriter.ts +19 -19
- package/src/session/messages/SessionMessageText.ts +3 -4
- package/src/session/messages/SessionTurnFileDiffData.ts +3 -3
- package/src/session/messages/SessionUserMessage.ts +10 -7
- package/src/session/preview/SessionMessagePreview.ts +26 -9
- package/src/session/runtime/SessionTurnCompletion.ts +159 -0
- package/src/session/runtime/SessionTurnContext.ts +20 -21
- package/src/session/runtime/SessionTurnFileDiff.ts +105 -0
- package/src/session/storage/LocalSessionDataStore.ts +27 -176
- package/src/session/storage/LocalSessionStore.ts +170 -38
- package/src/session/storage/LocalStorePaths.ts +14 -86
- package/src/session/storage/Metadata.ts +4 -13
- package/src/session/storage/RuntimeSessionPort.ts +7 -7
- package/src/session/storage/SessionStorageCodec.ts +465 -0
- package/src/session/storage/SessionStorageSchema.ts +132 -0
- package/src/session/storage/SqliteSessionStorage.ts +776 -0
- package/src/tools/ask/AskQuestionsTool.ts +3 -1
- package/src/types/action/ActionResult.ts +10 -10
- package/src/types/agent/AgentOptions.ts +11 -0
- package/src/types/agent/AgentStorage.ts +3 -1
- package/src/types/agent/SessionActor.ts +0 -10
- package/src/types/agent/SessionTypes.ts +5 -5
- package/src/types/executor/SessionAssistantOutput.ts +15 -4
- package/src/types/executor/SessionTurnContext.ts +25 -22
- package/src/types/sdk/AgentSessionAction.ts +1 -1
- package/src/types/sdk/AgentSessionPrompt.ts +15 -5
- package/src/types/session/AdaptivePartContextPolicy.ts +37 -0
- package/src/types/session/{SessionAssistantMessageState.ts → SessionAgentMessageState.ts} +6 -6
- package/src/types/session/SessionCommand.ts +21 -7
- package/src/types/session/SessionComposer.ts +48 -48
- package/src/types/session/SessionComposition.ts +2 -5
- package/src/types/session/SessionContextPolicy.ts +77 -0
- package/src/types/session/SessionExecution.ts +11 -36
- package/src/types/session/SessionLoop.ts +3 -8
- package/src/types/session/SessionMessages.ts +19 -29
- package/src/types/session/SessionOptions.ts +5 -5
- package/src/types/session/SessionPort.ts +10 -10
- package/src/types/session/SessionState.ts +2 -5
- package/src/types/session/SessionSystem.ts +19 -0
- package/src/types/session/SessionTool.ts +2 -2
- package/src/types/session/SessionTurnCompletion.ts +24 -0
- package/src/types/session/SessionTurnFileDiff.ts +44 -0
- package/src/types/store/LocalStore.ts +6 -14
- package/src/types/store/SessionStorage.ts +121 -0
- package/src/types/store/SessionStore.ts +6 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.d.ts +0 -45
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.d.ts.map +0 -1
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.js +0 -144
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.js.map +0 -1
- package/bin/executor/composer/system/SessionSystemComposer.d.ts +0 -23
- package/bin/executor/composer/system/SessionSystemComposer.d.ts.map +0 -1
- package/bin/executor/composer/system/SessionSystemComposer.js +0 -9
- package/bin/executor/composer/system/SessionSystemComposer.js.map +0 -1
- package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts +0 -43
- package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts.map +0 -1
- package/bin/executor/composer/system/default/DefaultSessionSystemComposer.js +0 -42
- package/bin/executor/composer/system/default/DefaultSessionSystemComposer.js.map +0 -1
- package/bin/executor/composer/system/default/PromptRenderer.d.ts +0 -35
- package/bin/executor/composer/system/default/PromptRenderer.d.ts.map +0 -1
- package/bin/executor/composer/system/default/PromptRenderer.js +0 -23
- package/bin/executor/composer/system/default/PromptRenderer.js.map +0 -1
- package/bin/executor/composer/system/default/SystemDomain.d.ts +0 -151
- package/bin/executor/composer/system/default/SystemDomain.d.ts.map +0 -1
- package/bin/executor/composer/system/default/SystemDomain.js +0 -162
- package/bin/executor/composer/system/default/SystemDomain.js.map +0 -1
- package/bin/executor/composer/system/default/assets/task.prompt.d.ts +0 -7
- package/bin/executor/composer/system/default/assets/task.prompt.d.ts.map +0 -1
- package/bin/executor/composer/system/default/assets/task.prompt.js +0 -8
- package/bin/executor/composer/system/default/assets/task.prompt.js.map +0 -1
- package/bin/executor/composer/system/default/variables/GeoContext.d.ts +0 -14
- package/bin/executor/composer/system/default/variables/GeoContext.d.ts.map +0 -1
- package/bin/executor/composer/system/default/variables/GeoContext.js +0 -150
- package/bin/executor/composer/system/default/variables/GeoContext.js.map +0 -1
- package/bin/executor/composer/system/default/variables/PromptTypes.d.ts +0 -36
- package/bin/executor/composer/system/default/variables/PromptTypes.d.ts.map +0 -1
- package/bin/executor/composer/system/default/variables/PromptTypes.js +0 -9
- package/bin/executor/composer/system/default/variables/PromptTypes.js.map +0 -1
- package/bin/executor/composer/system/default/variables/VariableReplacer.d.ts +0 -61
- package/bin/executor/composer/system/default/variables/VariableReplacer.d.ts.map +0 -1
- package/bin/executor/composer/system/default/variables/VariableReplacer.js +0 -93
- package/bin/executor/composer/system/default/variables/VariableReplacer.js.map +0 -1
- package/bin/executor/core-engine/CoreEngineMessageState.d.ts +0 -63
- package/bin/executor/core-engine/CoreEngineMessageState.d.ts.map +0 -1
- package/bin/executor/core-engine/CoreEngineMessageState.js +0 -81
- package/bin/executor/core-engine/CoreEngineMessageState.js.map +0 -1
- package/bin/session/SessionCommand.d.ts +0 -24
- package/bin/session/SessionCommand.d.ts.map +0 -1
- package/bin/session/SessionCommand.js +0 -35
- package/bin/session/SessionCommand.js.map +0 -1
- package/bin/session/messages/SessionActionMessageWriter.d.ts.map +0 -1
- package/bin/session/messages/SessionActionMessageWriter.js.map +0 -1
- package/bin/session/messages/SessionAssistantMessageState.d.ts +0 -49
- package/bin/session/messages/SessionAssistantMessageState.d.ts.map +0 -1
- package/bin/session/messages/SessionAssistantMessageState.js +0 -296
- package/bin/session/messages/SessionAssistantMessageState.js.map +0 -1
- package/bin/session/messages/SessionAssistantMessageWriter.d.ts.map +0 -1
- package/bin/session/messages/SessionAssistantMessageWriter.js.map +0 -1
- package/bin/session/messages/SessionMessageCompaction.d.ts +0 -29
- package/bin/session/messages/SessionMessageCompaction.d.ts.map +0 -1
- package/bin/session/messages/SessionMessageCompaction.js +0 -128
- package/bin/session/messages/SessionMessageCompaction.js.map +0 -1
- package/bin/session/runtime/SessionCompactOperation.d.ts +0 -29
- package/bin/session/runtime/SessionCompactOperation.d.ts.map +0 -1
- package/bin/session/runtime/SessionCompactOperation.js +0 -66
- package/bin/session/runtime/SessionCompactOperation.js.map +0 -1
- package/bin/session/runtime/SessionHistoryCompaction.d.ts +0 -22
- package/bin/session/runtime/SessionHistoryCompaction.d.ts.map +0 -1
- package/bin/session/runtime/SessionHistoryCompaction.js +0 -31
- package/bin/session/runtime/SessionHistoryCompaction.js.map +0 -1
- package/bin/session/storage/JsonlSessionMessageStore.d.ts +0 -77
- package/bin/session/storage/JsonlSessionMessageStore.d.ts.map +0 -1
- package/bin/session/storage/JsonlSessionMessageStore.js +0 -419
- package/bin/session/storage/JsonlSessionMessageStore.js.map +0 -1
- package/bin/session/storage/SessionMessageStoreFactory.d.ts +0 -12
- package/bin/session/storage/SessionMessageStoreFactory.d.ts.map +0 -1
- package/bin/session/storage/SessionMessageStoreFactory.js +0 -13
- package/bin/session/storage/SessionMessageStoreFactory.js.map +0 -1
- package/bin/types/common/Template.d.ts +0 -9
- package/bin/types/common/Template.d.ts.map +0 -1
- package/bin/types/common/Template.js +0 -9
- package/bin/types/common/Template.js.map +0 -1
- package/bin/types/sdk/AgentSessionCompact.d.ts +0 -30
- package/bin/types/sdk/AgentSessionCompact.d.ts.map +0 -1
- package/bin/types/sdk/AgentSessionCompact.js +0 -8
- package/bin/types/sdk/AgentSessionCompact.js.map +0 -1
- package/bin/types/session/SessionAssistantMessageState.d.ts.map +0 -1
- package/bin/types/session/SessionAssistantMessageState.js.map +0 -1
- package/bin/types/session/SessionSegment.d.ts +0 -57
- package/bin/types/session/SessionSegment.d.ts.map +0 -1
- package/bin/types/session/SessionSegment.js +0 -8
- package/bin/types/session/SessionSegment.js.map +0 -1
- package/bin/types/store/SessionDataStore.d.ts +0 -88
- package/bin/types/store/SessionDataStore.d.ts.map +0 -1
- package/bin/types/store/SessionDataStore.js +0 -9
- package/bin/types/store/SessionDataStore.js.map +0 -1
- package/bin/utils/Template.d.ts +0 -17
- package/bin/utils/Template.d.ts.map +0 -1
- package/bin/utils/Template.js +0 -24
- package/bin/utils/Template.js.map +0 -1
- package/scripts/session-compaction-prompts.test.mjs +0 -49
- package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionPrompts.ts +0 -162
- package/src/executor/composer/system/SessionSystemComposer.ts +0 -25
- package/src/executor/composer/system/default/DefaultSessionSystemComposer.ts +0 -76
- package/src/executor/composer/system/default/PromptRenderer.ts +0 -52
- package/src/executor/composer/system/default/SystemDomain.ts +0 -301
- package/src/executor/composer/system/default/assets/task.prompt.ts +0 -9
- package/src/executor/composer/system/default/assets/task.prompt.ts.txt +0 -33
- package/src/executor/composer/system/default/variables/GeoContext.ts +0 -180
- package/src/executor/composer/system/default/variables/PromptTypes.ts +0 -37
- package/src/executor/composer/system/default/variables/VariableReplacer.ts +0 -154
- package/src/executor/core-engine/CoreEngineMessageState.ts +0 -117
- package/src/session/SessionCommand.ts +0 -42
- package/src/session/messages/SessionAssistantMessageState.ts +0 -392
- package/src/session/messages/SessionMessageCompaction.ts +0 -160
- package/src/session/runtime/SessionCompactOperation.ts +0 -93
- package/src/session/runtime/SessionHistoryCompaction.ts +0 -45
- package/src/session/storage/JsonlSessionMessageStore.ts +0 -513
- package/src/session/storage/SessionMessageStoreFactory.ts +0 -18
- package/src/types/common/Template.ts +0 -9
- package/src/types/sdk/AgentSessionCompact.ts +0 -32
- package/src/types/session/SessionSegment.ts +0 -62
- package/src/types/store/SessionDataStore.ts +0 -113
- package/src/utils/Template.ts +0 -28
|
@@ -13,35 +13,15 @@ import type {
|
|
|
13
13
|
ModelJsonValue,
|
|
14
14
|
ModelMessage,
|
|
15
15
|
} from "@downcity/type";
|
|
16
|
-
import { parse_chat_message_markup } from "@executor/messages/ChatMessageMarkup.js";
|
|
17
16
|
import { render_session_user_context } from "@/session/messages/SessionUserContext.js";
|
|
18
17
|
import type {
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
SessionAgentMessage,
|
|
19
|
+
SessionAgentToolPart,
|
|
21
20
|
SessionMessage,
|
|
22
21
|
SessionUserFilePart,
|
|
23
22
|
SessionUserMessage,
|
|
23
|
+
SessionUserMessagePart,
|
|
24
24
|
} from "@downcity/type";
|
|
25
|
-
import type { SessionContextSnapshot } from "@/types/session/SessionSegment.js";
|
|
26
|
-
|
|
27
|
-
/** 把完整 Session 上下文快照转换为模型消息。 */
|
|
28
|
-
export async function session_context_to_model_messages(
|
|
29
|
-
snapshot: Readonly<SessionContextSnapshot>,
|
|
30
|
-
project_root?: string,
|
|
31
|
-
): Promise<ModelMessage[]> {
|
|
32
|
-
const messages = await session_messages_to_model_messages(
|
|
33
|
-
snapshot.messages,
|
|
34
|
-
project_root,
|
|
35
|
-
);
|
|
36
|
-
if (!snapshot.summary?.text.trim()) return messages;
|
|
37
|
-
return [
|
|
38
|
-
{
|
|
39
|
-
role: "assistant",
|
|
40
|
-
content: [{ type: "text", text: snapshot.summary.text }],
|
|
41
|
-
},
|
|
42
|
-
...messages,
|
|
43
|
-
];
|
|
44
|
-
}
|
|
45
25
|
|
|
46
26
|
/** 把一组 canonical Session Message 转换为模型消息。 */
|
|
47
27
|
export async function session_messages_to_model_messages(
|
|
@@ -50,9 +30,9 @@ export async function session_messages_to_model_messages(
|
|
|
50
30
|
): Promise<ModelMessage[]> {
|
|
51
31
|
const output: ModelMessage[] = [];
|
|
52
32
|
for (const message of messages) {
|
|
53
|
-
if (message.
|
|
33
|
+
if (message.role === "user") {
|
|
54
34
|
output.push(...await convert_user_message(message, project_root));
|
|
55
|
-
} else if (message.
|
|
35
|
+
} else if (message.role === "agent") {
|
|
56
36
|
output.push(...convert_assistant_message(message));
|
|
57
37
|
}
|
|
58
38
|
}
|
|
@@ -64,56 +44,94 @@ async function convert_user_message(
|
|
|
64
44
|
message: SessionUserMessage,
|
|
65
45
|
project_root?: string,
|
|
66
46
|
): Promise<ModelMessage[]> {
|
|
47
|
+
const converted = await convert_user_parts(message.parts, project_root);
|
|
48
|
+
return converted ? [converted] : [];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** 将 canonical User Parts 投影为单条模型消息。 */
|
|
52
|
+
async function convert_user_parts(
|
|
53
|
+
parts: readonly SessionUserMessagePart[],
|
|
54
|
+
project_root?: string,
|
|
55
|
+
): Promise<ModelMessage | null> {
|
|
67
56
|
const content: ModelContent[] = [];
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
57
|
+
for (const part of parts) {
|
|
58
|
+
switch (part.type) {
|
|
59
|
+
case "text":
|
|
60
|
+
if (part.text.trim()) content.push({ type: "text", text: part.text });
|
|
61
|
+
break;
|
|
62
|
+
case "context":
|
|
63
|
+
content.push({
|
|
64
|
+
type: "text",
|
|
65
|
+
text: render_session_user_context(part.tag, part.context),
|
|
66
|
+
});
|
|
67
|
+
break;
|
|
68
|
+
case "file":
|
|
69
|
+
content.push(await convert_file_part(part, project_root));
|
|
70
|
+
break;
|
|
71
|
+
case "data":
|
|
72
|
+
// Data Part 是持久化 UI 数据,不属于模型输入协议。
|
|
73
|
+
break;
|
|
74
|
+
default:
|
|
75
|
+
assert_never(part);
|
|
79
76
|
}
|
|
80
77
|
}
|
|
81
|
-
|
|
82
|
-
content.push(...await read_markup_files(message, project_root));
|
|
83
|
-
}
|
|
84
|
-
return content.length > 0 ? [{ role: "user", content }] : [];
|
|
78
|
+
return content.length > 0 ? { role: "user", content } : null;
|
|
85
79
|
}
|
|
86
80
|
|
|
87
|
-
/** 把单条 canonical
|
|
88
|
-
function convert_assistant_message(message:
|
|
81
|
+
/** 把单条 canonical Agent Message 转换为模型 assistant 与 tool 消息。 */
|
|
82
|
+
function convert_assistant_message(message: SessionAgentMessage): ModelMessage[] {
|
|
83
|
+
const output: ModelMessage[] = [];
|
|
84
|
+
let current_step_id: string | null = null;
|
|
89
85
|
const content: ModelContent[] = [];
|
|
90
86
|
const tool_results: ModelContent[] = [];
|
|
91
|
-
|
|
92
|
-
if (
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
87
|
+
const flush_step = (): void => {
|
|
88
|
+
if (content.length > 0) output.push({ role: "assistant", content: [...content] });
|
|
89
|
+
if (tool_results.length > 0) output.push({ role: "tool", content: [...tool_results] });
|
|
90
|
+
content.length = 0;
|
|
91
|
+
tool_results.length = 0;
|
|
92
|
+
};
|
|
93
|
+
for (const part of [...message.parts].sort((left, right) => left.sequence - right.sequence)) {
|
|
94
|
+
const part_step_id = part.step_id ?? "__unscoped__";
|
|
95
|
+
if (current_step_id !== null && part_step_id !== current_step_id) flush_step();
|
|
96
|
+
current_step_id = part_step_id;
|
|
97
|
+
switch (part.type) {
|
|
98
|
+
case "text":
|
|
99
|
+
if (part.text.trim()) content.push({ type: "text", text: part.text });
|
|
100
|
+
break;
|
|
101
|
+
case "reasoning":
|
|
102
|
+
if (part.text.trim()) {
|
|
103
|
+
content.push({
|
|
104
|
+
type: "reasoning",
|
|
105
|
+
text: part.text,
|
|
106
|
+
...(part.reasoning_signature
|
|
107
|
+
? { signature: part.reasoning_signature }
|
|
108
|
+
: {}),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
case "tool":
|
|
113
|
+
if (part.input !== undefined) {
|
|
114
|
+
append_tool_content(part, content, tool_results);
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
case "interaction":
|
|
118
|
+
case "file":
|
|
119
|
+
case "data":
|
|
120
|
+
case "action":
|
|
121
|
+
case "error":
|
|
122
|
+
// 这些 Part 只属于运行状态或宿主展示,不进入模型历史。
|
|
123
|
+
break;
|
|
124
|
+
default:
|
|
125
|
+
assert_never(part);
|
|
104
126
|
}
|
|
105
127
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
...(tool_results.length > 0
|
|
109
|
-
? [{ role: "tool", content: tool_results } as ModelMessage]
|
|
110
|
-
: []),
|
|
111
|
-
];
|
|
128
|
+
flush_step();
|
|
129
|
+
return output;
|
|
112
130
|
}
|
|
113
131
|
|
|
114
132
|
/** 把 canonical Tool Part 投影为模型工具调用和可选工具结果。 */
|
|
115
133
|
function append_tool_content(
|
|
116
|
-
part:
|
|
134
|
+
part: SessionAgentToolPart,
|
|
117
135
|
content: ModelContent[],
|
|
118
136
|
tool_results: ModelContent[],
|
|
119
137
|
): void {
|
|
@@ -169,36 +187,6 @@ function build_model_file(
|
|
|
169
187
|
};
|
|
170
188
|
}
|
|
171
189
|
|
|
172
|
-
/** 解析兼容聊天入口写入文本中的附件标记。 */
|
|
173
|
-
async function read_markup_files(
|
|
174
|
-
message: SessionUserMessage,
|
|
175
|
-
project_root?: string,
|
|
176
|
-
): Promise<ModelFileContent[]> {
|
|
177
|
-
const text = message.parts
|
|
178
|
-
.filter((part) => part.type === "text")
|
|
179
|
-
.map((part) => part.text)
|
|
180
|
-
.join("\n");
|
|
181
|
-
const output: ModelFileContent[] = [];
|
|
182
|
-
for (const file of parse_chat_message_markup(text).files) {
|
|
183
|
-
const media_type = guess_media_type(file.path);
|
|
184
|
-
if (!media_type || (!media_type.startsWith("image/") && media_type !== "application/pdf")) {
|
|
185
|
-
continue;
|
|
186
|
-
}
|
|
187
|
-
const file_path = resolve_local_file_path(file.path, project_root);
|
|
188
|
-
if (!await fs.pathExists(file_path)) continue;
|
|
189
|
-
output.push({
|
|
190
|
-
type: "file",
|
|
191
|
-
media_type,
|
|
192
|
-
source: {
|
|
193
|
-
type: "base64",
|
|
194
|
-
data: (await fs.readFile(file_path)).toString("base64"),
|
|
195
|
-
},
|
|
196
|
-
filename: path.basename(file_path),
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
return output;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
190
|
/** 把本地文件引用限制在项目根目录内,绝对附件路径保持可读。 */
|
|
203
191
|
function resolve_local_file_path(raw_path: string, project_root?: string): string {
|
|
204
192
|
if (path.isAbsolute(raw_path)) return path.resolve(raw_path);
|
|
@@ -211,19 +199,13 @@ function resolve_local_file_path(raw_path: string, project_root?: string): strin
|
|
|
211
199
|
return file_path;
|
|
212
200
|
}
|
|
213
201
|
|
|
214
|
-
/** 根据文件扩展名解析模型可用的 MIME type。 */
|
|
215
|
-
function guess_media_type(file_path: string): string | undefined {
|
|
216
|
-
const extension = path.extname(file_path).toLowerCase();
|
|
217
|
-
if (extension === ".png") return "image/png";
|
|
218
|
-
if (extension === ".jpg" || extension === ".jpeg") return "image/jpeg";
|
|
219
|
-
if (extension === ".webp") return "image/webp";
|
|
220
|
-
if (extension === ".gif") return "image/gif";
|
|
221
|
-
if (extension === ".pdf") return "application/pdf";
|
|
222
|
-
return undefined;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
202
|
/** 将未知值限制为可传输 JSON。 */
|
|
226
203
|
function to_model_json_value(value: unknown): ModelJsonValue {
|
|
227
204
|
if (value === undefined) return null;
|
|
228
205
|
return JSON.parse(JSON.stringify(value)) as ModelJsonValue;
|
|
229
206
|
}
|
|
207
|
+
|
|
208
|
+
/** 联合类型增加成员时,强制模型投影显式选择支持或忽略。 */
|
|
209
|
+
function assert_never(value: never): never {
|
|
210
|
+
throw new Error(`Unsupported Session model part: ${String((value as { type?: unknown }).type)}`);
|
|
211
|
+
}
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
import {
|
|
9
9
|
type ModelCall,
|
|
10
10
|
type ModelClient,
|
|
11
|
-
type ModelContent,
|
|
12
11
|
type ModelFinishReason,
|
|
13
12
|
type ModelJsonValue,
|
|
14
13
|
type ModelMessage,
|
|
@@ -22,8 +21,8 @@ import { z } from "zod";
|
|
|
22
21
|
import type { SessionSystemMessage } from "@/executor/types/SessionPrompts.js";
|
|
23
22
|
import type { SessionAssistantOutput } from "@/types/executor/SessionAssistantOutput.js";
|
|
24
23
|
import type {
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
SessionAgentMessagePart,
|
|
25
|
+
SessionAgentToolPart,
|
|
27
26
|
} from "@downcity/type";
|
|
28
27
|
import { consume_model_stream } from "@/executor/model/ModelStreamConsumer.js";
|
|
29
28
|
|
|
@@ -59,8 +58,6 @@ export interface ModelStepResult {
|
|
|
59
58
|
tool_calls: ModelStepToolCall[];
|
|
60
59
|
/** 当前 Step 的工具结果。 */
|
|
61
60
|
tool_results: ModelStepToolResult[];
|
|
62
|
-
/** 用于后续模型 Step 的消息。 */
|
|
63
|
-
response: { messages: ModelMessage[] };
|
|
64
61
|
/** 供诊断代码读取的内容事实。 */
|
|
65
62
|
content: Array<Record<string, unknown>>;
|
|
66
63
|
}
|
|
@@ -86,7 +83,7 @@ export interface RunModelStepInput {
|
|
|
86
83
|
/** 执行一个 Downcity 模型 Step 并收敛工具结果。 */
|
|
87
84
|
export async function run_model_step(input: RunModelStepInput): Promise<{
|
|
88
85
|
/** 当前 Step 的 canonical Assistant Parts。 */
|
|
89
|
-
assistant_parts:
|
|
86
|
+
assistant_parts: SessionAgentMessagePart[];
|
|
90
87
|
/** 当前 Step 的运行结果。 */
|
|
91
88
|
step_result: ModelStepResult;
|
|
92
89
|
}> {
|
|
@@ -123,19 +120,6 @@ export async function run_model_step(input: RunModelStepInput): Promise<{
|
|
|
123
120
|
collected.assistant_parts,
|
|
124
121
|
tool_results,
|
|
125
122
|
);
|
|
126
|
-
const response_messages: ModelMessage[] = [collected.assistant_model_message];
|
|
127
|
-
if (tool_results.length > 0) {
|
|
128
|
-
response_messages.push({
|
|
129
|
-
role: "tool",
|
|
130
|
-
content: tool_results.map((result) => ({
|
|
131
|
-
type: "tool_result",
|
|
132
|
-
tool_call_id: result.tool_call_id,
|
|
133
|
-
tool_name: result.tool_name,
|
|
134
|
-
outcome: result.success ? "succeeded" : "failed",
|
|
135
|
-
content: [{ type: "json", value: to_model_json_value(result.output) }],
|
|
136
|
-
})),
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
123
|
return {
|
|
140
124
|
assistant_parts,
|
|
141
125
|
step_result: {
|
|
@@ -144,7 +128,6 @@ export async function run_model_step(input: RunModelStepInput): Promise<{
|
|
|
144
128
|
...(collected.usage ? { usage: collected.usage } : {}),
|
|
145
129
|
tool_calls: collected.tool_calls,
|
|
146
130
|
tool_results,
|
|
147
|
-
response: { messages: response_messages },
|
|
148
131
|
content: collected.tool_calls.map((tool_call) => ({
|
|
149
132
|
type: "tool-call",
|
|
150
133
|
...tool_call,
|
|
@@ -155,8 +138,7 @@ export async function run_model_step(input: RunModelStepInput): Promise<{
|
|
|
155
138
|
|
|
156
139
|
/** 模型事件聚合器。 */
|
|
157
140
|
class StepEventCollector {
|
|
158
|
-
private readonly
|
|
159
|
-
private readonly assistant_parts: SessionAssistantMessagePart[] = [];
|
|
141
|
+
private readonly assistant_parts: SessionAgentMessagePart[] = [];
|
|
160
142
|
private readonly text_by_id = new Map<string, string>();
|
|
161
143
|
private readonly reasoning_by_id = new Map<string, string>();
|
|
162
144
|
private readonly tool_by_content_id = new Map<string, ModelStepToolCall>();
|
|
@@ -183,7 +165,6 @@ class StepEventCollector {
|
|
|
183
165
|
this.text += event.delta;
|
|
184
166
|
} else if (event.type === "text_finish") {
|
|
185
167
|
const text = this.text_by_id.get(event.content_id) ?? "";
|
|
186
|
-
this.model_content.push({ type: "text", text });
|
|
187
168
|
this.assistant_parts.push({
|
|
188
169
|
part_id: `text:${event.content_id}`,
|
|
189
170
|
sequence: this.assistant_parts.length + 1,
|
|
@@ -200,11 +181,6 @@ class StepEventCollector {
|
|
|
200
181
|
);
|
|
201
182
|
} else if (event.type === "reasoning_finish") {
|
|
202
183
|
const text = this.reasoning_by_id.get(event.content_id) ?? "";
|
|
203
|
-
this.model_content.push({
|
|
204
|
-
type: "reasoning",
|
|
205
|
-
text,
|
|
206
|
-
...(event.signature ? { signature: event.signature } : {}),
|
|
207
|
-
});
|
|
208
184
|
this.assistant_parts.push({
|
|
209
185
|
part_id: `reasoning:${event.content_id}`,
|
|
210
186
|
sequence: this.assistant_parts.length + 1,
|
|
@@ -224,12 +200,6 @@ class StepEventCollector {
|
|
|
224
200
|
if (tool) {
|
|
225
201
|
tool.input = event.input;
|
|
226
202
|
if (event.input_error) tool.input_error = event.input_error;
|
|
227
|
-
this.model_content.push({
|
|
228
|
-
type: "tool_call",
|
|
229
|
-
tool_call_id: tool.tool_call_id,
|
|
230
|
-
tool_name: tool.tool_name,
|
|
231
|
-
input: tool.input,
|
|
232
|
-
});
|
|
233
203
|
this.assistant_parts.push({
|
|
234
204
|
part_id: `tool:${tool.tool_call_id}`,
|
|
235
205
|
sequence: this.assistant_parts.length + 1,
|
|
@@ -249,8 +219,7 @@ class StepEventCollector {
|
|
|
249
219
|
|
|
250
220
|
/** 返回完整 Step 聚合结果。 */
|
|
251
221
|
finish(): {
|
|
252
|
-
assistant_parts:
|
|
253
|
-
assistant_model_message: ModelMessage;
|
|
222
|
+
assistant_parts: SessionAgentMessagePart[];
|
|
254
223
|
finish_reason: ModelFinishReason;
|
|
255
224
|
usage?: ModelUsage;
|
|
256
225
|
text: string;
|
|
@@ -259,7 +228,6 @@ class StepEventCollector {
|
|
|
259
228
|
if (!this.finish_reason) throw new Error("Model stream ended without model_finish");
|
|
260
229
|
return {
|
|
261
230
|
assistant_parts: this.assistant_parts,
|
|
262
|
-
assistant_model_message: { role: "assistant", content: this.model_content },
|
|
263
231
|
finish_reason: this.finish_reason,
|
|
264
232
|
...(this.usage ? { usage: this.usage } : {}),
|
|
265
233
|
text: this.text,
|
|
@@ -377,9 +345,9 @@ function to_model_json_value(value: unknown): ModelJsonValue {
|
|
|
377
345
|
|
|
378
346
|
/** 把工具结果合并到 canonical Tool Parts。 */
|
|
379
347
|
function append_tool_results(
|
|
380
|
-
parts:
|
|
348
|
+
parts: SessionAgentMessagePart[],
|
|
381
349
|
results: ModelStepToolResult[],
|
|
382
|
-
):
|
|
350
|
+
): SessionAgentMessagePart[] {
|
|
383
351
|
if (results.length === 0) return parts;
|
|
384
352
|
const result_by_id = new Map(results.map((result) => [result.tool_call_id, result]));
|
|
385
353
|
return parts.map((part) => {
|
|
@@ -391,12 +359,12 @@ function append_tool_results(
|
|
|
391
359
|
...part,
|
|
392
360
|
state: "completed",
|
|
393
361
|
output: to_model_json_value(result.output),
|
|
394
|
-
} satisfies
|
|
362
|
+
} satisfies SessionAgentToolPart
|
|
395
363
|
: {
|
|
396
364
|
...part,
|
|
397
365
|
state: "failed",
|
|
398
366
|
error: read_tool_error(result.output),
|
|
399
|
-
} satisfies
|
|
367
|
+
} satisfies SessionAgentToolPart;
|
|
400
368
|
});
|
|
401
369
|
}
|
|
402
370
|
|
|
@@ -3,17 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* 关键点(中文)
|
|
5
5
|
* - 统一封装“压缩后重试”和“普通失败兜底”逻辑。
|
|
6
|
-
* - Executor
|
|
6
|
+
* - Executor 提供单次 Turn 行为,本模块只决定是否恢复并重试。
|
|
7
7
|
* - 不改变外部行为,只把异常分流规则集中到一个地方。
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import type { ModelClient } from "@downcity/type";
|
|
11
10
|
import type { Logger } from "@/utils/logger/Logger.js";
|
|
12
|
-
import type {
|
|
13
|
-
import type {
|
|
14
|
-
SessionStepExecutionInput,
|
|
15
|
-
SessionTurnExecutionResult,
|
|
16
|
-
} from "@/types/session/SessionExecution.js";
|
|
11
|
+
import type { SessionTurnExecutionResult } from "@/types/session/SessionExecution.js";
|
|
17
12
|
|
|
18
13
|
/**
|
|
19
14
|
* 可压缩错误的最大重试次数。
|
|
@@ -24,8 +19,8 @@ interface ExecutorRecoveryPolicyOptions {
|
|
|
24
19
|
/** 当前 Session 稳定标识。 */
|
|
25
20
|
session_id: string;
|
|
26
21
|
|
|
27
|
-
/**
|
|
28
|
-
|
|
22
|
+
/** 请求 Composer 尝试推进上下文派生状态。 */
|
|
23
|
+
recover_context: (error: unknown) => Promise<boolean>;
|
|
29
24
|
|
|
30
25
|
/**
|
|
31
26
|
* 当前 session 统一日志器。
|
|
@@ -33,145 +28,64 @@ interface ExecutorRecoveryPolicyOptions {
|
|
|
33
28
|
logger: Logger;
|
|
34
29
|
}
|
|
35
30
|
|
|
36
|
-
interface ExecutorPrepareExecutionInput {
|
|
37
|
-
/**
|
|
38
|
-
* 当前轮用户 query。
|
|
39
|
-
*/
|
|
40
|
-
query: string;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* 当前轮模型实例。
|
|
44
|
-
*/
|
|
45
|
-
model: ModelClient;
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* 当前显式运行上下文。
|
|
49
|
-
*/
|
|
50
|
-
turn_context: SessionTurnContext;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* 当前压缩重试次数。
|
|
54
|
-
*/
|
|
55
|
-
retry_count: number;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
interface ExecutorExecutePreparedInput {
|
|
59
|
-
/**
|
|
60
|
-
* 已装配好的执行输入。
|
|
61
|
-
*/
|
|
62
|
-
execute_input: SessionStepExecutionInput;
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* 当前轮模型实例。
|
|
66
|
-
*/
|
|
67
|
-
model: ModelClient;
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* 当前显式运行上下文。
|
|
71
|
-
*/
|
|
72
|
-
turn_context: SessionTurnContext;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
31
|
interface ExecutorRecoveryInput {
|
|
76
|
-
/**
|
|
77
|
-
|
|
78
|
-
*/
|
|
79
|
-
query: string;
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* 当前轮模型实例。
|
|
83
|
-
*/
|
|
84
|
-
model: ModelClient;
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* 当前显式运行上下文。
|
|
88
|
-
*/
|
|
89
|
-
turn_context: SessionTurnContext;
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* 运行前装配执行输入。
|
|
93
|
-
*/
|
|
94
|
-
prepare_execute_input: (
|
|
95
|
-
input: ExecutorPrepareExecutionInput,
|
|
96
|
-
) => Promise<SessionStepExecutionInput>;
|
|
97
|
-
|
|
98
|
-
/**
|
|
99
|
-
* 执行已装配好的运行输入。
|
|
100
|
-
*/
|
|
101
|
-
execute_prepared_input: (
|
|
102
|
-
input: ExecutorExecutePreparedInput,
|
|
103
|
-
) => Promise<SessionTurnExecutionResult>;
|
|
32
|
+
/** 按当前恢复次数执行完整 Turn。 */
|
|
33
|
+
execute_turn: (retry_count: number) => Promise<SessionTurnExecutionResult>;
|
|
104
34
|
}
|
|
105
35
|
|
|
106
36
|
/**
|
|
107
37
|
* 执行恢复与重试策略服务。
|
|
108
38
|
*/
|
|
109
39
|
export class ExecutorRecoveryPolicy {
|
|
110
|
-
private readonly
|
|
40
|
+
private readonly recover_context: ExecutorRecoveryPolicyOptions["recover_context"];
|
|
111
41
|
private readonly logger: Logger;
|
|
112
|
-
private retry_count = 0;
|
|
113
42
|
|
|
114
43
|
constructor(options: ExecutorRecoveryPolicyOptions) {
|
|
115
44
|
const session_id = String(options.session_id || "").trim();
|
|
116
|
-
this.
|
|
45
|
+
this.recover_context = options.recover_context;
|
|
117
46
|
this.logger = options.logger;
|
|
118
47
|
if (!session_id) {
|
|
119
48
|
throw new Error("ExecutorRecoveryPolicy requires a non-empty session_id");
|
|
120
49
|
}
|
|
121
50
|
}
|
|
122
51
|
|
|
123
|
-
/**
|
|
124
|
-
* 重置当前 Turn 执行状态。
|
|
125
|
-
*/
|
|
126
|
-
reset_execution_state(): void {
|
|
127
|
-
this.retry_count = 0;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
52
|
/**
|
|
131
53
|
* 执行一次带恢复策略的 Session Turn。
|
|
132
54
|
*/
|
|
133
55
|
async execute_with_retry(
|
|
134
56
|
input: ExecutorRecoveryInput,
|
|
135
57
|
): Promise<SessionTurnExecutionResult> {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
retry_count
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
return await this.execute_with_retry(input);
|
|
58
|
+
let retry_count = 0;
|
|
59
|
+
while (true) {
|
|
60
|
+
try {
|
|
61
|
+
return await input.execute_turn(retry_count);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
if (retry_count < MAX_COMPACTION_RETRY_ATTEMPTS) {
|
|
64
|
+
const recovered = await this.recover_context(error);
|
|
65
|
+
if (recovered) {
|
|
66
|
+
await this.logger.log("info", "[agent] compacting", {
|
|
67
|
+
retryCount: retry_count,
|
|
68
|
+
error: String(error),
|
|
69
|
+
});
|
|
70
|
+
retry_count += 1;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (retry_count > 0) {
|
|
75
|
+
return this.build_failure_result({
|
|
76
|
+
error_text:
|
|
77
|
+
"Context length exceeded and retries failed. Please resend your question.",
|
|
78
|
+
});
|
|
158
79
|
}
|
|
159
80
|
|
|
81
|
+
const error_text = String(error);
|
|
82
|
+
await this.logger.log("error", "Executor execution failed", {
|
|
83
|
+
error: error_text,
|
|
84
|
+
});
|
|
160
85
|
return this.build_failure_result({
|
|
161
|
-
error_text
|
|
162
|
-
"Context length exceeded and retries failed. Please resend your question.",
|
|
163
|
-
turn_context: input.turn_context,
|
|
86
|
+
error_text,
|
|
164
87
|
});
|
|
165
88
|
}
|
|
166
|
-
|
|
167
|
-
const error_text = String(error);
|
|
168
|
-
await this.logger.log("error", "Executor execution failed", {
|
|
169
|
-
error: error_text,
|
|
170
|
-
});
|
|
171
|
-
return this.build_failure_result({
|
|
172
|
-
error_text,
|
|
173
|
-
turn_context: input.turn_context,
|
|
174
|
-
});
|
|
175
89
|
}
|
|
176
90
|
}
|
|
177
91
|
|
|
@@ -181,18 +95,11 @@ export class ExecutorRecoveryPolicy {
|
|
|
181
95
|
*/
|
|
182
96
|
error_text: string;
|
|
183
97
|
|
|
184
|
-
/**
|
|
185
|
-
* 当前显式运行上下文。
|
|
186
|
-
*/
|
|
187
|
-
turn_context: SessionTurnContext;
|
|
188
98
|
}): SessionTurnExecutionResult {
|
|
189
99
|
return {
|
|
190
100
|
success: false,
|
|
191
101
|
text: "",
|
|
192
102
|
error: input.error_text,
|
|
193
|
-
deferred_persisted_user_messages: [
|
|
194
|
-
...input.turn_context.input.deferred_user_messages(),
|
|
195
|
-
],
|
|
196
103
|
};
|
|
197
104
|
}
|
|
198
105
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* SessionHistoryMeta:随 session_id 持久化的元信息。
|
|
3
3
|
*
|
|
4
4
|
* 关键点(中文)
|
|
5
|
-
* - 存储位置:
|
|
5
|
+
* - 存储位置:Session SQLite 的 `session_state` 表
|
|
6
6
|
* - 用于保存 session 列表、详情和索引所需的轻量元信息
|
|
7
7
|
*/
|
|
8
8
|
|
|
@@ -35,6 +35,4 @@ export type SessionHistoryMeta = {
|
|
|
35
35
|
message_count?: number;
|
|
36
36
|
/** 当前 session 最后一条记录的用户可见摘要,用于列表预览。 */
|
|
37
37
|
preview_text?: string;
|
|
38
|
-
/** 生成当前摘要时 messages.jsonl 的字节长度,用于校验摘要是否仍然有效。 */
|
|
39
|
-
historyBytes?: number;
|
|
40
38
|
};
|