@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
|
@@ -11,7 +11,7 @@ import type {
|
|
|
11
11
|
AgentSessionTimelineEvent,
|
|
12
12
|
} from "@/types/agent/SessionTypes.js";
|
|
13
13
|
import type {
|
|
14
|
-
|
|
14
|
+
SessionAgentToolPart,
|
|
15
15
|
SessionMessage,
|
|
16
16
|
} from "@downcity/type";
|
|
17
17
|
|
|
@@ -53,7 +53,7 @@ function create_timeline_event(input: {
|
|
|
53
53
|
/** 将单个 Tool Part 展开为调用与可选结果事件。 */
|
|
54
54
|
function project_tool_part(
|
|
55
55
|
message: SessionMessage,
|
|
56
|
-
part:
|
|
56
|
+
part: SessionAgentToolPart,
|
|
57
57
|
start_index: number,
|
|
58
58
|
): AgentSessionTimelineEvent[] {
|
|
59
59
|
const events = [create_timeline_event({
|
|
@@ -84,52 +84,77 @@ function project_tool_part(
|
|
|
84
84
|
export function to_session_message_timeline_events(
|
|
85
85
|
message: SessionMessage,
|
|
86
86
|
): AgentSessionTimelineEvent[] {
|
|
87
|
-
if (message.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
:
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
role: "assistant",
|
|
104
|
-
text: message.message,
|
|
105
|
-
index: 0,
|
|
106
|
-
})];
|
|
107
|
-
}
|
|
108
|
-
if (message.type === "user") {
|
|
109
|
-
const text = message.parts
|
|
110
|
-
.filter((part) => part.type === "text")
|
|
111
|
-
.map((part) => part.text.trim())
|
|
112
|
-
.filter(Boolean)
|
|
113
|
-
.join("\n");
|
|
87
|
+
if (message.role === "user") {
|
|
88
|
+
const text_parts: string[] = [];
|
|
89
|
+
for (const part of message.parts) {
|
|
90
|
+
switch (part.type) {
|
|
91
|
+
case "text":
|
|
92
|
+
if (part.text.trim()) text_parts.push(part.text.trim());
|
|
93
|
+
break;
|
|
94
|
+
case "context":
|
|
95
|
+
case "file":
|
|
96
|
+
case "data":
|
|
97
|
+
break;
|
|
98
|
+
default:
|
|
99
|
+
assert_never(part);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const text = text_parts.join("\n");
|
|
114
103
|
return [create_timeline_event({ message, role: "user", text, index: 0 })];
|
|
115
104
|
}
|
|
116
105
|
|
|
117
106
|
const events: AgentSessionTimelineEvent[] = [];
|
|
118
107
|
for (const part of [...message.parts].sort((left, right) => left.sequence - right.sequence)) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
108
|
+
switch (part.type) {
|
|
109
|
+
case "text": {
|
|
110
|
+
const text = part.text.trim();
|
|
111
|
+
if (text) {
|
|
112
|
+
events.push(create_timeline_event({
|
|
113
|
+
message,
|
|
114
|
+
role: "agent",
|
|
115
|
+
text,
|
|
116
|
+
index: events.length,
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
case "action":
|
|
122
|
+
events.push({
|
|
123
|
+
id: `${message.message_id}:${events.length}`,
|
|
124
|
+
role: "action",
|
|
125
|
+
ts: message.updated_at,
|
|
126
|
+
text: part.description
|
|
127
|
+
? `${part.title}\n${part.description}`
|
|
128
|
+
: part.title,
|
|
129
|
+
action_title: part.title,
|
|
130
|
+
...(part.description ? { action_description: part.description } : {}),
|
|
131
|
+
action_state: part.state,
|
|
132
|
+
});
|
|
133
|
+
break;
|
|
134
|
+
case "error":
|
|
122
135
|
events.push(create_timeline_event({
|
|
123
136
|
message,
|
|
124
|
-
role: "
|
|
125
|
-
text,
|
|
137
|
+
role: "agent",
|
|
138
|
+
text: part.message,
|
|
126
139
|
index: events.length,
|
|
127
140
|
}));
|
|
128
|
-
|
|
129
|
-
|
|
141
|
+
break;
|
|
142
|
+
case "tool":
|
|
143
|
+
events.push(...project_tool_part(message, part, events.length));
|
|
144
|
+
break;
|
|
145
|
+
case "reasoning":
|
|
146
|
+
case "interaction":
|
|
147
|
+
case "file":
|
|
148
|
+
case "data":
|
|
149
|
+
break;
|
|
150
|
+
default:
|
|
151
|
+
assert_never(part);
|
|
130
152
|
}
|
|
131
|
-
if (part.type !== "tool") continue;
|
|
132
|
-
events.push(...project_tool_part(message, part, events.length));
|
|
133
153
|
}
|
|
134
154
|
return events;
|
|
135
155
|
}
|
|
156
|
+
|
|
157
|
+
/** canonical Part 联合类型新增成员时强制时间线显式处理。 */
|
|
158
|
+
function assert_never(value: never): never {
|
|
159
|
+
throw new Error(`Unsupported timeline Session Part: ${String((value as { type?: unknown }).type)}`);
|
|
160
|
+
}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 基于稳定 Part 游标的自适应上下文策略。
|
|
3
|
+
*
|
|
4
|
+
* Message 仍是 canonical 持久化聚合,Part 是上下文取舍与摘要边界。策略只写自己的
|
|
5
|
+
* checkpoint 派生表,不修改 Message;单个 Agent Message 很大时也可以在
|
|
6
|
+
* Message 内部形成摘要边界。
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type {
|
|
10
|
+
SessionAgentMessagePart,
|
|
11
|
+
SessionMessage,
|
|
12
|
+
SessionUserMessagePart,
|
|
13
|
+
} from "@downcity/type";
|
|
14
|
+
import { generate_id } from "@/utils/Id.js";
|
|
15
|
+
import { build_text_model_messages, generate_model } from "@executor/model/ModelGenerate.js";
|
|
16
|
+
import { session_messages_to_model_messages } from "@/executor/messages/SessionModelMessages.js";
|
|
17
|
+
import type { SessionContextPolicy } from "@/types/session/SessionContextPolicy.js";
|
|
18
|
+
import type {
|
|
19
|
+
AdaptivePartCheckpointRow,
|
|
20
|
+
StablePartCandidate,
|
|
21
|
+
} from "@/types/session/AdaptivePartContextPolicy.js";
|
|
22
|
+
import {
|
|
23
|
+
build_initial_session_summary_prompt,
|
|
24
|
+
build_updated_session_summary_prompt,
|
|
25
|
+
SESSION_SUMMARY_SYSTEM_PROMPT,
|
|
26
|
+
} from "@/session/composer/policies/SessionSummaryPrompts.js";
|
|
27
|
+
|
|
28
|
+
const POLICY_VERSION = 1;
|
|
29
|
+
const SUMMARY_MAX_OUTPUT_TOKENS = 4_000;
|
|
30
|
+
const CHECKPOINT_TABLE = "composer_adaptive_part_checkpoints";
|
|
31
|
+
|
|
32
|
+
/** 默认 Part 级上下文策略。 */
|
|
33
|
+
export class AdaptivePartContextPolicy implements SessionContextPolicy {
|
|
34
|
+
readonly name = "adaptive_part";
|
|
35
|
+
|
|
36
|
+
/** 创建当前策略独享的 checkpoint 表。 */
|
|
37
|
+
async initialize(input: Parameters<SessionContextPolicy["initialize"]>[0]): Promise<void> {
|
|
38
|
+
await input.storage.transaction((transaction) => {
|
|
39
|
+
transaction.execute(`
|
|
40
|
+
CREATE TABLE IF NOT EXISTS ${CHECKPOINT_TABLE} (
|
|
41
|
+
checkpoint_id TEXT PRIMARY KEY,
|
|
42
|
+
through_message_id TEXT NOT NULL REFERENCES messages(message_id) ON DELETE CASCADE,
|
|
43
|
+
through_message_sequence INTEGER NOT NULL,
|
|
44
|
+
through_part_sequence INTEGER NOT NULL,
|
|
45
|
+
summary TEXT NOT NULL,
|
|
46
|
+
policy_version INTEGER NOT NULL,
|
|
47
|
+
created_at INTEGER NOT NULL,
|
|
48
|
+
UNIQUE(through_message_sequence, through_part_sequence, policy_version)
|
|
49
|
+
)
|
|
50
|
+
`);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** 返回显式摘要 system block 与 Part 边界后的 canonical 历史。 */
|
|
55
|
+
async resolve(input: Parameters<SessionContextPolicy["resolve"]>[0]) {
|
|
56
|
+
const checkpoint = await this.read_latest_checkpoint(input.storage);
|
|
57
|
+
const canonical = await input.storage.list_messages();
|
|
58
|
+
const tail = checkpoint
|
|
59
|
+
? slice_messages_after_checkpoint(canonical, checkpoint)
|
|
60
|
+
: canonical;
|
|
61
|
+
return {
|
|
62
|
+
messages: await session_messages_to_model_messages(tail, input.project_root),
|
|
63
|
+
...(checkpoint?.summary.trim()
|
|
64
|
+
? {
|
|
65
|
+
system_blocks: [{
|
|
66
|
+
source: "session" as const,
|
|
67
|
+
name: "context-summary",
|
|
68
|
+
content: `<session-context-summary>\n${checkpoint.summary}\n</session-context-summary>`,
|
|
69
|
+
}],
|
|
70
|
+
}
|
|
71
|
+
: {}),
|
|
72
|
+
diagnostics: {
|
|
73
|
+
policy_name: this.name,
|
|
74
|
+
...(canonical.at(-1)?.sequence !== undefined
|
|
75
|
+
? { through_sequence: canonical.at(-1)?.sequence }
|
|
76
|
+
: {}),
|
|
77
|
+
...(checkpoint
|
|
78
|
+
? { through_part_sequence: checkpoint.through_part_sequence }
|
|
79
|
+
: {}),
|
|
80
|
+
derived: Boolean(checkpoint),
|
|
81
|
+
...(checkpoint ? { derivation_id: checkpoint.checkpoint_id } : {}),
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** 上下文压力出现时,按体积选择较旧稳定 Part 并合并进累计摘要。 */
|
|
87
|
+
async recover(input: Parameters<SessionContextPolicy["recover"]>[0]): Promise<boolean> {
|
|
88
|
+
if (!input.model) return false;
|
|
89
|
+
const previous = await this.read_latest_checkpoint(input.storage);
|
|
90
|
+
const canonical = await input.storage.list_messages();
|
|
91
|
+
const candidates = collect_stable_parts(canonical, previous);
|
|
92
|
+
const compact_parts = select_compact_parts(candidates);
|
|
93
|
+
const boundary = compact_parts.at(-1);
|
|
94
|
+
if (!boundary) return false;
|
|
95
|
+
const conversation_text = compact_parts
|
|
96
|
+
.map(candidate_to_summary_text)
|
|
97
|
+
.filter(Boolean)
|
|
98
|
+
.join("\n");
|
|
99
|
+
if (!conversation_text) return false;
|
|
100
|
+
const prompt = previous?.summary.trim()
|
|
101
|
+
? build_updated_session_summary_prompt({
|
|
102
|
+
previous_summary: previous.summary,
|
|
103
|
+
conversation_text,
|
|
104
|
+
})
|
|
105
|
+
: build_initial_session_summary_prompt({ conversation_text });
|
|
106
|
+
const result = await generate_model(input.model, {
|
|
107
|
+
messages: build_text_model_messages(SESSION_SUMMARY_SYSTEM_PROMPT, prompt),
|
|
108
|
+
max_output_tokens: SUMMARY_MAX_OUTPUT_TOKENS,
|
|
109
|
+
}, {
|
|
110
|
+
request_kind: "history_compaction",
|
|
111
|
+
on_failure: input.on_model_request_failure,
|
|
112
|
+
});
|
|
113
|
+
const summary = String(result.text || "").trim();
|
|
114
|
+
if (!summary) throw new Error("Context summary model returned an empty result");
|
|
115
|
+
const checkpoint_id = `checkpoint:${generate_id()}`;
|
|
116
|
+
try {
|
|
117
|
+
await input.storage.transaction((transaction) => {
|
|
118
|
+
transaction.execute(`
|
|
119
|
+
INSERT INTO ${CHECKPOINT_TABLE} (
|
|
120
|
+
checkpoint_id, through_message_id, through_message_sequence,
|
|
121
|
+
through_part_sequence, summary, policy_version, created_at
|
|
122
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
123
|
+
`, [
|
|
124
|
+
checkpoint_id,
|
|
125
|
+
boundary.message.message_id,
|
|
126
|
+
boundary.message.sequence,
|
|
127
|
+
boundary.part.sequence,
|
|
128
|
+
summary,
|
|
129
|
+
POLICY_VERSION,
|
|
130
|
+
Date.now(),
|
|
131
|
+
]);
|
|
132
|
+
});
|
|
133
|
+
return true;
|
|
134
|
+
} catch (error) {
|
|
135
|
+
const latest = await this.read_latest_checkpoint(input.storage);
|
|
136
|
+
if (latest && compare_position(latest, boundary) >= 0) return true;
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** 读取当前版本位置最靠后的累计 checkpoint。 */
|
|
142
|
+
private async read_latest_checkpoint(
|
|
143
|
+
storage: Parameters<SessionContextPolicy["resolve"]>[0]["storage"],
|
|
144
|
+
): Promise<AdaptivePartCheckpointRow | null> {
|
|
145
|
+
return await storage.transaction((transaction) =>
|
|
146
|
+
transaction.get<AdaptivePartCheckpointRow>(`
|
|
147
|
+
SELECT checkpoint_id, through_message_id, through_message_sequence,
|
|
148
|
+
through_part_sequence, summary, policy_version, created_at
|
|
149
|
+
FROM ${CHECKPOINT_TABLE}
|
|
150
|
+
WHERE policy_version = ?
|
|
151
|
+
ORDER BY through_message_sequence DESC, through_part_sequence DESC
|
|
152
|
+
LIMIT 1
|
|
153
|
+
`, [POLICY_VERSION])
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** 收集 checkpoint 后适合进入摘要的稳定 Part。 */
|
|
159
|
+
function collect_stable_parts(
|
|
160
|
+
messages: readonly SessionMessage[],
|
|
161
|
+
checkpoint: AdaptivePartCheckpointRow | null,
|
|
162
|
+
): StablePartCandidate[] {
|
|
163
|
+
return messages.flatMap((message) => message.parts.flatMap((part) => {
|
|
164
|
+
if (checkpoint && compare_part_position(message.sequence, part.sequence, checkpoint) <= 0) {
|
|
165
|
+
return [];
|
|
166
|
+
}
|
|
167
|
+
if (!is_stable_summary_part(message, part)) return [];
|
|
168
|
+
return [{ message, part }];
|
|
169
|
+
}));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** 判断 Part 是否稳定且值得占据累计摘要。 */
|
|
173
|
+
function is_stable_summary_part(
|
|
174
|
+
message: SessionMessage,
|
|
175
|
+
part: SessionUserMessagePart | SessionAgentMessagePart,
|
|
176
|
+
): boolean {
|
|
177
|
+
switch (part.type) {
|
|
178
|
+
case "reasoning":
|
|
179
|
+
case "action":
|
|
180
|
+
case "interaction":
|
|
181
|
+
return false;
|
|
182
|
+
case "tool":
|
|
183
|
+
return part.state === "completed" || part.state === "failed";
|
|
184
|
+
case "text":
|
|
185
|
+
if (message.role === "user") return true;
|
|
186
|
+
return "state" in part && part.state === "done" && message.state === "done";
|
|
187
|
+
case "context":
|
|
188
|
+
case "file":
|
|
189
|
+
case "data":
|
|
190
|
+
case "error":
|
|
191
|
+
return true;
|
|
192
|
+
default:
|
|
193
|
+
return assert_never(part);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** 把单个 Part 收窄为摘要模型需要的稳定事实。 */
|
|
198
|
+
function candidate_to_summary_text(candidate: StablePartCandidate): string {
|
|
199
|
+
return JSON.stringify({
|
|
200
|
+
role: candidate.message.role,
|
|
201
|
+
message_id: candidate.message.message_id,
|
|
202
|
+
part: summary_part(candidate.part),
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** 删除瞬时字段并保留 Tool 调用/结果原子。 */
|
|
207
|
+
function summary_part(
|
|
208
|
+
part: SessionUserMessagePart | SessionAgentMessagePart,
|
|
209
|
+
): Record<string, unknown> {
|
|
210
|
+
switch (part.type) {
|
|
211
|
+
case "text":
|
|
212
|
+
return { type: "text", text: part.text };
|
|
213
|
+
case "context":
|
|
214
|
+
return { type: "context", tag: part.tag, context: part.context };
|
|
215
|
+
case "file":
|
|
216
|
+
return { type: "file", media_type: part.media_type, url: part.url, filename: part.filename };
|
|
217
|
+
case "data":
|
|
218
|
+
return { type: "data", data_type: part.data_type, data: part.data };
|
|
219
|
+
case "tool":
|
|
220
|
+
return {
|
|
221
|
+
type: "tool",
|
|
222
|
+
tool_name: part.tool_name,
|
|
223
|
+
input: part.input,
|
|
224
|
+
output: part.output,
|
|
225
|
+
error: part.error,
|
|
226
|
+
};
|
|
227
|
+
case "error":
|
|
228
|
+
return { type: "error", code: part.code, message: part.message };
|
|
229
|
+
case "reasoning":
|
|
230
|
+
case "action":
|
|
231
|
+
case "interaction":
|
|
232
|
+
return { type: part.type };
|
|
233
|
+
default:
|
|
234
|
+
return assert_never(part);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* 选择足以释放约一半原始上下文体积的最旧 Part。
|
|
240
|
+
*
|
|
241
|
+
* 关键点(中文):Part 数量不能代表上下文压力。一个巨大 Tool/Text Part
|
|
242
|
+
* 可以独自占满窗口,因此使用送入摘要模型的序列化字符体积作为轻量估算,
|
|
243
|
+
* 并保证只有一个可用 Part 时仍能推进 checkpoint。
|
|
244
|
+
*/
|
|
245
|
+
function select_compact_parts(
|
|
246
|
+
candidates: readonly StablePartCandidate[],
|
|
247
|
+
): StablePartCandidate[] {
|
|
248
|
+
if (candidates.length === 0) return [];
|
|
249
|
+
const sizes = candidates.map((candidate) =>
|
|
250
|
+
Math.max(candidate_to_summary_text(candidate).length, 1)
|
|
251
|
+
);
|
|
252
|
+
const target_size = Math.ceil(
|
|
253
|
+
sizes.reduce((total, size) => total + size, 0) / 2,
|
|
254
|
+
);
|
|
255
|
+
let selected_size = 0;
|
|
256
|
+
let selected_count = 0;
|
|
257
|
+
while (selected_count < candidates.length && selected_size < target_size) {
|
|
258
|
+
selected_size += sizes[selected_count] ?? 0;
|
|
259
|
+
selected_count += 1;
|
|
260
|
+
}
|
|
261
|
+
return candidates.slice(0, Math.max(selected_count, 1));
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/** 删除 checkpoint 以前的 Part;边界可以位于单个 Message 内部。 */
|
|
265
|
+
function slice_messages_after_checkpoint(
|
|
266
|
+
messages: readonly SessionMessage[],
|
|
267
|
+
checkpoint: AdaptivePartCheckpointRow,
|
|
268
|
+
): SessionMessage[] {
|
|
269
|
+
return messages.flatMap((message): SessionMessage[] => {
|
|
270
|
+
if (message.sequence < checkpoint.through_message_sequence) return [];
|
|
271
|
+
if (message.sequence > checkpoint.through_message_sequence) return [message];
|
|
272
|
+
const parts = message.parts.filter(
|
|
273
|
+
(part) => part.sequence > checkpoint.through_part_sequence,
|
|
274
|
+
);
|
|
275
|
+
if (parts.length === 0) return [];
|
|
276
|
+
return [{ ...message, parts } as SessionMessage];
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/** 比较 canonical Part 与 checkpoint 的全局线性位置。 */
|
|
281
|
+
function compare_part_position(
|
|
282
|
+
message_sequence: number,
|
|
283
|
+
part_sequence: number,
|
|
284
|
+
checkpoint: AdaptivePartCheckpointRow,
|
|
285
|
+
): number {
|
|
286
|
+
if (message_sequence !== checkpoint.through_message_sequence) {
|
|
287
|
+
return message_sequence - checkpoint.through_message_sequence;
|
|
288
|
+
}
|
|
289
|
+
return part_sequence - checkpoint.through_part_sequence;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/** 比较 checkpoint 与候选边界。 */
|
|
293
|
+
function compare_position(
|
|
294
|
+
checkpoint: AdaptivePartCheckpointRow,
|
|
295
|
+
candidate: StablePartCandidate,
|
|
296
|
+
): number {
|
|
297
|
+
return -compare_part_position(
|
|
298
|
+
candidate.message.sequence,
|
|
299
|
+
candidate.part.sequence,
|
|
300
|
+
checkpoint,
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/** canonical Part 联合类型新增成员时强制摘要策略显式选择语义。 */
|
|
305
|
+
function assert_never(value: never): never {
|
|
306
|
+
throw new Error(`Unsupported summary Session Part: ${String((value as { type?: unknown }).type)}`);
|
|
307
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 全量历史上下文策略。
|
|
3
|
+
*
|
|
4
|
+
* 该策略没有派生状态,适用于短会话、测试或拥有足够上下文窗口的模型。
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { session_messages_to_model_messages } from "@/executor/messages/SessionModelMessages.js";
|
|
8
|
+
import type { SessionContextPolicy } from "@/types/session/SessionContextPolicy.js";
|
|
9
|
+
|
|
10
|
+
/** 直接把全部 canonical Message 转换为模型历史。 */
|
|
11
|
+
export class FullHistoryContextPolicy implements SessionContextPolicy {
|
|
12
|
+
readonly name = "full_history";
|
|
13
|
+
|
|
14
|
+
/** 全量历史策略不需要创建派生表。 */
|
|
15
|
+
async initialize(): Promise<void> {}
|
|
16
|
+
|
|
17
|
+
/** 按 canonical 顺序返回完整模型历史。 */
|
|
18
|
+
async resolve(input: Parameters<SessionContextPolicy["resolve"]>[0]) {
|
|
19
|
+
const messages = await input.storage.list_messages();
|
|
20
|
+
return {
|
|
21
|
+
messages: await session_messages_to_model_messages(messages, input.project_root),
|
|
22
|
+
diagnostics: {
|
|
23
|
+
policy_name: this.name,
|
|
24
|
+
...(messages.at(-1)?.sequence !== undefined
|
|
25
|
+
? { through_sequence: messages.at(-1)?.sequence }
|
|
26
|
+
: {}),
|
|
27
|
+
derived: false,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** 没有派生状态,因此无法通过恢复改变上下文。 */
|
|
33
|
+
async recover(): Promise<boolean> {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Session 累计摘要策略使用的稳定提示词。 */
|
|
2
|
+
|
|
3
|
+
/** 上下文摘要 system prompt。 */
|
|
4
|
+
export const SESSION_SUMMARY_SYSTEM_PROMPT = [
|
|
5
|
+
"You are a context summarization assistant.",
|
|
6
|
+
"Read the conversation and produce only a structured checkpoint summary.",
|
|
7
|
+
"Do not continue the conversation or answer its questions.",
|
|
8
|
+
].join("\n");
|
|
9
|
+
|
|
10
|
+
/** 构建第一次累计摘要的 prompt。 */
|
|
11
|
+
export function build_initial_session_summary_prompt(input: {
|
|
12
|
+
/** 本次需要压缩的 canonical 对话文本。 */
|
|
13
|
+
conversation_text: string;
|
|
14
|
+
}): string {
|
|
15
|
+
return [
|
|
16
|
+
input.conversation_text.trim(),
|
|
17
|
+
"",
|
|
18
|
+
"Create a concise checkpoint another model can use to continue the work.",
|
|
19
|
+
"Preserve exact requests, constraints, decisions, completed work, pending work, file paths, function names, and errors.",
|
|
20
|
+
"Use these headings: Goal, Constraints, Progress, Key Decisions, Next Steps, Critical Context.",
|
|
21
|
+
].join("\n");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** 构建基于旧摘要的增量累计摘要 prompt。 */
|
|
25
|
+
export function build_updated_session_summary_prompt(input: {
|
|
26
|
+
/** 上一次已经持久化的累计摘要。 */
|
|
27
|
+
previous_summary: string;
|
|
28
|
+
/** 本次新增的 canonical 对话文本。 */
|
|
29
|
+
conversation_text: string;
|
|
30
|
+
}): string {
|
|
31
|
+
return [
|
|
32
|
+
"<previous-summary>",
|
|
33
|
+
input.previous_summary.trim(),
|
|
34
|
+
"</previous-summary>",
|
|
35
|
+
"",
|
|
36
|
+
input.conversation_text.trim(),
|
|
37
|
+
"",
|
|
38
|
+
"Update the checkpoint with the new conversation.",
|
|
39
|
+
"Preserve still-relevant facts and exact requests, constraints, decisions, file paths, function names, and errors.",
|
|
40
|
+
"Use these headings: Goal, Constraints, Progress, Key Decisions, Next Steps, Critical Context.",
|
|
41
|
+
].join("\n");
|
|
42
|
+
}
|
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
|
|
8
8
|
import type { ModelStreamEvent } from "@downcity/type";
|
|
9
9
|
import {
|
|
10
|
-
|
|
10
|
+
SessionAgentMessageWriter,
|
|
11
11
|
SessionMessages,
|
|
12
12
|
} from "@/session/SessionMessages.js";
|
|
13
|
-
import type {
|
|
14
|
-
import type {
|
|
13
|
+
import type { SessionAgentContent } from "@downcity/type";
|
|
14
|
+
import type { SessionAgentMessagePart } from "@downcity/type";
|
|
15
15
|
import type { SessionAssistantOutput } from "@/types/executor/SessionAssistantOutput.js";
|
|
16
16
|
import type {
|
|
17
17
|
SessionToolExecutionResult,
|
|
@@ -22,8 +22,8 @@ import type {
|
|
|
22
22
|
export class SessionAssistantOutputAdapter implements SessionAssistantOutput {
|
|
23
23
|
private readonly turn_id: string;
|
|
24
24
|
private readonly messages: SessionMessages;
|
|
25
|
-
private writer:
|
|
26
|
-
private writer_task: Promise<
|
|
25
|
+
private writer: SessionAgentMessageWriter | null = null;
|
|
26
|
+
private writer_task: Promise<SessionAgentMessageWriter> | null = null;
|
|
27
27
|
private step_pending = false;
|
|
28
28
|
|
|
29
29
|
constructor(options: {
|
|
@@ -65,7 +65,7 @@ export class SessionAssistantOutputAdapter implements SessionAssistantOutput {
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
/** 使用模型聚合出的 canonical Parts 校验当前 Step。 */
|
|
68
|
-
async finish_step(parts:
|
|
68
|
+
async finish_step(parts: SessionAgentMessagePart[]): Promise<void> {
|
|
69
69
|
await (await this.ensure_writer()).finish_step(parts);
|
|
70
70
|
}
|
|
71
71
|
|
|
@@ -86,9 +86,23 @@ export class SessionAssistantOutputAdapter implements SessionAssistantOutput {
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
/** 追加 Action 产生的封闭 Assistant 内容。 */
|
|
89
|
-
async append_result_parts(parts: readonly
|
|
90
|
-
if (parts.length === 0) return;
|
|
91
|
-
await (await this.ensure_writer()).append_result_parts(parts);
|
|
89
|
+
async append_result_parts(parts: readonly SessionAgentContent[]): Promise<SessionAgentMessagePart[]> {
|
|
90
|
+
if (parts.length === 0) return [];
|
|
91
|
+
return await (await this.ensure_writer()).append_result_parts(parts);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** 在 Turn 收口产物之前追加用户可见的 canonical Error Part。 */
|
|
95
|
+
async append_error(input: {
|
|
96
|
+
/** 错误影响范围。 */
|
|
97
|
+
scope: "session" | "turn";
|
|
98
|
+
/** 稳定错误码。 */
|
|
99
|
+
code: string;
|
|
100
|
+
/** 用户可见错误信息。 */
|
|
101
|
+
message: string;
|
|
102
|
+
/** 当前错误是否允许重试恢复。 */
|
|
103
|
+
recoverable: boolean;
|
|
104
|
+
}): Promise<void> {
|
|
105
|
+
await (await this.ensure_writer()).append_error(input);
|
|
92
106
|
}
|
|
93
107
|
|
|
94
108
|
/** 按 Turn 结果收口最后一个 canonical Message。 */
|
|
@@ -110,10 +124,10 @@ export class SessionAssistantOutputAdapter implements SessionAssistantOutput {
|
|
|
110
124
|
}
|
|
111
125
|
|
|
112
126
|
/** 惰性打开当前连续 Assistant 回复的唯一 Writer。 */
|
|
113
|
-
private async ensure_writer(): Promise<
|
|
127
|
+
private async ensure_writer(): Promise<SessionAgentMessageWriter> {
|
|
114
128
|
if (this.writer) return this.writer;
|
|
115
129
|
if (this.writer_task) return await this.writer_task;
|
|
116
|
-
this.writer_task = this.messages.
|
|
130
|
+
this.writer_task = this.messages.open_agent_message({
|
|
117
131
|
turn_id: this.turn_id,
|
|
118
132
|
});
|
|
119
133
|
try {
|
package/src/session/messages/{SessionActionMessageWriter.ts → SessionAgentActionPartWriter.ts}
RENAMED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 单个 canonical Action
|
|
2
|
+
* 单个 canonical Action Part 的生命周期写入器。
|
|
3
3
|
*
|
|
4
4
|
* Writer 只保存目标 Message 身份与发布策略,实际状态仍由 SessionMessages
|
|
5
5
|
* 持久化和接受,避免形成第二份 Action 状态。
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import type { SessionMessages } from "@/session/SessionMessages.js";
|
|
9
|
-
import type {
|
|
9
|
+
import type { CompleteSessionAgentActionPartInput } from "@/types/session/SessionMessages.js";
|
|
10
10
|
|
|
11
|
-
/** 单个 Action
|
|
12
|
-
export class
|
|
13
|
-
/** 当前 Action Message 的稳定标识。 */
|
|
11
|
+
/** 单个 Action Part 的生命周期 writer。 */
|
|
12
|
+
export class SessionAgentActionPartWriter {
|
|
13
|
+
/** 当前 Action Part 所属 Agent Message 的稳定标识。 */
|
|
14
14
|
readonly message_id: string;
|
|
15
15
|
private readonly messages: SessionMessages;
|
|
16
16
|
private readonly publish_mutation: boolean;
|
|
@@ -27,9 +27,9 @@ export class SessionActionMessageWriter {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
/** 把 Action 更新为 completed。 */
|
|
30
|
-
async complete(input?:
|
|
30
|
+
async complete(input?: CompleteSessionAgentActionPartInput): Promise<void> {
|
|
31
31
|
if (this.closed) return;
|
|
32
|
-
await this.messages.
|
|
32
|
+
await this.messages.update_action_part(
|
|
33
33
|
this.message_id,
|
|
34
34
|
"completed",
|
|
35
35
|
input,
|
|
@@ -41,7 +41,7 @@ export class SessionActionMessageWriter {
|
|
|
41
41
|
/** 把 Action 更新为 failed。 */
|
|
42
42
|
async fail(error: unknown): Promise<void> {
|
|
43
43
|
if (this.closed) return;
|
|
44
|
-
await this.messages.
|
|
44
|
+
await this.messages.update_action_part(
|
|
45
45
|
this.message_id,
|
|
46
46
|
"failed",
|
|
47
47
|
{
|