@ai-setting/roy-agent-core 1.3.10 → 1.3.14
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,173 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import type { EventBus } from '../engine/event-bus';
|
|
3
|
-
import { AskUserError } from './workflow-message';
|
|
4
|
-
import type { SessionComponent } from '../../session/session-component';
|
|
5
|
-
|
|
6
|
-
// ==================== 状态枚举 ====================
|
|
7
|
-
|
|
8
|
-
export const RunStatusSchema = z.enum([
|
|
9
|
-
'idle', 'running', 'paused', 'stopped', 'completed', 'failed'
|
|
10
|
-
]);
|
|
11
|
-
export type RunStatus = z.infer<typeof RunStatusSchema>;
|
|
12
|
-
|
|
13
|
-
export const NodeStatusSchema = z.enum([
|
|
14
|
-
'pending', 'scheduled', 'started', 'running', 'completed', 'failed', 'skipped'
|
|
15
|
-
]);
|
|
16
|
-
export type NodeStatus = z.infer<typeof NodeStatusSchema>;
|
|
17
|
-
|
|
18
|
-
// ==================== Workflow Run ====================
|
|
19
|
-
|
|
20
|
-
export interface WorkflowRun {
|
|
21
|
-
id: string;
|
|
22
|
-
workflowId: string;
|
|
23
|
-
workflowName: string;
|
|
24
|
-
status: RunStatus;
|
|
25
|
-
input?: Record<string, any>;
|
|
26
|
-
output?: Record<string, any>;
|
|
27
|
-
error?: string;
|
|
28
|
-
startedAt?: Date;
|
|
29
|
-
pausedAt?: Date;
|
|
30
|
-
resumedAt?: Date;
|
|
31
|
-
stoppedAt?: Date;
|
|
32
|
-
completedAt?: Date;
|
|
33
|
-
durationMs?: number;
|
|
34
|
-
debugMode: boolean;
|
|
35
|
-
parentRunId?: string;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
// ==================== Node Run ====================
|
|
39
|
-
|
|
40
|
-
export interface NodeRun {
|
|
41
|
-
id: string;
|
|
42
|
-
runId: string;
|
|
43
|
-
nodeId: string;
|
|
44
|
-
nodeType: string;
|
|
45
|
-
status: NodeStatus;
|
|
46
|
-
input?: any;
|
|
47
|
-
output?: any;
|
|
48
|
-
error?: string;
|
|
49
|
-
startedAt?: Date;
|
|
50
|
-
completedAt?: Date;
|
|
51
|
-
durationMs?: number;
|
|
52
|
-
retryCount: number;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// ==================== 运行选项 ====================
|
|
56
|
-
|
|
57
|
-
export interface RunOptions {
|
|
58
|
-
input?: Record<string, any>;
|
|
59
|
-
debug?: boolean;
|
|
60
|
-
parallelLimit?: number | null;
|
|
61
|
-
timeout?: number | null;
|
|
62
|
-
/** @deprecated No-op: workflow always waits for completion */
|
|
63
|
-
sync?: boolean;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export interface RunResult {
|
|
67
|
-
runId: string;
|
|
68
|
-
/** Session ID (workflow_{runId} format) - useful for CLI resume */
|
|
69
|
-
sessionId?: string;
|
|
70
|
-
status: RunStatus;
|
|
71
|
-
output?: Record<string, any>;
|
|
72
|
-
error?: string;
|
|
73
|
-
durationMs?: number;
|
|
74
|
-
/** Pending node ID (when status is 'paused') */
|
|
75
|
-
pendingNodeId?: string;
|
|
76
|
-
/** Query from ask_user (when status is 'paused') */
|
|
77
|
-
query?: string;
|
|
78
|
-
/** Agent sub-session ID (for resuming agent nodes) */
|
|
79
|
-
agentSessionId?: string;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// ==================== 节点执行上下文 ====================
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* 节点执行上下文
|
|
86
|
-
*
|
|
87
|
-
* 扩展后包含:
|
|
88
|
-
* - sessionId: Session ID,用于消息持久化
|
|
89
|
-
* - askUser(): 方法,让节点可以请求用户输入
|
|
90
|
-
*/
|
|
91
|
-
export interface NodeExecutionContext {
|
|
92
|
-
runId: string;
|
|
93
|
-
sessionId: string; // Session ID = workflow_{runId},用于消息持久化
|
|
94
|
-
workflowName: string;
|
|
95
|
-
nodeId: string;
|
|
96
|
-
input: unknown;
|
|
97
|
-
previousOutputs: Map<string, unknown>; // 依赖节点的输出 (用于模板解析)
|
|
98
|
-
nodeOutputs: Map<string, unknown>; // 所有节点的输出 (用于完整数据访问)
|
|
99
|
-
config: Record<string, unknown>; // 节点配置
|
|
100
|
-
debug: boolean;
|
|
101
|
-
eventBus: EventBus;
|
|
102
|
-
|
|
103
|
-
// Workflow 历史消息(用于 agent 节点之间共享 LLM 对话历史)
|
|
104
|
-
workflowHistory?: Array<{
|
|
105
|
-
role: 'user' | 'assistant' | 'tool';
|
|
106
|
-
content: string;
|
|
107
|
-
toolCallId?: string;
|
|
108
|
-
toolName?: string;
|
|
109
|
-
nodeId?: string;
|
|
110
|
-
}>;
|
|
111
|
-
|
|
112
|
-
// Agent sub-session 支持
|
|
113
|
-
// SessionComponent 用于创建和管理 agent sub-sessions
|
|
114
|
-
sessionComponent?: SessionComponent;
|
|
115
|
-
// Agent sub-session ID(当节点是 agent 类型时)
|
|
116
|
-
agentSessionId?: string;
|
|
117
|
-
|
|
118
|
-
// 新增方法
|
|
119
|
-
/**
|
|
120
|
-
* 请求用户输入
|
|
121
|
-
*
|
|
122
|
-
* 调用此方法会抛出 AskUserError,引擎捕获后会暂停 workflow
|
|
123
|
-
*
|
|
124
|
-
* @param query - 向用户询问的问题
|
|
125
|
-
* @throws AskUserError - 总是抛出此异常
|
|
126
|
-
*/
|
|
127
|
-
askUser(query: string): never;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// ==================== 节点执行结果 ====================
|
|
131
|
-
|
|
132
|
-
export interface NodeExecutionResult {
|
|
133
|
-
success?: boolean;
|
|
134
|
-
output?: any;
|
|
135
|
-
error?: string | Error;
|
|
136
|
-
duration?: number;
|
|
137
|
-
durationMs?: number;
|
|
138
|
-
metadata?: Record<string, unknown>;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// ==================== Context Factory ====================
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* 创建 NodeExecutionContext
|
|
145
|
-
*/
|
|
146
|
-
export function createNodeExecutionContext(
|
|
147
|
-
params: {
|
|
148
|
-
runId: string;
|
|
149
|
-
workflowName: string;
|
|
150
|
-
nodeId: string;
|
|
151
|
-
input: unknown;
|
|
152
|
-
previousOutputs: Map<string, unknown>;
|
|
153
|
-
nodeOutputs: Map<string, unknown>;
|
|
154
|
-
config: Record<string, unknown>;
|
|
155
|
-
debug: boolean;
|
|
156
|
-
eventBus: EventBus;
|
|
157
|
-
sessionId: string;
|
|
158
|
-
workflowHistory?: NodeExecutionContext['workflowHistory'];
|
|
159
|
-
}
|
|
160
|
-
): NodeExecutionContext {
|
|
161
|
-
return {
|
|
162
|
-
...params,
|
|
163
|
-
askUser: (query: string): never => {
|
|
164
|
-
throw new AskUserError(
|
|
165
|
-
params.runId,
|
|
166
|
-
params.sessionId,
|
|
167
|
-
params.nodeId,
|
|
168
|
-
'unknown', // nodeType 会在外层设置
|
|
169
|
-
query
|
|
170
|
-
);
|
|
171
|
-
},
|
|
172
|
-
};
|
|
173
|
-
}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview Human-in-Loop (HIL) types for workflow
|
|
3
|
-
*
|
|
4
|
-
* This module contains types and utilities for human-in-loop functionality:
|
|
5
|
-
* - NodeInterruptEvent: Event when a node needs human input
|
|
6
|
-
* - WorkflowAskUserEvent: Event when the workflow needs human confirmation
|
|
7
|
-
* - AskUserError: Error thrown when a node requests user input
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { BaseEvent } from './event';
|
|
11
|
-
|
|
12
|
-
// ==================== Event Types ====================
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Node 中断事件 - 节点等待用户输入
|
|
16
|
-
*/
|
|
17
|
-
export interface NodeInterruptEvent extends BaseEvent {
|
|
18
|
-
type: 'node.interrupt';
|
|
19
|
-
node_id: string;
|
|
20
|
-
node_type: string;
|
|
21
|
-
query: string;
|
|
22
|
-
/** Agent sub-session ID (for agent nodes that need resume) */
|
|
23
|
-
agent_session_id?: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Workflow Ask User 事件 - Workflow 等待用户输入
|
|
28
|
-
*/
|
|
29
|
-
export interface WorkflowAskUserEvent extends BaseEvent {
|
|
30
|
-
type: 'workflow.ask-user';
|
|
31
|
-
session_id: string;
|
|
32
|
-
node_id: string;
|
|
33
|
-
node_type: string;
|
|
34
|
-
query: string;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* 创建 NodeInterruptEvent
|
|
39
|
-
*/
|
|
40
|
-
export function createNodeInterruptEvent(
|
|
41
|
-
runId: string,
|
|
42
|
-
nodeId: string,
|
|
43
|
-
nodeType: string,
|
|
44
|
-
query: string,
|
|
45
|
-
agentSessionId?: string
|
|
46
|
-
): NodeInterruptEvent {
|
|
47
|
-
return {
|
|
48
|
-
type: 'node.interrupt',
|
|
49
|
-
run_id: runId,
|
|
50
|
-
timestamp: Date.now(),
|
|
51
|
-
node_id: nodeId,
|
|
52
|
-
node_type: nodeType,
|
|
53
|
-
query,
|
|
54
|
-
...(agentSessionId ? { agent_session_id: agentSessionId } : {}),
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* 创建 WorkflowAskUserEvent
|
|
60
|
-
*/
|
|
61
|
-
export function createWorkflowAskUserEvent(
|
|
62
|
-
runId: string,
|
|
63
|
-
sessionId: string,
|
|
64
|
-
nodeId: string,
|
|
65
|
-
nodeType: string,
|
|
66
|
-
query: string
|
|
67
|
-
): WorkflowAskUserEvent {
|
|
68
|
-
return {
|
|
69
|
-
type: 'workflow.ask-user',
|
|
70
|
-
run_id: runId,
|
|
71
|
-
timestamp: Date.now(),
|
|
72
|
-
session_id: sessionId,
|
|
73
|
-
node_id: nodeId,
|
|
74
|
-
node_type: nodeType,
|
|
75
|
-
query,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
// ==================== AskUserError ====================
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* AskUserError - 当节点调用 askUser() 时抛出
|
|
83
|
-
*/
|
|
84
|
-
export class AskUserError extends Error {
|
|
85
|
-
readonly type = 'ask-user';
|
|
86
|
-
readonly name = 'AskUserError';
|
|
87
|
-
|
|
88
|
-
constructor(
|
|
89
|
-
public readonly runId: string,
|
|
90
|
-
public readonly sessionId: string,
|
|
91
|
-
public readonly nodeId: string,
|
|
92
|
-
public readonly nodeType: string,
|
|
93
|
-
public readonly query: string,
|
|
94
|
-
public readonly agentSessionId?: string,
|
|
95
|
-
public readonly timestamp: number = Date.now()
|
|
96
|
-
) {
|
|
97
|
-
super(`[${nodeType}:${nodeId}] Ask user: ${query}`);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* 转换为 WorkflowAskUserEvent
|
|
102
|
-
*/
|
|
103
|
-
toEvent(): WorkflowAskUserEvent {
|
|
104
|
-
return {
|
|
105
|
-
type: 'workflow.ask-user',
|
|
106
|
-
run_id: this.runId,
|
|
107
|
-
timestamp: this.timestamp,
|
|
108
|
-
session_id: this.sessionId,
|
|
109
|
-
node_id: this.nodeId,
|
|
110
|
-
node_type: this.nodeType,
|
|
111
|
-
query: this.query,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'bun:test';
|
|
2
|
-
import {
|
|
3
|
-
AskUserError,
|
|
4
|
-
createNodeInterruptEvent,
|
|
5
|
-
createWorkflowAskUserEvent,
|
|
6
|
-
WorkflowMessageRoleSchema,
|
|
7
|
-
type WorkflowMessagePart,
|
|
8
|
-
} from './workflow-message';
|
|
9
|
-
|
|
10
|
-
describe('AskUserError', () => {
|
|
11
|
-
it('should create error with all properties', () => {
|
|
12
|
-
const error = new AskUserError(
|
|
13
|
-
'run_123',
|
|
14
|
-
'workflow_run_123',
|
|
15
|
-
'node_1',
|
|
16
|
-
'agent',
|
|
17
|
-
'确认继续吗?'
|
|
18
|
-
);
|
|
19
|
-
|
|
20
|
-
expect(error.runId).toBe('run_123');
|
|
21
|
-
expect(error.sessionId).toBe('workflow_run_123');
|
|
22
|
-
expect(error.nodeId).toBe('node_1');
|
|
23
|
-
expect(error.nodeType).toBe('agent');
|
|
24
|
-
expect(error.query).toBe('确认继续吗?');
|
|
25
|
-
expect(error.type).toBe('ask-user');
|
|
26
|
-
expect(error.name).toBe('AskUserError');
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('should convert to WorkflowAskUserEvent', () => {
|
|
30
|
-
const error = new AskUserError(
|
|
31
|
-
'run_123',
|
|
32
|
-
'workflow_run_123',
|
|
33
|
-
'node_1',
|
|
34
|
-
'agent',
|
|
35
|
-
'确认继续吗?'
|
|
36
|
-
);
|
|
37
|
-
|
|
38
|
-
const event = error.toEvent();
|
|
39
|
-
|
|
40
|
-
expect(event.type).toBe('workflow.ask-user');
|
|
41
|
-
expect(event.run_id).toBe('run_123');
|
|
42
|
-
expect(event.session_id).toBe('workflow_run_123');
|
|
43
|
-
expect(event.node_id).toBe('node_1');
|
|
44
|
-
expect(event.node_type).toBe('agent');
|
|
45
|
-
expect(event.query).toBe('确认继续吗?');
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('should have correct error message', () => {
|
|
49
|
-
const error = new AskUserError(
|
|
50
|
-
'run_123',
|
|
51
|
-
'workflow_run_123',
|
|
52
|
-
'node_1',
|
|
53
|
-
'agent',
|
|
54
|
-
'确认继续吗?'
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
expect(error.message).toBe('[agent:node_1] Ask user: 确认继续吗?');
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
describe('createNodeInterruptEvent', () => {
|
|
62
|
-
it('should create event with correct structure', () => {
|
|
63
|
-
const event = createNodeInterruptEvent(
|
|
64
|
-
'run_123',
|
|
65
|
-
'node_1',
|
|
66
|
-
'agent',
|
|
67
|
-
'确认继续吗?'
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
expect(event.type).toBe('node.interrupt');
|
|
71
|
-
expect(event.run_id).toBe('run_123');
|
|
72
|
-
expect(event.node_id).toBe('node_1');
|
|
73
|
-
expect(event.node_type).toBe('agent');
|
|
74
|
-
expect(event.query).toBe('确认继续吗?');
|
|
75
|
-
expect(typeof event.timestamp).toBe('number');
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
describe('createWorkflowAskUserEvent', () => {
|
|
80
|
-
it('should create event with correct structure', () => {
|
|
81
|
-
const event = createWorkflowAskUserEvent(
|
|
82
|
-
'run_123',
|
|
83
|
-
'workflow_run_123',
|
|
84
|
-
'node_1',
|
|
85
|
-
'agent',
|
|
86
|
-
'确认继续吗?'
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
expect(event.type).toBe('workflow.ask-user');
|
|
90
|
-
expect(event.run_id).toBe('run_123');
|
|
91
|
-
expect(event.session_id).toBe('workflow_run_123');
|
|
92
|
-
expect(event.node_id).toBe('node_1');
|
|
93
|
-
expect(event.node_type).toBe('agent');
|
|
94
|
-
expect(event.query).toBe('确认继续吗?');
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
describe('WorkflowMessageRoleSchema', () => {
|
|
99
|
-
it('should validate workflow message roles', () => {
|
|
100
|
-
expect(WorkflowMessageRoleSchema.parse('workflow.node.call')).toBe('workflow.node.call');
|
|
101
|
-
expect(WorkflowMessageRoleSchema.parse('workflow.node.interrupt')).toBe('workflow.node.interrupt');
|
|
102
|
-
expect(WorkflowMessageRoleSchema.parse('workflow.node.result')).toBe('workflow.node.result');
|
|
103
|
-
expect(WorkflowMessageRoleSchema.parse('workflow.node.resume')).toBe('workflow.node.resume');
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('should reject invalid roles', () => {
|
|
107
|
-
expect(() => WorkflowMessageRoleSchema.parse('user')).toThrow();
|
|
108
|
-
expect(() => WorkflowMessageRoleSchema.parse('assistant')).toThrow();
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
describe('WorkflowMessagePart types', () => {
|
|
113
|
-
it('should allow WorkflowNodeCallPart', () => {
|
|
114
|
-
const part: WorkflowMessagePart = {
|
|
115
|
-
type: 'workflow-node-call',
|
|
116
|
-
nodeId: 'node_1',
|
|
117
|
-
nodeType: 'agent',
|
|
118
|
-
input: { value: 42 },
|
|
119
|
-
startTime: Date.now(),
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
expect(part.type).toBe('workflow-node-call');
|
|
123
|
-
expect(part.nodeId).toBe('node_1');
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
it('should allow WorkflowNodeResultPart', () => {
|
|
127
|
-
const part: WorkflowMessagePart = {
|
|
128
|
-
type: 'workflow-node-result',
|
|
129
|
-
nodeId: 'node_1',
|
|
130
|
-
nodeType: 'agent',
|
|
131
|
-
output: { result: 'success' },
|
|
132
|
-
durationMs: 1000,
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
expect(part.type).toBe('workflow-node-result');
|
|
136
|
-
expect(part.durationMs).toBe(1000);
|
|
137
|
-
});
|
|
138
|
-
});
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
|
|
3
|
-
// ==================== Workflow Message Roles ====================
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Workflow 节点执行消息角色类型
|
|
7
|
-
*/
|
|
8
|
-
export const WorkflowMessageRoleSchema = z.enum([
|
|
9
|
-
'workflow.node.call',
|
|
10
|
-
'workflow.node.interrupt',
|
|
11
|
-
'workflow.node.result',
|
|
12
|
-
'workflow.node.resume'
|
|
13
|
-
]);
|
|
14
|
-
export type WorkflowMessageRole = z.infer<typeof WorkflowMessageRoleSchema>;
|
|
15
|
-
|
|
16
|
-
// ==================== Message Parts ====================
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* workflow.node.call 消息 part
|
|
20
|
-
*/
|
|
21
|
-
export interface WorkflowNodeCallPart {
|
|
22
|
-
type: 'workflow-node-call';
|
|
23
|
-
nodeId: string;
|
|
24
|
-
nodeType: string;
|
|
25
|
-
input: unknown;
|
|
26
|
-
startTime: number;
|
|
27
|
-
/** Agent session ID (only for agent nodes) */
|
|
28
|
-
agentSessionId?: string;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* workflow.node.interrupt 消息 part
|
|
33
|
-
*/
|
|
34
|
-
export interface WorkflowNodeInterruptPart {
|
|
35
|
-
type: 'workflow-node-interrupt';
|
|
36
|
-
nodeId: string;
|
|
37
|
-
nodeType: string;
|
|
38
|
-
query: string;
|
|
39
|
-
timestamp: number;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* workflow.node.result 消息 part
|
|
44
|
-
*/
|
|
45
|
-
export interface WorkflowNodeResultPart {
|
|
46
|
-
type: 'workflow-node-result';
|
|
47
|
-
nodeId: string;
|
|
48
|
-
nodeType: string;
|
|
49
|
-
output?: unknown;
|
|
50
|
-
error?: string;
|
|
51
|
-
durationMs: number;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* workflow.node.resume 消息 part
|
|
56
|
-
*/
|
|
57
|
-
export interface WorkflowNodeResumePart {
|
|
58
|
-
type: 'workflow-node-resume';
|
|
59
|
-
response: string;
|
|
60
|
-
timestamp: number;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* workflow 消息 part 联合类型
|
|
65
|
-
*/
|
|
66
|
-
export type WorkflowMessagePart =
|
|
67
|
-
| WorkflowNodeCallPart
|
|
68
|
-
| WorkflowNodeInterruptPart
|
|
69
|
-
| WorkflowNodeResultPart
|
|
70
|
-
| WorkflowNodeResumePart;
|
|
71
|
-
|
|
72
|
-
// ==================== Session Metadata ====================
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Workflow Session 元数据(简化版)
|
|
76
|
-
*
|
|
77
|
-
* 简化原则:只保留必要字段,其他信息从 messages 推断
|
|
78
|
-
*
|
|
79
|
-
* 设计原则:
|
|
80
|
-
* - sessionId 直接作为 runId 使用
|
|
81
|
-
* - Session.metadata.status 跟踪运行状态
|
|
82
|
-
* - Session.messages 按时间顺序记录节点执行状态
|
|
83
|
-
* - Next node 从 messages 推断(最后一条消息决定恢复点)
|
|
84
|
-
*/
|
|
85
|
-
export interface WorkflowSessionMetadata {
|
|
86
|
-
type: 'workflow';
|
|
87
|
-
/** Used to load workflow definition */
|
|
88
|
-
workflowId: string;
|
|
89
|
-
/** Display name */
|
|
90
|
-
workflowName: string;
|
|
91
|
-
/** Workflow 版本 (可选) */
|
|
92
|
-
workflowVersion?: string;
|
|
93
|
-
/** Execution status */
|
|
94
|
-
status: 'running' | 'paused' | 'completed' | 'failed' | 'stopped';
|
|
95
|
-
|
|
96
|
-
// === 以下字段已移除,从 messages 推断 ===
|
|
97
|
-
// - input: 从第一条 workflow.node.call 消息推断
|
|
98
|
-
// - rootNodeId: 从 workflow definition 推断
|
|
99
|
-
// - agentSessions: 从 call 消息的 agentSessionId 收集
|
|
100
|
-
// - pendingNodeId: 从最后一条 call/interrupt 消息推断
|
|
101
|
-
// - pauseReason: 从最后一条 interrupt 消息推断
|
|
102
|
-
// - lastInterruptQuery: 从最后一条 interrupt 消息推断
|
|
103
|
-
|
|
104
|
-
/** Allow additional properties for metadata extension */
|
|
105
|
-
[key: string]: unknown;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Agent Session 引用(存储在 workflow session metadata 中)
|
|
110
|
-
*/
|
|
111
|
-
export interface AgentSessionRef {
|
|
112
|
-
nodeId: string;
|
|
113
|
-
sessionId: string;
|
|
114
|
-
status: 'active' | 'paused' | 'completed';
|
|
115
|
-
createdAt?: number;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// ==================== Message Metadata ====================
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* workflow.node.call 消息元数据
|
|
122
|
-
*/
|
|
123
|
-
export interface WorkflowNodeCallMetadata {
|
|
124
|
-
type: 'workflow.node.call';
|
|
125
|
-
workflowNodeId: string;
|
|
126
|
-
workflowNodeType: string;
|
|
127
|
-
/** Agent session ID (only for agent nodes) */
|
|
128
|
-
agentSessionId?: string;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* workflow.node.interrupt 消息元数据
|
|
133
|
-
*/
|
|
134
|
-
export interface WorkflowNodeInterruptMetadata {
|
|
135
|
-
type: 'workflow.node.interrupt';
|
|
136
|
-
workflowNodeId: string;
|
|
137
|
-
workflowNodeType: string;
|
|
138
|
-
query: string;
|
|
139
|
-
/** Agent session ID (only for agent nodes) */
|
|
140
|
-
agentSessionId?: string;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* workflow.node.result 消息元数据
|
|
145
|
-
*/
|
|
146
|
-
export interface WorkflowNodeResultMetadata {
|
|
147
|
-
type: 'workflow.node.result';
|
|
148
|
-
workflowNodeId: string;
|
|
149
|
-
workflowNodeType: string;
|
|
150
|
-
success: boolean;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* workflow.node.resume 消息元数据
|
|
155
|
-
*/
|
|
156
|
-
export interface WorkflowNodeResumeMetadata {
|
|
157
|
-
type: 'workflow.node.resume';
|
|
158
|
-
response: string;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* workflow 消息元数据联合类型
|
|
163
|
-
*/
|
|
164
|
-
export type WorkflowMessageMetadata =
|
|
165
|
-
| WorkflowNodeCallMetadata
|
|
166
|
-
| WorkflowNodeInterruptMetadata
|
|
167
|
-
| WorkflowNodeResultMetadata
|
|
168
|
-
| WorkflowNodeResumeMetadata;
|
|
169
|
-
|
|
170
|
-
// ==================== Agent Session Info ====================
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Agent Session 信息(存储在 workflow message metadata 中)
|
|
174
|
-
*/
|
|
175
|
-
export interface AgentSessionInfo {
|
|
176
|
-
/** Agent session ID */
|
|
177
|
-
sessionId: string;
|
|
178
|
-
/** Node ID */
|
|
179
|
-
nodeId: string;
|
|
180
|
-
/** 创建时间 */
|
|
181
|
-
createdAt: number;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// ==================== Re-export HIL types ====================
|
|
185
|
-
|
|
186
|
-
// Re-export Human-in-Loop types and utilities
|
|
187
|
-
export {
|
|
188
|
-
AskUserError,
|
|
189
|
-
createNodeInterruptEvent,
|
|
190
|
-
createWorkflowAskUserEvent,
|
|
191
|
-
} from './workflow-hil';
|
|
192
|
-
|
|
193
|
-
export type {
|
|
194
|
-
NodeInterruptEvent,
|
|
195
|
-
WorkflowAskUserEvent,
|
|
196
|
-
} from './workflow-hil';
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { isWorkflowSessionMetadata, getWorkflowSessionStatus } from './workflow-session';
|
|
3
|
-
|
|
4
|
-
describe('WorkflowSessionMetadata', () => {
|
|
5
|
-
describe('isWorkflowSessionMetadata', () => {
|
|
6
|
-
it('should accept simplified metadata with required fields only', () => {
|
|
7
|
-
const metadata = {
|
|
8
|
-
type: 'workflow' as const,
|
|
9
|
-
workflowId: 'my-workflow',
|
|
10
|
-
workflowName: 'My Workflow',
|
|
11
|
-
status: 'running' as const,
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
expect(isWorkflowSessionMetadata(metadata)).toBe(true);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('should accept all valid statuses', () => {
|
|
18
|
-
const statuses = ['running', 'paused', 'completed', 'failed', 'stopped'];
|
|
19
|
-
|
|
20
|
-
for (const status of statuses) {
|
|
21
|
-
const metadata = {
|
|
22
|
-
type: 'workflow' as const,
|
|
23
|
-
workflowId: 'wf',
|
|
24
|
-
workflowName: 'Wf',
|
|
25
|
-
status,
|
|
26
|
-
};
|
|
27
|
-
expect(isWorkflowSessionMetadata(metadata)).toBe(true, `Status ${status} should be valid`);
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('should accept metadata with optional fields', () => {
|
|
32
|
-
const metadata = {
|
|
33
|
-
type: 'workflow' as const,
|
|
34
|
-
workflowId: 'my-workflow',
|
|
35
|
-
workflowName: 'My Workflow',
|
|
36
|
-
status: 'running' as const,
|
|
37
|
-
workflowVersion: '1.0.0',
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
expect(isWorkflowSessionMetadata(metadata)).toBe(true);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('should reject non-workflow metadata', () => {
|
|
44
|
-
const metadata = { type: 'agent', name: 'test' };
|
|
45
|
-
expect(isWorkflowSessionMetadata(metadata)).toBe(false);
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
it('should reject metadata without type', () => {
|
|
49
|
-
const metadata = { workflowId: 'wf', workflowName: 'Wf', status: 'running' };
|
|
50
|
-
expect(isWorkflowSessionMetadata(metadata)).toBe(false);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('should reject metadata without workflowId', () => {
|
|
54
|
-
const metadata = { type: 'workflow', workflowName: 'Wf', status: 'running' };
|
|
55
|
-
expect(isWorkflowSessionMetadata(metadata)).toBe(false);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('should reject metadata without workflowName', () => {
|
|
59
|
-
const metadata = { type: 'workflow', workflowId: 'wf', status: 'running' };
|
|
60
|
-
expect(isWorkflowSessionMetadata(metadata)).toBe(false);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it('should reject metadata without status', () => {
|
|
64
|
-
const metadata = { type: 'workflow', workflowId: 'wf', workflowName: 'Wf' };
|
|
65
|
-
expect(isWorkflowSessionMetadata(metadata)).toBe(false);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('should reject null', () => {
|
|
69
|
-
expect(isWorkflowSessionMetadata(null)).toBe(false);
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
describe('getWorkflowSessionStatus', () => {
|
|
74
|
-
it('should return status from metadata', () => {
|
|
75
|
-
const metadata = {
|
|
76
|
-
type: 'workflow' as const,
|
|
77
|
-
workflowId: 'wf',
|
|
78
|
-
workflowName: 'Wf',
|
|
79
|
-
status: 'paused' as const,
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
expect(getWorkflowSessionStatus(metadata)).toBe('paused');
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
it('should return running as default when status is missing', () => {
|
|
86
|
-
const metadata = {
|
|
87
|
-
type: 'workflow' as const,
|
|
88
|
-
workflowId: 'wf',
|
|
89
|
-
workflowName: 'Wf',
|
|
90
|
-
} as any;
|
|
91
|
-
|
|
92
|
-
expect(getWorkflowSessionStatus(metadata)).toBe('running');
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
});
|