@downcity/agent 1.1.430 → 1.1.438
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
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { generate_id } from "@/utils/Id.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
10
|
+
import { SessionAgentMessageWriter } from "@/session/messages/SessionAgentMessageWriter.js";
|
|
11
|
+
import { SessionAgentMessageState } from "@/session/messages/SessionAgentMessageState.js";
|
|
12
|
+
import { SessionAgentActionPartWriter } from "@/session/messages/SessionAgentActionPartWriter.js";
|
|
13
13
|
import {
|
|
14
14
|
has_assistant_result_content,
|
|
15
15
|
normalize_canonical_session_user_parts,
|
|
@@ -18,11 +18,11 @@ import {
|
|
|
18
18
|
import type { JsonObject } from "@downcity/type";
|
|
19
19
|
import type {
|
|
20
20
|
ListSessionMessagesInput,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
SessionAgentActionPart,
|
|
22
|
+
SessionAgentErrorPart,
|
|
23
|
+
SessionAgentInteractionPart,
|
|
24
|
+
SessionAgentMessage,
|
|
25
|
+
SessionAgentMessagePart,
|
|
26
26
|
SessionMessage,
|
|
27
27
|
SessionMessagePage,
|
|
28
28
|
SessionUserMessage,
|
|
@@ -32,11 +32,7 @@ import type {
|
|
|
32
32
|
SessionMutation,
|
|
33
33
|
SessionMessageMutation as SessionMessageSnapshotMutation,
|
|
34
34
|
} from "@downcity/type";
|
|
35
|
-
import type {
|
|
36
|
-
SessionContextSnapshot,
|
|
37
|
-
SessionMessageStorageStats,
|
|
38
|
-
SessionSegmentSummary,
|
|
39
|
-
} from "@/types/session/SessionSegment.js";
|
|
35
|
+
import type { SessionMessageStorageStats } from "@/types/store/SessionStorage.js";
|
|
40
36
|
import type { SessionStreamingToolLocation } from "@/types/session/SessionTool.js";
|
|
41
37
|
import type {
|
|
42
38
|
SessionInteractionCloseInput,
|
|
@@ -46,33 +42,34 @@ import type {
|
|
|
46
42
|
import type { SessionActionEvent } from "@downcity/type";
|
|
47
43
|
import { persist_user_prompt_file_parts } from "@executor/messages/SessionAttachmentMapper.js";
|
|
48
44
|
import type {
|
|
49
|
-
|
|
50
|
-
|
|
45
|
+
AppendCompletedAgentMessageInput,
|
|
46
|
+
AppendExternalSessionAgentMessageInput,
|
|
51
47
|
AppendExternalSessionUserMessageInput,
|
|
52
|
-
|
|
48
|
+
AppendSessionAgentErrorPartInput,
|
|
53
49
|
AppendSessionPromptMessageInput,
|
|
54
50
|
AppendSessionUserMessageInput,
|
|
55
|
-
|
|
56
|
-
|
|
51
|
+
OpenSessionAgentActionPartInput,
|
|
52
|
+
OpenSessionAgentMessageInput,
|
|
57
53
|
SessionMessagesOptions,
|
|
58
54
|
} from "@/types/session/SessionMessages.js";
|
|
59
|
-
import type {
|
|
55
|
+
import type { SessionStorage } from "@/types/store/SessionStorage.js";
|
|
60
56
|
import type { SessionAttachmentStore } from "@/types/store/SessionAttachmentStore.js";
|
|
61
57
|
|
|
62
|
-
export {
|
|
63
|
-
export {
|
|
58
|
+
export { SessionAgentMessageWriter } from "@/session/messages/SessionAgentMessageWriter.js";
|
|
59
|
+
export { SessionAgentActionPartWriter } from "@/session/messages/SessionAgentActionPartWriter.js";
|
|
64
60
|
export { normalize_session_user_parts } from "@/session/messages/SessionUserMessage.js";
|
|
65
61
|
|
|
66
62
|
/** 唯一 Session Message 写入服务。 */
|
|
67
63
|
export class SessionMessages {
|
|
68
64
|
readonly session_id: string;
|
|
69
|
-
private readonly store:
|
|
65
|
+
private readonly store: SessionStorage;
|
|
70
66
|
private readonly attachment_store: SessionAttachmentStore;
|
|
71
67
|
private readonly publish: SessionMessagesOptions["publish"];
|
|
72
68
|
private readonly messages_by_id = new Map<string, SessionMessage>();
|
|
73
69
|
/** Assistant 草稿与 Interaction 的串行状态转换器。 */
|
|
74
|
-
private readonly
|
|
75
|
-
|
|
70
|
+
private readonly agent_state: SessionAgentMessageState;
|
|
71
|
+
/** 当前 Message 恢复事务;并发初始化共享同一个 Promise。 */
|
|
72
|
+
private initialize_promise: Promise<void> | null = null;
|
|
76
73
|
|
|
77
74
|
constructor(options: SessionMessagesOptions) {
|
|
78
75
|
this.session_id = String(options.session_id || "").trim();
|
|
@@ -80,35 +77,100 @@ export class SessionMessages {
|
|
|
80
77
|
this.attachment_store = options.attachment_store;
|
|
81
78
|
this.publish = options.publish;
|
|
82
79
|
if (!this.session_id) throw new Error("SessionMessages requires session_id");
|
|
83
|
-
this.
|
|
80
|
+
this.agent_state = new SessionAgentMessageState({
|
|
84
81
|
session_id: this.session_id,
|
|
85
82
|
store: this.store,
|
|
86
83
|
list_messages: () => this.messages_by_id.values(),
|
|
87
84
|
accept_message: (message, publish_mutation) =>
|
|
88
85
|
this.accept_message(message, publish_mutation),
|
|
89
|
-
|
|
86
|
+
project_mutation: (mutation, message) =>
|
|
90
87
|
this.accept_mutation(mutation, message),
|
|
91
88
|
});
|
|
92
89
|
}
|
|
93
90
|
|
|
94
91
|
/** 恢复已有 Message,并收口进程中断遗留的运行状态。 */
|
|
95
92
|
async initialize(): Promise<void> {
|
|
96
|
-
if (this.
|
|
97
|
-
|
|
98
|
-
for (const message of await this.store.list_messages()) {
|
|
99
|
-
this.messages_by_id.set(message.message_id, message);
|
|
93
|
+
if (!this.initialize_promise) {
|
|
94
|
+
this.initialize_promise = this.restore_messages();
|
|
100
95
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
if (message.type === "action" && message.status === "running") {
|
|
108
|
-
await this.update_action_message(message.message_id, "failed", {
|
|
109
|
-
description: message.description || "Action interrupted before completion.",
|
|
110
|
-
});
|
|
96
|
+
const initialize_promise = this.initialize_promise;
|
|
97
|
+
try {
|
|
98
|
+
await initialize_promise;
|
|
99
|
+
} catch (error) {
|
|
100
|
+
if (this.initialize_promise === initialize_promise) {
|
|
101
|
+
this.initialize_promise = null;
|
|
111
102
|
}
|
|
103
|
+
throw error;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** 只恢复非终态 Message,并由领域层统一收口进程中断状态。 */
|
|
108
|
+
private async restore_messages(): Promise<void> {
|
|
109
|
+
await this.store.initialize();
|
|
110
|
+
const persisted_messages = await this.store.list_recoverable_agent_messages();
|
|
111
|
+
this.messages_by_id.clear();
|
|
112
|
+
for (const message of persisted_messages) {
|
|
113
|
+
this.remember_message(message);
|
|
114
|
+
const updated_at = Date.now();
|
|
115
|
+
const recovered: SessionAgentMessage = {
|
|
116
|
+
...message,
|
|
117
|
+
state: "done",
|
|
118
|
+
revision: message.revision + 1,
|
|
119
|
+
updated_at,
|
|
120
|
+
parts: [...message.parts.map((part) => {
|
|
121
|
+
if (part.type === "action" && part.state === "running") {
|
|
122
|
+
return {
|
|
123
|
+
...part,
|
|
124
|
+
state: "failed" as const,
|
|
125
|
+
description: part.description || "Action interrupted before completion.",
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
if (part.type === "interaction" && part.status === "pending") {
|
|
129
|
+
return {
|
|
130
|
+
...part,
|
|
131
|
+
status: "cancelled" as const,
|
|
132
|
+
cancel_reason: "runtime_interrupted" as const,
|
|
133
|
+
resolved_at: updated_at,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
if (
|
|
137
|
+
part.type === "tool" &&
|
|
138
|
+
part.state !== "completed" &&
|
|
139
|
+
part.state !== "failed"
|
|
140
|
+
) {
|
|
141
|
+
return {
|
|
142
|
+
...part,
|
|
143
|
+
state: "failed" as const,
|
|
144
|
+
error: "Tool interrupted before completion.",
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
if (
|
|
148
|
+
(part.type === "text" || part.type === "reasoning") &&
|
|
149
|
+
part.state === "streaming"
|
|
150
|
+
) {
|
|
151
|
+
return { ...part, state: "done" as const };
|
|
152
|
+
}
|
|
153
|
+
return part;
|
|
154
|
+
}), {
|
|
155
|
+
part_id: `error:${generate_id()}`,
|
|
156
|
+
sequence: message.parts.reduce(
|
|
157
|
+
(sequence, part) => Math.max(sequence, part.sequence + 1),
|
|
158
|
+
1,
|
|
159
|
+
),
|
|
160
|
+
type: "error",
|
|
161
|
+
scope: message.turn_id ? "turn" : "session",
|
|
162
|
+
code: "runtime_interrupted",
|
|
163
|
+
message: "Agent execution was interrupted before completion.",
|
|
164
|
+
recoverable: true,
|
|
165
|
+
}],
|
|
166
|
+
};
|
|
167
|
+
const changed_parts = resolve_changed_agent_parts(message, recovered);
|
|
168
|
+
await this.store.update_message({
|
|
169
|
+
message: recovered,
|
|
170
|
+
expected_revision: message.revision,
|
|
171
|
+
changed_parts,
|
|
172
|
+
});
|
|
173
|
+
this.accept_message(recovered, false);
|
|
112
174
|
}
|
|
113
175
|
}
|
|
114
176
|
|
|
@@ -117,14 +179,15 @@ export class SessionMessages {
|
|
|
117
179
|
return this.messages_by_id.get(message_id);
|
|
118
180
|
}
|
|
119
181
|
|
|
120
|
-
/**
|
|
182
|
+
/** 追加一条 canonical User Message。 */
|
|
121
183
|
async append_user_message(
|
|
122
184
|
input: AppendSessionUserMessageInput,
|
|
123
185
|
): Promise<SessionUserMessage> {
|
|
186
|
+
const message_id =
|
|
187
|
+
String(input.message_id || "").trim() ||
|
|
188
|
+
`user:${this.session_id}:${generate_id()}`;
|
|
124
189
|
const message = await this.create_message((sequence, created_at) => ({
|
|
125
|
-
message_id
|
|
126
|
-
String(input.message_id || "").trim() ||
|
|
127
|
-
`user:${this.session_id}:${generate_id()}`,
|
|
190
|
+
message_id,
|
|
128
191
|
session_id: this.session_id,
|
|
129
192
|
turn_id: input.turn_id,
|
|
130
193
|
sequence,
|
|
@@ -132,21 +195,23 @@ export class SessionMessages {
|
|
|
132
195
|
visibility: input.visibility || "visible",
|
|
133
196
|
created_at,
|
|
134
197
|
updated_at: created_at,
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
198
|
+
role: "user",
|
|
199
|
+
parts: normalize_canonical_session_user_parts(input.parts).map((part) => ({
|
|
200
|
+
...part,
|
|
201
|
+
part_id: `${message_id}:part:${String(part.sequence)}`,
|
|
202
|
+
})),
|
|
138
203
|
}));
|
|
139
204
|
return message as SessionUserMessage;
|
|
140
205
|
}
|
|
141
206
|
|
|
142
207
|
/** 创建可持续接收 chunk 的 Assistant Message。 */
|
|
143
|
-
async
|
|
144
|
-
input:
|
|
145
|
-
): Promise<
|
|
208
|
+
async open_agent_message(
|
|
209
|
+
input: OpenSessionAgentMessageInput,
|
|
210
|
+
): Promise<SessionAgentMessageWriter> {
|
|
146
211
|
const message = (await this.create_message((sequence, created_at) => ({
|
|
147
212
|
message_id:
|
|
148
213
|
String(input.message_id || "").trim() ||
|
|
149
|
-
`
|
|
214
|
+
`agent:${this.session_id}:${generate_id()}`,
|
|
150
215
|
session_id: this.session_id,
|
|
151
216
|
turn_id: input.turn_id,
|
|
152
217
|
sequence,
|
|
@@ -154,33 +219,29 @@ export class SessionMessages {
|
|
|
154
219
|
visibility: input.visibility || "visible",
|
|
155
220
|
created_at,
|
|
156
221
|
updated_at: created_at,
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
status: "streaming",
|
|
222
|
+
role: "agent",
|
|
223
|
+
state: "streaming",
|
|
160
224
|
parts: [],
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
: {}),
|
|
164
|
-
}), true)) as SessionAssistantMessage;
|
|
165
|
-
return new SessionAssistantMessageWriter(this, message.message_id);
|
|
225
|
+
}), true)) as SessionAgentMessage;
|
|
226
|
+
return new SessionAgentMessageWriter(this, message.message_id);
|
|
166
227
|
}
|
|
167
228
|
|
|
168
229
|
/** 直接写入一条已完成 Assistant Message。 */
|
|
169
|
-
async
|
|
170
|
-
input:
|
|
171
|
-
): Promise<
|
|
230
|
+
async append_completed_agent_message(
|
|
231
|
+
input: AppendCompletedAgentMessageInput,
|
|
232
|
+
): Promise<SessionAgentMessage> {
|
|
172
233
|
const turn_id = input.turn_id || `external:${this.session_id}:${generate_id()}`;
|
|
173
|
-
const writer = await this.
|
|
234
|
+
const writer = await this.open_agent_message({
|
|
174
235
|
turn_id,
|
|
175
|
-
kind: input.kind || "normal",
|
|
176
236
|
visibility: input.visibility || "visible",
|
|
177
|
-
...(input.summary_through_message_id
|
|
178
|
-
? { summary_through_message_id: input.summary_through_message_id }
|
|
179
|
-
: {}),
|
|
180
237
|
});
|
|
181
238
|
for (const part of input.parts) await writer.upsert_part(part);
|
|
182
239
|
await writer.complete();
|
|
183
|
-
|
|
240
|
+
const message = await this.store.read_message(writer.message_id);
|
|
241
|
+
if (!message || message.role !== "agent") {
|
|
242
|
+
throw new Error(`Completed Agent Message not found: ${writer.message_id}`);
|
|
243
|
+
}
|
|
244
|
+
return message;
|
|
184
245
|
}
|
|
185
246
|
|
|
186
247
|
/** 把公开 Session API 的 User 输入转换为 canonical Message 并持久化。 */
|
|
@@ -195,22 +256,21 @@ export class SessionMessages {
|
|
|
195
256
|
if (parts.length === 0) return false;
|
|
196
257
|
await this.append_user_message({
|
|
197
258
|
turn_id: `external:${this.session_id}:${Date.now()}`,
|
|
198
|
-
input_type: "prompt",
|
|
199
259
|
parts,
|
|
200
260
|
});
|
|
201
261
|
return true;
|
|
202
262
|
}
|
|
203
263
|
|
|
204
264
|
/** 把公开 Session API 的 Assistant 输入转换为 canonical Message 并持久化。 */
|
|
205
|
-
async
|
|
206
|
-
input:
|
|
265
|
+
async append_external_agent_message(
|
|
266
|
+
input: AppendExternalSessionAgentMessageInput,
|
|
207
267
|
): Promise<boolean> {
|
|
208
268
|
const parts = input.parts || [{
|
|
209
269
|
type: "text" as const,
|
|
210
270
|
text: String(input.text || "").trim(),
|
|
211
271
|
}];
|
|
212
272
|
if (!has_assistant_result_content(parts)) return false;
|
|
213
|
-
const writer = await this.
|
|
273
|
+
const writer = await this.open_agent_message({
|
|
214
274
|
turn_id: `external:${this.session_id}:${Date.now()}`,
|
|
215
275
|
});
|
|
216
276
|
await writer.append_result_parts(parts);
|
|
@@ -231,38 +291,27 @@ export class SessionMessages {
|
|
|
231
291
|
);
|
|
232
292
|
const canonical = await this.append_user_message({
|
|
233
293
|
turn_id: input.turn_id,
|
|
234
|
-
input_type: input.input_type,
|
|
235
294
|
parts: normalize_session_user_parts(ui_parts),
|
|
295
|
+
...(input.message_id ? { message_id: input.message_id } : {}),
|
|
236
296
|
});
|
|
237
297
|
return canonical;
|
|
238
298
|
}
|
|
239
299
|
|
|
240
|
-
/**
|
|
241
|
-
async
|
|
242
|
-
|
|
243
|
-
): Promise<number> {
|
|
244
|
-
const messages = Array.isArray(deferred_messages)
|
|
245
|
-
? deferred_messages
|
|
246
|
-
: [];
|
|
247
|
-
for (const message of messages) {
|
|
248
|
-
await this.append_user_message({
|
|
249
|
-
turn_id: message.turn_id || `deferred:${this.session_id}:${Date.now()}`,
|
|
250
|
-
input_type: "steer",
|
|
251
|
-
parts: structuredClone(message.parts),
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
return messages.length;
|
|
300
|
+
/** 读取指定 Turn 最近一条 canonical Agent Message。 */
|
|
301
|
+
async read_latest_agent_message(turn_id: string): Promise<SessionAgentMessage | null> {
|
|
302
|
+
return await this.store.read_latest_agent_message(turn_id);
|
|
255
303
|
}
|
|
256
304
|
|
|
257
|
-
/** 按稳定 Action ID
|
|
305
|
+
/** 按稳定 Action ID 创建或更新只包含 Action Part 的 Agent Message。 */
|
|
258
306
|
async persist_action(
|
|
259
307
|
event: SessionActionEvent,
|
|
260
308
|
options?: { publish_mutation?: boolean },
|
|
261
309
|
): Promise<void> {
|
|
262
310
|
const publish_mutation = options?.publish_mutation !== false;
|
|
263
|
-
const existing = this.get_message(event.action_id)
|
|
311
|
+
const existing = this.get_message(event.action_id) ||
|
|
312
|
+
await this.store.read_message(event.action_id) || undefined;
|
|
264
313
|
if (!existing) {
|
|
265
|
-
const writer = await this.
|
|
314
|
+
const writer = await this.open_action_part({
|
|
266
315
|
message_id: event.action_id,
|
|
267
316
|
turn_id: event.turn_id,
|
|
268
317
|
action_type: event.action_type,
|
|
@@ -276,22 +325,23 @@ export class SessionMessages {
|
|
|
276
325
|
}
|
|
277
326
|
return;
|
|
278
327
|
}
|
|
279
|
-
if (existing.
|
|
280
|
-
await this.
|
|
328
|
+
if (existing.role === "agent" && event.status !== "running") {
|
|
329
|
+
await this.update_action_part(event.action_id, event.status, {
|
|
281
330
|
title: event.title,
|
|
282
331
|
description: event.description,
|
|
283
332
|
}, { publish_mutation });
|
|
284
333
|
}
|
|
285
334
|
}
|
|
286
335
|
|
|
287
|
-
/**
|
|
288
|
-
async
|
|
289
|
-
input:
|
|
290
|
-
): Promise<
|
|
336
|
+
/** 创建只包含 running Action Part 的 Agent Message。 */
|
|
337
|
+
async open_action_part(
|
|
338
|
+
input: OpenSessionAgentActionPartInput,
|
|
339
|
+
): Promise<SessionAgentActionPartWriter> {
|
|
340
|
+
const message_id =
|
|
341
|
+
String(input.message_id || "").trim() ||
|
|
342
|
+
`agent-action:${this.session_id}:${generate_id()}`;
|
|
291
343
|
const message = (await this.create_message((sequence, created_at) => ({
|
|
292
|
-
message_id
|
|
293
|
-
String(input.message_id || "").trim() ||
|
|
294
|
-
`action:${this.session_id}:${generate_id()}`,
|
|
344
|
+
message_id,
|
|
295
345
|
session_id: this.session_id,
|
|
296
346
|
...(input.turn_id ? { turn_id: input.turn_id } : {}),
|
|
297
347
|
sequence,
|
|
@@ -299,14 +349,21 @@ export class SessionMessages {
|
|
|
299
349
|
visibility: "visible",
|
|
300
350
|
created_at,
|
|
301
351
|
updated_at: created_at,
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
352
|
+
role: "agent",
|
|
353
|
+
state: "streaming",
|
|
354
|
+
parts: [{
|
|
355
|
+
part_id: `action-part:${message_id}`,
|
|
356
|
+
sequence: 1,
|
|
357
|
+
type: "action",
|
|
358
|
+
action_id: message_id,
|
|
359
|
+
action_type: input.action_type,
|
|
360
|
+
state: "running",
|
|
361
|
+
title: input.title,
|
|
362
|
+
...(input.description ? { description: input.description } : {}),
|
|
363
|
+
...(input.data ? { data: structuredClone(input.data) } : {}),
|
|
364
|
+
}],
|
|
365
|
+
}), false, input.publish_mutation !== false)) as SessionAgentMessage;
|
|
366
|
+
return new SessionAgentActionPartWriter(
|
|
310
367
|
this,
|
|
311
368
|
message.message_id,
|
|
312
369
|
input.publish_mutation !== false,
|
|
@@ -314,37 +371,110 @@ export class SessionMessages {
|
|
|
314
371
|
}
|
|
315
372
|
|
|
316
373
|
/** 更新 Action 状态,同时保持 message_id 与 sequence 不变。 */
|
|
317
|
-
async
|
|
374
|
+
async update_action_part(
|
|
318
375
|
message_id: string,
|
|
319
376
|
status: "running" | "completed" | "failed",
|
|
320
377
|
changes?: { title?: string; description?: string; data?: JsonObject },
|
|
321
378
|
options?: { publish_mutation?: boolean },
|
|
322
|
-
): Promise<
|
|
323
|
-
const
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
379
|
+
): Promise<SessionAgentMessage> {
|
|
380
|
+
const current_message = require_message([
|
|
381
|
+
this.get_message(message_id) || await this.store.read_message(message_id),
|
|
382
|
+
].filter((message): message is SessionMessage => Boolean(message)), message_id, "agent");
|
|
383
|
+
const action = current_message.parts.find(
|
|
384
|
+
(part): part is SessionAgentActionPart => part.type === "action",
|
|
385
|
+
);
|
|
386
|
+
if (!action) throw new Error(`Session Action Part not found: ${message_id}`);
|
|
387
|
+
const next_action: SessionAgentActionPart = {
|
|
388
|
+
...action,
|
|
389
|
+
state: status,
|
|
390
|
+
...(changes?.title ? { title: changes.title } : {}),
|
|
391
|
+
...(changes?.description !== undefined
|
|
392
|
+
? { description: changes.description }
|
|
393
|
+
: {}),
|
|
394
|
+
...(changes?.data ? { data: structuredClone(changes.data) } : {}),
|
|
395
|
+
};
|
|
396
|
+
const message: SessionAgentMessage = {
|
|
397
|
+
...current_message,
|
|
398
|
+
state: status === "running" ? "streaming" : "done",
|
|
399
|
+
parts: current_message.parts.map((part) =>
|
|
400
|
+
part.part_id === action.part_id ? next_action : part),
|
|
401
|
+
revision: current_message.revision + 1,
|
|
402
|
+
updated_at: Date.now(),
|
|
403
|
+
};
|
|
404
|
+
await this.store.update_message({
|
|
405
|
+
message,
|
|
406
|
+
expected_revision: current_message.revision,
|
|
407
|
+
changed_parts: [next_action],
|
|
337
408
|
});
|
|
338
409
|
this.accept_message(message, options?.publish_mutation !== false);
|
|
339
|
-
return message as
|
|
340
|
-
}
|
|
410
|
+
return message as SessionAgentMessage;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* 将 Error Part 追加到当前 Turn 最后一个 Agent Message。
|
|
415
|
+
*
|
|
416
|
+
* 同一错误码已经存在时保持幂等;只有当前 Turn 从未产生 Agent Message 时,才创建
|
|
417
|
+
* 一个仅含 Error 的失败 Message。这样错误与已经产生的 Text、Tool 和 Diff 始终
|
|
418
|
+
* 共享同一 Message,并由 Part sequence 表达真实顺序。
|
|
419
|
+
*/
|
|
420
|
+
async append_error_part(
|
|
421
|
+
input: AppendSessionAgentErrorPartInput,
|
|
422
|
+
): Promise<SessionAgentMessage> {
|
|
423
|
+
await this.ensure_initialized();
|
|
424
|
+
const target = await this.store.read_latest_agent_message(input.turn_id);
|
|
425
|
+
const existing_error = target?.parts.find(
|
|
426
|
+
(part): part is SessionAgentErrorPart =>
|
|
427
|
+
part.type === "error" && part.code === input.code,
|
|
428
|
+
);
|
|
429
|
+
if (target && existing_error) {
|
|
430
|
+
return target;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
const error_part: SessionAgentErrorPart = {
|
|
434
|
+
part_id: `error:${generate_id()}`,
|
|
435
|
+
sequence: target
|
|
436
|
+
? target.parts.reduce(
|
|
437
|
+
(sequence, part) => Math.max(sequence, part.sequence + 1),
|
|
438
|
+
1,
|
|
439
|
+
)
|
|
440
|
+
: 1,
|
|
441
|
+
type: "error",
|
|
442
|
+
scope: input.scope,
|
|
443
|
+
code: input.code,
|
|
444
|
+
message: input.message,
|
|
445
|
+
recoverable: input.recoverable,
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
if (target?.state === "streaming") {
|
|
449
|
+
this.remember_message(target);
|
|
450
|
+
await this.agent_state.commit_parts(target.message_id, [error_part]);
|
|
451
|
+
const updated = await this.store.read_message(target.message_id);
|
|
452
|
+
if (!updated || updated.role !== "agent") {
|
|
453
|
+
throw new Error(`Agent Message not found after Error Part commit: ${target.message_id}`);
|
|
454
|
+
}
|
|
455
|
+
return updated;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
if (target) {
|
|
459
|
+
const message: SessionAgentMessage = {
|
|
460
|
+
...target,
|
|
461
|
+
revision: target.revision + 1,
|
|
462
|
+
updated_at: Date.now(),
|
|
463
|
+
parts: [...target.parts, error_part].sort(
|
|
464
|
+
(left, right) => left.sequence - right.sequence,
|
|
465
|
+
),
|
|
466
|
+
};
|
|
467
|
+
await this.store.update_message({
|
|
468
|
+
message,
|
|
469
|
+
expected_revision: target.revision,
|
|
470
|
+
changed_parts: [error_part],
|
|
471
|
+
});
|
|
472
|
+
this.accept_message(message);
|
|
473
|
+
return message as SessionAgentMessage;
|
|
474
|
+
}
|
|
341
475
|
|
|
342
|
-
/** 创建用户可见 Error Message。 */
|
|
343
|
-
async append_error_message(
|
|
344
|
-
input: AppendSessionErrorMessageInput,
|
|
345
|
-
): Promise<SessionErrorMessage> {
|
|
346
476
|
return (await this.create_message((sequence, created_at) => ({
|
|
347
|
-
message_id: `
|
|
477
|
+
message_id: `agent:${this.session_id}:${generate_id()}`,
|
|
348
478
|
session_id: this.session_id,
|
|
349
479
|
...(input.turn_id ? { turn_id: input.turn_id } : {}),
|
|
350
480
|
sequence,
|
|
@@ -352,94 +482,57 @@ export class SessionMessages {
|
|
|
352
482
|
visibility: "visible",
|
|
353
483
|
created_at,
|
|
354
484
|
updated_at: created_at,
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
recoverable: input.recoverable,
|
|
360
|
-
}))) as SessionErrorMessage;
|
|
485
|
+
role: "agent",
|
|
486
|
+
state: "done",
|
|
487
|
+
parts: [error_part],
|
|
488
|
+
}))) as SessionAgentMessage;
|
|
361
489
|
}
|
|
362
490
|
|
|
363
|
-
/**
|
|
491
|
+
/** 按 Message sequence 返回一页完整 Message 聚合。 */
|
|
364
492
|
async list_messages(
|
|
365
493
|
input?: ListSessionMessagesInput,
|
|
366
494
|
): Promise<SessionMessagePage> {
|
|
367
495
|
await this.ensure_initialized();
|
|
368
|
-
const requests_segment = input?.before_sequence !== undefined;
|
|
369
496
|
const before_sequence = input?.before_sequence;
|
|
370
497
|
if (
|
|
371
|
-
|
|
498
|
+
before_sequence !== undefined &&
|
|
372
499
|
(!Number.isInteger(before_sequence) || Number(before_sequence) <= 0)
|
|
373
500
|
) {
|
|
374
501
|
throw new Error("before_sequence must be a positive integer");
|
|
375
502
|
}
|
|
376
|
-
const
|
|
377
|
-
|
|
378
|
-
:
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
503
|
+
const limit = Math.min(Math.max(input?.limit ?? 50, 1), 200);
|
|
504
|
+
const page = await this.store.list_message_page({
|
|
505
|
+
...(before_sequence !== undefined ? { before_sequence } : {}),
|
|
506
|
+
limit: limit + 1,
|
|
507
|
+
include_internal: input?.include_internal === true,
|
|
508
|
+
});
|
|
509
|
+
const has_more = page.length > limit;
|
|
510
|
+
const messages = has_more ? page.slice(1) : page;
|
|
383
511
|
const start_sequence = messages[0]?.sequence;
|
|
384
512
|
const end_sequence = messages.at(-1)?.sequence;
|
|
385
|
-
const
|
|
386
|
-
? segment?.range.start_sequence
|
|
387
|
-
: await this.store.active_before_sequence(messages);
|
|
388
|
-
const has_more = history_boundary !== undefined &&
|
|
389
|
-
await this.store.has_segment_before(history_boundary);
|
|
390
|
-
const stats = await this.store.stats();
|
|
391
|
-
const items = messages
|
|
392
|
-
.filter((message) => input?.include_internal === true || message.visibility === "visible")
|
|
393
|
-
.map((message) => structuredClone(message));
|
|
513
|
+
const stats = await this.store.message_stats();
|
|
394
514
|
return {
|
|
395
|
-
items,
|
|
515
|
+
items: messages.map((message) => structuredClone(message)),
|
|
396
516
|
total: stats.message_count,
|
|
397
|
-
source,
|
|
398
517
|
...(start_sequence !== undefined ? { start_sequence } : {}),
|
|
399
518
|
...(end_sequence !== undefined ? { end_sequence } : {}),
|
|
400
|
-
...(has_more &&
|
|
401
|
-
? { next_before_sequence:
|
|
519
|
+
...(has_more && start_sequence !== undefined
|
|
520
|
+
? { next_before_sequence: start_sequence }
|
|
402
521
|
: {}),
|
|
403
522
|
has_more,
|
|
404
523
|
};
|
|
405
524
|
}
|
|
406
525
|
|
|
407
|
-
/** 读取最新累计 Summary 与全部 Active Message,供模型上下文使用。 */
|
|
408
|
-
async context_snapshot(): Promise<SessionContextSnapshot> {
|
|
409
|
-
await this.ensure_initialized();
|
|
410
|
-
return {
|
|
411
|
-
summary: await this.store.read_latest_summary(),
|
|
412
|
-
messages: [...this.messages_by_id.values()]
|
|
413
|
-
.sort(compare_message_sequence)
|
|
414
|
-
.map((message) => structuredClone(message)),
|
|
415
|
-
};
|
|
416
|
-
}
|
|
417
|
-
|
|
418
526
|
/** 读取全部真实历史,供 Fork 等明确的全量复制操作使用。 */
|
|
419
527
|
async list_history_messages(): Promise<SessionMessage[]> {
|
|
420
528
|
await this.ensure_initialized();
|
|
421
|
-
return await this.store.
|
|
529
|
+
return await this.store.list_messages();
|
|
422
530
|
}
|
|
423
531
|
|
|
424
532
|
/** 读取当前 Session 的存储统计。 */
|
|
425
533
|
async storage_stats(): Promise<SessionMessageStorageStats> {
|
|
426
534
|
await this.ensure_initialized();
|
|
427
|
-
return await this.store.
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
/** 把 Active 前缀和累计 Summary 提交为不可变 Segment。 */
|
|
431
|
-
async compact_active(input: {
|
|
432
|
-
/** 移入 Segment 的最后一条真实 Message sequence。 */
|
|
433
|
-
through_sequence: number;
|
|
434
|
-
/** 写入 Segment footer 的累计 Summary。 */
|
|
435
|
-
summary: SessionSegmentSummary;
|
|
436
|
-
}): Promise<void> {
|
|
437
|
-
await this.ensure_initialized();
|
|
438
|
-
const result = await this.store.compact_active(input);
|
|
439
|
-
this.messages_by_id.clear();
|
|
440
|
-
for (const message of result.active_messages) {
|
|
441
|
-
this.messages_by_id.set(message.message_id, structuredClone(message));
|
|
442
|
-
}
|
|
535
|
+
return await this.store.message_stats();
|
|
443
536
|
}
|
|
444
537
|
|
|
445
538
|
/** 向当前 Session 导入 fork 来源 Message,并重新分配全部身份和顺序。 */
|
|
@@ -453,7 +546,7 @@ export class SessionMessages {
|
|
|
453
546
|
const message_id = resolve_import_id(
|
|
454
547
|
message_ids,
|
|
455
548
|
source.message_id,
|
|
456
|
-
source.
|
|
549
|
+
source.role,
|
|
457
550
|
);
|
|
458
551
|
await this.create_message((sequence, created_at) => ({
|
|
459
552
|
...structuredClone(source),
|
|
@@ -473,54 +566,73 @@ export class SessionMessages {
|
|
|
473
566
|
}
|
|
474
567
|
}
|
|
475
568
|
|
|
476
|
-
/** @internal
|
|
477
|
-
|
|
569
|
+
/** @internal 只向运行投影追加 Agent 文本 delta。 */
|
|
570
|
+
project_agent_delta(
|
|
478
571
|
message_id: string,
|
|
479
572
|
part_id: string,
|
|
480
573
|
type: "text" | "reasoning",
|
|
481
574
|
delta: string,
|
|
482
|
-
):
|
|
483
|
-
|
|
575
|
+
): void {
|
|
576
|
+
this.agent_state.project_delta(message_id, part_id, type, delta);
|
|
484
577
|
}
|
|
485
578
|
|
|
486
|
-
/** @internal
|
|
487
|
-
|
|
579
|
+
/** @internal 只向运行投影追加 Agent Tool 输入 delta。 */
|
|
580
|
+
project_agent_tool_input_delta(
|
|
488
581
|
message_id: string,
|
|
489
582
|
part_id: string,
|
|
490
583
|
tool_call_id: string,
|
|
491
584
|
delta: string,
|
|
492
|
-
):
|
|
493
|
-
|
|
585
|
+
): void {
|
|
586
|
+
this.agent_state.project_delta(
|
|
494
587
|
message_id,
|
|
495
588
|
part_id,
|
|
496
|
-
|
|
589
|
+
"tool_input",
|
|
497
590
|
delta,
|
|
591
|
+
tool_call_id,
|
|
498
592
|
);
|
|
499
593
|
}
|
|
500
594
|
|
|
501
|
-
/** @internal
|
|
502
|
-
|
|
595
|
+
/** @internal 只向运行投影写入 Agent 完整 Part。 */
|
|
596
|
+
project_agent_part(
|
|
597
|
+
message_id: string,
|
|
598
|
+
part: SessionAgentMessagePart,
|
|
599
|
+
): void {
|
|
600
|
+
this.agent_state.project_part(message_id, part);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/** @internal 原子提交当前运行投影。 */
|
|
604
|
+
async checkpoint_agent_message(message_id: string): Promise<void> {
|
|
605
|
+
await this.agent_state.checkpoint(message_id);
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/** @internal 原子提交一组非流式 Agent Parts。 */
|
|
609
|
+
async commit_agent_parts(
|
|
503
610
|
message_id: string,
|
|
504
|
-
|
|
611
|
+
parts: readonly SessionAgentMessagePart[],
|
|
505
612
|
): Promise<void> {
|
|
506
|
-
await this.
|
|
613
|
+
await this.agent_state.commit_parts(message_id, parts);
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/** @internal 丢弃未提交的当前 Step 投影。 */
|
|
617
|
+
async rollback_agent_projection(message_id: string): Promise<void> {
|
|
618
|
+
await this.agent_state.rollback_projection(message_id);
|
|
507
619
|
}
|
|
508
620
|
|
|
509
621
|
/** @internal 原子提交当前 Assistant step 的 metadata 快照。 */
|
|
510
|
-
async
|
|
622
|
+
async commit_agent_step(
|
|
511
623
|
message_id: string,
|
|
512
|
-
parts:
|
|
624
|
+
parts: SessionAgentMessagePart[],
|
|
513
625
|
): Promise<void> {
|
|
514
|
-
await this.
|
|
626
|
+
await this.agent_state.commit_step(message_id, parts);
|
|
515
627
|
}
|
|
516
628
|
|
|
517
629
|
/** @internal 收口 Assistant Message。 */
|
|
518
|
-
async
|
|
630
|
+
async complete_agent_message(
|
|
519
631
|
message_id: string,
|
|
520
632
|
status: "completed" | "stopped" | "failed",
|
|
521
633
|
error?: string,
|
|
522
634
|
): Promise<void> {
|
|
523
|
-
await this.
|
|
635
|
+
await this.agent_state.complete(message_id, status, error);
|
|
524
636
|
}
|
|
525
637
|
|
|
526
638
|
private async create_message(
|
|
@@ -529,47 +641,40 @@ export class SessionMessages {
|
|
|
529
641
|
publish_mutation = true,
|
|
530
642
|
): Promise<SessionMessage> {
|
|
531
643
|
await this.ensure_initialized();
|
|
532
|
-
|
|
533
|
-
const
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
});
|
|
540
|
-
this.accept_message(message, publish_mutation);
|
|
541
|
-
return message;
|
|
542
|
-
}
|
|
543
|
-
const message = await this.store.append_message((state) =>
|
|
544
|
-
factory(state.message_sequence, Date.now()),
|
|
545
|
-
);
|
|
644
|
+
const message = await this.store.create_message((state) => {
|
|
645
|
+
const candidate = factory(state.message_sequence, Date.now());
|
|
646
|
+
if (draft && (candidate.role !== "agent" || candidate.state !== "streaming")) {
|
|
647
|
+
throw new Error("Draft Message must be a streaming Agent Message");
|
|
648
|
+
}
|
|
649
|
+
return candidate;
|
|
650
|
+
});
|
|
546
651
|
this.accept_message(message, publish_mutation);
|
|
547
652
|
return message;
|
|
548
653
|
}
|
|
549
654
|
|
|
550
655
|
/** 读取当前流式 Assistant 中的指定 Tool Part。 */
|
|
551
656
|
find_streaming_tool(tool_call_id: string): SessionStreamingToolLocation | undefined {
|
|
552
|
-
return this.
|
|
657
|
+
return this.agent_state.find_streaming_tool(tool_call_id);
|
|
553
658
|
}
|
|
554
659
|
|
|
555
660
|
/** 返回当前 Session 中全部等待用户响应的 canonical Interaction。 */
|
|
556
|
-
list_pending_interactions():
|
|
557
|
-
return this.
|
|
661
|
+
list_pending_interactions(): SessionAgentInteractionPart[] {
|
|
662
|
+
return this.agent_state.list_pending_interactions();
|
|
558
663
|
}
|
|
559
664
|
|
|
560
665
|
/** 原子创建 Interaction,并把关联 Tool 转为 waiting-user。 */
|
|
561
666
|
async request_interaction(
|
|
562
667
|
request: SessionInteractionRequest,
|
|
563
|
-
): Promise<
|
|
564
|
-
return await this.
|
|
668
|
+
): Promise<SessionAgentInteractionPart> {
|
|
669
|
+
return await this.agent_state.request_interaction(request);
|
|
565
670
|
}
|
|
566
671
|
|
|
567
672
|
/** 原子保存用户响应,并按 Interaction 结果恢复或终止关联 Tool。 */
|
|
568
673
|
async resolve_interaction(
|
|
569
674
|
interaction_id: string,
|
|
570
675
|
response: SessionInteractionResponse,
|
|
571
|
-
): Promise<
|
|
572
|
-
return await this.
|
|
676
|
+
): Promise<SessionAgentInteractionPart> {
|
|
677
|
+
return await this.agent_state.resolve_interaction(
|
|
573
678
|
interaction_id,
|
|
574
679
|
response,
|
|
575
680
|
);
|
|
@@ -579,8 +684,8 @@ export class SessionMessages {
|
|
|
579
684
|
async close_interaction(
|
|
580
685
|
interaction_id: string,
|
|
581
686
|
input: SessionInteractionCloseInput,
|
|
582
|
-
): Promise<
|
|
583
|
-
return await this.
|
|
687
|
+
): Promise<SessionAgentInteractionPart> {
|
|
688
|
+
return await this.agent_state.close_interaction(interaction_id, input);
|
|
584
689
|
}
|
|
585
690
|
|
|
586
691
|
private build_message_mutation(
|
|
@@ -589,7 +694,7 @@ export class SessionMessages {
|
|
|
589
694
|
return {
|
|
590
695
|
mutation_id: generate_id(),
|
|
591
696
|
variant: "message",
|
|
592
|
-
|
|
697
|
+
role: message.role,
|
|
593
698
|
message_id: message.message_id,
|
|
594
699
|
sequence: message.sequence,
|
|
595
700
|
revision: message.revision,
|
|
@@ -602,33 +707,41 @@ export class SessionMessages {
|
|
|
602
707
|
|
|
603
708
|
private accept_message(message: SessionMessage, publish_mutation = true): void {
|
|
604
709
|
if (!publish_mutation) {
|
|
605
|
-
this.
|
|
710
|
+
this.remember_message(message);
|
|
606
711
|
return;
|
|
607
712
|
}
|
|
608
713
|
this.accept_mutation(this.build_message_mutation(message), message);
|
|
609
714
|
}
|
|
610
715
|
|
|
611
716
|
private accept_mutation(mutation: SessionMutation, message: SessionMessage): void {
|
|
612
|
-
this.
|
|
717
|
+
this.remember_message(message);
|
|
613
718
|
this.publish(mutation);
|
|
614
719
|
}
|
|
615
720
|
|
|
721
|
+
/** 仅缓存可变的 streaming Agent Message;终态历史始终读取 SQLite。 */
|
|
722
|
+
private remember_message(message: SessionMessage): void {
|
|
723
|
+
this.messages_by_id.delete(message.message_id);
|
|
724
|
+
if (message.role === "agent" && message.state === "streaming") {
|
|
725
|
+
this.messages_by_id.set(message.message_id, structuredClone(message));
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
|
|
616
729
|
private async ensure_initialized(): Promise<void> {
|
|
617
|
-
|
|
730
|
+
await this.initialize();
|
|
618
731
|
}
|
|
619
732
|
|
|
620
733
|
}
|
|
621
734
|
|
|
622
|
-
function require_message<
|
|
735
|
+
function require_message<TRole extends SessionMessage["role"]>(
|
|
623
736
|
messages: SessionMessage[],
|
|
624
737
|
message_id: string,
|
|
625
|
-
|
|
626
|
-
): Extract<SessionMessage, {
|
|
738
|
+
role: TRole,
|
|
739
|
+
): Extract<SessionMessage, { role: TRole }> {
|
|
627
740
|
const message = messages.find((item) => item.message_id === message_id);
|
|
628
|
-
if (!message || message.
|
|
629
|
-
throw new Error(`Session ${
|
|
741
|
+
if (!message || message.role !== role) {
|
|
742
|
+
throw new Error(`Session ${role} Message not found: ${message_id}`);
|
|
630
743
|
}
|
|
631
|
-
return message as Extract<SessionMessage, {
|
|
744
|
+
return message as Extract<SessionMessage, { role: TRole }>;
|
|
632
745
|
}
|
|
633
746
|
|
|
634
747
|
function resolve_import_id(map: Map<string, string>, source_id: string, prefix: string): string {
|
|
@@ -640,6 +753,14 @@ function resolve_import_id(map: Map<string, string>, source_id: string, prefix:
|
|
|
640
753
|
}
|
|
641
754
|
|
|
642
755
|
/** 按真实 Message sequence 升序排序。 */
|
|
643
|
-
function
|
|
644
|
-
|
|
756
|
+
function resolve_changed_agent_parts(
|
|
757
|
+
current: SessionAgentMessage,
|
|
758
|
+
next: SessionAgentMessage,
|
|
759
|
+
): SessionAgentMessagePart[] {
|
|
760
|
+
const current_by_id = new Map(
|
|
761
|
+
current.parts.map((part) => [part.part_id, JSON.stringify(part)]),
|
|
762
|
+
);
|
|
763
|
+
return next.parts.filter(
|
|
764
|
+
(part) => current_by_id.get(part.part_id) !== JSON.stringify(part),
|
|
765
|
+
);
|
|
645
766
|
}
|