@substrate-ai/factory 0.20.1 → 0.20.3
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 +39 -0
- package/package.json +6 -3
- package/dist/__tests__/config.test.d.ts +0 -11
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -215
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/factory-run-command.test.d.ts +0 -12
- package/dist/__tests__/factory-run-command.test.d.ts.map +0 -1
- package/dist/__tests__/factory-run-command.test.js +0 -454
- package/dist/__tests__/factory-run-command.test.js.map +0 -1
- package/dist/__tests__/factory-validate-command.test.d.ts +0 -15
- package/dist/__tests__/factory-validate-command.test.d.ts.map +0 -1
- package/dist/__tests__/factory-validate-command.test.js +0 -339
- package/dist/__tests__/factory-validate-command.test.js.map +0 -1
- package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.d.ts +0 -72
- package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.d.ts.map +0 -1
- package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.js +0 -121
- package/dist/__tests__/fixtures/advanced-cross-project-validation.dot.js.map +0 -1
- package/dist/__tests__/fixtures/llm-edge-routing.dot.d.ts +0 -28
- package/dist/__tests__/fixtures/llm-edge-routing.dot.d.ts.map +0 -1
- package/dist/__tests__/fixtures/llm-edge-routing.dot.js +0 -55
- package/dist/__tests__/fixtures/llm-edge-routing.dot.js.map +0 -1
- package/dist/__tests__/fixtures/manager-loop.dot.d.ts +0 -34
- package/dist/__tests__/fixtures/manager-loop.dot.d.ts.map +0 -1
- package/dist/__tests__/fixtures/manager-loop.dot.js +0 -61
- package/dist/__tests__/fixtures/manager-loop.dot.js.map +0 -1
- package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.d.ts +0 -42
- package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.d.ts.map +0 -1
- package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.js +0 -118
- package/dist/__tests__/fixtures/parallel-fan-out-fan-in.dot.js.map +0 -1
- package/dist/__tests__/fixtures/subgraph-parent.dot.d.ts +0 -35
- package/dist/__tests__/fixtures/subgraph-parent.dot.d.ts.map +0 -1
- package/dist/__tests__/fixtures/subgraph-parent.dot.js +0 -69
- package/dist/__tests__/fixtures/subgraph-parent.dot.js.map +0 -1
- package/dist/__tests__/integration/advanced-graph-events.test.d.ts +0 -19
- package/dist/__tests__/integration/advanced-graph-events.test.d.ts.map +0 -1
- package/dist/__tests__/integration/advanced-graph-events.test.js +0 -288
- package/dist/__tests__/integration/advanced-graph-events.test.js.map +0 -1
- package/dist/__tests__/integration/checkpoint-resume.test.d.ts +0 -10
- package/dist/__tests__/integration/checkpoint-resume.test.d.ts.map +0 -1
- package/dist/__tests__/integration/checkpoint-resume.test.js +0 -125
- package/dist/__tests__/integration/checkpoint-resume.test.js.map +0 -1
- package/dist/__tests__/integration/conditional-pipeline.test.d.ts +0 -10
- package/dist/__tests__/integration/conditional-pipeline.test.d.ts.map +0 -1
- package/dist/__tests__/integration/conditional-pipeline.test.js +0 -106
- package/dist/__tests__/integration/conditional-pipeline.test.js.map +0 -1
- package/dist/__tests__/integration/convergence-validation.test.d.ts +0 -14
- package/dist/__tests__/integration/convergence-validation.test.d.ts.map +0 -1
- package/dist/__tests__/integration/convergence-validation.test.js +0 -449
- package/dist/__tests__/integration/convergence-validation.test.js.map +0 -1
- package/dist/__tests__/integration/epic44-coverage-gate.test.d.ts +0 -12
- package/dist/__tests__/integration/epic44-coverage-gate.test.d.ts.map +0 -1
- package/dist/__tests__/integration/epic44-coverage-gate.test.js +0 -58
- package/dist/__tests__/integration/epic44-coverage-gate.test.js.map +0 -1
- package/dist/__tests__/integration/epic45-coverage-gate.test.d.ts +0 -11
- package/dist/__tests__/integration/epic45-coverage-gate.test.d.ts.map +0 -1
- package/dist/__tests__/integration/epic45-coverage-gate.test.js +0 -64
- package/dist/__tests__/integration/epic45-coverage-gate.test.js.map +0 -1
- package/dist/__tests__/integration/epic46-scenario-primary-executor.test.d.ts +0 -2
- package/dist/__tests__/integration/epic46-scenario-primary-executor.test.d.ts.map +0 -1
- package/dist/__tests__/integration/epic46-scenario-primary-executor.test.js +0 -285
- package/dist/__tests__/integration/epic46-scenario-primary-executor.test.js.map +0 -1
- package/dist/__tests__/integration/events.test.d.ts +0 -8
- package/dist/__tests__/integration/events.test.d.ts.map +0 -1
- package/dist/__tests__/integration/events.test.js +0 -194
- package/dist/__tests__/integration/events.test.js.map +0 -1
- package/dist/__tests__/integration/graphs.d.ts +0 -59
- package/dist/__tests__/integration/graphs.d.ts.map +0 -1
- package/dist/__tests__/integration/graphs.js +0 -164
- package/dist/__tests__/integration/graphs.js.map +0 -1
- package/dist/__tests__/integration/helpers.d.ts +0 -127
- package/dist/__tests__/integration/helpers.d.ts.map +0 -1
- package/dist/__tests__/integration/helpers.js +0 -167
- package/dist/__tests__/integration/helpers.js.map +0 -1
- package/dist/__tests__/integration/integrity.test.d.ts +0 -8
- package/dist/__tests__/integration/integrity.test.d.ts.map +0 -1
- package/dist/__tests__/integration/integrity.test.js +0 -198
- package/dist/__tests__/integration/integrity.test.js.map +0 -1
- package/dist/__tests__/integration/llm-edge-routing.test.d.ts +0 -21
- package/dist/__tests__/integration/llm-edge-routing.test.d.ts.map +0 -1
- package/dist/__tests__/integration/llm-edge-routing.test.js +0 -341
- package/dist/__tests__/integration/llm-edge-routing.test.js.map +0 -1
- package/dist/__tests__/integration/manager-loop.test.d.ts +0 -24
- package/dist/__tests__/integration/manager-loop.test.d.ts.map +0 -1
- package/dist/__tests__/integration/manager-loop.test.js +0 -276
- package/dist/__tests__/integration/manager-loop.test.js.map +0 -1
- package/dist/__tests__/integration/multi-type-graph.test.d.ts +0 -10
- package/dist/__tests__/integration/multi-type-graph.test.d.ts.map +0 -1
- package/dist/__tests__/integration/multi-type-graph.test.js +0 -100
- package/dist/__tests__/integration/multi-type-graph.test.js.map +0 -1
- package/dist/__tests__/integration/parallel-fan-out-fan-in.test.d.ts +0 -22
- package/dist/__tests__/integration/parallel-fan-out-fan-in.test.d.ts.map +0 -1
- package/dist/__tests__/integration/parallel-fan-out-fan-in.test.js +0 -515
- package/dist/__tests__/integration/parallel-fan-out-fan-in.test.js.map +0 -1
- package/dist/__tests__/integration/persistence.test.d.ts +0 -8
- package/dist/__tests__/integration/persistence.test.d.ts.map +0 -1
- package/dist/__tests__/integration/persistence.test.js +0 -129
- package/dist/__tests__/integration/persistence.test.js.map +0 -1
- package/dist/__tests__/integration/pipeline-templates-integration.test.d.ts +0 -16
- package/dist/__tests__/integration/pipeline-templates-integration.test.d.ts.map +0 -1
- package/dist/__tests__/integration/pipeline-templates-integration.test.js +0 -171
- package/dist/__tests__/integration/pipeline-templates-integration.test.js.map +0 -1
- package/dist/__tests__/integration/scenario-pipeline.test.d.ts +0 -11
- package/dist/__tests__/integration/scenario-pipeline.test.d.ts.map +0 -1
- package/dist/__tests__/integration/scenario-pipeline.test.js +0 -243
- package/dist/__tests__/integration/scenario-pipeline.test.js.map +0 -1
- package/dist/__tests__/integration/stylesheet-application.test.d.ts +0 -12
- package/dist/__tests__/integration/stylesheet-application.test.d.ts.map +0 -1
- package/dist/__tests__/integration/stylesheet-application.test.js +0 -119
- package/dist/__tests__/integration/stylesheet-application.test.js.map +0 -1
- package/dist/__tests__/integration/subgraph-execution.test.d.ts +0 -24
- package/dist/__tests__/integration/subgraph-execution.test.d.ts.map +0 -1
- package/dist/__tests__/integration/subgraph-execution.test.js +0 -291
- package/dist/__tests__/integration/subgraph-execution.test.js.map +0 -1
- package/dist/__tests__/integration/validation-errors.test.d.ts +0 -8
- package/dist/__tests__/integration/validation-errors.test.d.ts.map +0 -1
- package/dist/__tests__/integration/validation-errors.test.js +0 -150
- package/dist/__tests__/integration/validation-errors.test.js.map +0 -1
- package/dist/agent/__tests__/loop-detection.test.d.ts +0 -2
- package/dist/agent/__tests__/loop-detection.test.d.ts.map +0 -1
- package/dist/agent/__tests__/loop-detection.test.js +0 -236
- package/dist/agent/__tests__/loop-detection.test.js.map +0 -1
- package/dist/agent/__tests__/loop.test.d.ts +0 -2
- package/dist/agent/__tests__/loop.test.d.ts.map +0 -1
- package/dist/agent/__tests__/loop.test.js +0 -868
- package/dist/agent/__tests__/loop.test.js.map +0 -1
- package/dist/agent/__tests__/truncation.test.d.ts +0 -2
- package/dist/agent/__tests__/truncation.test.d.ts.map +0 -1
- package/dist/agent/__tests__/truncation.test.js +0 -276
- package/dist/agent/__tests__/truncation.test.js.map +0 -1
- package/dist/agent/tools/__tests__/anthropic-tools.test.d.ts +0 -6
- package/dist/agent/tools/__tests__/anthropic-tools.test.d.ts.map +0 -1
- package/dist/agent/tools/__tests__/anthropic-tools.test.js +0 -49
- package/dist/agent/tools/__tests__/anthropic-tools.test.js.map +0 -1
- package/dist/agent/tools/__tests__/environment.test.d.ts +0 -6
- package/dist/agent/tools/__tests__/environment.test.d.ts.map +0 -1
- package/dist/agent/tools/__tests__/environment.test.js +0 -33
- package/dist/agent/tools/__tests__/environment.test.js.map +0 -1
- package/dist/agent/tools/__tests__/gemini-tools.test.d.ts +0 -6
- package/dist/agent/tools/__tests__/gemini-tools.test.d.ts.map +0 -1
- package/dist/agent/tools/__tests__/gemini-tools.test.js +0 -98
- package/dist/agent/tools/__tests__/gemini-tools.test.js.map +0 -1
- package/dist/agent/tools/__tests__/openai-tools.test.d.ts +0 -6
- package/dist/agent/tools/__tests__/openai-tools.test.d.ts.map +0 -1
- package/dist/agent/tools/__tests__/openai-tools.test.js +0 -53
- package/dist/agent/tools/__tests__/openai-tools.test.js.map +0 -1
- package/dist/agent/tools/__tests__/patch.test.d.ts +0 -6
- package/dist/agent/tools/__tests__/patch.test.d.ts.map +0 -1
- package/dist/agent/tools/__tests__/patch.test.js +0 -116
- package/dist/agent/tools/__tests__/patch.test.js.map +0 -1
- package/dist/agent/tools/__tests__/profiles.test.d.ts +0 -6
- package/dist/agent/tools/__tests__/profiles.test.d.ts.map +0 -1
- package/dist/agent/tools/__tests__/profiles.test.js +0 -125
- package/dist/agent/tools/__tests__/profiles.test.js.map +0 -1
- package/dist/agent/tools/__tests__/registry.test.d.ts +0 -6
- package/dist/agent/tools/__tests__/registry.test.d.ts.map +0 -1
- package/dist/agent/tools/__tests__/registry.test.js +0 -94
- package/dist/agent/tools/__tests__/registry.test.js.map +0 -1
- package/dist/agent/tools/__tests__/shared.test.d.ts +0 -6
- package/dist/agent/tools/__tests__/shared.test.d.ts.map +0 -1
- package/dist/agent/tools/__tests__/shared.test.js +0 -131
- package/dist/agent/tools/__tests__/shared.test.js.map +0 -1
- package/dist/backend/__tests__/direct-backend.test.d.ts +0 -14
- package/dist/backend/__tests__/direct-backend.test.d.ts.map +0 -1
- package/dist/backend/__tests__/direct-backend.test.js +0 -393
- package/dist/backend/__tests__/direct-backend.test.js.map +0 -1
- package/dist/backend/__tests__/direct-bootstrap.test.d.ts +0 -7
- package/dist/backend/__tests__/direct-bootstrap.test.d.ts.map +0 -1
- package/dist/backend/__tests__/direct-bootstrap.test.js +0 -177
- package/dist/backend/__tests__/direct-bootstrap.test.js.map +0 -1
- package/dist/backend/__tests__/mock-backend.test.d.ts +0 -7
- package/dist/backend/__tests__/mock-backend.test.d.ts.map +0 -1
- package/dist/backend/__tests__/mock-backend.test.js +0 -273
- package/dist/backend/__tests__/mock-backend.test.js.map +0 -1
- package/dist/backend/__tests__/parity.test.d.ts +0 -17
- package/dist/backend/__tests__/parity.test.d.ts.map +0 -1
- package/dist/backend/__tests__/parity.test.js +0 -411
- package/dist/backend/__tests__/parity.test.js.map +0 -1
- package/dist/context/__tests__/auto-summarizer.test.d.ts +0 -14
- package/dist/context/__tests__/auto-summarizer.test.d.ts.map +0 -1
- package/dist/context/__tests__/auto-summarizer.test.js +0 -189
- package/dist/context/__tests__/auto-summarizer.test.js.map +0 -1
- package/dist/context/__tests__/context-cli-command.test.d.ts +0 -7
- package/dist/context/__tests__/context-cli-command.test.d.ts.map +0 -1
- package/dist/context/__tests__/context-cli-command.test.js +0 -331
- package/dist/context/__tests__/context-cli-command.test.js.map +0 -1
- package/dist/context/__tests__/pyramid-summary-integration.test.d.ts +0 -2
- package/dist/context/__tests__/pyramid-summary-integration.test.d.ts.map +0 -1
- package/dist/context/__tests__/pyramid-summary-integration.test.js +0 -533
- package/dist/context/__tests__/pyramid-summary-integration.test.js.map +0 -1
- package/dist/context/__tests__/summarizer.test.d.ts +0 -2
- package/dist/context/__tests__/summarizer.test.d.ts.map +0 -1
- package/dist/context/__tests__/summarizer.test.js +0 -189
- package/dist/context/__tests__/summarizer.test.js.map +0 -1
- package/dist/context/__tests__/summary-cache.test.d.ts +0 -2
- package/dist/context/__tests__/summary-cache.test.d.ts.map +0 -1
- package/dist/context/__tests__/summary-cache.test.js +0 -214
- package/dist/context/__tests__/summary-cache.test.js.map +0 -1
- package/dist/context/__tests__/summary-metrics.test.d.ts +0 -2
- package/dist/context/__tests__/summary-metrics.test.d.ts.map +0 -1
- package/dist/context/__tests__/summary-metrics.test.js +0 -172
- package/dist/context/__tests__/summary-metrics.test.js.map +0 -1
- package/dist/context/__tests__/summary-types.test.d.ts +0 -2
- package/dist/context/__tests__/summary-types.test.d.ts.map +0 -1
- package/dist/context/__tests__/summary-types.test.js +0 -130
- package/dist/context/__tests__/summary-types.test.js.map +0 -1
- package/dist/convergence/__tests__/budget.test.d.ts +0 -6
- package/dist/convergence/__tests__/budget.test.d.ts.map +0 -1
- package/dist/convergence/__tests__/budget.test.js +0 -187
- package/dist/convergence/__tests__/budget.test.js.map +0 -1
- package/dist/convergence/__tests__/controller.test.d.ts +0 -9
- package/dist/convergence/__tests__/controller.test.d.ts.map +0 -1
- package/dist/convergence/__tests__/controller.test.js +0 -585
- package/dist/convergence/__tests__/controller.test.js.map +0 -1
- package/dist/convergence/__tests__/dual-signal.test.d.ts +0 -14
- package/dist/convergence/__tests__/dual-signal.test.d.ts.map +0 -1
- package/dist/convergence/__tests__/dual-signal.test.js +0 -123
- package/dist/convergence/__tests__/dual-signal.test.js.map +0 -1
- package/dist/convergence/__tests__/epic46-integration.test.d.ts +0 -15
- package/dist/convergence/__tests__/epic46-integration.test.d.ts.map +0 -1
- package/dist/convergence/__tests__/epic46-integration.test.js +0 -522
- package/dist/convergence/__tests__/epic46-integration.test.js.map +0 -1
- package/dist/convergence/__tests__/plateau.test.d.ts +0 -6
- package/dist/convergence/__tests__/plateau.test.d.ts.map +0 -1
- package/dist/convergence/__tests__/plateau.test.js +0 -163
- package/dist/convergence/__tests__/plateau.test.js.map +0 -1
- package/dist/convergence/__tests__/remediation.test.d.ts +0 -11
- package/dist/convergence/__tests__/remediation.test.d.ts.map +0 -1
- package/dist/convergence/__tests__/remediation.test.js +0 -209
- package/dist/convergence/__tests__/remediation.test.js.map +0 -1
- package/dist/convergence/__tests__/scenario-primary.test.d.ts +0 -13
- package/dist/convergence/__tests__/scenario-primary.test.d.ts.map +0 -1
- package/dist/convergence/__tests__/scenario-primary.test.js +0 -183
- package/dist/convergence/__tests__/scenario-primary.test.js.map +0 -1
- package/dist/factory-command.test.d.ts +0 -8
- package/dist/factory-command.test.d.ts.map +0 -1
- package/dist/factory-command.test.js +0 -304
- package/dist/factory-command.test.js.map +0 -1
- package/dist/graph/__tests__/attractor-compliance.test.d.ts +0 -10
- package/dist/graph/__tests__/attractor-compliance.test.d.ts.map +0 -1
- package/dist/graph/__tests__/attractor-compliance.test.js +0 -766
- package/dist/graph/__tests__/attractor-compliance.test.js.map +0 -1
- package/dist/graph/__tests__/checkpoint.test.d.ts +0 -8
- package/dist/graph/__tests__/checkpoint.test.d.ts.map +0 -1
- package/dist/graph/__tests__/checkpoint.test.js +0 -329
- package/dist/graph/__tests__/checkpoint.test.js.map +0 -1
- package/dist/graph/__tests__/condition-parser.test.d.ts +0 -14
- package/dist/graph/__tests__/condition-parser.test.d.ts.map +0 -1
- package/dist/graph/__tests__/condition-parser.test.js +0 -406
- package/dist/graph/__tests__/condition-parser.test.js.map +0 -1
- package/dist/graph/__tests__/context.test.d.ts +0 -14
- package/dist/graph/__tests__/context.test.d.ts.map +0 -1
- package/dist/graph/__tests__/context.test.js +0 -276
- package/dist/graph/__tests__/context.test.js.map +0 -1
- package/dist/graph/__tests__/edge-selector-events.test.d.ts +0 -11
- package/dist/graph/__tests__/edge-selector-events.test.d.ts.map +0 -1
- package/dist/graph/__tests__/edge-selector-events.test.js +0 -184
- package/dist/graph/__tests__/edge-selector-events.test.js.map +0 -1
- package/dist/graph/__tests__/edge-selector.test.d.ts +0 -6
- package/dist/graph/__tests__/edge-selector.test.d.ts.map +0 -1
- package/dist/graph/__tests__/edge-selector.test.js +0 -452
- package/dist/graph/__tests__/edge-selector.test.js.map +0 -1
- package/dist/graph/__tests__/executor-convergence.test.d.ts +0 -12
- package/dist/graph/__tests__/executor-convergence.test.d.ts.map +0 -1
- package/dist/graph/__tests__/executor-convergence.test.js +0 -432
- package/dist/graph/__tests__/executor-convergence.test.js.map +0 -1
- package/dist/graph/__tests__/executor-fidelity.test.d.ts +0 -13
- package/dist/graph/__tests__/executor-fidelity.test.d.ts.map +0 -1
- package/dist/graph/__tests__/executor-fidelity.test.js +0 -335
- package/dist/graph/__tests__/executor-fidelity.test.js.map +0 -1
- package/dist/graph/__tests__/executor.test.d.ts +0 -14
- package/dist/graph/__tests__/executor.test.d.ts.map +0 -1
- package/dist/graph/__tests__/executor.test.js +0 -901
- package/dist/graph/__tests__/executor.test.js.map +0 -1
- package/dist/graph/__tests__/fidelity.test.d.ts +0 -8
- package/dist/graph/__tests__/fidelity.test.d.ts.map +0 -1
- package/dist/graph/__tests__/fidelity.test.js +0 -135
- package/dist/graph/__tests__/fidelity.test.js.map +0 -1
- package/dist/graph/__tests__/llm-evaluator.test.d.ts +0 -7
- package/dist/graph/__tests__/llm-evaluator.test.d.ts.map +0 -1
- package/dist/graph/__tests__/llm-evaluator.test.js +0 -106
- package/dist/graph/__tests__/llm-evaluator.test.js.map +0 -1
- package/dist/graph/__tests__/parser-chaining.test.d.ts +0 -13
- package/dist/graph/__tests__/parser-chaining.test.d.ts.map +0 -1
- package/dist/graph/__tests__/parser-chaining.test.js +0 -215
- package/dist/graph/__tests__/parser-chaining.test.js.map +0 -1
- package/dist/graph/__tests__/parser.test.d.ts +0 -22
- package/dist/graph/__tests__/parser.test.d.ts.map +0 -1
- package/dist/graph/__tests__/parser.test.js +0 -452
- package/dist/graph/__tests__/parser.test.js.map +0 -1
- package/dist/graph/__tests__/run-state.test.d.ts +0 -13
- package/dist/graph/__tests__/run-state.test.d.ts.map +0 -1
- package/dist/graph/__tests__/run-state.test.js +0 -189
- package/dist/graph/__tests__/run-state.test.js.map +0 -1
- package/dist/graph/__tests__/transformer.test.d.ts +0 -16
- package/dist/graph/__tests__/transformer.test.d.ts.map +0 -1
- package/dist/graph/__tests__/transformer.test.js +0 -350
- package/dist/graph/__tests__/transformer.test.js.map +0 -1
- package/dist/graph/__tests__/validator-errors.test.d.ts +0 -15
- package/dist/graph/__tests__/validator-errors.test.d.ts.map +0 -1
- package/dist/graph/__tests__/validator-errors.test.js +0 -572
- package/dist/graph/__tests__/validator-errors.test.js.map +0 -1
- package/dist/graph/__tests__/validator-warnings.test.d.ts +0 -15
- package/dist/graph/__tests__/validator-warnings.test.d.ts.map +0 -1
- package/dist/graph/__tests__/validator-warnings.test.js +0 -363
- package/dist/graph/__tests__/validator-warnings.test.js.map +0 -1
- package/dist/handlers/__tests__/codergen-handler.test.d.ts +0 -14
- package/dist/handlers/__tests__/codergen-handler.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/codergen-handler.test.js +0 -442
- package/dist/handlers/__tests__/codergen-handler.test.js.map +0 -1
- package/dist/handlers/__tests__/fan-in.test.d.ts +0 -14
- package/dist/handlers/__tests__/fan-in.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/fan-in.test.js +0 -399
- package/dist/handlers/__tests__/fan-in.test.js.map +0 -1
- package/dist/handlers/__tests__/join-policy.test.d.ts +0 -9
- package/dist/handlers/__tests__/join-policy.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/join-policy.test.js +0 -201
- package/dist/handlers/__tests__/join-policy.test.js.map +0 -1
- package/dist/handlers/__tests__/manager-loop.test.d.ts +0 -14
- package/dist/handlers/__tests__/manager-loop.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/manager-loop.test.js +0 -322
- package/dist/handlers/__tests__/manager-loop.test.js.map +0 -1
- package/dist/handlers/__tests__/parallel-events.test.d.ts +0 -12
- package/dist/handlers/__tests__/parallel-events.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/parallel-events.test.js +0 -252
- package/dist/handlers/__tests__/parallel-events.test.js.map +0 -1
- package/dist/handlers/__tests__/parallel-handler.test.d.ts +0 -14
- package/dist/handlers/__tests__/parallel-handler.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/parallel-handler.test.js +0 -337
- package/dist/handlers/__tests__/parallel-handler.test.js.map +0 -1
- package/dist/handlers/__tests__/parallel-join.test.d.ts +0 -9
- package/dist/handlers/__tests__/parallel-join.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/parallel-join.test.js +0 -267
- package/dist/handlers/__tests__/parallel-join.test.js.map +0 -1
- package/dist/handlers/__tests__/registry.test.d.ts +0 -14
- package/dist/handlers/__tests__/registry.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/registry.test.js +0 -315
- package/dist/handlers/__tests__/registry.test.js.map +0 -1
- package/dist/handlers/__tests__/subgraph-events.test.d.ts +0 -10
- package/dist/handlers/__tests__/subgraph-events.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/subgraph-events.test.js +0 -189
- package/dist/handlers/__tests__/subgraph-events.test.js.map +0 -1
- package/dist/handlers/__tests__/subgraph-inheritance.test.d.ts +0 -14
- package/dist/handlers/__tests__/subgraph-inheritance.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/subgraph-inheritance.test.js +0 -267
- package/dist/handlers/__tests__/subgraph-inheritance.test.js.map +0 -1
- package/dist/handlers/__tests__/subgraph.test.d.ts +0 -14
- package/dist/handlers/__tests__/subgraph.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/subgraph.test.js +0 -369
- package/dist/handlers/__tests__/subgraph.test.js.map +0 -1
- package/dist/handlers/__tests__/tool-handler.test.d.ts +0 -11
- package/dist/handlers/__tests__/tool-handler.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/tool-handler.test.js +0 -184
- package/dist/handlers/__tests__/tool-handler.test.js.map +0 -1
- package/dist/handlers/__tests__/tool-scenario.test.d.ts +0 -12
- package/dist/handlers/__tests__/tool-scenario.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/tool-scenario.test.js +0 -222
- package/dist/handlers/__tests__/tool-scenario.test.js.map +0 -1
- package/dist/handlers/__tests__/wait-human-handler.test.d.ts +0 -11
- package/dist/handlers/__tests__/wait-human-handler.test.d.ts.map +0 -1
- package/dist/handlers/__tests__/wait-human-handler.test.js +0 -251
- package/dist/handlers/__tests__/wait-human-handler.test.js.map +0 -1
- package/dist/llm/__tests__/client.test.d.ts +0 -2
- package/dist/llm/__tests__/client.test.d.ts.map +0 -1
- package/dist/llm/__tests__/client.test.js +0 -198
- package/dist/llm/__tests__/client.test.js.map +0 -1
- package/dist/llm/__tests__/types.test.d.ts +0 -2
- package/dist/llm/__tests__/types.test.d.ts.map +0 -1
- package/dist/llm/__tests__/types.test.js +0 -289
- package/dist/llm/__tests__/types.test.js.map +0 -1
- package/dist/llm/middleware/__tests__/cost-tracking.test.d.ts +0 -2
- package/dist/llm/middleware/__tests__/cost-tracking.test.d.ts.map +0 -1
- package/dist/llm/middleware/__tests__/cost-tracking.test.js +0 -73
- package/dist/llm/middleware/__tests__/cost-tracking.test.js.map +0 -1
- package/dist/llm/middleware/__tests__/logging.test.d.ts +0 -2
- package/dist/llm/middleware/__tests__/logging.test.d.ts.map +0 -1
- package/dist/llm/middleware/__tests__/logging.test.js +0 -127
- package/dist/llm/middleware/__tests__/logging.test.js.map +0 -1
- package/dist/llm/middleware/__tests__/retry.test.d.ts +0 -2
- package/dist/llm/middleware/__tests__/retry.test.d.ts.map +0 -1
- package/dist/llm/middleware/__tests__/retry.test.js +0 -126
- package/dist/llm/middleware/__tests__/retry.test.js.map +0 -1
- package/dist/llm/providers/__tests__/anthropic.test.d.ts +0 -2
- package/dist/llm/providers/__tests__/anthropic.test.d.ts.map +0 -1
- package/dist/llm/providers/__tests__/anthropic.test.js +0 -412
- package/dist/llm/providers/__tests__/anthropic.test.js.map +0 -1
- package/dist/llm/providers/__tests__/gemini.test.d.ts +0 -2
- package/dist/llm/providers/__tests__/gemini.test.d.ts.map +0 -1
- package/dist/llm/providers/__tests__/gemini.test.js +0 -591
- package/dist/llm/providers/__tests__/gemini.test.js.map +0 -1
- package/dist/llm/providers/__tests__/openai.test.d.ts +0 -2
- package/dist/llm/providers/__tests__/openai.test.d.ts.map +0 -1
- package/dist/llm/providers/__tests__/openai.test.js +0 -546
- package/dist/llm/providers/__tests__/openai.test.js.map +0 -1
- package/dist/persistence/__tests__/factory-queries.test.d.ts +0 -9
- package/dist/persistence/__tests__/factory-queries.test.d.ts.map +0 -1
- package/dist/persistence/__tests__/factory-queries.test.js +0 -372
- package/dist/persistence/__tests__/factory-queries.test.js.map +0 -1
- package/dist/persistence/__tests__/factory-schema.test.d.ts +0 -6
- package/dist/persistence/__tests__/factory-schema.test.d.ts.map +0 -1
- package/dist/persistence/__tests__/factory-schema.test.js +0 -105
- package/dist/persistence/__tests__/factory-schema.test.js.map +0 -1
- package/dist/scenarios/__tests__/cli-command-list.test.d.ts +0 -7
- package/dist/scenarios/__tests__/cli-command-list.test.d.ts.map +0 -1
- package/dist/scenarios/__tests__/cli-command-list.test.js +0 -237
- package/dist/scenarios/__tests__/cli-command-list.test.js.map +0 -1
- package/dist/scenarios/__tests__/cli-command.test.d.ts +0 -11
- package/dist/scenarios/__tests__/cli-command.test.d.ts.map +0 -1
- package/dist/scenarios/__tests__/cli-command.test.js +0 -275
- package/dist/scenarios/__tests__/cli-command.test.js.map +0 -1
- package/dist/scenarios/__tests__/integrity-pipeline.test.d.ts +0 -15
- package/dist/scenarios/__tests__/integrity-pipeline.test.d.ts.map +0 -1
- package/dist/scenarios/__tests__/integrity-pipeline.test.js +0 -318
- package/dist/scenarios/__tests__/integrity-pipeline.test.js.map +0 -1
- package/dist/scenarios/__tests__/runner-twins.test.d.ts +0 -13
- package/dist/scenarios/__tests__/runner-twins.test.d.ts.map +0 -1
- package/dist/scenarios/__tests__/runner-twins.test.js +0 -205
- package/dist/scenarios/__tests__/runner-twins.test.js.map +0 -1
- package/dist/scenarios/__tests__/scorer.test.d.ts +0 -11
- package/dist/scenarios/__tests__/scorer.test.d.ts.map +0 -1
- package/dist/scenarios/__tests__/scorer.test.js +0 -225
- package/dist/scenarios/__tests__/scorer.test.js.map +0 -1
- package/dist/scenarios/__tests__/scoring-integration.test.d.ts +0 -8
- package/dist/scenarios/__tests__/scoring-integration.test.d.ts.map +0 -1
- package/dist/scenarios/__tests__/scoring-integration.test.js +0 -178
- package/dist/scenarios/__tests__/scoring-integration.test.js.map +0 -1
- package/dist/scenarios/__tests__/store.test.d.ts +0 -5
- package/dist/scenarios/__tests__/store.test.d.ts.map +0 -1
- package/dist/scenarios/__tests__/store.test.js +0 -169
- package/dist/scenarios/__tests__/store.test.js.map +0 -1
- package/dist/stylesheet/__tests__/stylesheet.test.d.ts +0 -17
- package/dist/stylesheet/__tests__/stylesheet.test.d.ts.map +0 -1
- package/dist/stylesheet/__tests__/stylesheet.test.js +0 -368
- package/dist/stylesheet/__tests__/stylesheet.test.js.map +0 -1
- package/dist/templates/__tests__/templates.test.d.ts +0 -7
- package/dist/templates/__tests__/templates.test.d.ts.map +0 -1
- package/dist/templates/__tests__/templates.test.js +0 -92
- package/dist/templates/__tests__/templates.test.js.map +0 -1
- package/dist/twins/__tests__/docker-compose.test.d.ts +0 -13
- package/dist/twins/__tests__/docker-compose.test.d.ts.map +0 -1
- package/dist/twins/__tests__/docker-compose.test.js +0 -247
- package/dist/twins/__tests__/docker-compose.test.js.map +0 -1
- package/dist/twins/__tests__/health-monitor.test.d.ts +0 -19
- package/dist/twins/__tests__/health-monitor.test.d.ts.map +0 -1
- package/dist/twins/__tests__/health-monitor.test.js +0 -301
- package/dist/twins/__tests__/health-monitor.test.js.map +0 -1
- package/dist/twins/__tests__/integration/e2e.test.d.ts +0 -18
- package/dist/twins/__tests__/integration/e2e.test.d.ts.map +0 -1
- package/dist/twins/__tests__/integration/e2e.test.js +0 -146
- package/dist/twins/__tests__/integration/e2e.test.js.map +0 -1
- package/dist/twins/__tests__/integration/helpers.d.ts +0 -32
- package/dist/twins/__tests__/integration/helpers.d.ts.map +0 -1
- package/dist/twins/__tests__/integration/helpers.js +0 -67
- package/dist/twins/__tests__/integration/helpers.js.map +0 -1
- package/dist/twins/__tests__/integration/lifecycle.test.d.ts +0 -14
- package/dist/twins/__tests__/integration/lifecycle.test.d.ts.map +0 -1
- package/dist/twins/__tests__/integration/lifecycle.test.js +0 -127
- package/dist/twins/__tests__/integration/lifecycle.test.js.map +0 -1
- package/dist/twins/__tests__/integration/persistence-integration.test.d.ts +0 -14
- package/dist/twins/__tests__/integration/persistence-integration.test.d.ts.map +0 -1
- package/dist/twins/__tests__/integration/persistence-integration.test.js +0 -132
- package/dist/twins/__tests__/integration/persistence-integration.test.js.map +0 -1
- package/dist/twins/__tests__/persistence.test.d.ts +0 -10
- package/dist/twins/__tests__/persistence.test.d.ts.map +0 -1
- package/dist/twins/__tests__/persistence.test.js +0 -300
- package/dist/twins/__tests__/persistence.test.js.map +0 -1
- package/dist/twins/__tests__/registry.test.d.ts +0 -7
- package/dist/twins/__tests__/registry.test.d.ts.map +0 -1
- package/dist/twins/__tests__/registry.test.js +0 -282
- package/dist/twins/__tests__/registry.test.js.map +0 -1
- package/dist/twins/__tests__/run-state.test.d.ts +0 -9
- package/dist/twins/__tests__/run-state.test.d.ts.map +0 -1
- package/dist/twins/__tests__/run-state.test.js +0 -112
- package/dist/twins/__tests__/run-state.test.js.map +0 -1
- package/dist/twins/__tests__/templates-cli.test.d.ts +0 -10
- package/dist/twins/__tests__/templates-cli.test.d.ts.map +0 -1
- package/dist/twins/__tests__/templates-cli.test.js +0 -187
- package/dist/twins/__tests__/templates-cli.test.js.map +0 -1
- package/dist/twins/__tests__/templates.test.d.ts +0 -7
- package/dist/twins/__tests__/templates.test.d.ts.map +0 -1
- package/dist/twins/__tests__/templates.test.js +0 -87
- package/dist/twins/__tests__/templates.test.js.map +0 -1
- package/dist/twins/__tests__/twins-cli.test.d.ts +0 -11
- package/dist/twins/__tests__/twins-cli.test.d.ts.map +0 -1
- package/dist/twins/__tests__/twins-cli.test.js +0 -365
- package/dist/twins/__tests__/twins-cli.test.js.map +0 -1
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests: ScenarioStore integrity verification (Story 44-10 AC3).
|
|
3
|
-
*
|
|
4
|
-
* Verifies that ScenarioStore.discover() captures SHA-256 checksums and
|
|
5
|
-
* ScenarioStore.verify() correctly detects tampered, missing, and added files.
|
|
6
|
-
*/
|
|
7
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
8
|
-
import { mkdtemp, writeFile, rm } from 'node:fs/promises';
|
|
9
|
-
import { tmpdir } from 'node:os';
|
|
10
|
-
import { join } from 'node:path';
|
|
11
|
-
import { ScenarioStore } from '../../scenarios/store.js';
|
|
12
|
-
import { parseGraph } from '../../graph/parser.js';
|
|
13
|
-
import { createGraphExecutor } from '../../graph/executor.js';
|
|
14
|
-
import { makeEventSpy, makeMockRegistry, makeTmpDir, cleanDir, readFixtureDot } from './helpers.js';
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
// Helpers
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
/** Create a ScenarioStore's expected directory: tempDir/.substrate/scenarios/ */
|
|
19
|
-
async function createScenariosDir(tempDir) {
|
|
20
|
-
const scenariosDir = join(tempDir, '.substrate', 'scenarios');
|
|
21
|
-
await writeFile(join(tempDir, '.gitkeep'), ''); // ensure tempDir exists (mkdtemp handles this)
|
|
22
|
-
const { mkdir } = await import('node:fs/promises');
|
|
23
|
-
await mkdir(scenariosDir, { recursive: true });
|
|
24
|
-
return scenariosDir;
|
|
25
|
-
}
|
|
26
|
-
// ---------------------------------------------------------------------------
|
|
27
|
-
// Setup / teardown
|
|
28
|
-
// ---------------------------------------------------------------------------
|
|
29
|
-
let tempDir;
|
|
30
|
-
let scenariosDir;
|
|
31
|
-
let store;
|
|
32
|
-
beforeEach(async () => {
|
|
33
|
-
tempDir = await mkdtemp(join(tmpdir(), 'integrity-test-'));
|
|
34
|
-
scenariosDir = await createScenariosDir(tempDir);
|
|
35
|
-
store = new ScenarioStore();
|
|
36
|
-
});
|
|
37
|
-
afterEach(async () => {
|
|
38
|
-
await rm(tempDir, { recursive: true, force: true });
|
|
39
|
-
});
|
|
40
|
-
// ---------------------------------------------------------------------------
|
|
41
|
-
// AC3: Integrity tamper detection
|
|
42
|
-
// ---------------------------------------------------------------------------
|
|
43
|
-
describe('ScenarioStore integrity verification (AC3)', () => {
|
|
44
|
-
it('AC3a: discover returns manifest with 2 entries when 2 scenario files exist', async () => {
|
|
45
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 0\n');
|
|
46
|
-
await writeFile(join(scenariosDir, 'scenario-fail.sh'), '#!/bin/bash\nexit 1\n');
|
|
47
|
-
const manifest = await store.discover(tempDir);
|
|
48
|
-
expect(manifest.scenarios).toHaveLength(2);
|
|
49
|
-
expect(manifest.scenarios.every((s) => s.checksum.length > 0)).toBe(true);
|
|
50
|
-
});
|
|
51
|
-
it('AC3b: verify returns invalid result when a scenario file is modified', async () => {
|
|
52
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 0\n');
|
|
53
|
-
await writeFile(join(scenariosDir, 'scenario-fail.sh'), '#!/bin/bash\nexit 1\n');
|
|
54
|
-
const manifest = await store.discover(tempDir);
|
|
55
|
-
// Tamper: modify scenario-pass.sh content
|
|
56
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 99\n');
|
|
57
|
-
const result = await store.verify(manifest);
|
|
58
|
-
expect(result.valid).toBe(false);
|
|
59
|
-
});
|
|
60
|
-
it('AC3c: verify returns the tampered scenario name in the failure details', async () => {
|
|
61
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 0\n');
|
|
62
|
-
await writeFile(join(scenariosDir, 'scenario-fail.sh'), '#!/bin/bash\nexit 1\n');
|
|
63
|
-
const manifest = await store.discover(tempDir);
|
|
64
|
-
// Tamper only scenario-pass.sh
|
|
65
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 42\n');
|
|
66
|
-
const result = await store.verify(manifest);
|
|
67
|
-
expect(result.tampered).toContain('scenario-pass.sh');
|
|
68
|
-
expect(result.tampered).not.toContain('scenario-fail.sh');
|
|
69
|
-
});
|
|
70
|
-
it('AC3d: verify passes when no files are modified after manifest capture', async () => {
|
|
71
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 0\n');
|
|
72
|
-
await writeFile(join(scenariosDir, 'scenario-fail.sh'), '#!/bin/bash\nexit 1\n');
|
|
73
|
-
const manifest = await store.discover(tempDir);
|
|
74
|
-
const result = await store.verify(manifest);
|
|
75
|
-
expect(result.valid).toBe(true);
|
|
76
|
-
expect(result.tampered).toHaveLength(0);
|
|
77
|
-
});
|
|
78
|
-
it('AC3d-alias: verifyIntegrity delegates to verify and passes for unmodified files', async () => {
|
|
79
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 0\n');
|
|
80
|
-
const manifest = await store.discover(tempDir);
|
|
81
|
-
const result = await store.verifyIntegrity(manifest);
|
|
82
|
-
expect(result.valid).toBe(true);
|
|
83
|
-
});
|
|
84
|
-
it('AC3e: verify detects a deleted scenario file as tampered', async () => {
|
|
85
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 0\n');
|
|
86
|
-
await writeFile(join(scenariosDir, 'scenario-fail.sh'), '#!/bin/bash\nexit 1\n');
|
|
87
|
-
const manifest = await store.discover(tempDir);
|
|
88
|
-
// Delete one file
|
|
89
|
-
const { unlink } = await import('node:fs/promises');
|
|
90
|
-
await unlink(join(scenariosDir, 'scenario-pass.sh'));
|
|
91
|
-
const result = await store.verify(manifest);
|
|
92
|
-
expect(result.valid).toBe(false);
|
|
93
|
-
expect(result.tampered).toContain('scenario-pass.sh');
|
|
94
|
-
});
|
|
95
|
-
it('AC3f: ScenarioStoreVerifyResult type shape — valid boolean and tampered string array', async () => {
|
|
96
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 0\n');
|
|
97
|
-
const manifest = await store.discover(tempDir);
|
|
98
|
-
const result = await store.verify(manifest);
|
|
99
|
-
// Type check: valid is boolean, tampered is string[]
|
|
100
|
-
expect(typeof result.valid).toBe('boolean');
|
|
101
|
-
expect(Array.isArray(result.tampered)).toBe(true);
|
|
102
|
-
result.tampered.forEach((entry) => {
|
|
103
|
-
expect(typeof entry).toBe('string');
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
// ---------------------------------------------------------------------------
|
|
108
|
-
// AC3-executor: integrity tamper detected by executor — execution halts
|
|
109
|
-
// ---------------------------------------------------------------------------
|
|
110
|
-
describe('AC3-executor: graph executor halts before validate node when integrity check fails', () => {
|
|
111
|
-
it('AC3-executor-a: executor returns FAIL outcome when a scenario file is tampered before validate dispatch', async () => {
|
|
112
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 0\n');
|
|
113
|
-
await writeFile(join(scenariosDir, 'scenario-fail.sh'), '#!/bin/bash\nexit 1\n');
|
|
114
|
-
// Capture manifest BEFORE tampering
|
|
115
|
-
const realManifest = await store.discover(tempDir);
|
|
116
|
-
// Create a proxy ScenarioStore whose discover() returns the pre-captured manifest
|
|
117
|
-
// (executor calls discover() without args, which would default to process.cwd()).
|
|
118
|
-
// verifyIntegrity() delegates to the real implementation so tampered files are detected.
|
|
119
|
-
const proxyStore = new ScenarioStore();
|
|
120
|
-
vi.spyOn(proxyStore, 'discover').mockResolvedValue(realManifest);
|
|
121
|
-
// Tamper AFTER manifest capture — simulate a tampered file between capture and dispatch
|
|
122
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 99\n');
|
|
123
|
-
const graph = parseGraph(readFixtureDot());
|
|
124
|
-
const { registry } = makeMockRegistry();
|
|
125
|
-
const logsRoot = await makeTmpDir();
|
|
126
|
-
try {
|
|
127
|
-
const outcome = await createGraphExecutor().run(graph, {
|
|
128
|
-
runId: 'test-integrity-halt-a',
|
|
129
|
-
logsRoot,
|
|
130
|
-
handlerRegistry: registry,
|
|
131
|
-
scenarioStore: proxyStore,
|
|
132
|
-
});
|
|
133
|
-
expect(outcome.status).toBe('FAIL');
|
|
134
|
-
}
|
|
135
|
-
finally {
|
|
136
|
-
await cleanDir(logsRoot);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
it('AC3-executor-b: graph:node-started is never emitted for validate when integrity check fails', async () => {
|
|
140
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 0\n');
|
|
141
|
-
const realManifest = await store.discover(tempDir);
|
|
142
|
-
const proxyStore = new ScenarioStore();
|
|
143
|
-
vi.spyOn(proxyStore, 'discover').mockResolvedValue(realManifest);
|
|
144
|
-
// Tamper the only scenario file
|
|
145
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\necho tampered\n');
|
|
146
|
-
const graph = parseGraph(readFixtureDot());
|
|
147
|
-
const { registry } = makeMockRegistry();
|
|
148
|
-
const { bus, events } = makeEventSpy();
|
|
149
|
-
const logsRoot = await makeTmpDir();
|
|
150
|
-
try {
|
|
151
|
-
await createGraphExecutor().run(graph, {
|
|
152
|
-
runId: 'test-integrity-halt-b',
|
|
153
|
-
logsRoot,
|
|
154
|
-
handlerRegistry: registry,
|
|
155
|
-
eventBus: bus,
|
|
156
|
-
scenarioStore: proxyStore,
|
|
157
|
-
});
|
|
158
|
-
// The validate tool node must never have been started
|
|
159
|
-
const validateStarted = events.filter((e) => e.event === 'graph:node-started' &&
|
|
160
|
-
e.payload['nodeId'] === 'validate');
|
|
161
|
-
expect(validateStarted).toHaveLength(0);
|
|
162
|
-
}
|
|
163
|
-
finally {
|
|
164
|
-
await cleanDir(logsRoot);
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
it('AC3-executor-c: scenario:integrity-failed event is emitted with tampered file name', async () => {
|
|
168
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 0\n');
|
|
169
|
-
await writeFile(join(scenariosDir, 'scenario-fail.sh'), '#!/bin/bash\nexit 1\n');
|
|
170
|
-
const realManifest = await store.discover(tempDir);
|
|
171
|
-
const proxyStore = new ScenarioStore();
|
|
172
|
-
vi.spyOn(proxyStore, 'discover').mockResolvedValue(realManifest);
|
|
173
|
-
// Tamper only scenario-pass.sh
|
|
174
|
-
await writeFile(join(scenariosDir, 'scenario-pass.sh'), '#!/bin/bash\nexit 100\n');
|
|
175
|
-
const graph = parseGraph(readFixtureDot());
|
|
176
|
-
const { registry } = makeMockRegistry();
|
|
177
|
-
const { bus, events } = makeEventSpy();
|
|
178
|
-
const logsRoot = await makeTmpDir();
|
|
179
|
-
try {
|
|
180
|
-
await createGraphExecutor().run(graph, {
|
|
181
|
-
runId: 'test-integrity-event',
|
|
182
|
-
logsRoot,
|
|
183
|
-
handlerRegistry: registry,
|
|
184
|
-
eventBus: bus,
|
|
185
|
-
scenarioStore: proxyStore,
|
|
186
|
-
});
|
|
187
|
-
const integrityFailedEvents = events.filter((e) => e.event === 'scenario:integrity-failed');
|
|
188
|
-
expect(integrityFailedEvents).toHaveLength(1);
|
|
189
|
-
const payload = integrityFailedEvents[0]?.payload;
|
|
190
|
-
expect(Array.isArray(payload['tampered'])).toBe(true);
|
|
191
|
-
expect(payload['tampered']).toContain('scenario-pass.sh');
|
|
192
|
-
}
|
|
193
|
-
finally {
|
|
194
|
-
await cleanDir(logsRoot);
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
});
|
|
198
|
-
//# sourceMappingURL=integrity.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"integrity.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/integrity.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests for LLM-evaluated edge routing.
|
|
3
|
-
* Story 50-11 AC2.
|
|
4
|
-
*
|
|
5
|
-
* Tests cover:
|
|
6
|
-
* - Affirmative LLM response → LLM-labeled edge selected
|
|
7
|
-
* - Negative LLM response → LLM edge not selected (forward edge taken)
|
|
8
|
-
* - LLM throws → fallback false → forward edge taken
|
|
9
|
-
* - graph:llm-edge-evaluated emitted for every evaluation attempt
|
|
10
|
-
* - Non-LLM edges not routed through LLM evaluator
|
|
11
|
-
* - runId flows through to event payload
|
|
12
|
-
* - Absent eventBus handling
|
|
13
|
-
* - Edge cases: empty response, ambiguous response, no outgoing edges
|
|
14
|
-
*
|
|
15
|
-
* Test approach: test `selectEdge` directly with mock `llmCall` injection.
|
|
16
|
-
* This gives full control over LLM responses without real network calls.
|
|
17
|
-
*
|
|
18
|
-
* ≥12 `it(...)` cases required (AC7).
|
|
19
|
-
*/
|
|
20
|
-
export {};
|
|
21
|
-
//# sourceMappingURL=llm-edge-routing.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-edge-routing.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/llm-edge-routing.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|
|
@@ -1,341 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests for LLM-evaluated edge routing.
|
|
3
|
-
* Story 50-11 AC2.
|
|
4
|
-
*
|
|
5
|
-
* Tests cover:
|
|
6
|
-
* - Affirmative LLM response → LLM-labeled edge selected
|
|
7
|
-
* - Negative LLM response → LLM edge not selected (forward edge taken)
|
|
8
|
-
* - LLM throws → fallback false → forward edge taken
|
|
9
|
-
* - graph:llm-edge-evaluated emitted for every evaluation attempt
|
|
10
|
-
* - Non-LLM edges not routed through LLM evaluator
|
|
11
|
-
* - runId flows through to event payload
|
|
12
|
-
* - Absent eventBus handling
|
|
13
|
-
* - Edge cases: empty response, ambiguous response, no outgoing edges
|
|
14
|
-
*
|
|
15
|
-
* Test approach: test `selectEdge` directly with mock `llmCall` injection.
|
|
16
|
-
* This gives full control over LLM responses without real network calls.
|
|
17
|
-
*
|
|
18
|
-
* ≥12 `it(...)` cases required (AC7).
|
|
19
|
-
*/
|
|
20
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
21
|
-
import { selectEdge } from '../../graph/edge-selector.js';
|
|
22
|
-
import { GraphContext } from '../../graph/context.js';
|
|
23
|
-
function makeEventSpy() {
|
|
24
|
-
const events = [];
|
|
25
|
-
const bus = {
|
|
26
|
-
emit(event, payload) {
|
|
27
|
-
events.push({ event: event, payload });
|
|
28
|
-
},
|
|
29
|
-
on() { },
|
|
30
|
-
off() { },
|
|
31
|
-
};
|
|
32
|
-
return { bus, events };
|
|
33
|
-
}
|
|
34
|
-
/** Build a minimal GraphNode for testing. */
|
|
35
|
-
function makeNode(id, type = 'codergen') {
|
|
36
|
-
return {
|
|
37
|
-
id,
|
|
38
|
-
label: '',
|
|
39
|
-
shape: 'box',
|
|
40
|
-
type,
|
|
41
|
-
prompt: '',
|
|
42
|
-
maxRetries: 0,
|
|
43
|
-
goalGate: false,
|
|
44
|
-
retryTarget: '',
|
|
45
|
-
fallbackRetryTarget: '',
|
|
46
|
-
fidelity: '',
|
|
47
|
-
threadId: '',
|
|
48
|
-
class: '',
|
|
49
|
-
timeout: 0,
|
|
50
|
-
llmModel: '',
|
|
51
|
-
llmProvider: '',
|
|
52
|
-
reasoningEffort: '',
|
|
53
|
-
autoStatus: false,
|
|
54
|
-
allowPartial: false,
|
|
55
|
-
toolCommand: '',
|
|
56
|
-
backend: '',
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
/** Build a minimal GraphEdge. */
|
|
60
|
-
function makeEdge(fromNode, toNode, opts) {
|
|
61
|
-
return {
|
|
62
|
-
fromNode,
|
|
63
|
-
toNode,
|
|
64
|
-
label: opts?.label ?? '',
|
|
65
|
-
condition: opts?.condition ?? '',
|
|
66
|
-
weight: opts?.weight ?? 0,
|
|
67
|
-
fidelity: '',
|
|
68
|
-
threadId: '',
|
|
69
|
-
loopRestart: false,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
/** Build a minimal Graph with given nodes and edges. */
|
|
73
|
-
function makeGraph(nodes, edges) {
|
|
74
|
-
const nodeMap = new Map(nodes.map((n) => [n.id, n]));
|
|
75
|
-
return {
|
|
76
|
-
id: 'test',
|
|
77
|
-
goal: '',
|
|
78
|
-
label: '',
|
|
79
|
-
modelStylesheet: '',
|
|
80
|
-
defaultMaxRetries: 0,
|
|
81
|
-
retryTarget: '',
|
|
82
|
-
fallbackRetryTarget: '',
|
|
83
|
-
defaultFidelity: '',
|
|
84
|
-
nodes: nodeMap,
|
|
85
|
-
edges,
|
|
86
|
-
outgoingEdges: (nodeId) => edges.filter((e) => e.fromNode === nodeId),
|
|
87
|
-
startNode: () => { throw new Error('not needed'); },
|
|
88
|
-
exitNode: () => { throw new Error('not needed'); },
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
const SUCCESS_OUTCOME = { status: 'SUCCESS' };
|
|
92
|
-
// ---------------------------------------------------------------------------
|
|
93
|
-
// AC2: LLM-evaluated edge routing tests
|
|
94
|
-
// ---------------------------------------------------------------------------
|
|
95
|
-
describe('LLM-evaluated edge routing — affirmative / negative responses', () => {
|
|
96
|
-
it('affirmative LLM response → LLM-conditioned back-edge selected (to refine)', async () => {
|
|
97
|
-
const decisionNode = makeNode('decision');
|
|
98
|
-
const edges = [
|
|
99
|
-
makeEdge('decision', 'refine', { condition: 'llm:should we iterate?' }),
|
|
100
|
-
makeEdge('decision', 'exit', { label: 'done' }),
|
|
101
|
-
];
|
|
102
|
-
const graph = makeGraph([decisionNode, makeNode('refine'), makeNode('exit', 'exit')], edges);
|
|
103
|
-
const context = new GraphContext();
|
|
104
|
-
const mockLlm = vi.fn().mockResolvedValue('yes');
|
|
105
|
-
const edge = await selectEdge(decisionNode, SUCCESS_OUTCOME, context, graph, {
|
|
106
|
-
llmCall: mockLlm,
|
|
107
|
-
});
|
|
108
|
-
expect(edge).not.toBeNull();
|
|
109
|
-
expect(edge.toNode).toBe('refine');
|
|
110
|
-
});
|
|
111
|
-
it('negative LLM response → LLM edge NOT selected; forward (done) edge taken', async () => {
|
|
112
|
-
const decisionNode = makeNode('decision');
|
|
113
|
-
const edges = [
|
|
114
|
-
makeEdge('decision', 'refine', { condition: 'llm:should we iterate?' }),
|
|
115
|
-
makeEdge('decision', 'exit', { label: 'done' }),
|
|
116
|
-
];
|
|
117
|
-
const graph = makeGraph([decisionNode, makeNode('refine'), makeNode('exit', 'exit')], edges);
|
|
118
|
-
const context = new GraphContext();
|
|
119
|
-
const mockLlm = vi.fn().mockResolvedValue('no');
|
|
120
|
-
const edge = await selectEdge(decisionNode, SUCCESS_OUTCOME, context, graph, {
|
|
121
|
-
llmCall: mockLlm,
|
|
122
|
-
});
|
|
123
|
-
// LLM condition not matched → step 2 (preferredLabel) → not set
|
|
124
|
-
// → step 4 (unconditional edges) → 'exit' is the unconditional edge
|
|
125
|
-
expect(edge).not.toBeNull();
|
|
126
|
-
expect(edge.toNode).toBe('exit');
|
|
127
|
-
});
|
|
128
|
-
it('LLM call throws → fallback false → forward edge taken; no exception propagated', async () => {
|
|
129
|
-
const decisionNode = makeNode('decision');
|
|
130
|
-
const edges = [
|
|
131
|
-
makeEdge('decision', 'refine', { condition: 'llm:should we iterate?' }),
|
|
132
|
-
makeEdge('decision', 'exit', { label: 'done' }),
|
|
133
|
-
];
|
|
134
|
-
const graph = makeGraph([decisionNode, makeNode('refine'), makeNode('exit', 'exit')], edges);
|
|
135
|
-
const context = new GraphContext();
|
|
136
|
-
const mockLlm = vi.fn().mockRejectedValue(new Error('LLM unavailable'));
|
|
137
|
-
let edge;
|
|
138
|
-
await expect(async () => {
|
|
139
|
-
edge = await selectEdge(decisionNode, SUCCESS_OUTCOME, context, graph, {
|
|
140
|
-
llmCall: mockLlm,
|
|
141
|
-
});
|
|
142
|
-
}).not.toThrow();
|
|
143
|
-
edge = await selectEdge(decisionNode, SUCCESS_OUTCOME, context, graph, { llmCall: mockLlm });
|
|
144
|
-
expect(edge).not.toBeNull();
|
|
145
|
-
expect(edge.toNode).toBe('exit');
|
|
146
|
-
});
|
|
147
|
-
it('empty LLM response → treated as non-affirmative → forward edge taken', async () => {
|
|
148
|
-
const decisionNode = makeNode('decision');
|
|
149
|
-
const edges = [
|
|
150
|
-
makeEdge('decision', 'refine', { condition: 'llm:should we iterate?' }),
|
|
151
|
-
makeEdge('decision', 'exit'),
|
|
152
|
-
];
|
|
153
|
-
const graph = makeGraph([decisionNode, makeNode('refine'), makeNode('exit', 'exit')], edges);
|
|
154
|
-
const context = new GraphContext();
|
|
155
|
-
const mockLlm = vi.fn().mockResolvedValue('');
|
|
156
|
-
const edge = await selectEdge(decisionNode, SUCCESS_OUTCOME, context, graph, { llmCall: mockLlm });
|
|
157
|
-
expect(edge.toNode).toBe('exit');
|
|
158
|
-
});
|
|
159
|
-
it('ambiguous LLM response → treated as non-affirmative → forward edge taken', async () => {
|
|
160
|
-
const decisionNode = makeNode('decision');
|
|
161
|
-
const edges = [
|
|
162
|
-
makeEdge('decision', 'refine', { condition: 'llm:should we iterate?' }),
|
|
163
|
-
makeEdge('decision', 'exit'),
|
|
164
|
-
];
|
|
165
|
-
const graph = makeGraph([decisionNode, makeNode('refine'), makeNode('exit', 'exit')], edges);
|
|
166
|
-
const context = new GraphContext();
|
|
167
|
-
const mockLlm = vi.fn().mockResolvedValue('maybe, not sure');
|
|
168
|
-
const edge = await selectEdge(decisionNode, SUCCESS_OUTCOME, context, graph, { llmCall: mockLlm });
|
|
169
|
-
expect(edge.toNode).toBe('exit');
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
// ---------------------------------------------------------------------------
|
|
173
|
-
// Event emission for graph:llm-edge-evaluated
|
|
174
|
-
// ---------------------------------------------------------------------------
|
|
175
|
-
describe('LLM-evaluated edge routing — graph:llm-edge-evaluated events', () => {
|
|
176
|
-
beforeEach(() => {
|
|
177
|
-
vi.clearAllMocks();
|
|
178
|
-
});
|
|
179
|
-
it('graph:llm-edge-evaluated emitted with result: true on affirmative response', async () => {
|
|
180
|
-
const { bus, events } = makeEventSpy();
|
|
181
|
-
const decisionNode = makeNode('decision');
|
|
182
|
-
const edges = [
|
|
183
|
-
makeEdge('decision', 'refine', { condition: 'llm:should we iterate?' }),
|
|
184
|
-
makeEdge('decision', 'exit'),
|
|
185
|
-
];
|
|
186
|
-
const graph = makeGraph([decisionNode, makeNode('refine'), makeNode('exit', 'exit')], edges);
|
|
187
|
-
const context = new GraphContext();
|
|
188
|
-
const mockLlm = vi.fn().mockResolvedValue('yes');
|
|
189
|
-
await selectEdge(decisionNode, SUCCESS_OUTCOME, context, graph, {
|
|
190
|
-
llmCall: mockLlm,
|
|
191
|
-
eventBus: bus,
|
|
192
|
-
runId: 'test-run-id',
|
|
193
|
-
});
|
|
194
|
-
const llmEvents = events.filter((e) => e.event === 'graph:llm-edge-evaluated');
|
|
195
|
-
expect(llmEvents).toHaveLength(1);
|
|
196
|
-
const payload = llmEvents[0].payload;
|
|
197
|
-
expect(payload.result).toBe(true);
|
|
198
|
-
expect(payload.question).toBe('should we iterate?');
|
|
199
|
-
});
|
|
200
|
-
it('graph:llm-edge-evaluated emitted with result: false on negative response', async () => {
|
|
201
|
-
const { bus, events } = makeEventSpy();
|
|
202
|
-
const decisionNode = makeNode('decision');
|
|
203
|
-
const edges = [
|
|
204
|
-
makeEdge('decision', 'refine', { condition: 'llm:should we iterate?' }),
|
|
205
|
-
makeEdge('decision', 'exit'),
|
|
206
|
-
];
|
|
207
|
-
const graph = makeGraph([decisionNode, makeNode('refine'), makeNode('exit', 'exit')], edges);
|
|
208
|
-
const context = new GraphContext();
|
|
209
|
-
await selectEdge(decisionNode, SUCCESS_OUTCOME, context, graph, {
|
|
210
|
-
llmCall: vi.fn().mockResolvedValue('no'),
|
|
211
|
-
eventBus: bus,
|
|
212
|
-
runId: 'test-run-id',
|
|
213
|
-
});
|
|
214
|
-
const llmEvents = events.filter((e) => e.event === 'graph:llm-edge-evaluated');
|
|
215
|
-
expect(llmEvents).toHaveLength(1);
|
|
216
|
-
expect(llmEvents[0].payload.result).toBe(false);
|
|
217
|
-
});
|
|
218
|
-
it('graph:llm-edge-evaluated emitted with result: false on LLM error (fallback path)', async () => {
|
|
219
|
-
const { bus, events } = makeEventSpy();
|
|
220
|
-
const decisionNode = makeNode('decision');
|
|
221
|
-
const edges = [
|
|
222
|
-
makeEdge('decision', 'refine', { condition: 'llm:should we iterate?' }),
|
|
223
|
-
makeEdge('decision', 'exit'),
|
|
224
|
-
];
|
|
225
|
-
const graph = makeGraph([decisionNode, makeNode('refine'), makeNode('exit', 'exit')], edges);
|
|
226
|
-
const context = new GraphContext();
|
|
227
|
-
await selectEdge(decisionNode, SUCCESS_OUTCOME, context, graph, {
|
|
228
|
-
llmCall: vi.fn().mockRejectedValue(new Error('network error')),
|
|
229
|
-
eventBus: bus,
|
|
230
|
-
runId: 'test-run-id',
|
|
231
|
-
});
|
|
232
|
-
const llmEvents = events.filter((e) => e.event === 'graph:llm-edge-evaluated');
|
|
233
|
-
expect(llmEvents).toHaveLength(1);
|
|
234
|
-
expect(llmEvents[0].payload.result).toBe(false);
|
|
235
|
-
});
|
|
236
|
-
it('runId flows through to graph:llm-edge-evaluated payload', async () => {
|
|
237
|
-
const { bus, events } = makeEventSpy();
|
|
238
|
-
const decisionNode = makeNode('decision');
|
|
239
|
-
const edges = [
|
|
240
|
-
makeEdge('decision', 'refine', { condition: 'llm:should we iterate?' }),
|
|
241
|
-
makeEdge('decision', 'exit'),
|
|
242
|
-
];
|
|
243
|
-
const graph = makeGraph([decisionNode, makeNode('refine'), makeNode('exit', 'exit')], edges);
|
|
244
|
-
const context = new GraphContext();
|
|
245
|
-
await selectEdge(decisionNode, SUCCESS_OUTCOME, context, graph, {
|
|
246
|
-
llmCall: vi.fn().mockResolvedValue('yes'),
|
|
247
|
-
eventBus: bus,
|
|
248
|
-
runId: 'my-specific-run-id',
|
|
249
|
-
});
|
|
250
|
-
const llmEvent = events.find((e) => e.event === 'graph:llm-edge-evaluated');
|
|
251
|
-
expect(llmEvent.payload.runId).toBe('my-specific-run-id');
|
|
252
|
-
});
|
|
253
|
-
it('absent eventBus: selectEdge completes without TypeError', async () => {
|
|
254
|
-
const decisionNode = makeNode('decision');
|
|
255
|
-
const edges = [makeEdge('decision', 'exit', { condition: 'llm:should we stop?' })];
|
|
256
|
-
const graph = makeGraph([decisionNode, makeNode('exit', 'exit')], edges);
|
|
257
|
-
const context = new GraphContext();
|
|
258
|
-
await expect(selectEdge(decisionNode, SUCCESS_OUTCOME, context, graph, {
|
|
259
|
-
llmCall: vi.fn().mockResolvedValue('yes'),
|
|
260
|
-
// No eventBus
|
|
261
|
-
})).resolves.not.toThrow();
|
|
262
|
-
});
|
|
263
|
-
});
|
|
264
|
-
// ---------------------------------------------------------------------------
|
|
265
|
-
// Non-LLM edge behavior
|
|
266
|
-
// ---------------------------------------------------------------------------
|
|
267
|
-
describe('LLM-evaluated edge routing — non-LLM edges', () => {
|
|
268
|
-
it('edge without llm: prefix is not evaluated via LLM; mock LLM never called', async () => {
|
|
269
|
-
const decisionNode = makeNode('decision');
|
|
270
|
-
const edges = [
|
|
271
|
-
makeEdge('decision', 'exit', { label: 'approved' }),
|
|
272
|
-
];
|
|
273
|
-
const graph = makeGraph([decisionNode, makeNode('exit', 'exit')], edges);
|
|
274
|
-
const context = new GraphContext();
|
|
275
|
-
const mockLlm = vi.fn().mockResolvedValue('yes');
|
|
276
|
-
const edge = await selectEdge(decisionNode, { status: 'SUCCESS', preferredLabel: 'approved' }, context, graph, { llmCall: mockLlm });
|
|
277
|
-
expect(mockLlm).not.toHaveBeenCalled();
|
|
278
|
-
expect(edge.toNode).toBe('exit');
|
|
279
|
-
});
|
|
280
|
-
it('graph with static label edges AND one LLM edge: static label matching works', async () => {
|
|
281
|
-
const router = makeNode('router');
|
|
282
|
-
const edges = [
|
|
283
|
-
makeEdge('router', 'path_a', { label: 'approved' }),
|
|
284
|
-
makeEdge('router', 'path_b', { label: 'revision_needed' }),
|
|
285
|
-
makeEdge('router', 'exit', { condition: 'llm:is this complete?' }),
|
|
286
|
-
];
|
|
287
|
-
const graph = makeGraph([router, makeNode('path_a'), makeNode('path_b'), makeNode('exit', 'exit')], edges);
|
|
288
|
-
const context = new GraphContext();
|
|
289
|
-
// preferredLabel = 'approved' matches static edge, bypasses LLM
|
|
290
|
-
const mockLlm = vi.fn().mockResolvedValue('yes');
|
|
291
|
-
const edge = await selectEdge(router, { status: 'SUCCESS', preferredLabel: 'approved' }, context, graph, { llmCall: mockLlm });
|
|
292
|
-
// LLM edge is evaluated FIRST (condition check), but the static edges in step 2 win?
|
|
293
|
-
// Wait - actually condition-matched edges (step 1) are evaluated first. If LLM says yes,
|
|
294
|
-
// the LLM edge is condition-matched and returned. But we want to test static label matching.
|
|
295
|
-
// Set LLM to return no so static label matching can take over.
|
|
296
|
-
expect(mockLlm).toHaveBeenCalled(); // LLM IS called for the condition edge (step 1)
|
|
297
|
-
// With LLM returning 'yes', the LLM edge would be selected in step 1
|
|
298
|
-
// The test as written would select the LLM edge. Let me adjust: test with llm returning 'no'
|
|
299
|
-
// Actually, this test demonstrates that static label matching in step 2 wins when LLM returns 'no'
|
|
300
|
-
expect(edge).not.toBeNull();
|
|
301
|
-
// If LLM returns 'yes', LLM edge (to 'exit') is selected (step 1)
|
|
302
|
-
expect(edge.toNode).toBe('exit'); // LLM returned 'yes' so LLM condition matched first
|
|
303
|
-
});
|
|
304
|
-
it('graph with static label edges AND LLM edge: static preferred label wins when LLM returns no', async () => {
|
|
305
|
-
const router = makeNode('router');
|
|
306
|
-
const edges = [
|
|
307
|
-
makeEdge('router', 'path_a', { label: 'approved' }),
|
|
308
|
-
makeEdge('router', 'exit', { condition: 'llm:is this complete?' }),
|
|
309
|
-
];
|
|
310
|
-
const graph = makeGraph([router, makeNode('path_a'), makeNode('exit', 'exit')], edges);
|
|
311
|
-
const context = new GraphContext();
|
|
312
|
-
// LLM returns 'no' → LLM edge not matched → step 2 picks preferred label 'approved'
|
|
313
|
-
const edge = await selectEdge(router, { status: 'SUCCESS', preferredLabel: 'approved' }, context, graph, { llmCall: vi.fn().mockResolvedValue('no') });
|
|
314
|
-
expect(edge.toNode).toBe('path_a');
|
|
315
|
-
});
|
|
316
|
-
it('no outgoing edges → selectEdge returns null', async () => {
|
|
317
|
-
const node = makeNode('isolated');
|
|
318
|
-
const graph = makeGraph([node], []);
|
|
319
|
-
const context = new GraphContext();
|
|
320
|
-
const edge = await selectEdge(node, SUCCESS_OUTCOME, context, graph, {
|
|
321
|
-
llmCall: vi.fn().mockResolvedValue('yes'),
|
|
322
|
-
});
|
|
323
|
-
expect(edge).toBeNull();
|
|
324
|
-
});
|
|
325
|
-
it('llm:edge-eval-count incremented in context for each LLM evaluation', async () => {
|
|
326
|
-
const node = makeNode('multi');
|
|
327
|
-
const edges = [
|
|
328
|
-
makeEdge('multi', 'path_a', { condition: 'llm:question 1?' }),
|
|
329
|
-
makeEdge('multi', 'path_b', { condition: 'llm:question 2?' }),
|
|
330
|
-
];
|
|
331
|
-
const graph = makeGraph([node, makeNode('path_a'), makeNode('path_b')], edges);
|
|
332
|
-
const context = new GraphContext();
|
|
333
|
-
// Both LLM conditions evaluated; mock returns 'no' for both
|
|
334
|
-
await selectEdge(node, SUCCESS_OUTCOME, context, graph, {
|
|
335
|
-
llmCall: vi.fn().mockResolvedValue('no'),
|
|
336
|
-
});
|
|
337
|
-
const evalCount = context.getNumber('llm.edge_eval_count', 0);
|
|
338
|
-
expect(evalCount).toBe(2);
|
|
339
|
-
});
|
|
340
|
-
});
|
|
341
|
-
//# sourceMappingURL=llm-edge-routing.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"llm-edge-routing.test.js","sourceRoot":"","sources":["../../../src/__tests__/integration/llm-edge-routing.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Integration tests for manager loop handler.
|
|
3
|
-
* Story 50-11 AC4.
|
|
4
|
-
*
|
|
5
|
-
* Tests cover:
|
|
6
|
-
* - Basic loop execution up to max_cycles
|
|
7
|
-
* - max_cycles attribute parsing and clamping
|
|
8
|
-
* - Missing graph_file attribute → FAILURE
|
|
9
|
-
* - graphFileLoader error → FAILURE
|
|
10
|
-
* - Invalid body DOT → FAILURE
|
|
11
|
-
* - Context-key stop condition (pre-set key triggers early exit)
|
|
12
|
-
* - Context-key stop condition (key absent → runs to max_cycles)
|
|
13
|
-
* - LLM stop condition (mock returns yes → early exit)
|
|
14
|
-
* - LLM stop condition (mock returns no → runs to max_cycles)
|
|
15
|
-
* - LLM stop condition with no llmCall provider → never stops early
|
|
16
|
-
* - Stall detection: consecutive non-SUCCESS cycles set steering.mode='recovery'
|
|
17
|
-
*
|
|
18
|
-
* Test approach: call `createManagerLoopHandler(options)` directly with an
|
|
19
|
-
* injectable `graphFileLoader` — no real disk access.
|
|
20
|
-
*
|
|
21
|
-
* ≥10 `it(...)` cases required (AC7).
|
|
22
|
-
*/
|
|
23
|
-
export {};
|
|
24
|
-
//# sourceMappingURL=manager-loop.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager-loop.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/integration/manager-loop.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
|