@ai-setting/roy-agent-core 1.3.10 → 1.3.11
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/dist/config/index.js +1647 -0
- package/dist/index.js +12579 -89691
- package/package.json +19 -56
- package/src/config/config-component.test.ts +0 -627
- package/src/config/config-component.ts +0 -906
- package/src/config/config-parser.test.ts +0 -319
- package/src/config/config-parser.ts +0 -203
- package/src/config/decentralized-config.test.ts +0 -740
- package/src/config/env-key.ts +0 -210
- package/src/config/env-source.test.ts +0 -252
- package/src/config/env-source.ts +0 -301
- package/src/config/file-source.test.ts +0 -357
- package/src/config/file-source.ts +0 -421
- package/src/config/index.ts +0 -24
- package/src/config/protocol-resolver.test.ts +0 -217
- package/src/config/protocol-resolver.ts +0 -228
- package/src/env/agent/agent-component.abort.test.ts +0 -511
- package/src/env/agent/agent-component.record-session.test.ts +0 -349
- package/src/env/agent/agent-component.test.ts +0 -1389
- package/src/env/agent/agent-component.tool-error.test.ts +0 -327
- package/src/env/agent/agent-component.ts +0 -1711
- package/src/env/agent/agent-config-registration.test.ts +0 -226
- package/src/env/agent/agent-config-registration.ts +0 -46
- package/src/env/agent/agent-reminder-plugin.integration.test.ts +0 -243
- package/src/env/agent/index.ts +0 -10
- package/src/env/agent/summary-agent.parse-hint.test.ts +0 -360
- package/src/env/agent/summary-agent.ts +0 -508
- package/src/env/agent/types.ts +0 -536
- package/src/env/commands/commands-component.test.ts +0 -364
- package/src/env/commands/commands-component.ts +0 -604
- package/src/env/commands/commands-config-registration.test.ts +0 -198
- package/src/env/commands/commands-config-registration.ts +0 -38
- package/src/env/commands/index.ts +0 -21
- package/src/env/commands/parser.test.ts +0 -203
- package/src/env/commands/parser.ts +0 -115
- package/src/env/commands/types.ts +0 -184
- package/src/env/commands-prompt-integration.test.ts +0 -243
- package/src/env/component-env.test.ts +0 -119
- package/src/env/component.ts +0 -335
- package/src/env/constants.test.ts +0 -72
- package/src/env/constants.ts +0 -123
- package/src/env/debug/debug-component.test.ts +0 -114
- package/src/env/debug/debug-component.ts +0 -547
- package/src/env/debug/formatters/index.ts +0 -9
- package/src/env/debug/formatters/repl-formatter.test.ts +0 -139
- package/src/env/debug/formatters/repl-formatter.ts +0 -358
- package/src/env/debug/formatters/trace-formatter.test.ts +0 -119
- package/src/env/debug/formatters/trace-formatter.ts +0 -191
- package/src/env/debug/formatters/tree-formatter.test.ts +0 -107
- package/src/env/debug/formatters/tree-formatter.ts +0 -325
- package/src/env/debug/index.ts +0 -38
- package/src/env/debug/parser/regex-parser.test.ts +0 -201
- package/src/env/debug/parser/regex-parser.ts +0 -196
- package/src/env/debug/parser/span-builder.test.ts +0 -241
- package/src/env/debug/parser/span-builder.ts +0 -386
- package/src/env/debug/reader/log-reader.test.ts +0 -170
- package/src/env/debug/reader/log-reader.ts +0 -186
- package/src/env/debug/reader/span-db-reader.test.ts +0 -118
- package/src/env/debug/reader/span-db-reader.ts +0 -201
- package/src/env/debug/types.test.ts +0 -187
- package/src/env/debug/types.ts +0 -171
- package/src/env/environment-init.test.ts +0 -183
- package/src/env/environment-lifecycle.test.ts +0 -516
- package/src/env/environment-service.test.ts +0 -332
- package/src/env/environment.handle-query.test.ts +0 -96
- package/src/env/environment.test.ts +0 -232
- package/src/env/environment.ts +0 -708
- package/src/env/errors.test.ts +0 -165
- package/src/env/errors.ts +0 -157
- package/src/env/event-source/event-source-agent-handler.test.ts +0 -193
- package/src/env/event-source/event-source-agent-handler.ts +0 -111
- package/src/env/event-source/event-source-component.process-cleanup.test.ts +0 -236
- package/src/env/event-source/event-source-component.stop.test.ts +0 -346
- package/src/env/event-source/event-source-component.test.ts +0 -1207
- package/src/env/event-source/event-source-component.ts +0 -1379
- package/src/env/event-source/event-source-config-registration.test.ts +0 -242
- package/src/env/event-source/event-source-config-registration.ts +0 -37
- package/src/env/event-source/event-source-integration.test.ts +0 -320
- package/src/env/event-source/event-source-platform.test.ts +0 -630
- package/src/env/event-source/types.ts +0 -298
- package/src/env/hook/global-hook-manager.ts +0 -162
- package/src/env/hook/hook-manager.test.ts +0 -374
- package/src/env/hook/hook-manager.ts +0 -309
- package/src/env/hook/index.ts +0 -38
- package/src/env/hook/types.ts +0 -138
- package/src/env/index.ts +0 -144
- package/src/env/interface.ts +0 -203
- package/src/env/llm/hooks.test.ts +0 -293
- package/src/env/llm/hooks.ts +0 -316
- package/src/env/llm/index.ts +0 -61
- package/src/env/llm/invoke-threshold-check.test.ts +0 -88
- package/src/env/llm/invoke-timeout.test.ts +0 -54
- package/src/env/llm/invoke.test.ts +0 -71
- package/src/env/llm/invoke.ts +0 -1039
- package/src/env/llm/llm-config.test.ts +0 -523
- package/src/env/llm/llm.test.ts +0 -233
- package/src/env/llm/llm.ts +0 -568
- package/src/env/llm/provider.test.ts +0 -182
- package/src/env/llm/provider.ts +0 -108
- package/src/env/llm/transform.test.ts +0 -251
- package/src/env/llm/transform.ts +0 -286
- package/src/env/llm/types.test.ts +0 -580
- package/src/env/llm/types.ts +0 -424
- package/src/env/log-trace/decorator-otel.test.ts +0 -182
- package/src/env/log-trace/decorator.ts +0 -230
- package/src/env/log-trace/index.ts +0 -79
- package/src/env/log-trace/log-trace-component.test.ts +0 -242
- package/src/env/log-trace/log-trace-component.ts +0 -497
- package/src/env/log-trace/log-trace-config-registration.test.ts +0 -348
- package/src/env/log-trace/log-trace-config-registration.ts +0 -45
- package/src/env/log-trace/logger.test.ts +0 -149
- package/src/env/log-trace/logger.ts +0 -522
- package/src/env/log-trace/opentelemetry/cli-propagation.test.ts +0 -147
- package/src/env/log-trace/opentelemetry/cli-propagation.ts +0 -194
- package/src/env/log-trace/opentelemetry/integration.test.ts +0 -668
- package/src/env/log-trace/opentelemetry/mod.ts +0 -25
- package/src/env/log-trace/opentelemetry/propagation-env.test.ts +0 -181
- package/src/env/log-trace/opentelemetry/propagation-env.ts +0 -136
- package/src/env/log-trace/opentelemetry/propagation.test.ts +0 -259
- package/src/env/log-trace/opentelemetry/propagation.ts +0 -215
- package/src/env/log-trace/opentelemetry/tracer-provider-context.test.ts +0 -166
- package/src/env/log-trace/opentelemetry/tracer-provider.test.ts +0 -379
- package/src/env/log-trace/opentelemetry/tracer-provider.ts +0 -612
- package/src/env/log-trace/span-storage.test.ts +0 -145
- package/src/env/log-trace/span-storage.ts +0 -230
- package/src/env/log-trace/trace-context.test.ts +0 -187
- package/src/env/log-trace/trace-context.ts +0 -162
- package/src/env/log-trace/types.test.ts +0 -63
- package/src/env/log-trace/types.ts +0 -172
- package/src/env/mcp/README.md +0 -244
- package/src/env/mcp/__integration__/mcp-component.integration.test.ts +0 -373
- package/src/env/mcp/config.test.ts +0 -74
- package/src/env/mcp/config.ts +0 -116
- package/src/env/mcp/index.ts +0 -41
- package/src/env/mcp/loader.test.ts +0 -161
- package/src/env/mcp/loader.ts +0 -209
- package/src/env/mcp/mcp-component.test.ts +0 -111
- package/src/env/mcp/mcp-component.ts +0 -358
- package/src/env/mcp/mcp-config-registration.test.ts +0 -304
- package/src/env/mcp/mcp-config-registration.ts +0 -50
- package/src/env/mcp/scanner.test.ts +0 -170
- package/src/env/mcp/scanner.ts +0 -246
- package/src/env/mcp/tool/adapter.test.ts +0 -520
- package/src/env/mcp/tool/adapter.ts +0 -521
- package/src/env/mcp/tool/index.ts +0 -5
- package/src/env/mcp/types.test.ts +0 -171
- package/src/env/mcp/types.ts +0 -79
- package/src/env/memory/README.md +0 -177
- package/src/env/memory/built-in/index.ts +0 -59
- package/src/env/memory/built-in/recall-memory.ts +0 -103
- package/src/env/memory/built-in/record-memory.ts +0 -148
- package/src/env/memory/index.ts +0 -20
- package/src/env/memory/memory-component.test.ts +0 -239
- package/src/env/memory/memory-component.ts +0 -503
- package/src/env/memory/memory-config-registration.test.ts +0 -67
- package/src/env/memory/memory-config-registration.ts +0 -48
- package/src/env/memory/memory-config.ts +0 -45
- package/src/env/memory/memory-file.test.ts +0 -268
- package/src/env/memory/plugin/index.ts +0 -48
- package/src/env/memory/plugin/memory-agent.test.ts +0 -249
- package/src/env/memory/plugin/memory-agent.ts +0 -365
- package/src/env/memory/plugin/memory-manager.ts +0 -198
- package/src/env/memory/plugin/memory-plugin-agent.test.ts +0 -145
- package/src/env/memory/plugin/memory-plugin.ts +0 -210
- package/src/env/memory/plugin/plugin-simplified.test.ts +0 -51
- package/src/env/memory/plugin/recall-memory.test.ts +0 -106
- package/src/env/memory/plugin/recall-memory.ts +0 -53
- package/src/env/memory/plugin/types.ts +0 -101
- package/src/env/memory/tools/memory-agent-tools.ts +0 -228
- package/src/env/memory/types.ts +0 -85
- package/src/env/paths.ts +0 -118
- package/src/env/prompt/index.ts +0 -18
- package/src/env/prompt/memory-prompts.test.ts +0 -91
- package/src/env/prompt/prompt-component.test.ts +0 -491
- package/src/env/prompt/prompt-component.ts +0 -619
- package/src/env/prompt/prompt-config-registration.test.ts +0 -213
- package/src/env/prompt/prompt-config-registration.ts +0 -39
- package/src/env/prompt/prompts-index.ts +0 -504
- package/src/env/prompt/renderer.ts +0 -67
- package/src/env/prompt/types.ts +0 -136
- package/src/env/session/hooks.ts +0 -18
- package/src/env/session/index.ts +0 -37
- package/src/env/session/search-query-parser.test.ts +0 -425
- package/src/env/session/search-query-parser.ts +0 -171
- package/src/env/session/session-checkpoint.test.ts +0 -523
- package/src/env/session/session-component.extract-recent-messages.test.ts +0 -209
- package/src/env/session/session-component.test.ts +0 -132
- package/src/env/session/session-component.ts +0 -1249
- package/src/env/session/session-config-registration.test.ts +0 -138
- package/src/env/session/session-config-registration.ts +0 -52
- package/src/env/session/session-message-converter.test.ts +0 -763
- package/src/env/session/session-message-converter.ts +0 -415
- package/src/env/session/session-message-e2e.test.ts +0 -448
- package/src/env/session/session-search.test.ts +0 -391
- package/src/env/session/session-store.test.ts +0 -362
- package/src/env/session/session-store.ts +0 -141
- package/src/env/session/storage/index.ts +0 -6
- package/src/env/session/storage/memory.ts +0 -502
- package/src/env/session/storage/sqlite.ts +0 -794
- package/src/env/session/types.ts +0 -742
- package/src/env/skill/config.ts +0 -39
- package/src/env/skill/index.ts +0 -6
- package/src/env/skill/parser.test.ts +0 -116
- package/src/env/skill/parser.ts +0 -77
- package/src/env/skill/scanner.test.ts +0 -211
- package/src/env/skill/scanner.ts +0 -119
- package/src/env/skill/skill-component.test.ts +0 -234
- package/src/env/skill/skill-component.ts +0 -352
- package/src/env/skill/skill-config-registration.test.ts +0 -60
- package/src/env/skill/skill-config-registration.ts +0 -43
- package/src/env/skill/tool/index.ts +0 -1
- package/src/env/skill/tool/skill-tool.test.ts +0 -100
- package/src/env/skill/tool/skill-tool.ts +0 -72
- package/src/env/skill/types.ts +0 -64
- package/src/env/task/delegate/delegate-tool.test.ts +0 -498
- package/src/env/task/delegate/delegate-tool.ts +0 -1014
- package/src/env/task/delegate/index.ts +0 -18
- package/src/env/task/delegate/stop-tool.test.ts +0 -140
- package/src/env/task/delegate/stop-tool.ts +0 -119
- package/src/env/task/delegate/task-events.test.ts +0 -178
- package/src/env/task/delegate/task-events.ts +0 -143
- package/src/env/task/hooks/contexts.test.ts +0 -92
- package/src/env/task/hooks/contexts.ts +0 -192
- package/src/env/task/hooks/index.ts +0 -23
- package/src/env/task/hooks/task-hook-points.test.ts +0 -32
- package/src/env/task/hooks/task-hook-points.ts +0 -54
- package/src/env/task/index.ts +0 -7
- package/src/env/task/plugins/index.ts +0 -13
- package/src/env/task/plugins/task-plugin.test.ts +0 -74
- package/src/env/task/plugins/task-plugin.ts +0 -89
- package/src/env/task/plugins/task-tag-plugin.test.ts +0 -377
- package/src/env/task/plugins/task-tag-plugin.ts +0 -319
- package/src/env/task/plugins/task-workflow-extractor.integration.test.ts +0 -226
- package/src/env/task/plugins/workflow-extractor-agent.test.ts +0 -107
- package/src/env/task/plugins/workflow-extractor-agent.ts +0 -225
- package/src/env/task/storage/index.ts +0 -6
- package/src/env/task/storage/sqlite-task-store.test.ts +0 -283
- package/src/env/task/storage/sqlite-task-store.ts +0 -903
- package/src/env/task/storage/task-search.test.ts +0 -291
- package/src/env/task/tag-service.test.ts +0 -198
- package/src/env/task/tag-service.ts +0 -264
- package/src/env/task/task-component.test.ts +0 -193
- package/src/env/task/task-component.ts +0 -658
- package/src/env/task/task-config-registration.test.ts +0 -57
- package/src/env/task/task-config-registration.ts +0 -37
- package/src/env/task/task-types.test.ts +0 -137
- package/src/env/task/tools/complete-tool.ts +0 -44
- package/src/env/task/tools/create-tool.ts +0 -49
- package/src/env/task/tools/delete-tool.ts +0 -43
- package/src/env/task/tools/get-tool.ts +0 -59
- package/src/env/task/tools/index.ts +0 -10
- package/src/env/task/tools/list-tool.ts +0 -40
- package/src/env/task/tools/operation/create-tool.ts +0 -48
- package/src/env/task/tools/operation/delete-tool.ts +0 -43
- package/src/env/task/tools/operation/get-tool.ts +0 -43
- package/src/env/task/tools/operation/index.ts +0 -9
- package/src/env/task/tools/operation/list-tool.ts +0 -40
- package/src/env/task/tools/operation/operation-tools.test.ts +0 -274
- package/src/env/task/tools/operation/operation-types.ts +0 -75
- package/src/env/task/tools/operation/update-tool.ts +0 -47
- package/src/env/task/tools/task-tools.test.ts +0 -203
- package/src/env/task/tools/task-types.test.ts +0 -75
- package/src/env/task/tools/task-types.ts +0 -68
- package/src/env/task/tools/update-tool.ts +0 -70
- package/src/env/task/types.ts +0 -160
- package/src/env/tool/built-in/bash.ts +0 -201
- package/src/env/tool/built-in/echo.ts +0 -29
- package/src/env/tool/built-in/edit-file.test.ts +0 -136
- package/src/env/tool/built-in/edit-file.ts +0 -92
- package/src/env/tool/built-in/glob.test.ts +0 -94
- package/src/env/tool/built-in/glob.ts +0 -65
- package/src/env/tool/built-in/grep.test.ts +0 -122
- package/src/env/tool/built-in/grep.ts +0 -108
- package/src/env/tool/built-in/index.ts +0 -44
- package/src/env/tool/built-in/read-file.test.ts +0 -84
- package/src/env/tool/built-in/read-file.ts +0 -75
- package/src/env/tool/built-in/write-file.test.ts +0 -119
- package/src/env/tool/built-in/write-file.ts +0 -68
- package/src/env/tool/index.ts +0 -24
- package/src/env/tool/registry.test.ts +0 -257
- package/src/env/tool/registry.ts +0 -167
- package/src/env/tool/tool-component.test.ts +0 -559
- package/src/env/tool/tool-component.ts +0 -563
- package/src/env/tool/tool-config-registration.test.ts +0 -249
- package/src/env/tool/tool-config-registration.ts +0 -46
- package/src/env/tool/types.ts +0 -267
- package/src/env/tool/validator.test.ts +0 -143
- package/src/env/tool/validator.ts +0 -44
- package/src/env/types.ts +0 -180
- package/src/env/workflow/ask-user-tool-registration.test.ts +0 -216
- package/src/env/workflow/complex-workflow.integration.test.ts +0 -1900
- package/src/env/workflow/decorators/decorator-node.ts +0 -229
- package/src/env/workflow/decorators/decorator.test.ts +0 -196
- package/src/env/workflow/decorators/edge.ts +0 -82
- package/src/env/workflow/decorators/index.ts +0 -31
- package/src/env/workflow/decorators/node-as.ts +0 -98
- package/src/env/workflow/decorators/workflow.ts +0 -54
- package/src/env/workflow/engine/dag-manager.test.ts +0 -570
- package/src/env/workflow/engine/dag-manager.ts +0 -594
- package/src/env/workflow/engine/engine.ts +0 -1422
- package/src/env/workflow/engine/event-bus.test.ts +0 -359
- package/src/env/workflow/engine/event-bus.ts +0 -156
- package/src/env/workflow/engine/executor-agent-session.test.ts +0 -84
- package/src/env/workflow/engine/executor.test.ts +0 -619
- package/src/env/workflow/engine/executor.ts +0 -593
- package/src/env/workflow/engine/index.ts +0 -24
- package/src/env/workflow/engine/node-registry.test.ts +0 -560
- package/src/env/workflow/engine/node-registry.ts +0 -289
- package/src/env/workflow/engine/resume-removed.test.ts +0 -22
- package/src/env/workflow/engine/scheduler.test.ts +0 -715
- package/src/env/workflow/engine/scheduler.ts +0 -318
- package/src/env/workflow/engine/workflow-engine.test.ts +0 -815
- package/src/env/workflow/extractor/workflow-converter.ts +0 -306
- package/src/env/workflow/fixtures.ts +0 -380
- package/src/env/workflow/index.ts +0 -38
- package/src/env/workflow/integration/run-resume-unified.test.ts +0 -186
- package/src/env/workflow/integration/service-integration.test.ts +0 -267
- package/src/env/workflow/metadata/keys.ts +0 -12
- package/src/env/workflow/nodes/agent-component-adapter.test.ts +0 -318
- package/src/env/workflow/nodes/agent-component-adapter.ts +0 -448
- package/src/env/workflow/nodes/agent-node.test.ts +0 -371
- package/src/env/workflow/nodes/agent-node.ts +0 -598
- package/src/env/workflow/nodes/ask-user-node.ts +0 -113
- package/src/env/workflow/nodes/condition-node.ts +0 -200
- package/src/env/workflow/nodes/index.ts +0 -9
- package/src/env/workflow/nodes/merge-node.ts +0 -141
- package/src/env/workflow/nodes/skill-node.test.ts +0 -253
- package/src/env/workflow/nodes/skill-node.ts +0 -393
- package/src/env/workflow/nodes/tool-node.test.ts +0 -251
- package/src/env/workflow/nodes/tool-node.ts +0 -493
- package/src/env/workflow/nodes/workflow-llm-history.test.ts +0 -455
- package/src/env/workflow/nodes/workflow-node.test.ts +0 -315
- package/src/env/workflow/nodes/workflow-node.ts +0 -311
- package/src/env/workflow/service/index.ts +0 -27
- package/src/env/workflow/service/registry.test.ts +0 -133
- package/src/env/workflow/service/registry.ts +0 -71
- package/src/env/workflow/service/workflow-service.test.ts +0 -310
- package/src/env/workflow/service/workflow-service.ts +0 -393
- package/src/env/workflow/storage/index.ts +0 -28
- package/src/env/workflow/storage/mock-repositories.ts +0 -385
- package/src/env/workflow/storage/sqlite.test.ts +0 -179
- package/src/env/workflow/storage/sqlite.ts +0 -163
- package/src/env/workflow/storage/workflow-repo.test.ts +0 -780
- package/src/env/workflow/storage/workflow-repo.ts +0 -342
- package/src/env/workflow/tools/ask-user-tool.ts +0 -82
- package/src/env/workflow/tools/index.ts +0 -26
- package/src/env/workflow/tools/run-workflow.test.ts +0 -352
- package/src/env/workflow/tools/run-workflow.ts +0 -214
- package/src/env/workflow/types/context.ts +0 -18
- package/src/env/workflow/types/decorators-types.ts +0 -198
- package/src/env/workflow/types/event.test.ts +0 -515
- package/src/env/workflow/types/event.ts +0 -193
- package/src/env/workflow/types/index.ts +0 -49
- package/src/env/workflow/types/run.test.ts +0 -437
- package/src/env/workflow/types/run.ts +0 -173
- package/src/env/workflow/types/workflow-hil.ts +0 -114
- package/src/env/workflow/types/workflow-message.test.ts +0 -138
- package/src/env/workflow/types/workflow-message.ts +0 -196
- package/src/env/workflow/types/workflow-session.test.ts +0 -95
- package/src/env/workflow/types/workflow-session.ts +0 -59
- package/src/env/workflow/types/workflow.test.ts +0 -495
- package/src/env/workflow/types/workflow.ts +0 -195
- package/src/env/workflow/types_compat.ts +0 -51
- package/src/env/workflow/utils/create-workflow.ts +0 -47
- package/src/env/workflow/utils/execution-state.ts +0 -245
- package/src/env/workflow/utils/index.ts +0 -18
- package/src/env/workflow/utils/node-registry-helper.ts +0 -58
- package/src/env/workflow/utils/recovery-validator.test.ts +0 -460
- package/src/env/workflow/utils/recovery-validator.ts +0 -377
- package/src/env/workflow/utils/session-parser.test.ts +0 -111
- package/src/env/workflow/utils/session-parser.ts +0 -94
- package/src/env/workflow/utils/session-recovery.test.ts +0 -334
- package/src/env/workflow/utils/session-recovery.ts +0 -188
- package/src/env/workflow/utils/template-resolver.test.ts +0 -258
- package/src/env/workflow/utils/template-resolver.ts +0 -436
- package/src/env/workflow/utils/validation-rules.ts +0 -149
- package/src/env/workflow/workflow-component.ts +0 -544
- package/src/index.ts +0 -422
- package/src/utils/id.ts +0 -21
|
@@ -1,511 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview AgentComponent Abort 功能测试
|
|
3
|
-
*
|
|
4
|
-
* TDD 测试覆盖:
|
|
5
|
-
* 1. AbortController Map Key 唯一性
|
|
6
|
-
* 2. abort() 和 _run() finally 块状态正确性
|
|
7
|
-
* 3. abort() 调用时 AbortController 已删除的边界情况
|
|
8
|
-
* 4. 并发调用同一 agent 的 abort 处理
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
12
|
-
import { AgentComponent } from "./agent-component";
|
|
13
|
-
import type { AgentContext } from "./types";
|
|
14
|
-
import type { Environment } from "../interface";
|
|
15
|
-
import { ConfigComponent } from "../../config/config-component";
|
|
16
|
-
|
|
17
|
-
// ============================================================================
|
|
18
|
-
// Mock Factory
|
|
19
|
-
// ============================================================================
|
|
20
|
-
|
|
21
|
-
function createMockEnvironment(configComponent: ConfigComponent): Environment {
|
|
22
|
-
const mockEnv = {
|
|
23
|
-
name: "test-env",
|
|
24
|
-
version: "1.0.0",
|
|
25
|
-
getConfig: vi.fn(() => ({ name: "test-env", version: "1.0.0", enabled: true })),
|
|
26
|
-
registerComponent: vi.fn(),
|
|
27
|
-
unregisterComponent: vi.fn(),
|
|
28
|
-
getComponent: vi.fn((name: string) => {
|
|
29
|
-
if (name === "config") return configComponent;
|
|
30
|
-
return undefined;
|
|
31
|
-
}),
|
|
32
|
-
hasComponent: vi.fn((name: string) => name === "config"),
|
|
33
|
-
listComponents: vi.fn(() => []),
|
|
34
|
-
handle_query: vi.fn(),
|
|
35
|
-
handle_action: vi.fn(),
|
|
36
|
-
subscribe: vi.fn(() => () => {}),
|
|
37
|
-
subscribeTo: vi.fn(() => () => {}),
|
|
38
|
-
subscribeAll: vi.fn(() => () => {}),
|
|
39
|
-
pushEnvEvent: vi.fn(),
|
|
40
|
-
} as unknown as Environment;
|
|
41
|
-
return mockEnv;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// ============================================================================
|
|
45
|
-
// Tests
|
|
46
|
-
// ============================================================================
|
|
47
|
-
|
|
48
|
-
describe("AgentComponent Abort 功能 (TDD)", () => {
|
|
49
|
-
let agentComponent: AgentComponent;
|
|
50
|
-
let configComponent: ConfigComponent;
|
|
51
|
-
let mockEnv: Environment;
|
|
52
|
-
|
|
53
|
-
beforeEach(async () => {
|
|
54
|
-
vi.clearAllMocks();
|
|
55
|
-
agentComponent = new AgentComponent();
|
|
56
|
-
configComponent = new ConfigComponent();
|
|
57
|
-
mockEnv = createMockEnvironment(configComponent);
|
|
58
|
-
await agentComponent.init({ env: mockEnv, options: { configComponent } });
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
afterEach(async () => {
|
|
62
|
-
// 确保组件被正确清理
|
|
63
|
-
if (agentComponent.getStatus() !== "stopped") {
|
|
64
|
-
await agentComponent.stop();
|
|
65
|
-
}
|
|
66
|
-
vi.restoreAllMocks();
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
// ==========================================================================
|
|
70
|
-
// Test 1: AbortController Map Key 唯一性
|
|
71
|
-
// ==========================================================================
|
|
72
|
-
|
|
73
|
-
describe("AbortController Map Key 唯一性", () => {
|
|
74
|
-
it("每次 run() 调用应该创建唯一的 AbortController", async () => {
|
|
75
|
-
agentComponent.registerAgent("test-agent", { type: "primary" });
|
|
76
|
-
|
|
77
|
-
// Mock LLMComponent
|
|
78
|
-
const mockLLMComponent = {
|
|
79
|
-
invoke: vi.fn(() => Promise.resolve({
|
|
80
|
-
output: { content: "done", toolCalls: [] }
|
|
81
|
-
}))
|
|
82
|
-
};
|
|
83
|
-
(mockEnv.getComponent as any).mockImplementation((name: string) => {
|
|
84
|
-
if (name === "llm") return mockLLMComponent;
|
|
85
|
-
if (name === "config") return configComponent;
|
|
86
|
-
return undefined;
|
|
87
|
-
});
|
|
88
|
-
agentComponent.refreshDependencies();
|
|
89
|
-
|
|
90
|
-
// 第一次调用
|
|
91
|
-
const runPromise1 = agentComponent.run("test-agent", "query 1");
|
|
92
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
93
|
-
|
|
94
|
-
// 第二次调用(并发)
|
|
95
|
-
const runPromise2 = agentComponent.run("test-agent", "query 2");
|
|
96
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
97
|
-
|
|
98
|
-
// 等待两个调用完成
|
|
99
|
-
await Promise.all([runPromise1, runPromise2]);
|
|
100
|
-
|
|
101
|
-
// 验证:两个调用都完成了,没有相互干扰
|
|
102
|
-
expect(mockLLMComponent.invoke).toHaveBeenCalledTimes(2);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it("abort() 应该能够正确中断指定 agent 的运行", async () => {
|
|
106
|
-
agentComponent.registerAgent("test-agent", { type: "primary", maxIterations: 100 });
|
|
107
|
-
|
|
108
|
-
// 创建一个可以被外部控制的 Promise,用于模拟 LLM 调用
|
|
109
|
-
let rejectLLM: (error: any) => void;
|
|
110
|
-
let resolveLLM: (value: any) => void;
|
|
111
|
-
const llmPromise = new Promise((resolve, reject) => {
|
|
112
|
-
resolveLLM = resolve;
|
|
113
|
-
rejectLLM = reject;
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
// Mock LLMComponent - 模拟真实的 abort 行为
|
|
117
|
-
// 当 AbortController.abort() 被调用时,Promise 应该被 reject
|
|
118
|
-
const mockLLMComponent = {
|
|
119
|
-
invoke: vi.fn(({ abortSignal }: { abortSignal?: AbortSignal }) => {
|
|
120
|
-
if (abortSignal) {
|
|
121
|
-
// 如果 abortSignal 已经被触发,立即抛出 AbortError
|
|
122
|
-
if (abortSignal.aborted) {
|
|
123
|
-
const error = new Error("The operation was aborted");
|
|
124
|
-
(error as any).name = "AbortError";
|
|
125
|
-
return Promise.reject(error);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// 监听 abort 事件
|
|
129
|
-
abortSignal.addEventListener("abort", () => {
|
|
130
|
-
const error = new Error("The operation was aborted");
|
|
131
|
-
(error as any).name = "AbortError";
|
|
132
|
-
rejectLLM!(error);
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
return llmPromise;
|
|
136
|
-
})
|
|
137
|
-
};
|
|
138
|
-
(mockEnv.getComponent as any).mockImplementation((name: string) => {
|
|
139
|
-
if (name === "llm") return mockLLMComponent;
|
|
140
|
-
if (name === "config") return configComponent;
|
|
141
|
-
return undefined;
|
|
142
|
-
});
|
|
143
|
-
agentComponent.refreshDependencies();
|
|
144
|
-
|
|
145
|
-
// 启动运行
|
|
146
|
-
const runPromise = agentComponent.run("test-agent", "long query");
|
|
147
|
-
|
|
148
|
-
// 等待 LLM 开始处理
|
|
149
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
150
|
-
|
|
151
|
-
// 中止 - 这会触发 AbortController.abort()
|
|
152
|
-
agentComponent.abort("test-agent");
|
|
153
|
-
|
|
154
|
-
// 等待 run 完成(AbortError 会被抛出)
|
|
155
|
-
const result = await runPromise;
|
|
156
|
-
|
|
157
|
-
// 验证:运行被中止
|
|
158
|
-
expect(result.stopped).toBe(true);
|
|
159
|
-
expect(result.stopReason).toBe("aborted");
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it("并发调用不同 agent 应该互不干扰", async () => {
|
|
163
|
-
agentComponent.registerAgent("agent-1", { type: "primary" });
|
|
164
|
-
agentComponent.registerAgent("agent-2", { type: "primary" });
|
|
165
|
-
|
|
166
|
-
let invokeCount = 0;
|
|
167
|
-
const mockLLMComponent = {
|
|
168
|
-
invoke: vi.fn(() => {
|
|
169
|
-
invokeCount++;
|
|
170
|
-
return Promise.resolve({
|
|
171
|
-
output: { content: `response ${invokeCount}`, toolCalls: [] }
|
|
172
|
-
});
|
|
173
|
-
})
|
|
174
|
-
};
|
|
175
|
-
(mockEnv.getComponent as any).mockImplementation((name: string) => {
|
|
176
|
-
if (name === "llm") return mockLLMComponent;
|
|
177
|
-
if (name === "config") return configComponent;
|
|
178
|
-
return undefined;
|
|
179
|
-
});
|
|
180
|
-
agentComponent.refreshDependencies();
|
|
181
|
-
|
|
182
|
-
// 并发调用两个不同的 agent
|
|
183
|
-
const [result1, result2] = await Promise.all([
|
|
184
|
-
agentComponent.run("agent-1", "query 1"),
|
|
185
|
-
agentComponent.run("agent-2", "query 2"),
|
|
186
|
-
]);
|
|
187
|
-
|
|
188
|
-
// 验证:两个调用都成功
|
|
189
|
-
expect(result1.finalText).toBe("response 1");
|
|
190
|
-
expect(result2.finalText).toBe("response 2");
|
|
191
|
-
expect(mockLLMComponent.invoke).toHaveBeenCalledTimes(2);
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
// ==========================================================================
|
|
196
|
-
// Test 2: abort() 和 _run() finally 块状态正确性
|
|
197
|
-
// ==========================================================================
|
|
198
|
-
|
|
199
|
-
describe("abort() 和 _run() finally 块状态正确性", () => {
|
|
200
|
-
it("abort() 后 agent 状态应该是 stopped(不被 finally 覆盖)", async () => {
|
|
201
|
-
agentComponent.registerAgent("test-agent", { type: "primary", maxIterations: 100 });
|
|
202
|
-
|
|
203
|
-
let resolveLLM: (value: any) => void;
|
|
204
|
-
let rejectLLM: (error: any) => void;
|
|
205
|
-
|
|
206
|
-
const mockLLMComponent = {
|
|
207
|
-
invoke: vi.fn(({ abortSignal }: { abortSignal?: AbortSignal }) => {
|
|
208
|
-
return new Promise((resolve, reject) => {
|
|
209
|
-
resolveLLM = resolve;
|
|
210
|
-
rejectLLM = reject;
|
|
211
|
-
|
|
212
|
-
if (abortSignal?.aborted) {
|
|
213
|
-
const error = new Error("The operation was aborted");
|
|
214
|
-
(error as any).name = "AbortError";
|
|
215
|
-
reject(error);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
abortSignal?.addEventListener("abort", () => {
|
|
219
|
-
const error = new Error("The operation was aborted");
|
|
220
|
-
(error as any).name = "AbortError";
|
|
221
|
-
reject(error);
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
})
|
|
225
|
-
};
|
|
226
|
-
(mockEnv.getComponent as any).mockImplementation((name: string) => {
|
|
227
|
-
if (name === "llm") return mockLLMComponent;
|
|
228
|
-
if (name === "config") return configComponent;
|
|
229
|
-
return undefined;
|
|
230
|
-
});
|
|
231
|
-
agentComponent.refreshDependencies();
|
|
232
|
-
|
|
233
|
-
// 启动运行
|
|
234
|
-
const runPromise = agentComponent.run("test-agent", "query");
|
|
235
|
-
|
|
236
|
-
// 等待 LLM 开始
|
|
237
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
238
|
-
|
|
239
|
-
// 中止
|
|
240
|
-
agentComponent.abort("test-agent");
|
|
241
|
-
|
|
242
|
-
// 等待 run 完成
|
|
243
|
-
await runPromise;
|
|
244
|
-
|
|
245
|
-
// 验证:agent 状态应该是 stopped(如果 finally 覆盖了,会是 idle)
|
|
246
|
-
const agent = agentComponent.getAgent("test-agent");
|
|
247
|
-
expect(agent?.status).toBe("stopped");
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
it("正常完成的 agent 状态应该是 idle", async () => {
|
|
251
|
-
agentComponent.registerAgent("test-agent", { type: "primary" });
|
|
252
|
-
|
|
253
|
-
const mockLLMComponent = {
|
|
254
|
-
invoke: vi.fn(() => Promise.resolve({
|
|
255
|
-
output: { content: "done", toolCalls: [] }
|
|
256
|
-
}))
|
|
257
|
-
};
|
|
258
|
-
(mockEnv.getComponent as any).mockImplementation((name: string) => {
|
|
259
|
-
if (name === "llm") return mockLLMComponent;
|
|
260
|
-
if (name === "config") return configComponent;
|
|
261
|
-
return undefined;
|
|
262
|
-
});
|
|
263
|
-
agentComponent.refreshDependencies();
|
|
264
|
-
|
|
265
|
-
await agentComponent.run("test-agent", "query");
|
|
266
|
-
|
|
267
|
-
const agent = agentComponent.getAgent("test-agent");
|
|
268
|
-
expect(agent?.status).toBe("idle");
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
it("被外部 stop() 中止的 agent 状态应该是 stopped", async () => {
|
|
272
|
-
agentComponent.registerAgent("test-agent", { type: "primary", maxIterations: 100 });
|
|
273
|
-
|
|
274
|
-
let resolveLLM: (value: any) => void;
|
|
275
|
-
let rejectLLM: (error: any) => void;
|
|
276
|
-
|
|
277
|
-
const mockLLMComponent = {
|
|
278
|
-
invoke: vi.fn(({ abortSignal }: { abortSignal?: AbortSignal }) => {
|
|
279
|
-
return new Promise((resolve, reject) => {
|
|
280
|
-
resolveLLM = resolve;
|
|
281
|
-
rejectLLM = reject;
|
|
282
|
-
|
|
283
|
-
if (abortSignal?.aborted) {
|
|
284
|
-
const error = new Error("The operation was aborted");
|
|
285
|
-
(error as any).name = "AbortError";
|
|
286
|
-
reject(error);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
abortSignal?.addEventListener("abort", () => {
|
|
290
|
-
const error = new Error("The operation was aborted");
|
|
291
|
-
(error as any).name = "AbortError";
|
|
292
|
-
reject(error);
|
|
293
|
-
});
|
|
294
|
-
});
|
|
295
|
-
})
|
|
296
|
-
};
|
|
297
|
-
(mockEnv.getComponent as any).mockImplementation((name: string) => {
|
|
298
|
-
if (name === "llm") return mockLLMComponent;
|
|
299
|
-
if (name === "config") return configComponent;
|
|
300
|
-
return undefined;
|
|
301
|
-
});
|
|
302
|
-
agentComponent.refreshDependencies();
|
|
303
|
-
|
|
304
|
-
// 启动运行
|
|
305
|
-
const runPromise = agentComponent.run("test-agent", "query");
|
|
306
|
-
|
|
307
|
-
// 等待 LLM 开始
|
|
308
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
309
|
-
|
|
310
|
-
// 通过 stop() 停止组件(会调用 abort)
|
|
311
|
-
await agentComponent.stop();
|
|
312
|
-
|
|
313
|
-
// 等待 run 完成(AbortError 应该被抛出)
|
|
314
|
-
const result = await runPromise;
|
|
315
|
-
|
|
316
|
-
// 验证:运行被中止
|
|
317
|
-
expect(result.stopped).toBe(true);
|
|
318
|
-
});
|
|
319
|
-
});
|
|
320
|
-
|
|
321
|
-
// ==========================================================================
|
|
322
|
-
// Test 3: abort() 调用时 AbortController 已删除的边界情况
|
|
323
|
-
// ==========================================================================
|
|
324
|
-
|
|
325
|
-
describe("abort() 调用时 AbortController 已删除的边界情况", () => {
|
|
326
|
-
it("对已完成的 agent 调用 abort() 不应该抛出错误", () => {
|
|
327
|
-
agentComponent.registerAgent("test-agent", { type: "primary" });
|
|
328
|
-
|
|
329
|
-
// 运行完成后再中止
|
|
330
|
-
// 这应该静默失败,不抛出错误
|
|
331
|
-
expect(() => {
|
|
332
|
-
agentComponent.abort("test-agent");
|
|
333
|
-
}).not.toThrow();
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
it("onStop() 对已完成/不存在的 agent 调用 abort() 不应该抛出错误", async () => {
|
|
337
|
-
agentComponent.registerAgent("test-agent-1", { type: "primary" });
|
|
338
|
-
agentComponent.registerAgent("test-agent-2", { type: "primary" });
|
|
339
|
-
|
|
340
|
-
// 所有 agent 都正常完成
|
|
341
|
-
const mockLLMComponent = {
|
|
342
|
-
invoke: vi.fn(() => Promise.resolve({
|
|
343
|
-
output: { content: "done", toolCalls: [] }
|
|
344
|
-
}))
|
|
345
|
-
};
|
|
346
|
-
(mockEnv.getComponent as any).mockImplementation((name: string) => {
|
|
347
|
-
if (name === "llm") return mockLLMComponent;
|
|
348
|
-
if (name === "config") return configComponent;
|
|
349
|
-
return undefined;
|
|
350
|
-
});
|
|
351
|
-
agentComponent.refreshDependencies();
|
|
352
|
-
|
|
353
|
-
await agentComponent.run("test-agent-1", "query 1");
|
|
354
|
-
await agentComponent.run("test-agent-2", "query 2");
|
|
355
|
-
|
|
356
|
-
// 再次调用 stop(确保 idempotent)
|
|
357
|
-
await agentComponent.stop();
|
|
358
|
-
await agentComponent.stop();
|
|
359
|
-
|
|
360
|
-
// 验证:没有抛出错误
|
|
361
|
-
expect(agentComponent.getStatus()).toBe("stopped");
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
it("onStop() 应该清空所有 AbortController", async () => {
|
|
365
|
-
agentComponent.registerAgent("test-agent", { type: "primary", maxIterations: 100 });
|
|
366
|
-
|
|
367
|
-
let resolveLLM: (value: any) => void;
|
|
368
|
-
const mockLLMComponent = {
|
|
369
|
-
invoke: vi.fn(() => new Promise(resolve => {
|
|
370
|
-
resolveLLM = resolve;
|
|
371
|
-
}))
|
|
372
|
-
};
|
|
373
|
-
(mockEnv.getComponent as any).mockImplementation((name: string) => {
|
|
374
|
-
if (name === "llm") return mockLLMComponent;
|
|
375
|
-
if (name === "config") return configComponent;
|
|
376
|
-
return undefined;
|
|
377
|
-
});
|
|
378
|
-
agentComponent.refreshDependencies();
|
|
379
|
-
|
|
380
|
-
// 启动运行
|
|
381
|
-
const runPromise = agentComponent.run("test-agent", "query");
|
|
382
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
383
|
-
|
|
384
|
-
// 停止组件
|
|
385
|
-
await agentComponent.stop();
|
|
386
|
-
|
|
387
|
-
// 完成 LLM
|
|
388
|
-
resolveLLM!({ output: { content: "done", toolCalls: [] } });
|
|
389
|
-
|
|
390
|
-
await runPromise;
|
|
391
|
-
|
|
392
|
-
// 验证:组件已停止
|
|
393
|
-
expect(agentComponent.getStatus()).toBe("stopped");
|
|
394
|
-
});
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
// ==========================================================================
|
|
398
|
-
// Test 4: 资源清理完整性
|
|
399
|
-
// ==========================================================================
|
|
400
|
-
|
|
401
|
-
describe("资源清理完整性", () => {
|
|
402
|
-
it("stop() 应该清理 doomLoopCaches", async () => {
|
|
403
|
-
agentComponent.registerAgent("test-agent", { type: "primary", doomLoopThreshold: 5 });
|
|
404
|
-
|
|
405
|
-
const mockLLMComponent = {
|
|
406
|
-
invoke: vi.fn(() => Promise.resolve({
|
|
407
|
-
output: { content: "done", toolCalls: [] }
|
|
408
|
-
}))
|
|
409
|
-
};
|
|
410
|
-
(mockEnv.getComponent as any).mockImplementation((name: string) => {
|
|
411
|
-
if (name === "llm") return mockLLMComponent;
|
|
412
|
-
if (name === "config") return configComponent;
|
|
413
|
-
return undefined;
|
|
414
|
-
});
|
|
415
|
-
agentComponent.refreshDependencies();
|
|
416
|
-
|
|
417
|
-
// 运行以创建 doomLoopCache
|
|
418
|
-
await agentComponent.run("test-agent", "query");
|
|
419
|
-
|
|
420
|
-
// 停止
|
|
421
|
-
await agentComponent.stop();
|
|
422
|
-
|
|
423
|
-
// 验证:状态是 stopped
|
|
424
|
-
expect(agentComponent.getStatus()).toBe("stopped");
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
it("stop() 应该清理 agents Map", async () => {
|
|
428
|
-
agentComponent.registerAgent("test-agent", { type: "primary" });
|
|
429
|
-
|
|
430
|
-
await agentComponent.stop();
|
|
431
|
-
|
|
432
|
-
// 验证:agents 被清空
|
|
433
|
-
const agents = agentComponent.listAgents();
|
|
434
|
-
expect(agents).toHaveLength(0);
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
it("多次调用 stop() 应该是幂等的", async () => {
|
|
438
|
-
agentComponent.registerAgent("test-agent", { type: "primary" });
|
|
439
|
-
|
|
440
|
-
await agentComponent.stop();
|
|
441
|
-
await agentComponent.stop();
|
|
442
|
-
await agentComponent.stop();
|
|
443
|
-
|
|
444
|
-
expect(agentComponent.getStatus()).toBe("stopped");
|
|
445
|
-
});
|
|
446
|
-
});
|
|
447
|
-
|
|
448
|
-
// ==========================================================================
|
|
449
|
-
// Test 5: 异常场景处理
|
|
450
|
-
// ==========================================================================
|
|
451
|
-
|
|
452
|
-
describe("异常场景处理", () => {
|
|
453
|
-
it("LLM 调用抛出 AbortError 应该被正确处理", async () => {
|
|
454
|
-
agentComponent.registerAgent("test-agent", { type: "primary", maxIterations: 100 });
|
|
455
|
-
|
|
456
|
-
const abortError = new Error("The operation was aborted");
|
|
457
|
-
(abortError as any).name = "AbortError";
|
|
458
|
-
|
|
459
|
-
const mockLLMComponent = {
|
|
460
|
-
invoke: vi.fn(() => Promise.reject(abortError))
|
|
461
|
-
};
|
|
462
|
-
(mockEnv.getComponent as any).mockImplementation((name: string) => {
|
|
463
|
-
if (name === "llm") return mockLLMComponent;
|
|
464
|
-
if (name === "config") return configComponent;
|
|
465
|
-
return undefined;
|
|
466
|
-
});
|
|
467
|
-
agentComponent.refreshDependencies();
|
|
468
|
-
|
|
469
|
-
const result = await agentComponent.run("test-agent", "query");
|
|
470
|
-
|
|
471
|
-
// 验证:错误被正确处理
|
|
472
|
-
expect(result.error).toBeDefined();
|
|
473
|
-
});
|
|
474
|
-
|
|
475
|
-
it("abort() 后 LLM 抛出 AbortError 应该被正确处理", async () => {
|
|
476
|
-
agentComponent.registerAgent("test-agent", { type: "primary", maxIterations: 100 });
|
|
477
|
-
|
|
478
|
-
let resolveLLM: (value: any) => void;
|
|
479
|
-
let rejectLLM: (error: any) => void;
|
|
480
|
-
|
|
481
|
-
const mockLLMComponent = {
|
|
482
|
-
invoke: vi.fn(() => new Promise((resolve, reject) => {
|
|
483
|
-
resolveLLM = resolve;
|
|
484
|
-
rejectLLM = reject;
|
|
485
|
-
}))
|
|
486
|
-
};
|
|
487
|
-
(mockEnv.getComponent as any).mockImplementation((name: string) => {
|
|
488
|
-
if (name === "llm") return mockLLMComponent;
|
|
489
|
-
if (name === "config") return configComponent;
|
|
490
|
-
return undefined;
|
|
491
|
-
});
|
|
492
|
-
agentComponent.refreshDependencies();
|
|
493
|
-
|
|
494
|
-
const runPromise = agentComponent.run("test-agent", "query");
|
|
495
|
-
await new Promise(resolve => setTimeout(resolve, 50));
|
|
496
|
-
|
|
497
|
-
// 中止
|
|
498
|
-
agentComponent.abort("test-agent");
|
|
499
|
-
|
|
500
|
-
// LLM 抛出 AbortError
|
|
501
|
-
const abortError = new Error("The operation was aborted");
|
|
502
|
-
(abortError as any).name = "AbortError";
|
|
503
|
-
rejectLLM!(abortError);
|
|
504
|
-
|
|
505
|
-
const result = await runPromise;
|
|
506
|
-
|
|
507
|
-
// 验证:被正确中止
|
|
508
|
-
expect(result.stopped).toBe(true);
|
|
509
|
-
});
|
|
510
|
-
});
|
|
511
|
-
});
|