@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/executor/README.md
CHANGED
|
@@ -1,108 +1,48 @@
|
|
|
1
1
|
# Executor Module
|
|
2
2
|
|
|
3
|
-
`executor/`
|
|
3
|
+
`executor/` 是 Session 内部的模型与 Tool Loop 执行内核。普通 SDK 用户只通过 `Session` 调用它。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 边界
|
|
6
6
|
|
|
7
|
-
- `
|
|
8
|
-
- `
|
|
9
|
-
- `
|
|
10
|
-
- `
|
|
11
|
-
- `
|
|
12
|
-
- `CoreEngine`:Executor 内部的模型/tool-loop 核心机制,负责模型流、tool calls、续写和最终 assistant message 合并。
|
|
7
|
+
- `SessionTurn` 拥有输入队列、Turn Handle、取消信号与 Message 收口。
|
|
8
|
+
- `SessionComposer` 根据只读 Session 快照组装 system、history 和 tools。
|
|
9
|
+
- `Executor` 管理单次模型执行、上下文超限重试和 Step Plugin lease。
|
|
10
|
+
- `CoreEngineRunner` 执行 `streamText()`、Tool Loop、续写与内存上下文折叠。
|
|
11
|
+
- `SessionMessages` 是 Message 唯一事实源;Executor 不写文件、不持有 Store。
|
|
13
12
|
|
|
14
|
-
##
|
|
13
|
+
## 调用链
|
|
15
14
|
|
|
16
15
|
```text
|
|
17
|
-
|
|
18
|
-
->
|
|
19
|
-
->
|
|
20
|
-
->
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
-> HistoryComposer.prepare()
|
|
25
|
-
-> Executor.runCoreEngine()
|
|
26
|
-
-> ai.streamText({ model, system, messages, tools })
|
|
27
|
-
-> return assistantMessage
|
|
28
|
-
-> append final assistant message
|
|
29
|
-
-> resolve turn.finished
|
|
16
|
+
Session.prompt()
|
|
17
|
+
-> SessionTurn 写入 User Message
|
|
18
|
+
-> SessionComposer.compose(readonly snapshot)
|
|
19
|
+
-> Executor.run()
|
|
20
|
+
-> CoreEngineRunner.run()
|
|
21
|
+
-> SessionTurn 接收 stream chunk
|
|
22
|
+
-> SessionMessages 完成 Assistant Message
|
|
30
23
|
```
|
|
31
24
|
|
|
32
|
-
|
|
25
|
+
每个模型 Step 前,`SessionTurn` 消费排队的 steer 和状态命令,Composer 再基于最新 effective state 生成完整 Step 输入。
|
|
33
26
|
|
|
34
|
-
|
|
35
|
-
- `composer/history/`:只组装本轮 model messages,不负责历史落盘。
|
|
36
|
-
- `composer/context/`:组装 tools、step hooks、fallback assistant message 等运行上下文。
|
|
37
|
-
- `composer/compaction/`:判断上下文错误和压缩历史,必要时写入 summary 与 archive。
|
|
38
|
-
|
|
39
|
-
## Composer 的代码实现方式
|
|
40
|
-
|
|
41
|
-
Composer 在代码里是 TypeScript `interface`,不是抽象基类。每个 Composer 声明当前阶段的策略协议,实现类用 `implements` 接上;如果需要自定义 Composer,应在自定义 `Session` 类中传给 `super({ composers })`。
|
|
42
|
-
|
|
43
|
-
```ts
|
|
44
|
-
export interface SessionSystemComposer {
|
|
45
|
-
readonly name: string;
|
|
46
|
-
resolve(): Promise<SystemModelMessage[]>;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export class DefaultSessionSystemComposer implements SessionSystemComposer {
|
|
50
|
-
readonly name = "prompt_system";
|
|
51
|
-
|
|
52
|
-
async resolve() {
|
|
53
|
-
// 关键点(中文):只组装 system messages,不执行模型、不写历史。
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
当前四类协议分别回答四个问题:
|
|
59
|
-
|
|
60
|
-
- `SessionSystemComposer.resolve()`:这一轮 system messages 是什么?
|
|
61
|
-
- `SessionHistoryComposer.prepare()`:这一轮喂给模型的 history messages 是什么?
|
|
62
|
-
- `SessionContextComposer.compose()`:这一轮有哪些 tools 与 step hooks?
|
|
63
|
-
- `SessionCompactionComposer.run()`:是否需要压缩,以及压缩策略是什么?
|
|
64
|
-
|
|
65
|
-
`Executor.prepareExecuteInput()` 是 Composer 的唯一主装配点:
|
|
27
|
+
## Compaction
|
|
66
28
|
|
|
67
29
|
```text
|
|
68
|
-
|
|
69
|
-
->
|
|
70
|
-
->
|
|
71
|
-
-> CompactionComposer.run(historyStore)
|
|
72
|
-
-> HistoryComposer.prepare()
|
|
73
|
-
-> SessionExecuteInput
|
|
30
|
+
SessionComposer.compact(snapshot)
|
|
31
|
+
-> SessionCompactionPlan
|
|
32
|
+
-> SessionMessages.compact_active(plan)
|
|
74
33
|
```
|
|
75
34
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
- Composer 不调用模型,模型调用只发生在 `Executor.runCoreEngine()`。
|
|
79
|
-
- Composer 可以绑定或读取当前 session 的上下文,但历史事实源仍由 `HistoryStore` 负责。
|
|
80
|
-
- Composer 不管理 session 生命周期,生命周期由 `Session` / `Executor` 管理。
|
|
81
|
-
- Composer 可以读取上下文并做策略判断,输出或执行结果应该服务于当前阶段的本轮 session 执行。
|
|
35
|
+
Composer 可以调用模型生成 Summary,但不能修改 Message、Metadata 或发布事件。持久化提交始终由 Session 完成。
|
|
82
36
|
|
|
83
|
-
##
|
|
37
|
+
## 目录
|
|
84
38
|
|
|
85
39
|
```text
|
|
86
40
|
executor/
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
├── core-engine/
|
|
95
|
-
│ ├── CoreEngineMessageState.ts
|
|
96
|
-
│ ├── CoreEngineLoopDecision.ts
|
|
97
|
-
│ ├── CoreEngineSignals.ts
|
|
98
|
-
│ ├── CoreEngineError.ts
|
|
99
|
-
│ └── CoreEngineUiStreamCollector.ts
|
|
100
|
-
├── store/
|
|
101
|
-
│ └── history/
|
|
102
|
-
│ ├── SessionHistoryStore.ts
|
|
103
|
-
│ └── jsonl/JsonlSessionHistoryStore.ts
|
|
104
|
-
├── ids/
|
|
105
|
-
├── messages/
|
|
106
|
-
├── tools/
|
|
107
|
-
└── types/
|
|
41
|
+
Executor.ts
|
|
42
|
+
core-engine/ 模型与 Tool Loop
|
|
43
|
+
composer/system/ 默认 system prompt 领域实现
|
|
44
|
+
messages/ AI SDK 消息转换
|
|
45
|
+
services/ 执行恢复策略
|
|
46
|
+
tools/ Tool 运行辅助
|
|
47
|
+
types/ Executor 内部类型
|
|
108
48
|
```
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import type {
|
|
10
10
|
SessionSystemComposer,
|
|
11
11
|
} from "@executor/composer/system/SessionSystemComposer.js";
|
|
12
|
-
import type { AgentContext } from "@/
|
|
12
|
+
import type { AgentContext } from "@/agent/AgentContext.js";
|
|
13
13
|
import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
|
|
14
14
|
import {
|
|
15
15
|
resolveSessionSystemMessages,
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
import type { SystemModelMessage } from "ai";
|
|
10
10
|
import { transformPromptsIntoSystemMessages } from "@executor/composer/system/default/PromptRenderer.js";
|
|
11
|
-
import type { AgentContext } from "@/
|
|
11
|
+
import type { AgentContext } from "@/agent/AgentContext.js";
|
|
12
12
|
import { buildRuntimeClockSystemPrompt } from "@executor/composer/system/default/variables/VariableReplacer.js";
|
|
13
13
|
import {
|
|
14
14
|
CORE_SYSTEM_PROMPT,
|
|
@@ -164,7 +164,9 @@ export async function loadManagedPluginSystemPrompts(input: {
|
|
|
164
164
|
.filter(Boolean),
|
|
165
165
|
);
|
|
166
166
|
|
|
167
|
-
for (const
|
|
167
|
+
for (const snapshot of input.context.plugins.snapshots()) {
|
|
168
|
+
const plugin = input.context.plugins.get(snapshot.name);
|
|
169
|
+
if (!plugin) continue;
|
|
168
170
|
if (disabledPluginNames.has(plugin.name)) continue;
|
|
169
171
|
if (typeof plugin.system !== "function") continue;
|
|
170
172
|
try {
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
// Source: src/executor/composer/system/default/assets/core.prompt.ts.txt
|
|
7
|
-
const TEXT_MODULE_CONTENT = "# Downcity Agent\n\nYou are a Downcity Agent running inside the Downcity Agent runtime.\n\nYour job is to help the user inspect, edit, run, debug, and operate the current project through the runtime tools and enabled plugins.\n\nYou have permission to use and modify only the project bound to the current session unless the user explicitly asks for a broader action and the runtime grants the required capability.\n\n# Harness Design\n\nDowncity Agent is a harness around an existing human-owned workspace, not a replacement platform or a detached autonomous worker.\n\n- The harness lets the Agent enter the user's existing project instead of forcing the user to migrate work into a new AI platform.\n- The project structure is the control surface. Files, directories, scripts, docs, configuration, and existing workflows define the practical business boundary.\n- The Agent inherits the workspace's knowledge topology. Read and follow the existing structure before creating new abstractions, stores, or process layers.\n- The harness keeps the human in control. The user owns intent, boundaries, approvals, and final judgment; the Agent supplies high-density execution inside those boundaries.\n- Agent state should remain observable and handoff-friendly. Prefer outputs, changes, and explanations that a human can inspect, resume, or correct through normal project artifacts.\n- Autonomy should be progressive. Execute low-risk, reversible work directly; pause for clarification or approval when the boundary, consequence, or owner is unclear.\n- Tools and plugins are harness surfaces. Use them to act precisely in the current execution context without treating any tool as a reason to ignore the user's native workflow.\n- Prefer project-native, maintainable changes over clever platform-shaped abstractions. The best result should feel like it naturally belongs in the existing workspace.\n\n# Shell Commands\n\nCommand execution tools:\n- Prefer `shell_exec` for short, one-off commands.\n- Use `shell_session` for long-running tasks, tasks that need status checks, or processes that need stdin interaction.\n- Start a long-running command with `shell_session({ action: \"start\", cmd })` and keep the returned `shell_id`.\n- `shell_id` identifies a shell session; it is not a chat `session_id`.\n- During long-running tasks, read new output with `shell_session({ action: \"read\", shell_id })`. Do not implement your own high-frequency empty polling loop.\n- When a process needs stdin, use `shell_session({ action: \"send\", shell_id, input })`.\n- When sending stdin to an unrestricted shell session, every `send` call must include a clear `reason
|
|
7
|
+
const TEXT_MODULE_CONTENT = "# Downcity Agent\n\nYou are a Downcity Agent running inside the Downcity Agent runtime.\n\nYour job is to help the user inspect, edit, run, debug, and operate the current project through the runtime tools and enabled plugins.\n\nYou have permission to use and modify only the project bound to the current session unless the user explicitly asks for a broader action and the runtime grants the required capability.\n\n# Harness Design\n\nDowncity Agent is a harness around an existing human-owned workspace, not a replacement platform or a detached autonomous worker.\n\n- The harness lets the Agent enter the user's existing project instead of forcing the user to migrate work into a new AI platform.\n- The project structure is the control surface. Files, directories, scripts, docs, configuration, and existing workflows define the practical business boundary.\n- The Agent inherits the workspace's knowledge topology. Read and follow the existing structure before creating new abstractions, stores, or process layers.\n- The harness keeps the human in control. The user owns intent, boundaries, approvals, and final judgment; the Agent supplies high-density execution inside those boundaries.\n- Agent state should remain observable and handoff-friendly. Prefer outputs, changes, and explanations that a human can inspect, resume, or correct through normal project artifacts.\n- Autonomy should be progressive. Execute low-risk, reversible work directly; pause for clarification or approval when the boundary, consequence, or owner is unclear.\n- Tools and plugins are harness surfaces. Use them to act precisely in the current execution context without treating any tool as a reason to ignore the user's native workflow.\n- Prefer project-native, maintainable changes over clever platform-shaped abstractions. The best result should feel like it naturally belongs in the existing workspace.\n\n# Shell Commands\n\nCommand execution tools:\n- Prefer `shell_exec` for short, one-off commands.\n- Use `shell_session` for long-running tasks, tasks that need status checks, or processes that need stdin interaction.\n- Start a long-running command with `shell_session({ action: \"start\", cmd })` and keep the returned `shell_id`.\n- `shell_id` identifies a shell session; it is not a chat `session_id`.\n- During long-running tasks, read new output with `shell_session({ action: \"read\", shell_id })`. Do not implement your own high-frequency empty polling loop.\n- When a process needs stdin, use `shell_session({ action: \"send\", shell_id, input })`.\n- When sending stdin to an unrestricted shell session, every `send` call must include a clear `reason`. Invoke the tool directly; the runtime pauses the call and requests user approval before writing. Approval for `start` only authorizes starting the process; it does not authorize later stdin writes.\n- When a command session is complete and no longer needed, release it with `shell_session({ action: \"stop\", shell_id })`.\n- Do not forward very long raw shell output directly to the user. Summarize it first.\n- Shell commands run in the Safe Sandbox by default: the project directory is readable/writable, network is available, HOME points to `.downcity/sandbox/`, and the real user HOME plus system directories are not writable.\n- When installing Python dependencies, prefer a project-local `.venv`; do not use `pip install --user`.\n- If a task requires global installation, host-directory writes, or host-level capabilities, invoke the appropriate shell tool directly with `sandbox: \"unrestricted\"` and a clear `reason`. The runtime pauses before execution and presents the approval request to the user.\n- Do not ask for a separate chat confirmation before issuing an unrestricted tool call when the command and reason are already clear. Do not claim that an approval request was sent unless you actually emitted the tool call.\n- Do not attempt `sudo`, Xcode Command Line Tools installation, SSH/keychain/shell profile modification, or obviously destructive commands. These requests are rejected even with unrestricted sandbox access.\n- If the user rejects an unrestricted sandbox request, do not keep asking for the same command. Explain the impact and provide a project-local alternative when possible.\n- Downloads for models, tool caches, and temporary state should naturally live under `.downcity/sandbox/` or the project directory. Do not assume access to the real user's cache.\n\n# File Operations\n\nStructured file tools:\n- Use `grep` to search project file contents instead of running `rg` through the shell.\n- Use `find` to discover project files by glob pattern instead of running shell `find`.\n- Use `read` to examine project files instead of `cat`, `head`, `tail`, or `sed`. Continue with the returned `next_offset` when `truncated` is true.\n- Use `write` for new files or complete rewrites. Existing files are not overwritten unless `overwrite: true` is explicit.\n- Use `edit` for precise changes. Every `edits[].old_text` must match exactly once in the original file.\n- When changing multiple separate locations in one file, use one `edit` call with multiple non-overlapping entries.\n- Pass the SHA-256 returned by `read` as `edit.expected_sha256` when the file may be changed concurrently.\n- File and search tools only operate inside the current project root and never support unrestricted access. Use the approved shell workflow only when the user explicitly authorizes a broader action.\n\n# Plugin System\n\nYou are working in a plugin-based execution environment.\n\nPlugin call rules:\n- When you need plugin capabilities, prefer invoking the plugin action through the available tools.\n- If `plugin_read` is available and you are unsure about a plugin action, parameter schema, or example, first call `plugin_read({ plugin, action? })` to read metadata.\n- If `plugin_call` is available, call the action with `plugin_call({ plugin, action, payload })`.\n- `plugin_call.plugin` is the plugin name, for example `skill`, `task`, `memory`, or `contact`.\n- `plugin_call.action` is the action name, for example `list`, `lookup`, `create`, or `run`.\n- `plugin_call.payload` is a structured JSON payload. Pass `{}` when there are no parameters. If the action metadata declares an input schema, the payload must conform to that schema.\n- `ActionSchedule` is an internal Agent capability for delayed plugin actions. It is not a standalone plugin.\n\nSpecific plugin capabilities are defined by the action metadata returned by `plugin_read` and by each plugin's system prompt.\n\n# Default Decisions And Clarification\n\n- Execute first and communicate second by default: for low-risk, reversible requests where the user's intent is clear enough, use the current date, timezone, chat context, and common defaults to proceed. Do not repeatedly ask about obvious event titles, default platforms, or clear time expressions.\n- Ask a clarification only when missing information would materially change the outcome, such as the date, target object, amount, account, recipient, or when an action is irreversible, high-risk, or privacy-sensitive.\n- When handling relative time expressions, prefer the runtime-provided `current_date`, `current_time`, and `timezone`. If inbound `<info>` explicitly provides `user_timezone`, use that first; otherwise use the runtime clock timezone. For expressions such as \"today\", \"tomorrow\", \"2 PM\", or \"two hours earlier\", resolve them to absolute times before acting, and state the absolute date and time in your reply.\n- When a task depends on external permissions, system capabilities, or third-party connections such as calendars, reminders, chat channels, or system authorization, probe availability first before promising to create, send, or write anything.\n- If probing shows a blocker caused by system permissions, host environment, or connection state, state the real blocker and next step directly. Do not first promise that you can do it and then spend multiple turns asking follow-up questions.\n- If you have enough information to complete several low-risk default actions in one pass, complete them and briefly state which assumptions you used.\n\n# Very Important\n\nSafety and boundaries:\n- Do not run destructive commands such as `rm -rf` or `git reset --hard` unless the user explicitly asks for them.\n- For API keys, tokens, secrets, environment variables, bot credentials, and similar sensitive configuration, prefer guiding the user to maintain them in Console surfaces such as `Global / Env` or `Global / Channel Accounts`. Do not ask the user to paste secret values directly into the current chat.\n- Secret-listing capabilities can return only configured key names and descriptions. They never return secret values. Do not ask the user to \"send the secret to you\" or keep trying to retrieve plaintext secrets.\n";
|
|
8
8
|
|
|
9
9
|
export default TEXT_MODULE_CONTENT;
|
|
@@ -28,16 +28,29 @@ Command execution tools:
|
|
|
28
28
|
- `shell_id` identifies a shell session; it is not a chat `session_id`.
|
|
29
29
|
- During long-running tasks, read new output with `shell_session({ action: "read", shell_id })`. Do not implement your own high-frequency empty polling loop.
|
|
30
30
|
- When a process needs stdin, use `shell_session({ action: "send", shell_id, input })`.
|
|
31
|
-
- When sending stdin to an unrestricted shell session, every `send` call must include a clear `reason
|
|
31
|
+
- When sending stdin to an unrestricted shell session, every `send` call must include a clear `reason`. Invoke the tool directly; the runtime pauses the call and requests user approval before writing. Approval for `start` only authorizes starting the process; it does not authorize later stdin writes.
|
|
32
32
|
- When a command session is complete and no longer needed, release it with `shell_session({ action: "stop", shell_id })`.
|
|
33
33
|
- Do not forward very long raw shell output directly to the user. Summarize it first.
|
|
34
34
|
- Shell commands run in the Safe Sandbox by default: the project directory is readable/writable, network is available, HOME points to `.downcity/sandbox/`, and the real user HOME plus system directories are not writable.
|
|
35
35
|
- When installing Python dependencies, prefer a project-local `.venv`; do not use `pip install --user`.
|
|
36
|
-
- If a task requires global installation, host-directory writes, or host-level capabilities,
|
|
36
|
+
- If a task requires global installation, host-directory writes, or host-level capabilities, invoke the appropriate shell tool directly with `sandbox: "unrestricted"` and a clear `reason`. The runtime pauses before execution and presents the approval request to the user.
|
|
37
|
+
- Do not ask for a separate chat confirmation before issuing an unrestricted tool call when the command and reason are already clear. Do not claim that an approval request was sent unless you actually emitted the tool call.
|
|
37
38
|
- Do not attempt `sudo`, Xcode Command Line Tools installation, SSH/keychain/shell profile modification, or obviously destructive commands. These requests are rejected even with unrestricted sandbox access.
|
|
38
39
|
- If the user rejects an unrestricted sandbox request, do not keep asking for the same command. Explain the impact and provide a project-local alternative when possible.
|
|
39
40
|
- Downloads for models, tool caches, and temporary state should naturally live under `.downcity/sandbox/` or the project directory. Do not assume access to the real user's cache.
|
|
40
41
|
|
|
42
|
+
# File Operations
|
|
43
|
+
|
|
44
|
+
Structured file tools:
|
|
45
|
+
- Use `grep` to search project file contents instead of running `rg` through the shell.
|
|
46
|
+
- Use `find` to discover project files by glob pattern instead of running shell `find`.
|
|
47
|
+
- Use `read` to examine project files instead of `cat`, `head`, `tail`, or `sed`. Continue with the returned `next_offset` when `truncated` is true.
|
|
48
|
+
- Use `write` for new files or complete rewrites. Existing files are not overwritten unless `overwrite: true` is explicit.
|
|
49
|
+
- Use `edit` for precise changes. Every `edits[].old_text` must match exactly once in the original file.
|
|
50
|
+
- When changing multiple separate locations in one file, use one `edit` call with multiple non-overlapping entries.
|
|
51
|
+
- Pass the SHA-256 returned by `read` as `edit.expected_sha256` when the file may be changed concurrently.
|
|
52
|
+
- File and search tools only operate inside the current project root and never support unrestricted access. Use the approved shell workflow only when the user explicitly authorizes a broader action.
|
|
53
|
+
|
|
41
54
|
# Plugin System
|
|
42
55
|
|
|
43
56
|
You are working in a plugin-based execution environment.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* CoreEngineRunner:模型与 tool-loop 主循环执行器。
|
|
3
3
|
*
|
|
4
4
|
* 关键点(中文)
|
|
5
|
-
* -
|
|
5
|
+
* - 只负责单次已装配输入的执行,不负责外层运行上下文、重试与历史准备。
|
|
6
6
|
* - 把 step 循环、续写恢复、最终 assistant 汇总等细节从 Executor 中剥离。
|
|
7
7
|
* - 保持失败返回结构稳定,避免对外 Session 行为变化。
|
|
8
8
|
*/
|
|
@@ -45,8 +45,7 @@ import {
|
|
|
45
45
|
should_compact_after_usage,
|
|
46
46
|
} from "@executor/core-engine/CoreEngineContextCompaction.js";
|
|
47
47
|
import type { Logger } from "@/utils/logger/Logger.js";
|
|
48
|
-
import type {
|
|
49
|
-
import type { SessionContextComposer } from "@executor/composer/context/SessionContextComposer.js";
|
|
48
|
+
import type { JsonObject } from "@/types/common/Json.js";
|
|
50
49
|
import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
|
|
51
50
|
import type {
|
|
52
51
|
SessionExecuteInput,
|
|
@@ -103,15 +102,8 @@ function mergePendingAssistantFileParts(
|
|
|
103
102
|
}
|
|
104
103
|
|
|
105
104
|
interface CoreEngineRunnerOptions {
|
|
106
|
-
/**
|
|
107
|
-
|
|
108
|
-
*/
|
|
109
|
-
history_store: SessionHistoryStore;
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* 当前 session 对应的 context Composer。
|
|
113
|
-
*/
|
|
114
|
-
context_composer: SessionContextComposer;
|
|
105
|
+
/** 当前 Session 稳定标识。 */
|
|
106
|
+
session_id: string;
|
|
115
107
|
|
|
116
108
|
/**
|
|
117
109
|
* 当前 session 统一日志器。
|
|
@@ -153,14 +145,16 @@ interface CoreEngineRunInput {
|
|
|
153
145
|
/** 当前 Session step 模型支持的总上下文窗口长度。 */
|
|
154
146
|
context_window?: number;
|
|
155
147
|
}>;
|
|
148
|
+
|
|
149
|
+
/** 持久化 compact 后重新读取 Composer 生成的 canonical history。 */
|
|
150
|
+
reload_history: () => Promise<SessionRecordV1[]>;
|
|
156
151
|
}
|
|
157
152
|
|
|
158
153
|
/**
|
|
159
154
|
* 模型与 tool-loop 主循环执行器。
|
|
160
155
|
*/
|
|
161
156
|
export class CoreEngineRunner {
|
|
162
|
-
private readonly
|
|
163
|
-
private readonly context_composer: SessionContextComposer;
|
|
157
|
+
private readonly session_id: string;
|
|
164
158
|
private readonly logger: Logger;
|
|
165
159
|
private readonly should_compact_on_error: CoreEngineRunnerOptions["should_compact_on_error"];
|
|
166
160
|
|
|
@@ -168,10 +162,12 @@ export class CoreEngineRunner {
|
|
|
168
162
|
private validated_compaction_summary_id = "";
|
|
169
163
|
|
|
170
164
|
constructor(options: CoreEngineRunnerOptions) {
|
|
171
|
-
this.
|
|
172
|
-
this.context_composer = options.context_composer;
|
|
165
|
+
this.session_id = String(options.session_id || "").trim();
|
|
173
166
|
this.logger = options.logger;
|
|
174
167
|
this.should_compact_on_error = options.should_compact_on_error;
|
|
168
|
+
if (!this.session_id) {
|
|
169
|
+
throw new Error("CoreEngineRunner requires a non-empty session_id");
|
|
170
|
+
}
|
|
175
171
|
}
|
|
176
172
|
|
|
177
173
|
/**
|
|
@@ -179,7 +175,7 @@ export class CoreEngineRunner {
|
|
|
179
175
|
*/
|
|
180
176
|
async run(input: CoreEngineRunInput): Promise<SessionRunResult> {
|
|
181
177
|
const start_time = Date.now();
|
|
182
|
-
const session_id =
|
|
178
|
+
const session_id = this.session_id;
|
|
183
179
|
let system = Array.isArray(input.execute_input.system)
|
|
184
180
|
? input.execute_input.system
|
|
185
181
|
: [];
|
|
@@ -201,8 +197,6 @@ export class CoreEngineRunner {
|
|
|
201
197
|
const append_merged_user_messages = (messages: SessionRecordV1[]) =>
|
|
202
198
|
message_state.appendMergedUserMessages(messages);
|
|
203
199
|
|
|
204
|
-
const context_composer_on_step_finish =
|
|
205
|
-
this.context_composer.createOnStepFinishHandler(input.run_context);
|
|
206
200
|
let step_count = 0;
|
|
207
201
|
let total_tool_call_count = 0;
|
|
208
202
|
let total_tool_result_count = 0;
|
|
@@ -220,15 +214,19 @@ export class CoreEngineRunner {
|
|
|
220
214
|
stepIndex: step_count,
|
|
221
215
|
...summary,
|
|
222
216
|
});
|
|
223
|
-
|
|
217
|
+
if (input.run_context.onAssistantStepCallback) {
|
|
218
|
+
try {
|
|
219
|
+
await input.run_context.onAssistantStepCallback({
|
|
220
|
+
text: String((step_result as { text?: unknown })?.text || "").trim(),
|
|
221
|
+
stepIndex: step_count,
|
|
222
|
+
stepResult: step_result,
|
|
223
|
+
});
|
|
224
|
+
} catch {
|
|
225
|
+
// Assistant step 观察回调失败不能改变模型执行结果。
|
|
226
|
+
}
|
|
227
|
+
}
|
|
224
228
|
};
|
|
225
229
|
|
|
226
|
-
const prepare_step_inputs = this.context_composer.createPrepareStepHandler({
|
|
227
|
-
system,
|
|
228
|
-
appendMergedUserMessages: append_merged_user_messages,
|
|
229
|
-
runContext: input.run_context,
|
|
230
|
-
});
|
|
231
|
-
|
|
232
230
|
let text_only_continuation_count = 0;
|
|
233
231
|
let incomplete_response_recovery_count = 0;
|
|
234
232
|
let context_error_compaction_retries = 0;
|
|
@@ -243,12 +241,25 @@ export class CoreEngineRunner {
|
|
|
243
241
|
while (step_count < MAX_TOOL_LOOP_STEPS) {
|
|
244
242
|
// 关键点(中文):steer 与 command 在同一个 Session step 检查点执行。
|
|
245
243
|
// 当前流与 tool callback 保持原执行视图,下一 step 再统一读取 effective 配置。
|
|
246
|
-
|
|
244
|
+
const injected_messages = [...input.run_context.injectedUserMessages];
|
|
245
|
+
input.run_context.injectedUserMessages = [];
|
|
246
|
+
let queued_messages: SessionRecordV1[] = [];
|
|
247
|
+
if (input.run_context.onStepCallback) {
|
|
248
|
+
try {
|
|
249
|
+
queued_messages = await input.run_context.onStepCallback();
|
|
250
|
+
} catch {
|
|
251
|
+
queued_messages = [];
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
await append_merged_user_messages([
|
|
255
|
+
...injected_messages,
|
|
256
|
+
...queued_messages,
|
|
257
|
+
]);
|
|
247
258
|
const step_inputs = await input.resolve_step_inputs();
|
|
248
259
|
system = Array.isArray(step_inputs.system) ? step_inputs.system : [];
|
|
249
260
|
tools = step_inputs.tools;
|
|
250
261
|
if (input.run_context.consume_history_reload?.()) {
|
|
251
|
-
const canonical_records = await
|
|
262
|
+
const canonical_records = await input.reload_history();
|
|
252
263
|
await message_state.replace_session_messages(canonical_records, tools);
|
|
253
264
|
persisted_compaction_summary_id = resolve_compaction_summary_id(
|
|
254
265
|
canonical_records,
|
|
@@ -312,10 +323,7 @@ export class CoreEngineRunner {
|
|
|
312
323
|
sessionId: session_id,
|
|
313
324
|
logger: this.logger,
|
|
314
325
|
buildFallbackAssistantMessage: (text) =>
|
|
315
|
-
|
|
316
|
-
text,
|
|
317
|
-
input.run_context,
|
|
318
|
-
),
|
|
326
|
+
build_fallback_assistant_message(session_id, text),
|
|
319
327
|
onUiMessageChunkCallback: input.run_context.onUiMessageChunkCallback,
|
|
320
328
|
abortSignal: input.run_context.abortSignal,
|
|
321
329
|
});
|
|
@@ -441,17 +449,15 @@ export class CoreEngineRunner {
|
|
|
441
449
|
reason: incomplete_response.reason,
|
|
442
450
|
...incomplete_response.details,
|
|
443
451
|
});
|
|
444
|
-
const recovery_message =
|
|
452
|
+
const recovery_message = build_internal_user_message({
|
|
453
|
+
session_id,
|
|
445
454
|
text: buildIncompleteResponseRecoveryNudge(
|
|
446
455
|
incomplete_response_recovery_count,
|
|
447
456
|
),
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
reason: incomplete_response.reason,
|
|
453
|
-
stepIndex: step_count,
|
|
454
|
-
},
|
|
457
|
+
extra: {
|
|
458
|
+
internal: "agent_incomplete_response_recover",
|
|
459
|
+
reason: incomplete_response.reason,
|
|
460
|
+
stepIndex: step_count,
|
|
455
461
|
},
|
|
456
462
|
});
|
|
457
463
|
await message_state.appendUserTextMessage(recovery_message);
|
|
@@ -485,15 +491,13 @@ export class CoreEngineRunner {
|
|
|
485
491
|
if (loop_decision.continueForTextOnly) {
|
|
486
492
|
text_only_continuation_count += 1;
|
|
487
493
|
incomplete_response_recovery_count = 0;
|
|
488
|
-
const continuation_message =
|
|
494
|
+
const continuation_message = build_internal_user_message({
|
|
495
|
+
session_id,
|
|
489
496
|
text: buildTextOnlyContinuationNudge(text_only_continuation_count),
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
reason: text_only_continuation_reason,
|
|
495
|
-
stepIndex: step_count,
|
|
496
|
-
},
|
|
497
|
+
extra: {
|
|
498
|
+
internal: "agent_loop_auto_continue",
|
|
499
|
+
reason: text_only_continuation_reason,
|
|
500
|
+
stepIndex: step_count,
|
|
497
501
|
},
|
|
498
502
|
});
|
|
499
503
|
await message_state.appendUserTextMessage(continuation_message);
|
|
@@ -533,10 +537,7 @@ export class CoreEngineRunner {
|
|
|
533
537
|
|
|
534
538
|
const final_message = mergePendingAssistantFileParts(
|
|
535
539
|
final_assistant_ui_message ||
|
|
536
|
-
|
|
537
|
-
"Execution completed",
|
|
538
|
-
input.run_context,
|
|
539
|
-
),
|
|
540
|
+
build_fallback_assistant_message(session_id, "Execution completed"),
|
|
540
541
|
input.run_context.pendingAssistantFileParts,
|
|
541
542
|
);
|
|
542
543
|
|
|
@@ -602,9 +603,9 @@ export class CoreEngineRunner {
|
|
|
602
603
|
return {
|
|
603
604
|
success: false,
|
|
604
605
|
error: error_text,
|
|
605
|
-
assistantMessage:
|
|
606
|
+
assistantMessage: build_fallback_assistant_message(
|
|
607
|
+
session_id,
|
|
606
608
|
`Execution failed: ${error_text}`,
|
|
607
|
-
input.run_context,
|
|
608
609
|
),
|
|
609
610
|
...(compact_required ? { compact_required: true } : {}),
|
|
610
611
|
deferredPersistedUserMessages: [
|
|
@@ -615,6 +616,46 @@ export class CoreEngineRunner {
|
|
|
615
616
|
}
|
|
616
617
|
}
|
|
617
618
|
|
|
619
|
+
/** 构造仅在当前 Turn 内使用的内部 User Message。 */
|
|
620
|
+
function build_internal_user_message(input: {
|
|
621
|
+
session_id: string;
|
|
622
|
+
text: string;
|
|
623
|
+
extra: JsonObject;
|
|
624
|
+
}): SessionRecordV1 {
|
|
625
|
+
return {
|
|
626
|
+
id: `u:${input.session_id}:${Date.now()}`,
|
|
627
|
+
role: "user",
|
|
628
|
+
metadata: {
|
|
629
|
+
v: 1,
|
|
630
|
+
ts: Date.now(),
|
|
631
|
+
sessionId: input.session_id,
|
|
632
|
+
source: "ingress",
|
|
633
|
+
kind: "normal",
|
|
634
|
+
extra: input.extra,
|
|
635
|
+
},
|
|
636
|
+
parts: [{ type: "text", text: input.text }],
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/** 构造 Executor 失败或空结果使用的临时 Assistant Message。 */
|
|
641
|
+
function build_fallback_assistant_message(
|
|
642
|
+
session_id: string,
|
|
643
|
+
text: string,
|
|
644
|
+
): SessionMessageRecordV1 {
|
|
645
|
+
return {
|
|
646
|
+
id: `a:${session_id}:${Date.now()}`,
|
|
647
|
+
role: "assistant",
|
|
648
|
+
metadata: {
|
|
649
|
+
v: 1,
|
|
650
|
+
ts: Date.now(),
|
|
651
|
+
sessionId: session_id,
|
|
652
|
+
source: "egress",
|
|
653
|
+
kind: "normal",
|
|
654
|
+
},
|
|
655
|
+
parts: [{ type: "text", text }],
|
|
656
|
+
};
|
|
657
|
+
}
|
|
658
|
+
|
|
618
659
|
/** 读取当前模型上下文中最新的持久化 compact Summary 标识。 */
|
|
619
660
|
function resolve_compaction_summary_id(messages: SessionRecordV1[]): string {
|
|
620
661
|
for (let index = messages.length - 1; index >= 0; index -= 1) {
|
|
@@ -9,8 +9,6 @@
|
|
|
9
9
|
|
|
10
10
|
import type { LanguageModel } from "ai";
|
|
11
11
|
import type { Logger } from "@/utils/logger/Logger.js";
|
|
12
|
-
import type { SessionCompactionComposer } from "@executor/composer/compaction/SessionCompactionComposer.js";
|
|
13
|
-
import type { SessionContextComposer } from "@executor/composer/context/SessionContextComposer.js";
|
|
14
12
|
import type { SessionRunContext } from "@/types/executor/SessionRunContext.js";
|
|
15
13
|
import type {
|
|
16
14
|
SessionExecuteInput,
|
|
@@ -23,15 +21,11 @@ import type {
|
|
|
23
21
|
const MAX_COMPACTION_RETRY_ATTEMPTS = 3;
|
|
24
22
|
|
|
25
23
|
interface ExecutorRecoveryPolicyOptions {
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
*/
|
|
29
|
-
compaction_composer: SessionCompactionComposer;
|
|
24
|
+
/** 当前 Session 稳定标识。 */
|
|
25
|
+
session_id: string;
|
|
30
26
|
|
|
31
|
-
/**
|
|
32
|
-
|
|
33
|
-
*/
|
|
34
|
-
context_composer: SessionContextComposer;
|
|
27
|
+
/** 判断错误是否需要持久化压缩后重试。 */
|
|
28
|
+
should_compact: (error: unknown) => boolean;
|
|
35
29
|
|
|
36
30
|
/**
|
|
37
31
|
* 当前 session 统一日志器。
|
|
@@ -113,15 +107,18 @@ interface ExecutorRecoveryRunInput {
|
|
|
113
107
|
* 执行恢复与重试策略服务。
|
|
114
108
|
*/
|
|
115
109
|
export class ExecutorRecoveryPolicy {
|
|
116
|
-
private readonly
|
|
117
|
-
private readonly
|
|
110
|
+
private readonly session_id: string;
|
|
111
|
+
private readonly should_compact: ExecutorRecoveryPolicyOptions["should_compact"];
|
|
118
112
|
private readonly logger: Logger;
|
|
119
113
|
private retry_count = 0;
|
|
120
114
|
|
|
121
115
|
constructor(options: ExecutorRecoveryPolicyOptions) {
|
|
122
|
-
this.
|
|
123
|
-
this.
|
|
116
|
+
this.session_id = String(options.session_id || "").trim();
|
|
117
|
+
this.should_compact = options.should_compact;
|
|
124
118
|
this.logger = options.logger;
|
|
119
|
+
if (!this.session_id) {
|
|
120
|
+
throw new Error("ExecutorRecoveryPolicy requires a non-empty session_id");
|
|
121
|
+
}
|
|
125
122
|
}
|
|
126
123
|
|
|
127
124
|
/**
|
|
@@ -150,7 +147,7 @@ export class ExecutorRecoveryPolicy {
|
|
|
150
147
|
run_context: input.run_context,
|
|
151
148
|
});
|
|
152
149
|
} catch (error) {
|
|
153
|
-
if (this.
|
|
150
|
+
if (this.should_compact(error)) {
|
|
154
151
|
await this.logger.log("info", "[agent] compacting", {
|
|
155
152
|
retryCount: this.retry_count,
|
|
156
153
|
error: String(error),
|
|
@@ -201,10 +198,18 @@ export class ExecutorRecoveryPolicy {
|
|
|
201
198
|
return {
|
|
202
199
|
success: false,
|
|
203
200
|
error: input.error_text,
|
|
204
|
-
assistantMessage:
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
201
|
+
assistantMessage: {
|
|
202
|
+
id: `a:${this.session_id}:${Date.now()}`,
|
|
203
|
+
role: "assistant",
|
|
204
|
+
metadata: {
|
|
205
|
+
v: 1,
|
|
206
|
+
ts: Date.now(),
|
|
207
|
+
sessionId: this.session_id,
|
|
208
|
+
source: "egress",
|
|
209
|
+
kind: "normal",
|
|
210
|
+
},
|
|
211
|
+
parts: [{ type: "text", text: input.fallback_text }],
|
|
212
|
+
},
|
|
208
213
|
deferredPersistedUserMessages: [
|
|
209
214
|
...input.run_context.deferredPersistedUserMessages,
|
|
210
215
|
],
|