@downcity/agent 1.1.237 → 1.1.258
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 +21 -20
- package/bin/agent/{local/Agent.d.ts → Agent.d.ts} +37 -27
- package/bin/agent/Agent.d.ts.map +1 -0
- package/bin/agent/Agent.js +211 -0
- package/bin/agent/Agent.js.map +1 -0
- package/bin/agent/AgentContext.d.ts +64 -0
- package/bin/agent/AgentContext.d.ts.map +1 -0
- package/bin/agent/AgentContext.js +53 -0
- package/bin/agent/AgentContext.js.map +1 -0
- package/bin/agent/{local/AgentInstructions.d.ts → AgentInstructions.d.ts} +1 -6
- package/bin/agent/AgentInstructions.d.ts.map +1 -0
- package/bin/agent/{local/AgentInstructions.js → AgentInstructions.js} +1 -10
- package/bin/agent/AgentInstructions.js.map +1 -0
- package/bin/{model/CityModelAdapter.d.ts → agent/AgentModel.d.ts} +3 -3
- package/bin/agent/AgentModel.d.ts.map +1 -0
- package/bin/{model/CityModelAdapter.js → agent/AgentModel.js} +11 -4
- package/bin/agent/AgentModel.js.map +1 -0
- package/bin/agent/{local/services/AgentSessions.d.ts → AgentSessions.d.ts} +30 -40
- package/bin/agent/AgentSessions.d.ts.map +1 -0
- package/bin/agent/{local/services/AgentSessions.js → AgentSessions.js} +62 -79
- package/bin/agent/AgentSessions.js.map +1 -0
- package/bin/agent/AgentState.d.ts +64 -0
- package/bin/agent/AgentState.d.ts.map +1 -0
- package/bin/agent/AgentState.js +118 -0
- package/bin/agent/AgentState.js.map +1 -0
- package/bin/config/Paths.d.ts +0 -43
- package/bin/config/Paths.d.ts.map +1 -1
- package/bin/config/Paths.js +0 -79
- package/bin/config/Paths.js.map +1 -1
- package/bin/config/ProjectSetup.d.ts.map +1 -0
- package/bin/{agent/local → config}/ProjectSetup.js +1 -1
- package/bin/config/ProjectSetup.js.map +1 -0
- package/bin/executor/Executor.d.ts +20 -86
- package/bin/executor/Executor.d.ts.map +1 -1
- package/bin/executor/Executor.js +109 -260
- package/bin/executor/Executor.js.map +1 -1
- package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts +1 -1
- package/bin/executor/composer/system/default/DefaultSessionSystemComposer.d.ts.map +1 -1
- package/bin/executor/composer/system/default/SystemDomain.d.ts +1 -1
- package/bin/executor/composer/system/default/SystemDomain.d.ts.map +1 -1
- package/bin/executor/composer/system/default/SystemDomain.js +4 -1
- package/bin/executor/composer/system/default/SystemDomain.js.map +1 -1
- package/bin/executor/composer/system/default/assets/core.prompt.d.ts +1 -1
- package/bin/executor/composer/system/default/assets/core.prompt.d.ts.map +1 -1
- package/bin/executor/composer/system/default/assets/core.prompt.js +1 -1
- package/bin/executor/composer/system/default/assets/core.prompt.js.map +1 -1
- package/bin/executor/core-engine/CoreEngineRunner.d.ts +7 -13
- package/bin/executor/core-engine/CoreEngineRunner.d.ts.map +1 -1
- package/bin/executor/core-engine/CoreEngineRunner.js +81 -34
- package/bin/executor/core-engine/CoreEngineRunner.js.map +1 -1
- package/bin/executor/services/ExecutorRecoveryPolicy.d.ts +6 -12
- package/bin/executor/services/ExecutorRecoveryPolicy.d.ts.map +1 -1
- package/bin/executor/services/ExecutorRecoveryPolicy.js +20 -6
- package/bin/executor/services/ExecutorRecoveryPolicy.js.map +1 -1
- package/bin/executor/tools/file/ReadImageToolBridge.d.ts +21 -0
- package/bin/executor/tools/file/ReadImageToolBridge.d.ts.map +1 -0
- package/bin/executor/tools/file/ReadImageToolBridge.js +69 -0
- package/bin/executor/tools/file/ReadImageToolBridge.js.map +1 -0
- package/bin/executor/tools/plugin/PluginToolBridge.d.ts.map +1 -1
- package/bin/executor/tools/plugin/PluginToolBridge.js +6 -5
- package/bin/executor/tools/plugin/PluginToolBridge.js.map +1 -1
- package/bin/executor/tools/plugin/PluginToolDefinition.d.ts.map +1 -1
- package/bin/executor/tools/plugin/PluginToolDefinition.js +15 -2
- package/bin/executor/tools/plugin/PluginToolDefinition.js.map +1 -1
- package/bin/executor/types/SessionHistoryMeta.d.ts +0 -2
- package/bin/executor/types/SessionHistoryMeta.d.ts.map +1 -1
- package/bin/index.d.ts +17 -21
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +9 -11
- package/bin/index.js.map +1 -1
- package/bin/plugin/core/ActionScheduleExecutor.d.ts +1 -1
- package/bin/plugin/core/ActionScheduleExecutor.d.ts.map +1 -1
- package/bin/plugin/core/ActionScheduleRuntime.d.ts +1 -1
- package/bin/plugin/core/ActionScheduleRuntime.d.ts.map +1 -1
- package/bin/plugin/core/BasePlugin.d.ts +4 -3
- package/bin/plugin/core/BasePlugin.d.ts.map +1 -1
- package/bin/plugin/core/BasePlugin.js.map +1 -1
- package/bin/plugin/core/HookRegistry.d.ts +5 -8
- package/bin/plugin/core/HookRegistry.d.ts.map +1 -1
- package/bin/plugin/core/HookRegistry.js +12 -12
- package/bin/plugin/core/HookRegistry.js.map +1 -1
- package/bin/plugin/core/PluginActionFactory.d.ts +6 -3
- package/bin/plugin/core/PluginActionFactory.d.ts.map +1 -1
- package/bin/plugin/core/PluginActionFactory.js.map +1 -1
- package/bin/plugin/core/PluginActionRunner.d.ts +1 -1
- package/bin/plugin/core/PluginActionRunner.d.ts.map +1 -1
- package/bin/plugin/core/PluginCatalog.d.ts +1 -1
- package/bin/plugin/core/PluginCatalog.d.ts.map +1 -1
- package/bin/plugin/core/PluginHttpRoutes.d.ts +1 -1
- package/bin/plugin/core/PluginHttpRoutes.d.ts.map +1 -1
- package/bin/plugin/core/PluginLocalExecution.d.ts +4 -5
- package/bin/plugin/core/PluginLocalExecution.d.ts.map +1 -1
- package/bin/plugin/core/PluginLocalExecution.js +4 -12
- package/bin/plugin/core/PluginLocalExecution.js.map +1 -1
- package/bin/plugin/core/PluginRegistry.d.ts +16 -12
- package/bin/plugin/core/PluginRegistry.d.ts.map +1 -1
- package/bin/plugin/core/PluginRegistry.js +43 -22
- package/bin/plugin/core/PluginRegistry.js.map +1 -1
- package/bin/plugin/core/PluginStateController.d.ts +1 -1
- package/bin/plugin/core/PluginStateController.d.ts.map +1 -1
- package/bin/{agent/remote → remote}/RemoteAgent.d.ts +4 -4
- package/bin/remote/RemoteAgent.d.ts.map +1 -0
- package/bin/{agent/remote → remote}/RemoteAgent.js +3 -3
- package/bin/remote/RemoteAgent.js.map +1 -0
- package/bin/{agent/remote → remote}/RemoteSession.d.ts +9 -11
- package/bin/remote/RemoteSession.d.ts.map +1 -0
- package/bin/{agent/remote → remote}/RemoteSession.js +3 -33
- package/bin/remote/RemoteSession.js.map +1 -0
- package/bin/{agent/remote → remote}/RemoteTransport.d.ts +7 -9
- package/bin/remote/RemoteTransport.d.ts.map +1 -0
- package/bin/remote/RemoteTransport.js.map +1 -0
- package/bin/{agent/remote → remote}/TransportFactory.d.ts +1 -1
- package/bin/remote/TransportFactory.d.ts.map +1 -0
- package/bin/{agent/remote → remote}/TransportFactory.js +2 -2
- package/bin/remote/TransportFactory.js.map +1 -0
- package/bin/{agent/remote → remote}/transports/HttpRemoteAgentTransport.d.ts +8 -9
- package/bin/remote/transports/HttpRemoteAgentTransport.d.ts.map +1 -0
- package/bin/{agent/remote → remote}/transports/HttpRemoteAgentTransport.js +0 -13
- package/bin/remote/transports/HttpRemoteAgentTransport.js.map +1 -0
- package/bin/{rpc/Client.d.ts → remote/transports/RpcClient.d.ts} +15 -22
- package/bin/remote/transports/RpcClient.d.ts.map +1 -0
- package/bin/{rpc/Client.js → remote/transports/RpcClient.js} +2 -13
- package/bin/remote/transports/RpcClient.js.map +1 -0
- package/bin/{agent/remote → remote}/transports/RpcRemoteAgentTransport.d.ts +8 -9
- package/bin/remote/transports/RpcRemoteAgentTransport.d.ts.map +1 -0
- package/bin/{agent/remote → remote}/transports/RpcRemoteAgentTransport.js +1 -4
- package/bin/remote/transports/RpcRemoteAgentTransport.js.map +1 -0
- package/bin/session/DefaultSessionComposer.d.ts +18 -0
- package/bin/session/DefaultSessionComposer.d.ts.map +1 -0
- package/bin/session/DefaultSessionComposer.js +62 -0
- package/bin/session/DefaultSessionComposer.js.map +1 -0
- package/bin/session/Session.d.ts +44 -33
- package/bin/session/Session.d.ts.map +1 -1
- package/bin/session/Session.js +440 -274
- package/bin/session/Session.js.map +1 -1
- package/bin/session/SessionMessages.d.ts +117 -0
- package/bin/session/SessionMessages.d.ts.map +1 -0
- package/bin/session/{recorder/SessionRecorder.js → SessionMessages.js} +194 -284
- package/bin/session/SessionMessages.js.map +1 -0
- package/bin/session/SessionQueue.d.ts +34 -0
- package/bin/session/SessionQueue.d.ts.map +1 -0
- package/bin/session/SessionQueue.js +60 -0
- package/bin/session/SessionQueue.js.map +1 -0
- package/bin/session/SessionState.d.ts +70 -0
- package/bin/session/SessionState.d.ts.map +1 -0
- package/bin/session/SessionState.js +267 -0
- package/bin/session/SessionState.js.map +1 -0
- package/bin/session/SessionSystem.d.ts +15 -0
- package/bin/session/SessionSystem.d.ts.map +1 -0
- package/bin/session/SessionSystem.js +95 -0
- package/bin/session/SessionSystem.js.map +1 -0
- package/bin/session/SessionTurn.d.ts +84 -0
- package/bin/session/SessionTurn.d.ts.map +1 -0
- package/bin/session/SessionTurn.js +588 -0
- package/bin/session/SessionTurn.js.map +1 -0
- package/bin/session/approval/SessionApprovalBroker.d.ts +48 -0
- package/bin/session/approval/SessionApprovalBroker.d.ts.map +1 -0
- package/bin/session/approval/SessionApprovalBroker.js +126 -0
- package/bin/session/approval/SessionApprovalBroker.js.map +1 -0
- package/bin/session/browse/Browse.d.ts.map +1 -1
- package/bin/session/browse/Browse.js +1 -4
- package/bin/session/browse/Browse.js.map +1 -1
- package/bin/session/{recorder → messages}/JsonlSessionMessageStore.d.ts.map +1 -1
- package/bin/session/{recorder → messages}/JsonlSessionMessageStore.js.map +1 -1
- package/bin/session/messages/SessionAssistantMessageWriter.d.ts +62 -0
- package/bin/session/messages/SessionAssistantMessageWriter.d.ts.map +1 -0
- package/bin/session/messages/SessionAssistantMessageWriter.js +287 -0
- package/bin/session/messages/SessionAssistantMessageWriter.js.map +1 -0
- package/bin/session/messages/SessionJsonValue.d.ts +10 -0
- package/bin/session/messages/SessionJsonValue.d.ts.map +1 -0
- package/bin/session/messages/SessionJsonValue.js +23 -0
- package/bin/session/messages/SessionJsonValue.js.map +1 -0
- package/bin/session/{recorder → messages}/SessionMessageCodec.d.ts +4 -1
- package/bin/session/messages/SessionMessageCodec.d.ts.map +1 -0
- package/bin/session/{recorder → messages}/SessionMessageCodec.js +33 -19
- package/bin/session/messages/SessionMessageCodec.js.map +1 -0
- package/bin/session/messages/SessionMessageCompaction.d.ts +22 -0
- package/bin/session/messages/SessionMessageCompaction.d.ts.map +1 -0
- package/bin/session/{recorder/SessionRecorderCompaction.js → messages/SessionMessageCompaction.js} +19 -51
- package/bin/session/messages/SessionMessageCompaction.js.map +1 -0
- package/bin/session/runtime/SessionEventHub.d.ts +1 -8
- package/bin/session/runtime/SessionEventHub.d.ts.map +1 -1
- package/bin/session/runtime/SessionEventHub.js +1 -6
- package/bin/session/runtime/SessionEventHub.js.map +1 -1
- package/bin/session/storage/Metadata.d.ts +23 -5
- package/bin/session/storage/Metadata.d.ts.map +1 -1
- package/bin/session/storage/Metadata.js +32 -29
- package/bin/session/storage/Metadata.js.map +1 -1
- package/bin/session/storage/RuntimeSessionPort.d.ts +5 -10
- package/bin/session/storage/RuntimeSessionPort.d.ts.map +1 -1
- package/bin/session/storage/RuntimeSessionPort.js +2 -4
- package/bin/session/storage/RuntimeSessionPort.js.map +1 -1
- package/bin/types/agent/AgentOptions.d.ts +6 -35
- package/bin/types/agent/AgentOptions.d.ts.map +1 -1
- package/bin/types/agent/AgentState.d.ts +28 -0
- package/bin/types/agent/AgentState.d.ts.map +1 -0
- package/bin/types/agent/AgentState.js +9 -0
- package/bin/types/agent/AgentState.js.map +1 -0
- package/bin/types/agent/SessionActor.d.ts +0 -2
- package/bin/types/agent/SessionActor.d.ts.map +1 -1
- package/bin/types/agent/SessionTypes.d.ts +5 -18
- package/bin/types/agent/SessionTypes.d.ts.map +1 -1
- package/bin/types/executor/SessionRunContext.d.ts +8 -2
- package/bin/types/executor/SessionRunContext.d.ts.map +1 -1
- package/bin/types/executor/SessionRunContext.js +1 -1
- package/bin/types/executor/SessionToolExecutionContext.d.ts +20 -0
- package/bin/types/executor/SessionToolExecutionContext.d.ts.map +1 -0
- package/bin/types/executor/SessionToolExecutionContext.js +10 -0
- package/bin/types/executor/SessionToolExecutionContext.js.map +1 -0
- package/bin/types/plugin/PluginAction.d.ts +10 -1
- package/bin/types/plugin/PluginAction.d.ts.map +1 -1
- package/bin/types/plugin/PluginCommand.d.ts +3 -11
- package/bin/types/plugin/PluginCommand.d.ts.map +1 -1
- package/bin/types/plugin/PluginConfig.d.ts +12 -0
- package/bin/types/plugin/PluginConfig.d.ts.map +1 -0
- package/bin/types/plugin/PluginConfig.js +5 -0
- package/bin/types/plugin/PluginConfig.js.map +1 -0
- package/bin/types/plugin/PluginDefinition.d.ts +10 -3
- package/bin/types/plugin/PluginDefinition.d.ts.map +1 -1
- package/bin/types/plugin/PluginHttp.d.ts +1 -1
- package/bin/types/plugin/PluginHttp.d.ts.map +1 -1
- package/bin/types/plugin/PluginRunContext.d.ts +26 -0
- package/bin/types/plugin/PluginRunContext.d.ts.map +1 -0
- package/bin/types/plugin/PluginRunContext.js +10 -0
- package/bin/types/plugin/PluginRunContext.js.map +1 -0
- package/bin/types/plugin/PluginRuntime.d.ts +9 -3
- package/bin/types/plugin/PluginRuntime.d.ts.map +1 -1
- package/bin/types/plugin/PluginToolRuntime.d.ts +11 -0
- package/bin/types/plugin/PluginToolRuntime.d.ts.map +1 -1
- package/bin/types/rpc/RpcProtocol.d.ts +1 -13
- package/bin/types/rpc/RpcProtocol.d.ts.map +1 -1
- package/bin/types/session/SessionApproval.d.ts +4 -38
- package/bin/types/session/SessionApproval.d.ts.map +1 -1
- package/bin/types/session/SessionApprovalBroker.d.ts +17 -0
- package/bin/types/session/SessionApprovalBroker.d.ts.map +1 -0
- package/bin/types/session/SessionApprovalBroker.js +7 -0
- package/bin/types/session/SessionApprovalBroker.js.map +1 -0
- package/bin/types/session/SessionComposer.d.ts +99 -0
- package/bin/types/session/SessionComposer.d.ts.map +1 -0
- package/bin/types/session/SessionComposer.js +8 -0
- package/bin/types/session/SessionComposer.js.map +1 -0
- package/bin/types/session/SessionLocalState.d.ts +6 -6
- package/bin/types/session/SessionLocalState.d.ts.map +1 -1
- package/bin/types/session/SessionLocalState.js +1 -1
- package/bin/types/session/SessionMessage.d.ts +3 -2
- package/bin/types/session/SessionMessage.d.ts.map +1 -1
- package/bin/types/session/SessionMessages.d.ts +115 -0
- package/bin/types/session/SessionMessages.d.ts.map +1 -0
- package/bin/types/session/SessionMessages.js +7 -0
- package/bin/types/session/SessionMessages.js.map +1 -0
- package/bin/types/session/SessionMutation.d.ts +1 -10
- package/bin/types/session/SessionMutation.d.ts.map +1 -1
- package/bin/types/session/SessionMutation.js.map +1 -1
- package/bin/types/session/SessionOptions.d.ts +8 -23
- package/bin/types/session/SessionOptions.d.ts.map +1 -1
- package/bin/types/session/SessionPort.d.ts +72 -0
- package/bin/types/session/SessionPort.d.ts.map +1 -0
- package/bin/types/session/SessionPort.js +9 -0
- package/bin/types/session/SessionPort.js.map +1 -0
- package/bin/types/session/SessionQueue.d.ts +104 -0
- package/bin/types/session/SessionQueue.d.ts.map +1 -0
- package/bin/types/session/SessionQueue.js +7 -0
- package/bin/types/session/SessionQueue.js.map +1 -0
- package/bin/types/session/SessionState.d.ts +43 -0
- package/bin/types/session/SessionState.d.ts.map +1 -0
- package/bin/types/session/SessionState.js +7 -0
- package/bin/types/session/SessionState.js.map +1 -0
- package/bin/types/session/SessionSystem.d.ts +26 -0
- package/bin/types/session/SessionSystem.d.ts.map +1 -0
- package/bin/types/session/SessionSystem.js +7 -0
- package/bin/types/session/SessionSystem.js.map +1 -0
- package/bin/types/session/SessionTool.d.ts +23 -0
- package/bin/types/session/SessionTool.d.ts.map +1 -0
- package/bin/types/session/SessionTool.js +7 -0
- package/bin/types/session/SessionTool.js.map +1 -0
- package/bin/types/session/SessionTurn.d.ts +52 -0
- package/bin/types/session/SessionTurn.d.ts.map +1 -0
- package/bin/types/session/SessionTurn.js +7 -0
- package/bin/types/session/SessionTurn.js.map +1 -0
- package/package.json +3 -3
- package/scripts/agent-env.test.mjs +4 -18
- package/scripts/agent-ready.test.mjs +33 -2
- package/scripts/agent-session-maintenance.test.mjs +52 -0
- package/scripts/city-model-tool-loop.test.mjs +3 -4
- package/scripts/core-engine-context-compaction.test.mjs +5 -22
- package/scripts/image-plugin-job.test.mjs +4 -6
- package/scripts/plugin-tool-bridge.test.mjs +44 -36
- package/scripts/read-image-tool-bridge.test.mjs +71 -0
- package/scripts/remote-session-reconnect.test.mjs +1 -34
- package/scripts/session-compaction-prompts.test.mjs +1 -49
- package/scripts/session-composer.test.mjs +163 -0
- package/scripts/session-config-turn-boundary.test.mjs +2 -5
- package/scripts/session-list-title.test.mjs +3 -2
- package/scripts/session-messages-error.test.mjs +57 -0
- package/scripts/{session-recorder.test.mjs → session-messages.test.mjs} +131 -90
- package/scripts/session-queue.test.mjs +64 -0
- package/scripts/session-shell-approval.test.mjs +171 -0
- package/scripts/session-system-blocks.test.mjs +10 -10
- package/scripts/session-title-event.test.mjs +1 -0
- package/src/agent/Agent.ts +241 -0
- package/src/agent/AgentContext.ts +92 -0
- package/src/agent/{local/AgentInstructions.ts → AgentInstructions.ts} +0 -11
- package/src/{model/CityModelAdapter.ts → agent/AgentModel.ts} +10 -3
- package/src/agent/{local/services/AgentSessions.ts → AgentSessions.ts} +81 -110
- package/src/agent/AgentState.ts +151 -0
- package/src/config/Paths.ts +0 -91
- package/src/executor/Executor.ts +180 -386
- package/src/executor/README.md +29 -89
- package/src/executor/composer/system/default/DefaultSessionSystemComposer.ts +1 -1
- package/src/executor/composer/system/default/SystemDomain.ts +4 -2
- package/src/executor/composer/system/default/assets/core.prompt.ts +1 -1
- package/src/executor/composer/system/default/assets/core.prompt.ts.txt +15 -2
- package/src/executor/core-engine/CoreEngineRunner.ts +95 -54
- package/src/executor/services/ExecutorRecoveryPolicy.ts +24 -19
- package/src/executor/tools/file/ReadImageToolBridge.ts +79 -0
- package/src/executor/tools/plugin/PluginToolBridge.ts +6 -8
- package/src/executor/tools/plugin/PluginToolDefinition.ts +23 -3
- package/src/executor/types/SessionHistoryMeta.ts +0 -2
- package/src/index.ts +34 -53
- package/src/plugin/core/ActionScheduleExecutor.ts +1 -1
- package/src/plugin/core/ActionScheduleRuntime.ts +1 -1
- package/src/plugin/core/BasePlugin.ts +7 -3
- package/src/plugin/core/HookRegistry.ts +15 -18
- package/src/plugin/core/PluginActionFactory.ts +9 -3
- package/src/plugin/core/PluginActionRunner.ts +1 -1
- package/src/plugin/core/PluginCatalog.ts +1 -1
- package/src/plugin/core/PluginHttpRoutes.ts +1 -1
- package/src/plugin/core/PluginLocalExecution.ts +11 -24
- package/src/plugin/core/PluginRegistry.ts +55 -32
- package/src/plugin/core/PluginStateController.ts +1 -1
- package/src/{agent/remote → remote}/RemoteAgent.ts +4 -4
- package/src/{agent/remote → remote}/RemoteSession.ts +2 -35
- package/src/{agent/remote → remote}/RemoteTransport.ts +0 -3
- package/src/{agent/remote → remote}/TransportFactory.ts +3 -3
- package/src/{agent/remote → remote}/transports/HttpRemoteAgentTransport.ts +1 -23
- package/src/{rpc/Client.ts → remote/transports/RpcClient.ts} +1 -19
- package/src/{agent/remote → remote}/transports/RpcRemoteAgentTransport.ts +2 -10
- package/src/session/DefaultSessionComposer.ts +79 -0
- package/src/session/Session.ts +496 -332
- package/src/session/{recorder/SessionRecorder.ts → SessionMessages.ts} +254 -428
- package/src/session/SessionQueue.ts +86 -0
- package/src/session/SessionState.ts +322 -0
- package/src/session/SessionSystem.ts +117 -0
- package/src/session/SessionTurn.ts +684 -0
- package/src/session/approval/SessionApprovalBroker.ts +164 -0
- package/src/session/browse/Browse.ts +1 -4
- package/src/session/messages/SessionAssistantMessageWriter.ts +345 -0
- package/src/session/messages/SessionJsonValue.ts +25 -0
- package/src/session/{recorder → messages}/SessionMessageCodec.ts +38 -20
- package/src/session/{recorder/SessionRecorderCompaction.ts → messages/SessionMessageCompaction.ts} +30 -69
- package/src/session/runtime/SessionEventHub.ts +1 -14
- package/src/session/storage/Metadata.ts +60 -34
- package/src/session/storage/RuntimeSessionPort.ts +7 -14
- package/src/types/agent/AgentOptions.ts +6 -38
- package/src/types/agent/AgentState.ts +33 -0
- package/src/types/agent/SessionActor.ts +0 -3
- package/src/types/agent/SessionTypes.ts +5 -18
- package/src/types/executor/SessionRunContext.ts +10 -2
- package/src/types/executor/SessionToolExecutionContext.ts +21 -0
- package/src/types/plugin/PluginAction.ts +10 -1
- package/src/types/plugin/PluginCommand.ts +3 -14
- package/src/types/plugin/PluginConfig.ts +13 -0
- package/src/types/plugin/PluginDefinition.ts +13 -6
- package/src/types/plugin/PluginHttp.ts +1 -1
- package/src/types/plugin/PluginRunContext.ts +31 -0
- package/src/types/plugin/PluginRuntime.ts +13 -6
- package/src/types/plugin/PluginToolRuntime.ts +13 -1
- package/src/types/rpc/RpcProtocol.ts +0 -14
- package/src/types/session/SessionApproval.ts +4 -43
- package/src/types/session/SessionApprovalBroker.ts +18 -0
- package/src/types/session/SessionComposer.ts +114 -0
- package/src/types/session/SessionLocalState.ts +6 -6
- package/src/types/session/SessionMessage.ts +3 -2
- package/src/types/session/SessionMessages.ts +127 -0
- package/src/types/session/SessionMutation.ts +0 -11
- package/src/types/session/SessionOptions.ts +8 -40
- package/src/types/session/SessionPort.ts +97 -0
- package/src/types/session/SessionQueue.ts +122 -0
- package/src/types/session/SessionState.ts +47 -0
- package/src/types/session/SessionSystem.ts +27 -0
- package/src/types/session/SessionTool.ts +25 -0
- package/src/types/session/SessionTurn.ts +56 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/bin/agent/local/Agent.d.ts.map +0 -1
- package/bin/agent/local/Agent.js +0 -216
- package/bin/agent/local/Agent.js.map +0 -1
- package/bin/agent/local/AgentInstructions.d.ts.map +0 -1
- package/bin/agent/local/AgentInstructions.js.map +0 -1
- package/bin/agent/local/AgentPluginFactory.d.ts +0 -26
- package/bin/agent/local/AgentPluginFactory.d.ts.map +0 -1
- package/bin/agent/local/AgentPluginFactory.js +0 -33
- package/bin/agent/local/AgentPluginFactory.js.map +0 -1
- package/bin/agent/local/AgentRuntimeAssembly.d.ts +0 -10
- package/bin/agent/local/AgentRuntimeAssembly.d.ts.map +0 -1
- package/bin/agent/local/AgentRuntimeAssembly.js +0 -43
- package/bin/agent/local/AgentRuntimeAssembly.js.map +0 -1
- package/bin/agent/local/ProjectSetup.d.ts.map +0 -1
- package/bin/agent/local/ProjectSetup.js.map +0 -1
- package/bin/agent/local/services/AgentAssemblyService.d.ts +0 -105
- package/bin/agent/local/services/AgentAssemblyService.d.ts.map +0 -1
- package/bin/agent/local/services/AgentAssemblyService.js +0 -184
- package/bin/agent/local/services/AgentAssemblyService.js.map +0 -1
- package/bin/agent/local/services/AgentBackgroundService.d.ts +0 -55
- package/bin/agent/local/services/AgentBackgroundService.d.ts.map +0 -1
- package/bin/agent/local/services/AgentBackgroundService.js +0 -85
- package/bin/agent/local/services/AgentBackgroundService.js.map +0 -1
- package/bin/agent/local/services/AgentSessions.d.ts.map +0 -1
- package/bin/agent/local/services/AgentSessions.js.map +0 -1
- package/bin/agent/remote/RemoteAgent.d.ts.map +0 -1
- package/bin/agent/remote/RemoteAgent.js.map +0 -1
- package/bin/agent/remote/RemoteSession.d.ts.map +0 -1
- package/bin/agent/remote/RemoteSession.js.map +0 -1
- package/bin/agent/remote/RemoteTransport.d.ts.map +0 -1
- package/bin/agent/remote/RemoteTransport.js.map +0 -1
- package/bin/agent/remote/TransportFactory.d.ts.map +0 -1
- package/bin/agent/remote/TransportFactory.js.map +0 -1
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.d.ts.map +0 -1
- package/bin/agent/remote/transports/HttpRemoteAgentTransport.js.map +0 -1
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.d.ts.map +0 -1
- package/bin/agent/remote/transports/RpcRemoteAgentTransport.js.map +0 -1
- package/bin/executor/SessionRunScope.d.ts +0 -68
- package/bin/executor/SessionRunScope.d.ts.map +0 -1
- package/bin/executor/SessionRunScope.js +0 -96
- package/bin/executor/SessionRunScope.js.map +0 -1
- package/bin/executor/composer/compaction/SessionCompactionComposer.d.ts +0 -74
- package/bin/executor/composer/compaction/SessionCompactionComposer.d.ts.map +0 -1
- package/bin/executor/composer/compaction/SessionCompactionComposer.js +0 -9
- package/bin/executor/composer/compaction/SessionCompactionComposer.js.map +0 -1
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.d.ts +0 -27
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.d.ts.map +0 -1
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.js +0 -39
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.js.map +0 -1
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.d.ts +0 -44
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.d.ts.map +0 -1
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.js +0 -218
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.js.map +0 -1
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.d.ts +0 -27
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.d.ts.map +0 -1
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.js +0 -181
- package/bin/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.js.map +0 -1
- package/bin/executor/composer/context/LocalSessionContextComposer.d.ts +0 -50
- package/bin/executor/composer/context/LocalSessionContextComposer.d.ts.map +0 -1
- package/bin/executor/composer/context/LocalSessionContextComposer.js +0 -108
- package/bin/executor/composer/context/LocalSessionContextComposer.js.map +0 -1
- package/bin/executor/composer/context/SessionContextComposer.d.ts +0 -67
- package/bin/executor/composer/context/SessionContextComposer.d.ts.map +0 -1
- package/bin/executor/composer/context/SessionContextComposer.js +0 -9
- package/bin/executor/composer/context/SessionContextComposer.js.map +0 -1
- package/bin/executor/composer/history/SessionHistoryComposer.d.ts +0 -54
- package/bin/executor/composer/history/SessionHistoryComposer.d.ts.map +0 -1
- package/bin/executor/composer/history/SessionHistoryComposer.js +0 -10
- package/bin/executor/composer/history/SessionHistoryComposer.js.map +0 -1
- package/bin/executor/composer/history/SessionHistoryWriter.d.ts +0 -46
- package/bin/executor/composer/history/SessionHistoryWriter.d.ts.map +0 -1
- package/bin/executor/composer/history/SessionHistoryWriter.js +0 -65
- package/bin/executor/composer/history/SessionHistoryWriter.js.map +0 -1
- package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.d.ts +0 -35
- package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.d.ts.map +0 -1
- package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.js +0 -105
- package/bin/executor/composer/history/jsonl/JsonlSessionHistoryComposer.js.map +0 -1
- package/bin/executor/messages/AssistantResultPersistence.d.ts +0 -66
- package/bin/executor/messages/AssistantResultPersistence.d.ts.map +0 -1
- package/bin/executor/messages/AssistantResultPersistence.js +0 -44
- package/bin/executor/messages/AssistantResultPersistence.js.map +0 -1
- package/bin/executor/services/ExecutorInflightService.d.ts +0 -34
- package/bin/executor/services/ExecutorInflightService.d.ts.map +0 -1
- package/bin/executor/services/ExecutorInflightService.js +0 -73
- package/bin/executor/services/ExecutorInflightService.js.map +0 -1
- package/bin/executor/store/history/SessionHistoryStore.d.ts +0 -140
- package/bin/executor/store/history/SessionHistoryStore.d.ts.map +0 -1
- package/bin/executor/store/history/SessionHistoryStore.js +0 -10
- package/bin/executor/store/history/SessionHistoryStore.js.map +0 -1
- package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts +0 -116
- package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.d.ts.map +0 -1
- package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js +0 -709
- package/bin/executor/store/history/jsonl/JsonlSessionHistoryStore.js.map +0 -1
- package/bin/executor/types/SessionHistoryPaths.d.ts +0 -34
- package/bin/executor/types/SessionHistoryPaths.d.ts.map +0 -1
- package/bin/executor/types/SessionHistoryPaths.js +0 -2
- package/bin/executor/types/SessionHistoryPaths.js.map +0 -1
- package/bin/model/CityModelAdapter.d.ts.map +0 -1
- package/bin/model/CityModelAdapter.js.map +0 -1
- package/bin/rpc/Client.d.ts.map +0 -1
- package/bin/rpc/Client.js.map +0 -1
- package/bin/session/SessionSystemBuilder.d.ts +0 -107
- package/bin/session/SessionSystemBuilder.d.ts.map +0 -1
- package/bin/session/SessionSystemBuilder.js +0 -148
- package/bin/session/SessionSystemBuilder.js.map +0 -1
- package/bin/session/recorder/SessionMessageCodec.d.ts.map +0 -1
- package/bin/session/recorder/SessionMessageCodec.js.map +0 -1
- package/bin/session/recorder/SessionRecorder.d.ts +0 -217
- package/bin/session/recorder/SessionRecorder.d.ts.map +0 -1
- package/bin/session/recorder/SessionRecorder.js.map +0 -1
- package/bin/session/recorder/SessionRecorderCompaction.d.ts +0 -18
- package/bin/session/recorder/SessionRecorderCompaction.d.ts.map +0 -1
- package/bin/session/recorder/SessionRecorderCompaction.js.map +0 -1
- package/bin/session/recorder/SessionRecorderHistoryStore.d.ts +0 -66
- package/bin/session/recorder/SessionRecorderHistoryStore.d.ts.map +0 -1
- package/bin/session/recorder/SessionRecorderHistoryStore.js +0 -190
- package/bin/session/recorder/SessionRecorderHistoryStore.js.map +0 -1
- package/bin/session/runtime/SessionPromptRuntime.d.ts +0 -112
- package/bin/session/runtime/SessionPromptRuntime.d.ts.map +0 -1
- package/bin/session/runtime/SessionPromptRuntime.js +0 -357
- package/bin/session/runtime/SessionPromptRuntime.js.map +0 -1
- package/bin/session/services/SessionStateService.d.ts +0 -187
- package/bin/session/services/SessionStateService.d.ts.map +0 -1
- package/bin/session/services/SessionStateService.js +0 -467
- package/bin/session/services/SessionStateService.js.map +0 -1
- package/bin/session/services/SessionTurnService.d.ts +0 -90
- package/bin/session/services/SessionTurnService.d.ts.map +0 -1
- package/bin/session/services/SessionTurnService.js +0 -293
- package/bin/session/services/SessionTurnService.js.map +0 -1
- package/bin/session/services/SessionViewService.d.ts +0 -114
- package/bin/session/services/SessionViewService.d.ts.map +0 -1
- package/bin/session/services/SessionViewService.js +0 -204
- package/bin/session/services/SessionViewService.js.map +0 -1
- package/bin/session/storage/Persistence.d.ts +0 -73
- package/bin/session/storage/Persistence.d.ts.map +0 -1
- package/bin/session/storage/Persistence.js +0 -63
- package/bin/session/storage/Persistence.js.map +0 -1
- package/bin/types/agent/AgentRuntimeAssembly.d.ts +0 -72
- package/bin/types/agent/AgentRuntimeAssembly.d.ts.map +0 -1
- package/bin/types/agent/AgentRuntimeAssembly.js +0 -10
- package/bin/types/agent/AgentRuntimeAssembly.js.map +0 -1
- package/bin/types/runtime/agent/AgentContext.d.ts +0 -306
- package/bin/types/runtime/agent/AgentContext.d.ts.map +0 -1
- package/bin/types/runtime/agent/AgentContext.js +0 -128
- package/bin/types/runtime/agent/AgentContext.js.map +0 -1
- package/bin/types/session/SessionComposerOptions.d.ts +0 -90
- package/bin/types/session/SessionComposerOptions.d.ts.map +0 -1
- package/bin/types/session/SessionComposerOptions.js +0 -10
- package/bin/types/session/SessionComposerOptions.js.map +0 -1
- package/bin/types/session/SessionQueueCommand.d.ts +0 -68
- package/bin/types/session/SessionQueueCommand.d.ts.map +0 -1
- package/bin/types/session/SessionQueueCommand.js +0 -10
- package/bin/types/session/SessionQueueCommand.js.map +0 -1
- package/scripts/session-action-message.test.mjs +0 -410
- package/scripts/session-compaction-context-window.test.mjs +0 -96
- package/scripts/session-history-inflight.test.mjs +0 -146
- package/scripts/session-history-writer-error.test.mjs +0 -57
- package/scripts/session-prompt-runtime.test.mjs +0 -390
- package/src/agent/local/Agent.ts +0 -250
- package/src/agent/local/AgentPluginFactory.ts +0 -51
- package/src/agent/local/AgentRuntimeAssembly.ts +0 -65
- package/src/agent/local/services/AgentAssemblyService.ts +0 -307
- package/src/agent/local/services/AgentBackgroundService.ts +0 -115
- package/src/executor/SessionRunScope.ts +0 -122
- package/src/executor/composer/compaction/SessionCompactionComposer.ts +0 -84
- package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionComposer.ts +0 -51
- package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionExecutor.ts +0 -294
- package/src/executor/composer/compaction/jsonl/JsonlSessionCompactionFileOperations.ts +0 -197
- package/src/executor/composer/context/LocalSessionContextComposer.ts +0 -175
- package/src/executor/composer/context/SessionContextComposer.ts +0 -83
- package/src/executor/composer/history/SessionHistoryComposer.ts +0 -62
- package/src/executor/composer/history/SessionHistoryWriter.ts +0 -100
- package/src/executor/composer/history/jsonl/JsonlSessionHistoryComposer.ts +0 -133
- package/src/executor/messages/AssistantResultPersistence.ts +0 -106
- package/src/executor/services/ExecutorInflightService.ts +0 -95
- package/src/executor/store/history/SessionHistoryStore.ts +0 -172
- package/src/executor/store/history/jsonl/JsonlSessionHistoryStore.ts +0 -879
- package/src/executor/types/SessionHistoryPaths.ts +0 -38
- package/src/session/SessionSystemBuilder.ts +0 -262
- package/src/session/recorder/SessionRecorderHistoryStore.ts +0 -256
- package/src/session/runtime/SessionPromptRuntime.ts +0 -518
- package/src/session/services/SessionStateService.ts +0 -628
- package/src/session/services/SessionTurnService.ts +0 -368
- package/src/session/services/SessionViewService.ts +0 -335
- package/src/session/storage/Persistence.ts +0 -137
- package/src/types/agent/AgentRuntimeAssembly.ts +0 -74
- package/src/types/runtime/agent/AgentContext.ts +0 -387
- package/src/types/session/SessionComposerOptions.ts +0 -107
- package/src/types/session/SessionQueueCommand.ts +0 -78
- /package/bin/{agent/local → config}/ProjectSetup.d.ts +0 -0
- /package/bin/{agent/remote → remote}/RemoteTransport.js +0 -0
- /package/bin/session/{recorder → messages}/JsonlSessionMessageStore.d.ts +0 -0
- /package/bin/session/{recorder → messages}/JsonlSessionMessageStore.js +0 -0
- /package/src/{agent/local → config}/ProjectSetup.ts +0 -0
- /package/src/session/{recorder → messages}/JsonlSessionMessageStore.ts +0 -0
package/src/session/Session.ts
CHANGED
|
@@ -4,15 +4,18 @@
|
|
|
4
4
|
* 关键点(中文)
|
|
5
5
|
* - 面向 `new Agent(...)` 的本地会话使用场景。
|
|
6
6
|
* - 对外保留稳定 Session facade,把状态、turn、view 逻辑下沉到独立 service。
|
|
7
|
-
* - 内部使用 `
|
|
7
|
+
* - 内部使用 `SessionMessages` 统一管理 Active、Segment 与流式 Assistant 草稿。
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { Executor } from "@executor/Executor.js";
|
|
11
|
-
import type { Tool } from "ai";
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
import type { LanguageModel, Tool } from "ai";
|
|
12
|
+
import {
|
|
13
|
+
normalizeAgentModel,
|
|
14
|
+
read_agent_model_context_window,
|
|
15
|
+
type AgentModel,
|
|
16
|
+
} from "@/agent/AgentModel.js";
|
|
17
|
+
import { JsonlSessionMessageStore } from "@/session/messages/JsonlSessionMessageStore.js";
|
|
18
|
+
import { SessionMessages } from "@/session/SessionMessages.js";
|
|
16
19
|
import type {
|
|
17
20
|
AgentSessionConfigSnapshot,
|
|
18
21
|
AgentSessionForkInput,
|
|
@@ -28,10 +31,8 @@ import {
|
|
|
28
31
|
} from "@/session/storage/Paths.js";
|
|
29
32
|
import { resolveSystemTimezone } from "@/session/storage/Metadata.js";
|
|
30
33
|
import { createRuntimeSessionPort } from "@/session/storage/RuntimeSessionPort.js";
|
|
31
|
-
import {
|
|
32
|
-
import type { SessionPort } from "@/types/runtime/agent/AgentContext.js";
|
|
34
|
+
import type { SessionPort } from "@/types/session/SessionPort.js";
|
|
33
35
|
import type {
|
|
34
|
-
SessionMutation,
|
|
35
36
|
SessionMutationSubscriber,
|
|
36
37
|
SessionMutationUnsubscribe,
|
|
37
38
|
} from "@/types/session/SessionMutation.js";
|
|
@@ -41,7 +42,6 @@ import type {
|
|
|
41
42
|
SessionApprovalModeSnapshot,
|
|
42
43
|
SessionApprovalResult,
|
|
43
44
|
SetSessionApprovalModeInput,
|
|
44
|
-
SessionApprovalRuntimeEvent,
|
|
45
45
|
} from "@/types/session/SessionApproval.js";
|
|
46
46
|
import type {
|
|
47
47
|
ListSessionMessagesInput,
|
|
@@ -51,22 +51,35 @@ import type { AgentSessionPromptInput } from "@/types/sdk/AgentSessionPrompt.js"
|
|
|
51
51
|
import type { AgentSessionStopResult } from "@/types/sdk/AgentSessionStop.js";
|
|
52
52
|
import type { AgentSessionTurnHandle } from "@/types/sdk/AgentSessionTurn.js";
|
|
53
53
|
import { SessionEventHub } from "@/session/runtime/SessionEventHub.js";
|
|
54
|
-
import {
|
|
55
|
-
import {
|
|
56
|
-
import { SessionViewService } from "@/session/services/SessionViewService.js";
|
|
54
|
+
import { SessionState } from "@/session/SessionState.js";
|
|
55
|
+
import { SessionTurn } from "@/session/SessionTurn.js";
|
|
57
56
|
import type { SessionLocalState } from "@/types/session/SessionLocalState.js";
|
|
58
|
-
import type { AgentSessionCommand } from "@/types/session/SessionQueueCommand.js";
|
|
59
57
|
import type {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
} from "@/types/session/SessionComposerOptions.js";
|
|
64
|
-
import type { SessionCompactionComposer } from "@/executor/composer/compaction/SessionCompactionComposer.js";
|
|
65
|
-
import type { SessionContextComposer } from "@/executor/composer/context/SessionContextComposer.js";
|
|
66
|
-
import type { SessionHistoryComposer } from "@/executor/composer/history/SessionHistoryComposer.js";
|
|
67
|
-
import type { SessionSystemComposer } from "@/executor/composer/system/SessionSystemComposer.js";
|
|
58
|
+
AgentSessionCommand,
|
|
59
|
+
SessionQueueCommand,
|
|
60
|
+
} from "@/types/session/SessionQueue.js";
|
|
68
61
|
import type { SessionOptions } from "@/types/session/SessionOptions.js";
|
|
69
62
|
import type { AgentPluginExecutionRuntime } from "@/types/plugin/PluginRuntime.js";
|
|
63
|
+
import { SessionApprovalBroker } from "@/session/approval/SessionApprovalBroker.js";
|
|
64
|
+
import { DefaultSessionComposer } from "@/session/DefaultSessionComposer.js";
|
|
65
|
+
import type {
|
|
66
|
+
SessionComposer,
|
|
67
|
+
SessionCompactionPlan,
|
|
68
|
+
SessionComposeInput,
|
|
69
|
+
SessionStepInput,
|
|
70
|
+
} from "@/types/session/SessionComposer.js";
|
|
71
|
+
import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
|
|
72
|
+
import { generateId } from "@/utils/Id.js";
|
|
73
|
+
import { nanoid } from "nanoid";
|
|
74
|
+
import { buildSessionInfo } from "@/session/browse/Browse.js";
|
|
75
|
+
import { ensureSessionTitle } from "@/session/SessionTitle.js";
|
|
76
|
+
import { readSessionMetadata } from "@/session/storage/Metadata.js";
|
|
77
|
+
import { to_executor_history } from "@/session/messages/SessionMessageCodec.js";
|
|
78
|
+
import type { SessionMessage } from "@/types/session/SessionMessage.js";
|
|
79
|
+
import type {
|
|
80
|
+
SessionActionRecordInputV1,
|
|
81
|
+
SessionActionRecordV1,
|
|
82
|
+
} from "@/executor/types/SessionRecords.js";
|
|
70
83
|
|
|
71
84
|
/**
|
|
72
85
|
* SDK 本地 Session。
|
|
@@ -75,150 +88,99 @@ export class Session implements AgentSession {
|
|
|
75
88
|
readonly id: string;
|
|
76
89
|
readonly agentId: string;
|
|
77
90
|
|
|
78
|
-
private readonly
|
|
91
|
+
private readonly project_root: string;
|
|
79
92
|
private readonly tools: Record<string, Tool>;
|
|
80
93
|
private readonly logger: SessionOptions["logger"];
|
|
81
|
-
private readonly
|
|
82
|
-
private readonly
|
|
83
|
-
private readonly
|
|
84
|
-
private readonly
|
|
85
|
-
private readonly
|
|
86
|
-
private readonly
|
|
87
|
-
private readonly messageStore: JsonlSessionMessageStore;
|
|
88
|
-
private readonly recorder: SessionRecorder;
|
|
89
|
-
private readonly historyComposer: SessionHistoryComposer;
|
|
94
|
+
private readonly get_instruction_system_blocks: SessionOptions["getInstructionSystemBlocks"];
|
|
95
|
+
private readonly get_managed_plugin_system_blocks: SessionOptions["getManagedPluginSystemBlocks"];
|
|
96
|
+
private readonly ensure_configured_hook?: SessionOptions["ensureConfigured"];
|
|
97
|
+
private readonly composer: SessionComposer;
|
|
98
|
+
private readonly message_store: JsonlSessionMessageStore;
|
|
99
|
+
private readonly session_messages: SessionMessages;
|
|
90
100
|
private readonly executor: Executor;
|
|
91
|
-
private readonly
|
|
92
|
-
private readonly
|
|
93
|
-
private readonly
|
|
94
|
-
private readonly
|
|
95
|
-
private readonly
|
|
96
|
-
private readonly localState: SessionLocalState;
|
|
97
|
-
private readonly getAgentEnv: SessionOptions["getAgentEnv"];
|
|
101
|
+
private readonly events: SessionEventHub;
|
|
102
|
+
private readonly approval_broker: SessionApprovalBroker;
|
|
103
|
+
private readonly local_state: SessionLocalState;
|
|
104
|
+
private readonly get_agent_env: SessionOptions["getAgentEnv"];
|
|
105
|
+
private readonly get_agent_model: SessionOptions["getAgentModel"];
|
|
98
106
|
private readonly get_agent_plugins: SessionOptions["get_agent_plugins"];
|
|
99
107
|
private effective_instruction_system_blocks: AgentSessionSystemBlock[];
|
|
100
108
|
private effective_agent_env: Record<string, string>;
|
|
101
109
|
private effective_agent_plugins: AgentPluginExecutionRuntime;
|
|
102
|
-
private readonly
|
|
103
|
-
private readonly
|
|
104
|
-
private
|
|
105
|
-
private runtimePort: SessionPort | null = null;
|
|
110
|
+
private readonly state: SessionState;
|
|
111
|
+
private readonly session_turn: SessionTurn;
|
|
112
|
+
private runtime_port: SessionPort | null = null;
|
|
106
113
|
|
|
107
114
|
constructor(options: SessionOptions) {
|
|
108
115
|
this.id = String(options.sessionId || "").trim();
|
|
109
116
|
this.agentId = String(options.agentId || "").trim();
|
|
110
|
-
this.
|
|
117
|
+
this.project_root = String(options.projectRoot || "").trim();
|
|
111
118
|
this.tools = options.tools;
|
|
112
119
|
this.logger = options.logger;
|
|
113
|
-
this.
|
|
114
|
-
this.
|
|
120
|
+
this.get_instruction_system_blocks = options.getInstructionSystemBlocks;
|
|
121
|
+
this.get_agent_env = options.getAgentEnv;
|
|
122
|
+
this.get_agent_model = options.getAgentModel;
|
|
115
123
|
this.get_agent_plugins = options.get_agent_plugins;
|
|
116
124
|
this.effective_instruction_system_blocks = options
|
|
117
125
|
.getInstructionSystemBlocks()
|
|
118
126
|
.map((block) => ({ ...block }));
|
|
119
127
|
this.effective_agent_env = { ...options.getAgentEnv() };
|
|
120
128
|
this.effective_agent_plugins = options.get_agent_plugins();
|
|
121
|
-
this.
|
|
122
|
-
this.
|
|
123
|
-
this.
|
|
124
|
-
this.composers = options.composers;
|
|
125
|
-
this.list_approvals = options.list_approvals;
|
|
126
|
-
this.get_approval_mode = options.get_approval_mode;
|
|
127
|
-
this.set_approval_mode_hook = options.set_approval_mode;
|
|
128
|
-
this.resolve_approval_hook = options.resolve_approval;
|
|
129
|
+
this.get_managed_plugin_system_blocks = options.getManagedPluginSystemBlocks;
|
|
130
|
+
this.ensure_configured_hook = options.ensureConfigured;
|
|
131
|
+
this.composer = options.composer || new DefaultSessionComposer();
|
|
129
132
|
if (!this.id) {
|
|
130
133
|
throw new Error("Session requires a non-empty sessionId");
|
|
131
134
|
}
|
|
132
135
|
if (!this.agentId) {
|
|
133
136
|
throw new Error("Session requires a non-empty agentId");
|
|
134
137
|
}
|
|
135
|
-
if (!this.
|
|
136
|
-
throw new Error("Session requires a non-empty
|
|
138
|
+
if (!this.project_root) {
|
|
139
|
+
throw new Error("Session requires a non-empty project_root");
|
|
137
140
|
}
|
|
138
141
|
|
|
139
|
-
this.
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
const approval_id = require_approval_id(mutation);
|
|
143
|
-
return await this.resolve_approval({ approval_id, decision });
|
|
144
|
-
},
|
|
145
|
-
}),
|
|
146
|
-
});
|
|
147
|
-
this.messageStore = this.create_message_store();
|
|
148
|
-
this.recorder = new SessionRecorder({
|
|
142
|
+
this.events = new SessionEventHub();
|
|
143
|
+
this.message_store = this.create_message_store();
|
|
144
|
+
this.session_messages = new SessionMessages({
|
|
149
145
|
session_id: this.id,
|
|
150
|
-
store: this.
|
|
146
|
+
store: this.message_store,
|
|
151
147
|
publish: (mutation) => {
|
|
152
|
-
this.
|
|
148
|
+
this.events.publish(mutation);
|
|
153
149
|
},
|
|
154
150
|
});
|
|
155
|
-
this.
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
this.create_compaction_composer(composer_context);
|
|
163
|
-
this.executor = this.create_executor(
|
|
164
|
-
system_composer,
|
|
165
|
-
context_composer,
|
|
166
|
-
compaction_composer,
|
|
167
|
-
);
|
|
168
|
-
this.stateService = new SessionStateService({
|
|
151
|
+
this.approval_broker = new SessionApprovalBroker({
|
|
152
|
+
session_id: this.id,
|
|
153
|
+
messages: this.session_messages,
|
|
154
|
+
});
|
|
155
|
+
this.local_state = this.create_local_state();
|
|
156
|
+
this.executor = this.create_executor();
|
|
157
|
+
this.state = new SessionState({
|
|
169
158
|
agent_id: this.agentId,
|
|
170
|
-
project_root: this.
|
|
159
|
+
project_root: this.project_root,
|
|
171
160
|
session_id: this.id,
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
executor: this.executor,
|
|
175
|
-
state: this.localState,
|
|
161
|
+
messages: this.session_messages,
|
|
162
|
+
state: this.local_state,
|
|
176
163
|
logger: this.logger,
|
|
177
|
-
ensure_configured_hook: this.
|
|
164
|
+
ensure_configured_hook: this.ensure_configured_hook
|
|
178
165
|
? async () => {
|
|
179
|
-
await this.
|
|
166
|
+
await this.ensure_configured_hook?.(this);
|
|
180
167
|
}
|
|
181
168
|
: undefined,
|
|
182
|
-
|
|
169
|
+
get_model: () => this.get_model(),
|
|
183
170
|
publish_event: (event) => {
|
|
184
|
-
this.
|
|
171
|
+
this.events.publish(event);
|
|
185
172
|
},
|
|
186
173
|
});
|
|
187
|
-
this.
|
|
174
|
+
this.session_turn = new SessionTurn({
|
|
188
175
|
session_id: this.id,
|
|
189
|
-
project_root: this.
|
|
176
|
+
project_root: this.project_root,
|
|
190
177
|
executor: this.executor,
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
project_root: this.projectRoot,
|
|
198
|
-
session_id: this.id,
|
|
199
|
-
history_store: this.historyStore,
|
|
200
|
-
recorder: this.recorder,
|
|
201
|
-
state_service: this.stateService,
|
|
202
|
-
logger: this.logger,
|
|
203
|
-
is_executing: () => this.isExecuting(),
|
|
204
|
-
get_instruction_system_blocks: () =>
|
|
205
|
-
this.effective_instruction_system_blocks.map((block) => ({ ...block })),
|
|
206
|
-
get_managed_plugin_system_blocks: this.getManagedPluginSystemBlocks,
|
|
207
|
-
get_plugin_system_blocks: async () =>
|
|
208
|
-
await this.effective_agent_plugins.systemBlocks(),
|
|
209
|
-
...(this.composers?.systemComposer
|
|
210
|
-
? { custom_system_composer: system_composer }
|
|
211
|
-
: {}),
|
|
212
|
-
create_fork_session: async (session_id) => {
|
|
213
|
-
const session = this.create_fork_session(session_id);
|
|
214
|
-
await session.initialize();
|
|
215
|
-
return {
|
|
216
|
-
session,
|
|
217
|
-
history_store: session.historyStore,
|
|
218
|
-
recorder: session.recorder,
|
|
219
|
-
state_service: session.stateService,
|
|
220
|
-
};
|
|
221
|
-
},
|
|
178
|
+
state: this.state,
|
|
179
|
+
events: this.events,
|
|
180
|
+
messages: this.session_messages,
|
|
181
|
+
approvals: this.approval_broker,
|
|
182
|
+
apply_command: async (command, turn_id) =>
|
|
183
|
+
await this.apply_queue_command(command, turn_id),
|
|
222
184
|
});
|
|
223
185
|
}
|
|
224
186
|
|
|
@@ -226,8 +188,8 @@ export class Session implements AgentSession {
|
|
|
226
188
|
* 初始化当前 session。
|
|
227
189
|
*/
|
|
228
190
|
async initialize(): Promise<this> {
|
|
229
|
-
await this.
|
|
230
|
-
await this.
|
|
191
|
+
await this.session_messages.initialize();
|
|
192
|
+
await this.state.initialize();
|
|
231
193
|
return this;
|
|
232
194
|
}
|
|
233
195
|
|
|
@@ -235,16 +197,16 @@ export class Session implements AgentSession {
|
|
|
235
197
|
* 读取当前 session 配置快照。
|
|
236
198
|
*/
|
|
237
199
|
get config(): AgentSessionConfigSnapshot {
|
|
238
|
-
return this.
|
|
200
|
+
return this.state.get_config();
|
|
239
201
|
}
|
|
240
202
|
|
|
241
203
|
/**
|
|
242
204
|
* 写入当前 session 默认配置。
|
|
243
205
|
*/
|
|
244
206
|
async set(input: AgentSessionSetInput): Promise<void> {
|
|
245
|
-
const configured = await this.
|
|
207
|
+
const configured = await this.state.set(input);
|
|
246
208
|
if (configured.command) {
|
|
247
|
-
this.
|
|
209
|
+
this.session_turn.enqueue_command(configured.command);
|
|
248
210
|
}
|
|
249
211
|
}
|
|
250
212
|
|
|
@@ -252,62 +214,97 @@ export class Session implements AgentSession {
|
|
|
252
214
|
* 追加一条新的 Session prompt。
|
|
253
215
|
*/
|
|
254
216
|
async prompt(input: AgentSessionPromptInput): Promise<AgentSessionTurnHandle> {
|
|
255
|
-
return await this.
|
|
217
|
+
return await this.session_turn.prompt(input);
|
|
256
218
|
}
|
|
257
219
|
|
|
258
220
|
/**
|
|
259
221
|
* 停止当前 turn,并取消尚未被吸收的排队 prompt。
|
|
260
222
|
*/
|
|
261
223
|
async stop(): Promise<AgentSessionStopResult> {
|
|
262
|
-
|
|
224
|
+
await this.approval_broker.expire_all();
|
|
225
|
+
return this.session_turn.stop();
|
|
263
226
|
}
|
|
264
227
|
|
|
265
228
|
/**
|
|
266
229
|
* 把一次显式历史压缩加入当前 Session 的有序输入队列。
|
|
267
230
|
*/
|
|
268
231
|
async compact(): Promise<void> {
|
|
269
|
-
await this.
|
|
232
|
+
await this.session_turn.compact();
|
|
270
233
|
}
|
|
271
234
|
|
|
272
235
|
/**
|
|
273
236
|
* 把 Agent configured state command 加入当前 Session 的统一输入队列。
|
|
274
237
|
*/
|
|
275
238
|
enqueue_agent_command(command: AgentSessionCommand): void {
|
|
276
|
-
|
|
277
|
-
|
|
239
|
+
if (command.type === "instruction") {
|
|
240
|
+
this.session_turn.enqueue_command({
|
|
241
|
+
type: "agent_instruction",
|
|
242
|
+
command_id: command.command_id,
|
|
243
|
+
instruction_blocks: command.instruction_blocks,
|
|
244
|
+
});
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (command.type === "env") {
|
|
248
|
+
this.session_turn.enqueue_command({
|
|
249
|
+
type: "agent_env",
|
|
250
|
+
command_id: command.command_id,
|
|
251
|
+
env: command.env,
|
|
252
|
+
});
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
this.session_turn.enqueue_command({
|
|
256
|
+
type: "agent_plugins",
|
|
278
257
|
command_id: command.command_id,
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
await this.stateService.emit_config_action_event({
|
|
296
|
-
id: `agent-env:${this.id}:${command.command_id}`,
|
|
297
|
-
title: "Agent environment updated",
|
|
298
|
-
state: "completed",
|
|
299
|
-
turnId: turn_id,
|
|
300
|
-
});
|
|
301
|
-
return;
|
|
302
|
-
}
|
|
303
|
-
this.effective_agent_plugins = command.plugins;
|
|
304
|
-
await this.stateService.emit_config_action_event({
|
|
305
|
-
id: `agent-plugins:${this.id}:${command.command_id}`,
|
|
306
|
-
title: command.title,
|
|
258
|
+
title: command.title,
|
|
259
|
+
plugins: command.plugins,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/** 在 Step 检查点提交明确的 Session/Agent 状态命令。 */
|
|
264
|
+
private async apply_queue_command(
|
|
265
|
+
command: Exclude<SessionQueueCommand, { type: "compact" }>,
|
|
266
|
+
turn_id: string,
|
|
267
|
+
): Promise<void> {
|
|
268
|
+
if (command.type === "session_model") {
|
|
269
|
+
await this.state.apply_model_command(command);
|
|
270
|
+
if (command.action_id && command.action_title) {
|
|
271
|
+
await this.emit_config_action_event({
|
|
272
|
+
id: command.action_id,
|
|
273
|
+
title: command.action_title,
|
|
307
274
|
state: "completed",
|
|
308
275
|
turnId: turn_id,
|
|
309
276
|
});
|
|
310
|
-
}
|
|
277
|
+
}
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
if (command.type === "agent_instruction") {
|
|
281
|
+
this.effective_instruction_system_blocks = command.instruction_blocks.map(
|
|
282
|
+
(block) => ({ ...block }),
|
|
283
|
+
);
|
|
284
|
+
await this.emit_config_action_event({
|
|
285
|
+
id: `agent-instruction:${this.id}:${command.command_id}`,
|
|
286
|
+
title: "Agent instruction updated",
|
|
287
|
+
state: "completed",
|
|
288
|
+
turnId: turn_id,
|
|
289
|
+
});
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (command.type === "agent_env") {
|
|
293
|
+
this.effective_agent_env = { ...command.env };
|
|
294
|
+
await this.emit_config_action_event({
|
|
295
|
+
id: `agent-env:${this.id}:${command.command_id}`,
|
|
296
|
+
title: "Agent environment updated",
|
|
297
|
+
state: "completed",
|
|
298
|
+
turnId: turn_id,
|
|
299
|
+
});
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
this.effective_agent_plugins = command.plugins;
|
|
303
|
+
await this.emit_config_action_event({
|
|
304
|
+
id: `agent-plugins:${this.id}:${command.command_id}`,
|
|
305
|
+
title: command.title,
|
|
306
|
+
state: "completed",
|
|
307
|
+
turnId: turn_id,
|
|
311
308
|
});
|
|
312
309
|
}
|
|
313
310
|
|
|
@@ -317,42 +314,27 @@ export class Session implements AgentSession {
|
|
|
317
314
|
subscribe(
|
|
318
315
|
subscriber: SessionMutationSubscriber,
|
|
319
316
|
): SessionMutationUnsubscribe {
|
|
320
|
-
return this.
|
|
317
|
+
return this.events.subscribe(subscriber);
|
|
321
318
|
}
|
|
322
319
|
|
|
323
320
|
/** 列出当前 Session 的 pending 工具审批。 */
|
|
324
321
|
async approvals(): Promise<SessionApproval[]> {
|
|
325
|
-
return
|
|
322
|
+
return this.approval_broker.list();
|
|
326
323
|
}
|
|
327
324
|
|
|
328
325
|
/** 读取当前 Session 的工具审批模式。 */
|
|
329
326
|
async approval_mode(): Promise<SessionApprovalModeSnapshot> {
|
|
330
|
-
return
|
|
327
|
+
return this.approval_broker.get_mode();
|
|
331
328
|
}
|
|
332
329
|
|
|
333
330
|
/** 更新当前 Session 的工具审批模式。 */
|
|
334
331
|
async set_approval_mode(input: SetSessionApprovalModeInput): Promise<SessionApprovalModeSnapshot> {
|
|
335
|
-
return
|
|
332
|
+
return this.approval_broker.set_mode(input.mode);
|
|
336
333
|
}
|
|
337
334
|
|
|
338
335
|
/** 处理当前 Session 的 pending 工具审批。 */
|
|
339
336
|
async resolve_approval(input: ResolveSessionApprovalInput): Promise<SessionApprovalResult> {
|
|
340
|
-
return await this.
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
private async apply_runtime_event(event: SessionApprovalRuntimeEvent): Promise<void> {
|
|
344
|
-
if (event.type === "tool-approval-request") {
|
|
345
|
-
await this.recorder.require_tool_approval({
|
|
346
|
-
tool_call_id: event.tool_call_id,
|
|
347
|
-
approval_id: event.approval_id,
|
|
348
|
-
});
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
await this.recorder.resolve_tool_approval({
|
|
352
|
-
tool_call_id: event.tool_call_id,
|
|
353
|
-
approval_id: event.approval_id,
|
|
354
|
-
decision: event.decision,
|
|
355
|
-
});
|
|
337
|
+
return await this.approval_broker.resolve(input);
|
|
356
338
|
}
|
|
357
339
|
|
|
358
340
|
/**
|
|
@@ -361,9 +343,12 @@ export class Session implements AgentSession {
|
|
|
361
343
|
async append_user_message(input: {
|
|
362
344
|
text: string;
|
|
363
345
|
}): Promise<void> {
|
|
364
|
-
await this.
|
|
346
|
+
const appended = await this.session_messages.append_external_user_message({
|
|
365
347
|
text: String(input.text || "").trim(),
|
|
366
348
|
});
|
|
349
|
+
if (!appended) return;
|
|
350
|
+
await this.state.ensure_title_from_history({ generate: true });
|
|
351
|
+
await this.state.touch_metadata();
|
|
367
352
|
}
|
|
368
353
|
|
|
369
354
|
/**
|
|
@@ -372,101 +357,199 @@ export class Session implements AgentSession {
|
|
|
372
357
|
async append_assistant_message(input: {
|
|
373
358
|
text: string;
|
|
374
359
|
}): Promise<void> {
|
|
375
|
-
await this.
|
|
376
|
-
|
|
360
|
+
const appended = await this.session_messages.append_external_assistant_message({
|
|
361
|
+
fallback_text: String(input.text || "").trim(),
|
|
377
362
|
});
|
|
363
|
+
if (appended) await this.state.touch_metadata();
|
|
378
364
|
}
|
|
379
365
|
|
|
380
366
|
/**
|
|
381
367
|
* 读取当前 session 详情。
|
|
382
368
|
*/
|
|
383
369
|
async get_info(): Promise<AgentSessionInfo> {
|
|
384
|
-
|
|
370
|
+
const [metadata, snapshot] = await Promise.all([
|
|
371
|
+
readSessionMetadata({
|
|
372
|
+
projectRoot: this.project_root,
|
|
373
|
+
agentId: this.agentId,
|
|
374
|
+
sessionId: this.id,
|
|
375
|
+
}),
|
|
376
|
+
this.session_messages.context_snapshot(),
|
|
377
|
+
]);
|
|
378
|
+
const records = to_executor_history(this.id, snapshot);
|
|
379
|
+
const metadata_with_title = metadata.title
|
|
380
|
+
? metadata
|
|
381
|
+
: await ensureSessionTitle({
|
|
382
|
+
projectRoot: this.project_root,
|
|
383
|
+
agentId: this.agentId,
|
|
384
|
+
sessionId: this.id,
|
|
385
|
+
messages: records,
|
|
386
|
+
logger: this.logger,
|
|
387
|
+
});
|
|
388
|
+
return buildSessionInfo({
|
|
389
|
+
projectRoot: this.project_root,
|
|
390
|
+
agentId: this.agentId,
|
|
391
|
+
sessionId: this.id,
|
|
392
|
+
metadata: metadata_with_title,
|
|
393
|
+
messages: records,
|
|
394
|
+
executing: this.isExecuting(),
|
|
395
|
+
});
|
|
385
396
|
}
|
|
386
397
|
|
|
387
398
|
/**
|
|
388
399
|
* 读取当前 session records 分页。
|
|
389
400
|
*/
|
|
390
401
|
async messages(input?: ListSessionMessagesInput): Promise<SessionMessagePage> {
|
|
391
|
-
return await this.
|
|
402
|
+
return await this.session_messages.list_messages(input);
|
|
392
403
|
}
|
|
393
404
|
|
|
394
405
|
/**
|
|
395
406
|
* 读取当前 session 生效的 system 快照。
|
|
396
407
|
*/
|
|
397
408
|
async system(): Promise<AgentSessionSystemSnapshot> {
|
|
398
|
-
|
|
409
|
+
const composed = await this.compose_for_view();
|
|
410
|
+
const blocks = resolve_composed_system_blocks(composed);
|
|
411
|
+
return {
|
|
412
|
+
sessionId: this.id,
|
|
413
|
+
session: {
|
|
414
|
+
agentId: this.agentId,
|
|
415
|
+
sessionId: this.id,
|
|
416
|
+
projectRoot: this.project_root,
|
|
417
|
+
createdAt: new Date(this.state.get_created_at()).toISOString(),
|
|
418
|
+
timezone: this.state.get_timezone(),
|
|
419
|
+
},
|
|
420
|
+
blocks,
|
|
421
|
+
};
|
|
399
422
|
}
|
|
400
423
|
|
|
401
424
|
/**
|
|
402
425
|
* 返回当前 session 是否正在执行。
|
|
403
426
|
*/
|
|
404
427
|
isExecuting(): boolean {
|
|
405
|
-
return this.
|
|
428
|
+
return this.session_turn.is_active() || this.executor.isExecuting();
|
|
406
429
|
}
|
|
407
430
|
|
|
408
431
|
/**
|
|
409
432
|
* 从当前 session 创建一个分叉会话。
|
|
410
433
|
*/
|
|
411
434
|
async fork(input?: AgentSessionForkInput | string): Promise<this> {
|
|
412
|
-
|
|
435
|
+
const message_id = typeof input === "string"
|
|
436
|
+
? String(input || "").trim() || undefined
|
|
437
|
+
: String(input?.messageId || "").trim() || undefined;
|
|
438
|
+
const messages = await this.session_messages.list_history_messages();
|
|
439
|
+
const fork_messages = message_id
|
|
440
|
+
? this.resolve_fork_messages(messages, message_id)
|
|
441
|
+
: messages;
|
|
442
|
+
const action_id = `history-forking:${this.id}:${Date.now()}:${nanoid(8)}`;
|
|
443
|
+
await this.emit_action_event({
|
|
444
|
+
id: action_id,
|
|
445
|
+
title: "Forking session messages",
|
|
446
|
+
description: `Preparing ${String(fork_messages.length)} messages for the new session.`,
|
|
447
|
+
state: "running",
|
|
448
|
+
});
|
|
449
|
+
try {
|
|
450
|
+
const forked = this.create_fork_session(
|
|
451
|
+
`fork-${Date.now()}-${nanoid(8)}`,
|
|
452
|
+
);
|
|
453
|
+
await forked.initialize();
|
|
454
|
+
const session_config = this.state.get_config();
|
|
455
|
+
if (session_config.model) {
|
|
456
|
+
await forked.state.set(
|
|
457
|
+
{ model: session_config.model },
|
|
458
|
+
{ emit_action: false },
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
await forked.session_messages.import_messages(fork_messages);
|
|
462
|
+
await this.emit_action_event({
|
|
463
|
+
id: action_id,
|
|
464
|
+
title: "Session messages forked",
|
|
465
|
+
description: `Created ${forked.id} with ${String(fork_messages.length)} messages.`,
|
|
466
|
+
state: "completed",
|
|
467
|
+
});
|
|
468
|
+
return forked;
|
|
469
|
+
} catch (error) {
|
|
470
|
+
await this.emit_action_event({
|
|
471
|
+
id: action_id,
|
|
472
|
+
title: "Session messages fork failed",
|
|
473
|
+
description: error instanceof Error ? error.message : String(error),
|
|
474
|
+
state: "failed",
|
|
475
|
+
});
|
|
476
|
+
throw error;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/** 截取 Fork 目标 Message 及其之前的完整历史。 */
|
|
481
|
+
private resolve_fork_messages(
|
|
482
|
+
messages: SessionMessage[],
|
|
483
|
+
message_id: string,
|
|
484
|
+
): SessionMessage[] {
|
|
485
|
+
const target_index = messages.findIndex(
|
|
486
|
+
(message) => message.message_id === message_id,
|
|
487
|
+
);
|
|
488
|
+
if (target_index < 0) {
|
|
489
|
+
throw new Error(
|
|
490
|
+
`Cannot fork session "${this.id}": messageId "${message_id}" not found.`,
|
|
491
|
+
);
|
|
492
|
+
}
|
|
493
|
+
return messages.slice(0, target_index + 1);
|
|
413
494
|
}
|
|
414
495
|
|
|
415
496
|
/**
|
|
416
497
|
* 返回供受托管 plugin 使用的 session 端口。
|
|
417
498
|
*/
|
|
418
499
|
getRuntimePort(): SessionPort {
|
|
419
|
-
if (this.
|
|
420
|
-
this.
|
|
500
|
+
if (this.runtime_port) return this.runtime_port;
|
|
501
|
+
this.runtime_port = createRuntimeSessionPort({
|
|
421
502
|
sessionId: this.id,
|
|
503
|
+
getModel: () => this.get_model(),
|
|
422
504
|
getExecutor: () => this.executor.getExecutor(),
|
|
423
505
|
prompt: async (input) => await this.prompt(input),
|
|
424
506
|
stop: async () => await this.stop(),
|
|
425
507
|
subscribe: (subscriber) => this.subscribe(subscriber),
|
|
426
|
-
publishEvent: async (event) => {
|
|
427
|
-
await this.apply_runtime_event(event);
|
|
428
|
-
},
|
|
429
508
|
append_user_message: async (message_params) => {
|
|
430
|
-
await this.
|
|
509
|
+
const appended = await this.session_messages.append_external_user_message(
|
|
510
|
+
message_params,
|
|
511
|
+
);
|
|
512
|
+
if (!appended) return;
|
|
513
|
+
await this.state.ensure_title_from_history({ generate: true });
|
|
514
|
+
await this.state.touch_metadata();
|
|
431
515
|
},
|
|
432
516
|
append_assistant_message: async (message_params) => {
|
|
433
|
-
await this.
|
|
517
|
+
const appended = await this.session_messages.append_external_assistant_message({
|
|
518
|
+
message: message_params.message,
|
|
519
|
+
fallback_text: message_params.fallbackText,
|
|
520
|
+
});
|
|
521
|
+
if (appended) await this.state.touch_metadata();
|
|
434
522
|
},
|
|
435
523
|
isExecuting: () => this.isExecuting(),
|
|
436
|
-
|
|
524
|
+
context: async () => await this.session_messages.context_snapshot(),
|
|
437
525
|
ensureReadyForExecution: async () => {
|
|
438
526
|
await this.ensureReadyForExecution();
|
|
439
527
|
},
|
|
440
528
|
});
|
|
441
|
-
return this.
|
|
529
|
+
return this.runtime_port;
|
|
442
530
|
}
|
|
443
531
|
|
|
444
532
|
/**
|
|
445
533
|
* 在执行前确保 session 已完成初始化与宿主装配。
|
|
446
534
|
*/
|
|
447
535
|
async ensureReadyForExecution(): Promise<void> {
|
|
448
|
-
await this.
|
|
536
|
+
await this.state.ensure_ready_for_execution();
|
|
449
537
|
}
|
|
450
538
|
|
|
451
539
|
private create_fork_session(session_id: string): this {
|
|
452
540
|
return this.create_child_session({
|
|
453
541
|
agentId: this.agentId,
|
|
454
|
-
projectRoot: this.
|
|
542
|
+
projectRoot: this.project_root,
|
|
455
543
|
sessionId: session_id,
|
|
456
544
|
tools: this.tools,
|
|
457
545
|
logger: this.logger,
|
|
458
|
-
getInstructionSystemBlocks: this.
|
|
459
|
-
getAgentEnv: this.
|
|
546
|
+
getInstructionSystemBlocks: this.get_instruction_system_blocks,
|
|
547
|
+
getAgentEnv: this.get_agent_env,
|
|
460
548
|
get_agent_plugins: this.get_agent_plugins,
|
|
461
|
-
getManagedPluginSystemBlocks: this.
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
composers: this.composers,
|
|
466
|
-
list_approvals: this.list_approvals,
|
|
467
|
-
get_approval_mode: this.get_approval_mode,
|
|
468
|
-
set_approval_mode: this.set_approval_mode_hook,
|
|
469
|
-
resolve_approval: this.resolve_approval_hook,
|
|
549
|
+
getManagedPluginSystemBlocks: this.get_managed_plugin_system_blocks,
|
|
550
|
+
ensureConfigured: this.ensure_configured_hook,
|
|
551
|
+
getAgentModel: this.get_agent_model,
|
|
552
|
+
composer: this.composer,
|
|
470
553
|
});
|
|
471
554
|
}
|
|
472
555
|
|
|
@@ -486,7 +569,7 @@ export class Session implements AgentSession {
|
|
|
486
569
|
|
|
487
570
|
private create_message_store(): JsonlSessionMessageStore {
|
|
488
571
|
const session_dir_path = getSdkAgentSessionDirPath(
|
|
489
|
-
this.
|
|
572
|
+
this.project_root,
|
|
490
573
|
this.agentId,
|
|
491
574
|
this.id,
|
|
492
575
|
);
|
|
@@ -495,156 +578,237 @@ export class Session implements AgentSession {
|
|
|
495
578
|
session_id: this.id,
|
|
496
579
|
file_path: `${messages_dir_path}/active.jsonl`,
|
|
497
580
|
assistant_message_file_path: getSdkAgentSessionAssistantMessagePath(
|
|
498
|
-
this.
|
|
581
|
+
this.project_root,
|
|
499
582
|
this.agentId,
|
|
500
583
|
this.id,
|
|
501
584
|
),
|
|
502
585
|
});
|
|
503
586
|
}
|
|
504
587
|
|
|
505
|
-
private create_history_store(): SessionRecorderHistoryStore {
|
|
506
|
-
return new SessionRecorderHistoryStore({
|
|
507
|
-
session_id: this.id,
|
|
508
|
-
recorder: this.recorder,
|
|
509
|
-
});
|
|
510
|
-
}
|
|
511
|
-
|
|
512
588
|
private create_local_state(): SessionLocalState {
|
|
513
589
|
return {
|
|
514
|
-
|
|
590
|
+
session_config: {},
|
|
515
591
|
effective_session_config: {},
|
|
516
|
-
|
|
592
|
+
created_at: Date.now(),
|
|
517
593
|
timezone: resolveSystemTimezone(),
|
|
518
|
-
|
|
519
|
-
|
|
594
|
+
initialize_promise: null,
|
|
595
|
+
ensure_configured_promise: null,
|
|
520
596
|
};
|
|
521
597
|
}
|
|
522
598
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
projectRoot: this.projectRoot,
|
|
599
|
+
/** 创建只依赖统一 Composer 的 Turn Executor。 */
|
|
600
|
+
private create_executor(): Executor {
|
|
601
|
+
return new Executor({
|
|
527
602
|
sessionId: this.id,
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
603
|
+
composer: this.composer,
|
|
604
|
+
get_compose_input: async (run_context, retry_count) =>
|
|
605
|
+
await this.create_compose_input(run_context, retry_count),
|
|
606
|
+
commit_compaction: async (plan, run_context) =>
|
|
607
|
+
await this.commit_compaction_plan(plan, run_context),
|
|
608
|
+
getModel: () => this.get_model(),
|
|
609
|
+
logger: this.logger,
|
|
610
|
+
get_plugins: () => this.effective_agent_plugins,
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/** 为 Composer 创建当前 Step 的只读 Session 快照。 */
|
|
615
|
+
private async create_compose_input(
|
|
616
|
+
run_context: SessionRunContext,
|
|
617
|
+
retry_count: number,
|
|
618
|
+
): Promise<SessionComposeInput> {
|
|
619
|
+
const plugin_system_blocks = run_context.agentPlugins
|
|
620
|
+
? await run_context.agentPlugins.systemBlocks(run_context)
|
|
621
|
+
: await this.effective_agent_plugins.systemBlocks(run_context);
|
|
622
|
+
return {
|
|
623
|
+
session: {
|
|
624
|
+
agent_id: this.agentId,
|
|
625
|
+
session_id: this.id,
|
|
626
|
+
project_root: this.project_root,
|
|
627
|
+
created_at: this.local_state.created_at,
|
|
628
|
+
timezone: this.local_state.timezone,
|
|
629
|
+
},
|
|
630
|
+
state: {
|
|
631
|
+
model: this.get_model(),
|
|
632
|
+
model_context_window: this.get_model_context_window(),
|
|
633
|
+
env: Object.freeze({ ...this.effective_agent_env }),
|
|
634
|
+
systems: Object.freeze(
|
|
635
|
+
this.effective_instruction_system_blocks.map(
|
|
636
|
+
(block) => block.content,
|
|
637
|
+
),
|
|
638
|
+
),
|
|
639
|
+
tools: Object.freeze({ ...this.tools }),
|
|
640
|
+
instruction_system_blocks:
|
|
641
|
+
this.effective_instruction_system_blocks.map(
|
|
642
|
+
(block) => ({ ...block }),
|
|
643
|
+
),
|
|
644
|
+
managed_plugin_system_blocks:
|
|
645
|
+
await this.get_managed_plugin_system_blocks(),
|
|
646
|
+
plugin_system_blocks,
|
|
647
|
+
},
|
|
648
|
+
history: await this.session_messages.context_snapshot(),
|
|
649
|
+
turn: {
|
|
650
|
+
...(run_context.turnId ? { turn_id: run_context.turnId } : {}),
|
|
651
|
+
retry_count,
|
|
652
|
+
},
|
|
537
653
|
};
|
|
538
654
|
}
|
|
539
655
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
656
|
+
/** 使用统一 Composer 生成只读 system/history 查询结果。 */
|
|
657
|
+
private async compose_for_view(): Promise<SessionStepInput> {
|
|
658
|
+
const run_context: SessionRunContext = {
|
|
659
|
+
sessionId: this.id,
|
|
660
|
+
injectedUserMessages: [],
|
|
661
|
+
deferredPersistedUserMessages: [],
|
|
662
|
+
pendingAssistantFileParts: [],
|
|
663
|
+
};
|
|
664
|
+
return await this.composer.compose(
|
|
665
|
+
await this.create_compose_input(run_context, 0),
|
|
547
666
|
);
|
|
548
667
|
}
|
|
549
668
|
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
669
|
+
/** 提交 Composer 生成的 Segment 压缩计划。 */
|
|
670
|
+
private async commit_compaction_plan(
|
|
671
|
+
plan: SessionCompactionPlan,
|
|
672
|
+
run_context: SessionRunContext,
|
|
673
|
+
): Promise<void> {
|
|
674
|
+
const action_id = `compacting:${this.id}:${generateId()}`;
|
|
675
|
+
await this.emit_action_event({
|
|
676
|
+
id: action_id,
|
|
677
|
+
title: "Compacting session messages",
|
|
678
|
+
state: "running",
|
|
679
|
+
...(run_context.turnId ? { turnId: run_context.turnId } : {}),
|
|
680
|
+
});
|
|
681
|
+
try {
|
|
682
|
+
await this.session_messages.compact_active({
|
|
683
|
+
through_sequence: plan.through_sequence,
|
|
684
|
+
summary: plan.summary,
|
|
685
|
+
});
|
|
686
|
+
await this.emit_action_event({
|
|
687
|
+
id: action_id,
|
|
688
|
+
title: "Session messages compacted",
|
|
689
|
+
description: plan.used_fallback
|
|
690
|
+
? `Closed Active through Message ${plan.boundary_message_id} with deterministic fallback Summary.`
|
|
691
|
+
: `Closed Active through Message ${plan.boundary_message_id}.`,
|
|
692
|
+
state: "completed",
|
|
693
|
+
...(run_context.turnId ? { turnId: run_context.turnId } : {}),
|
|
694
|
+
});
|
|
695
|
+
await this.state.touch_metadata();
|
|
696
|
+
} catch (error) {
|
|
697
|
+
await this.emit_action_event({
|
|
698
|
+
id: action_id,
|
|
699
|
+
title: "Session messages compact failed",
|
|
700
|
+
description: error instanceof Error ? error.message : String(error),
|
|
701
|
+
state: "failed",
|
|
702
|
+
...(run_context.turnId ? { turnId: run_context.turnId } : {}),
|
|
703
|
+
});
|
|
704
|
+
throw error;
|
|
705
|
+
}
|
|
566
706
|
}
|
|
567
707
|
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
);
|
|
708
|
+
/**
|
|
709
|
+
* 返回当前 Session 实际使用的模型实例。
|
|
710
|
+
*
|
|
711
|
+
* 解析顺序固定为 Session 覆盖模型,其次回退到 Agent 模型。
|
|
712
|
+
*/
|
|
713
|
+
get_model(): LanguageModel | undefined {
|
|
714
|
+
const model = this.get_selected_model();
|
|
715
|
+
return model ? normalizeAgentModel(model) : undefined;
|
|
575
716
|
}
|
|
576
717
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
this.
|
|
582
|
-
|
|
718
|
+
/** 按 Session 优先、Agent 兜底规则读取当前配置的 AgentModel。 */
|
|
719
|
+
private get_selected_model(): AgentModel | undefined {
|
|
720
|
+
return (
|
|
721
|
+
this.local_state.effective_session_config.model ||
|
|
722
|
+
this.local_state.session_config.model ||
|
|
723
|
+
this.get_agent_model()
|
|
583
724
|
);
|
|
584
725
|
}
|
|
585
726
|
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
historyStore: this.historyStore,
|
|
594
|
-
historyComposer: this.historyComposer,
|
|
595
|
-
getModel: () =>
|
|
596
|
-
this.localState.effective_session_config.model ||
|
|
597
|
-
this.localState.sessionConfig.model,
|
|
598
|
-
get_model_context_window: () =>
|
|
599
|
-
this.localState.effective_session_config.model
|
|
600
|
-
? this.localState.effective_session_config.model_context_window
|
|
601
|
-
: this.localState.sessionConfig.model_context_window,
|
|
602
|
-
logger: this.logger,
|
|
603
|
-
systemComposer: system_composer,
|
|
604
|
-
getTools: () => this.tools,
|
|
605
|
-
getEnv: () => ({ ...this.effective_agent_env }),
|
|
606
|
-
get_systems: () =>
|
|
607
|
-
this.effective_instruction_system_blocks.map((block) => block.content),
|
|
608
|
-
get_plugins: () => this.effective_agent_plugins,
|
|
609
|
-
...(context_composer ? { contextComposer: context_composer } : {}),
|
|
610
|
-
...(compaction_composer
|
|
611
|
-
? { compactionComposer: compaction_composer }
|
|
612
|
-
: {}),
|
|
613
|
-
});
|
|
727
|
+
/** 读取当前有效模型对应的上下文窗口。 */
|
|
728
|
+
private get_model_context_window(): number | undefined {
|
|
729
|
+
return (
|
|
730
|
+
this.local_state.effective_session_config.model_context_window ||
|
|
731
|
+
this.local_state.session_config.model_context_window ||
|
|
732
|
+
read_agent_model_context_window(this.get_selected_model())
|
|
733
|
+
);
|
|
614
734
|
}
|
|
615
735
|
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
736
|
+
/** 持久化并发布一条 canonical Action Message。 */
|
|
737
|
+
private async emit_action_event(input: SessionActionRecordInputV1): Promise<void> {
|
|
738
|
+
const action_id = String(input.id || "").trim() ||
|
|
739
|
+
`action:${this.id}:${Date.now()}`;
|
|
740
|
+
await this.session_messages.persist_action_record({
|
|
741
|
+
type: "action",
|
|
742
|
+
id: action_id,
|
|
743
|
+
title: input.title,
|
|
744
|
+
...(input.description ? { description: input.description } : {}),
|
|
745
|
+
state: input.state,
|
|
746
|
+
metadata: {
|
|
747
|
+
v: 1,
|
|
748
|
+
ts: Date.now(),
|
|
749
|
+
sessionId: this.id,
|
|
750
|
+
...(input.turnId ? { turnId: input.turnId } : {}),
|
|
751
|
+
},
|
|
752
|
+
});
|
|
753
|
+
await this.state.touch_metadata();
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
/** 尽力记录配置 Action,不让 timeline 故障反向改变已提交配置。 */
|
|
757
|
+
private async emit_config_action_event(
|
|
758
|
+
input: SessionActionRecordInputV1 | SessionActionRecordV1,
|
|
759
|
+
): Promise<boolean> {
|
|
760
|
+
try {
|
|
761
|
+
await this.emit_action_event({
|
|
762
|
+
id: input.id,
|
|
763
|
+
title: input.title,
|
|
764
|
+
description: input.description,
|
|
765
|
+
state: input.state,
|
|
766
|
+
turnId: "turnId" in input ? input.turnId : input.metadata?.turnId,
|
|
767
|
+
});
|
|
768
|
+
return true;
|
|
769
|
+
} catch (error) {
|
|
770
|
+
try {
|
|
771
|
+
await this.logger.log("warn", "[agent] config action persistence failed", {
|
|
772
|
+
sessionId: this.id,
|
|
773
|
+
actionId: String(input.id || ""),
|
|
774
|
+
error: error instanceof Error ? error.message : String(error),
|
|
775
|
+
});
|
|
776
|
+
} catch {
|
|
777
|
+
// 配置已提交,日志失败也不能反向改变 effective state。
|
|
778
|
+
}
|
|
779
|
+
return false;
|
|
635
780
|
}
|
|
636
|
-
return input;
|
|
637
781
|
}
|
|
782
|
+
|
|
638
783
|
}
|
|
639
784
|
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
return
|
|
785
|
+
/** 把自定义 Composer 的 system content 转为可展示文本。 */
|
|
786
|
+
function stringify_system_content(content: unknown): string {
|
|
787
|
+
if (typeof content === "string") return content.trim();
|
|
788
|
+
if (content === null || content === undefined) return "";
|
|
789
|
+
try {
|
|
790
|
+
return JSON.stringify(content);
|
|
791
|
+
} catch {
|
|
792
|
+
return String(content || "").trim();
|
|
648
793
|
}
|
|
649
|
-
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
/** 以实际模型输入为准,保留仍与其一致的 system block 来源信息。 */
|
|
797
|
+
function resolve_composed_system_blocks(
|
|
798
|
+
composed: SessionStepInput,
|
|
799
|
+
): AgentSessionSystemBlock[] {
|
|
800
|
+
const declared_blocks = composed.system_blocks || [];
|
|
801
|
+
return composed.system.flatMap((message, index) => {
|
|
802
|
+
const content = stringify_system_content(message.content);
|
|
803
|
+
if (!content) return [];
|
|
804
|
+
const declared = declared_blocks[index];
|
|
805
|
+
if (declared && declared.content.trim() === content) {
|
|
806
|
+
return [{ ...declared, content }];
|
|
807
|
+
}
|
|
808
|
+
return [{
|
|
809
|
+
source: "session" as const,
|
|
810
|
+
name: `custom_system:${index + 1}`,
|
|
811
|
+
content,
|
|
812
|
+
}];
|
|
813
|
+
});
|
|
650
814
|
}
|