@substrate-ai/factory 0.19.54 → 0.20.2
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/dist/config.d.ts +4 -4
- package/package.json +12 -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/health-monitor-integration.test.d.ts +0 -16
- package/dist/twins/__tests__/integration/health-monitor-integration.test.d.ts.map +0 -1
- package/dist/twins/__tests__/integration/health-monitor-integration.test.js +0 -183
- package/dist/twins/__tests__/integration/health-monitor-integration.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,411 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Parity test suite that verifies `DirectCodergenBackend` and the CLI `callLLM`
|
|
3
|
-
* path produce structurally equivalent outcomes for the same codergen tasks.
|
|
4
|
-
* Observable differences between the two backends are intentional and documented.
|
|
5
|
-
*
|
|
6
|
-
* Story 48-11.
|
|
7
|
-
*
|
|
8
|
-
* Covers:
|
|
9
|
-
* AC1 – SUCCESS outcome structure is identical across both backends
|
|
10
|
-
* AC2 – FAILURE outcome is structurally comparable
|
|
11
|
-
* AC3 – Direct backend exposes TOOL_CALL_START/END events absent from CLI path
|
|
12
|
-
* AC4 – Direct backend exposes LOOP_DETECTION signal absent from CLI path
|
|
13
|
-
* AC5 – Direct backend exposes per-turn token usage; CLI path does not
|
|
14
|
-
* AC6 – Multiple sequential invocations produce independent outcomes
|
|
15
|
-
*/
|
|
16
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
// Mock declarations — must be hoisted before any imports that load the mocked
|
|
19
|
-
// modules. Vitest hoists vi.mock() calls at transpile time.
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
vi.mock('@substrate-ai/core', () => ({
|
|
22
|
-
callLLM: vi.fn(),
|
|
23
|
-
}));
|
|
24
|
-
vi.mock('../../agent/loop.js', () => ({
|
|
25
|
-
createSession: vi.fn(() => mockSession),
|
|
26
|
-
}));
|
|
27
|
-
// ---------------------------------------------------------------------------
|
|
28
|
-
// Imports — after mock declarations
|
|
29
|
-
// ---------------------------------------------------------------------------
|
|
30
|
-
import { callLLM } from '@substrate-ai/core';
|
|
31
|
-
import { createSession } from '../../agent/loop.js';
|
|
32
|
-
import { EventKind } from '../../agent/types.js';
|
|
33
|
-
import { createCodergenHandler } from '../../handlers/codergen-handler.js';
|
|
34
|
-
import { createDirectCodergenBackend } from '../direct-backend.js';
|
|
35
|
-
import { GraphContext } from '../../graph/context.js';
|
|
36
|
-
// ---------------------------------------------------------------------------
|
|
37
|
-
// Module-level mutable state — populated/reset in beforeEach.
|
|
38
|
-
// The vi.mock factory closes over these variables so the mock is always
|
|
39
|
-
// up-to-date when referenced inside tests.
|
|
40
|
-
// ---------------------------------------------------------------------------
|
|
41
|
-
let mockHandlers;
|
|
42
|
-
let mockHistory;
|
|
43
|
-
let mockProcessInput;
|
|
44
|
-
let mockClose;
|
|
45
|
-
let mockSession;
|
|
46
|
-
/** Cast the callLLM mock so we get .mockResolvedValue / .mockRejectedValue */
|
|
47
|
-
const mockCallLLM = vi.mocked(callLLM);
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
// beforeEach: reset all mock state and reconstitute mockSession
|
|
50
|
-
// ---------------------------------------------------------------------------
|
|
51
|
-
beforeEach(() => {
|
|
52
|
-
mockHandlers = new Map();
|
|
53
|
-
mockHistory = [];
|
|
54
|
-
mockClose = vi.fn();
|
|
55
|
-
mockProcessInput = vi.fn().mockResolvedValue(undefined);
|
|
56
|
-
mockSession = {
|
|
57
|
-
on: vi.fn().mockImplementation((kind, handler) => {
|
|
58
|
-
if (!mockHandlers.has(kind))
|
|
59
|
-
mockHandlers.set(kind, []);
|
|
60
|
-
mockHandlers.get(kind).push(handler);
|
|
61
|
-
}),
|
|
62
|
-
processInput: mockProcessInput,
|
|
63
|
-
close: mockClose,
|
|
64
|
-
get history() { return mockHistory; },
|
|
65
|
-
};
|
|
66
|
-
vi.mocked(createSession).mockReturnValue(mockSession);
|
|
67
|
-
vi.clearAllMocks();
|
|
68
|
-
// Re-set the session mock after clearAllMocks resets the call count
|
|
69
|
-
vi.mocked(createSession).mockReturnValue(mockSession);
|
|
70
|
-
mockSession.on.mockImplementation((kind, handler) => {
|
|
71
|
-
if (!mockHandlers.has(kind))
|
|
72
|
-
mockHandlers.set(kind, []);
|
|
73
|
-
mockHandlers.get(kind).push(handler);
|
|
74
|
-
});
|
|
75
|
-
mockProcessInput.mockResolvedValue(undefined);
|
|
76
|
-
});
|
|
77
|
-
// ---------------------------------------------------------------------------
|
|
78
|
-
// Helper: emit a synthetic event through registered handlers
|
|
79
|
-
// ---------------------------------------------------------------------------
|
|
80
|
-
function emitEvent(kind, data = {}) {
|
|
81
|
-
const handlers = mockHandlers.get(kind) ?? [];
|
|
82
|
-
const event = {
|
|
83
|
-
kind,
|
|
84
|
-
timestamp: new Date(),
|
|
85
|
-
session_id: 'test-session',
|
|
86
|
-
data,
|
|
87
|
-
};
|
|
88
|
-
for (const h of handlers)
|
|
89
|
-
h(event);
|
|
90
|
-
}
|
|
91
|
-
// ---------------------------------------------------------------------------
|
|
92
|
-
// Helper: make a minimal GraphNode
|
|
93
|
-
// ---------------------------------------------------------------------------
|
|
94
|
-
function makeNode(overrides = {}) {
|
|
95
|
-
return {
|
|
96
|
-
id: 'node1',
|
|
97
|
-
label: '',
|
|
98
|
-
shape: 'box',
|
|
99
|
-
type: 'codergen',
|
|
100
|
-
prompt: '',
|
|
101
|
-
maxRetries: 0,
|
|
102
|
-
goalGate: false,
|
|
103
|
-
retryTarget: '',
|
|
104
|
-
fallbackRetryTarget: '',
|
|
105
|
-
fidelity: '',
|
|
106
|
-
threadId: '',
|
|
107
|
-
class: '',
|
|
108
|
-
timeout: 0,
|
|
109
|
-
llmModel: '',
|
|
110
|
-
llmProvider: '',
|
|
111
|
-
reasoningEffort: '',
|
|
112
|
-
autoStatus: false,
|
|
113
|
-
allowPartial: false,
|
|
114
|
-
toolCommand: '',
|
|
115
|
-
backend: '',
|
|
116
|
-
...overrides,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
// ---------------------------------------------------------------------------
|
|
120
|
-
// Helper: make a minimal IGraphContext
|
|
121
|
-
// ---------------------------------------------------------------------------
|
|
122
|
-
function makeContext() {
|
|
123
|
-
return new GraphContext({});
|
|
124
|
-
}
|
|
125
|
-
// ---------------------------------------------------------------------------
|
|
126
|
-
// Helper: make a minimal Graph stub
|
|
127
|
-
// ---------------------------------------------------------------------------
|
|
128
|
-
function makeGraph() {
|
|
129
|
-
return { nodes: [], edges: [], stylesheets: [] };
|
|
130
|
-
}
|
|
131
|
-
// ---------------------------------------------------------------------------
|
|
132
|
-
// Helper: make an AssistantTurn (with optional usage override)
|
|
133
|
-
// ---------------------------------------------------------------------------
|
|
134
|
-
function makeAssistantTurn(content, usage) {
|
|
135
|
-
return {
|
|
136
|
-
type: 'assistant',
|
|
137
|
-
content,
|
|
138
|
-
tool_calls: [],
|
|
139
|
-
reasoning: null,
|
|
140
|
-
usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0, ...usage },
|
|
141
|
-
response_id: null,
|
|
142
|
-
timestamp: new Date(),
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
// ---------------------------------------------------------------------------
|
|
146
|
-
// Helper: build a DirectCodergenBackend with optional onEvent collector
|
|
147
|
-
// ---------------------------------------------------------------------------
|
|
148
|
-
function buildDirectBackend(onEvent) {
|
|
149
|
-
return createDirectCodergenBackend({
|
|
150
|
-
llmClient: {},
|
|
151
|
-
providerProfile: {},
|
|
152
|
-
executionEnv: {},
|
|
153
|
-
...(onEvent ? { onEvent } : {}),
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
// ---------------------------------------------------------------------------
|
|
157
|
-
// AC1 – SUCCESS outcome structure is identical across both backends
|
|
158
|
-
// ---------------------------------------------------------------------------
|
|
159
|
-
describe('AC1 – SUCCESS outcome structure parity', () => {
|
|
160
|
-
it('CLI path returns SUCCESS with correct status and contextUpdates', async () => {
|
|
161
|
-
mockCallLLM.mockResolvedValue({ text: 'implementation output' });
|
|
162
|
-
const handler = createCodergenHandler();
|
|
163
|
-
const outcome = await handler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
|
|
164
|
-
expect(outcome.status).toBe('SUCCESS');
|
|
165
|
-
expect(outcome.contextUpdates?.['node1_output']).toBe('implementation output');
|
|
166
|
-
});
|
|
167
|
-
it('direct backend returns SUCCESS with correct status and contextUpdates', async () => {
|
|
168
|
-
mockHistory.push(makeAssistantTurn('implementation output'));
|
|
169
|
-
const directBackend = buildDirectBackend();
|
|
170
|
-
const handler = createCodergenHandler({ directBackend });
|
|
171
|
-
const outcome = await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
|
|
172
|
-
expect(outcome.status).toBe('SUCCESS');
|
|
173
|
-
expect(outcome.contextUpdates?.['node1_output']).toBe('implementation output');
|
|
174
|
-
});
|
|
175
|
-
it('contextUpdates key names and values are identical between both backends', async () => {
|
|
176
|
-
mockCallLLM.mockResolvedValue({ text: 'implementation output' });
|
|
177
|
-
const cliHandler = createCodergenHandler();
|
|
178
|
-
const cliOutcome = await cliHandler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
|
|
179
|
-
mockHistory.push(makeAssistantTurn('implementation output'));
|
|
180
|
-
const directBackend = buildDirectBackend();
|
|
181
|
-
const directHandler = createCodergenHandler({ directBackend });
|
|
182
|
-
const directOutcome = await directHandler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
|
|
183
|
-
// Core parity: status and contextUpdates structure must be identical
|
|
184
|
-
expect(cliOutcome.status).toBe(directOutcome.status);
|
|
185
|
-
expect(Object.keys(cliOutcome.contextUpdates ?? {})).toEqual(Object.keys(directOutcome.contextUpdates ?? {}));
|
|
186
|
-
expect(cliOutcome.contextUpdates?.['node1_output']).toBe(directOutcome.contextUpdates?.['node1_output']);
|
|
187
|
-
});
|
|
188
|
-
it('documented difference: CLI path sets notes; direct path does not', async () => {
|
|
189
|
-
mockCallLLM.mockResolvedValue({ text: 'implementation output' });
|
|
190
|
-
const cliHandler = createCodergenHandler();
|
|
191
|
-
const cliOutcome = await cliHandler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
|
|
192
|
-
mockHistory.push(makeAssistantTurn('implementation output'));
|
|
193
|
-
const directBackend = buildDirectBackend();
|
|
194
|
-
const directHandler = createCodergenHandler({ directBackend });
|
|
195
|
-
const directOutcome = await directHandler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
|
|
196
|
-
// Documented difference: CLI sets notes, direct does not
|
|
197
|
-
expect(cliOutcome.notes).toBe('implementation output');
|
|
198
|
-
expect(directOutcome.notes).toBeUndefined();
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
// ---------------------------------------------------------------------------
|
|
202
|
-
// AC2 – FAILURE outcome is structurally comparable
|
|
203
|
-
// ---------------------------------------------------------------------------
|
|
204
|
-
describe('AC2 – FAILURE outcome structural parity', () => {
|
|
205
|
-
it('CLI path returns FAILURE when callLLM throws a non-transient error', async () => {
|
|
206
|
-
mockCallLLM.mockRejectedValue(new Error('unknown failure'));
|
|
207
|
-
const handler = createCodergenHandler();
|
|
208
|
-
const outcome = await handler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
|
|
209
|
-
expect(outcome.status).toBe('FAILURE');
|
|
210
|
-
});
|
|
211
|
-
it('direct path returns FAILURE when session emits TURN_LIMIT', async () => {
|
|
212
|
-
mockProcessInput.mockImplementation(async () => {
|
|
213
|
-
emitEvent(EventKind.TURN_LIMIT, { reason: 'max_turns' });
|
|
214
|
-
});
|
|
215
|
-
const directBackend = buildDirectBackend();
|
|
216
|
-
const handler = createCodergenHandler({ directBackend });
|
|
217
|
-
const outcome = await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
|
|
218
|
-
expect(outcome.status).toBe('FAILURE');
|
|
219
|
-
});
|
|
220
|
-
it('both paths carry status FAILURE — documented shape difference: error vs failureReason', async () => {
|
|
221
|
-
// CLI path
|
|
222
|
-
mockCallLLM.mockRejectedValue(new Error('unknown failure'));
|
|
223
|
-
const cliHandler = createCodergenHandler();
|
|
224
|
-
const cliOutcome = await cliHandler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
|
|
225
|
-
// Direct path via TURN_LIMIT
|
|
226
|
-
mockProcessInput.mockImplementation(async () => {
|
|
227
|
-
emitEvent(EventKind.TURN_LIMIT, { reason: 'max_turns' });
|
|
228
|
-
});
|
|
229
|
-
const directBackend = buildDirectBackend();
|
|
230
|
-
const directHandler = createCodergenHandler({ directBackend });
|
|
231
|
-
const directOutcome = await directHandler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
|
|
232
|
-
// Both carry FAILURE status
|
|
233
|
-
expect(cliOutcome.status).toBe('FAILURE');
|
|
234
|
-
expect(directOutcome.status).toBe('FAILURE');
|
|
235
|
-
// Documented shape difference: CLI uses error, direct uses failureReason
|
|
236
|
-
expect(cliOutcome.error).toBeDefined();
|
|
237
|
-
expect(directOutcome.failureReason).toBe('turn limit exceeded');
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
// ---------------------------------------------------------------------------
|
|
241
|
-
// AC3 – Direct backend exposes TOOL_CALL_START/END events absent from CLI path
|
|
242
|
-
// ---------------------------------------------------------------------------
|
|
243
|
-
describe('AC3 – TOOL_CALL events visible on direct path only', () => {
|
|
244
|
-
it('direct backend onEvent collector receives TOOL_CALL_START and TOOL_CALL_END', async () => {
|
|
245
|
-
mockProcessInput.mockImplementation(async () => {
|
|
246
|
-
emitEvent(EventKind.TOOL_CALL_START, { tool_name: 'read_file', call_id: 'call-1' });
|
|
247
|
-
emitEvent(EventKind.TOOL_CALL_END, { call_id: 'call-1', output: 'file contents', is_error: false });
|
|
248
|
-
mockHistory.push(makeAssistantTurn('done'));
|
|
249
|
-
});
|
|
250
|
-
const collectedEvents = [];
|
|
251
|
-
const directBackend = buildDirectBackend(e => collectedEvents.push(e));
|
|
252
|
-
const handler = createCodergenHandler({ directBackend });
|
|
253
|
-
await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
|
|
254
|
-
const kinds = collectedEvents.map(e => e.kind);
|
|
255
|
-
expect(kinds).toContain(EventKind.TOOL_CALL_START);
|
|
256
|
-
expect(kinds).toContain(EventKind.TOOL_CALL_END);
|
|
257
|
-
});
|
|
258
|
-
it('TOOL_CALL_START event carries tool_name and call_id metadata', async () => {
|
|
259
|
-
mockProcessInput.mockImplementation(async () => {
|
|
260
|
-
emitEvent(EventKind.TOOL_CALL_START, { tool_name: 'write_file', call_id: 'call-42' });
|
|
261
|
-
mockHistory.push(makeAssistantTurn('done'));
|
|
262
|
-
});
|
|
263
|
-
const collectedEvents = [];
|
|
264
|
-
const directBackend = buildDirectBackend(e => collectedEvents.push(e));
|
|
265
|
-
const handler = createCodergenHandler({ directBackend });
|
|
266
|
-
await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
|
|
267
|
-
const startEvent = collectedEvents.find(e => e.kind === EventKind.TOOL_CALL_START);
|
|
268
|
-
expect(startEvent?.data?.['tool_name']).toBe('write_file');
|
|
269
|
-
expect(startEvent?.data?.['call_id']).toBe('call-42');
|
|
270
|
-
});
|
|
271
|
-
it('CLI path produces zero session events — callLLM has no event bus integration', async () => {
|
|
272
|
-
mockCallLLM.mockResolvedValue({ text: 'result' });
|
|
273
|
-
const handler = createCodergenHandler();
|
|
274
|
-
await handler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
|
|
275
|
-
// callLLM was invoked — but no session events exist (CLI path has no event bus)
|
|
276
|
-
expect(mockCallLLM).toHaveBeenCalledOnce();
|
|
277
|
-
// No session was created on the CLI path
|
|
278
|
-
expect(createSession).not.toHaveBeenCalled();
|
|
279
|
-
});
|
|
280
|
-
});
|
|
281
|
-
// ---------------------------------------------------------------------------
|
|
282
|
-
// AC4 – Direct backend exposes LOOP_DETECTION signal absent from CLI path
|
|
283
|
-
// ---------------------------------------------------------------------------
|
|
284
|
-
describe('AC4 – LOOP_DETECTION signal visible on direct path only', () => {
|
|
285
|
-
it('LOOP_DETECTION event is captured by the onEvent collector', async () => {
|
|
286
|
-
mockProcessInput.mockImplementation(async () => {
|
|
287
|
-
emitEvent(EventKind.LOOP_DETECTION, { message: 'loop detected: pattern length 2 repeated 5 times' });
|
|
288
|
-
mockHistory.push(makeAssistantTurn('done'));
|
|
289
|
-
});
|
|
290
|
-
const collectedEvents = [];
|
|
291
|
-
const directBackend = buildDirectBackend(e => collectedEvents.push(e));
|
|
292
|
-
const handler = createCodergenHandler({ directBackend });
|
|
293
|
-
await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
|
|
294
|
-
const loopEvent = collectedEvents.find(e => e.kind === EventKind.LOOP_DETECTION);
|
|
295
|
-
expect(loopEvent).toBeDefined();
|
|
296
|
-
expect(loopEvent?.data?.['message']).toBe('loop detected: pattern length 2 repeated 5 times');
|
|
297
|
-
});
|
|
298
|
-
it('CLI path has no equivalent loop detection — callLLM is a simple function call', async () => {
|
|
299
|
-
mockCallLLM.mockResolvedValue({ text: 'result' });
|
|
300
|
-
const handler = createCodergenHandler();
|
|
301
|
-
await handler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
|
|
302
|
-
// No session was created — the CLI path calls callLLM directly with no event system
|
|
303
|
-
expect(createSession).not.toHaveBeenCalled();
|
|
304
|
-
// callLLM returns a simple text result with no loop detection signals
|
|
305
|
-
expect(mockCallLLM).toHaveBeenCalledOnce();
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
// ---------------------------------------------------------------------------
|
|
309
|
-
// AC5 – Direct backend exposes per-turn token usage; CLI path does not
|
|
310
|
-
// ---------------------------------------------------------------------------
|
|
311
|
-
describe('AC5 – token usage observability', () => {
|
|
312
|
-
it('direct backend: AssistantTurn.usage fields are readable from session.history', async () => {
|
|
313
|
-
mockHistory.push(makeAssistantTurn('result', { inputTokens: 100, outputTokens: 50, totalTokens: 150 }));
|
|
314
|
-
const directBackend = buildDirectBackend();
|
|
315
|
-
const handler = createCodergenHandler({ directBackend });
|
|
316
|
-
await handler(makeNode({ id: 'node1', backend: 'direct' }), makeContext(), makeGraph());
|
|
317
|
-
// Read the last AssistantTurn from session history
|
|
318
|
-
const lastAssistantTurn = [...mockHistory]
|
|
319
|
-
.reverse()
|
|
320
|
-
.find((t) => t.type === 'assistant');
|
|
321
|
-
expect(lastAssistantTurn).toBeDefined();
|
|
322
|
-
expect(lastAssistantTurn.usage.inputTokens).toBe(100);
|
|
323
|
-
expect(lastAssistantTurn.usage.outputTokens).toBe(50);
|
|
324
|
-
expect(lastAssistantTurn.usage.totalTokens).toBe(150);
|
|
325
|
-
});
|
|
326
|
-
it('CLI path: callLLM return value contains only text — no usage field', async () => {
|
|
327
|
-
mockCallLLM.mockResolvedValue({ text: 'result' });
|
|
328
|
-
const handler = createCodergenHandler();
|
|
329
|
-
const outcome = await handler(makeNode({ id: 'node1' }), makeContext(), makeGraph());
|
|
330
|
-
// The CLI outcome does not expose token usage
|
|
331
|
-
expect(outcome.status).toBe('SUCCESS');
|
|
332
|
-
// LLMCallResult only contains { text: string }
|
|
333
|
-
const returnValue = mockCallLLM.mock.results[0]?.value;
|
|
334
|
-
expect(returnValue?.['usage']).toBeUndefined();
|
|
335
|
-
});
|
|
336
|
-
it('documented constraint: token observability requires direct backend on CLI path', () => {
|
|
337
|
-
// The CLI callLLM interface returns LLMCallResult { text: string } — no usage.
|
|
338
|
-
// Token observability on the CLI path requires out-of-band instrumentation at
|
|
339
|
-
// a higher level (e.g., the dispatch layer).
|
|
340
|
-
// This test documents the constraint by checking the mock return shape.
|
|
341
|
-
mockCallLLM.mockResolvedValue({ text: 'result' });
|
|
342
|
-
// Direct inspection of the mock return value confirms the absence of usage
|
|
343
|
-
const mockReturnValue = { text: 'result' };
|
|
344
|
-
expect(Object.prototype.hasOwnProperty.call(mockReturnValue, 'usage')).toBe(false);
|
|
345
|
-
});
|
|
346
|
-
});
|
|
347
|
-
// ---------------------------------------------------------------------------
|
|
348
|
-
// AC6 – Multiple sequential invocations produce independent outcomes
|
|
349
|
-
// ---------------------------------------------------------------------------
|
|
350
|
-
describe('AC6 – sequential invocations are independent; no state leaks', () => {
|
|
351
|
-
it('CLI: three sequential invocations each return SUCCESS with correct contextUpdates', async () => {
|
|
352
|
-
mockCallLLM
|
|
353
|
-
.mockResolvedValueOnce({ text: 'output-1' })
|
|
354
|
-
.mockResolvedValueOnce({ text: 'output-2' })
|
|
355
|
-
.mockResolvedValueOnce({ text: 'output-3' });
|
|
356
|
-
const handler = createCodergenHandler();
|
|
357
|
-
const node = makeNode({ id: 'node1' });
|
|
358
|
-
const o1 = await handler(node, makeContext(), makeGraph());
|
|
359
|
-
const o2 = await handler(node, makeContext(), makeGraph());
|
|
360
|
-
const o3 = await handler(node, makeContext(), makeGraph());
|
|
361
|
-
expect(o1.status).toBe('SUCCESS');
|
|
362
|
-
expect(o2.status).toBe('SUCCESS');
|
|
363
|
-
expect(o3.status).toBe('SUCCESS');
|
|
364
|
-
expect(o1.contextUpdates?.['node1_output']).toBe('output-1');
|
|
365
|
-
expect(o2.contextUpdates?.['node1_output']).toBe('output-2');
|
|
366
|
-
expect(o3.contextUpdates?.['node1_output']).toBe('output-3');
|
|
367
|
-
});
|
|
368
|
-
it('direct: three sequential invocations each return SUCCESS', async () => {
|
|
369
|
-
const directBackend = buildDirectBackend();
|
|
370
|
-
const handler = createCodergenHandler({ directBackend });
|
|
371
|
-
const node = makeNode({ id: 'node1', backend: 'direct' });
|
|
372
|
-
// Invocation 1
|
|
373
|
-
mockHistory.length = 0;
|
|
374
|
-
mockHistory.push(makeAssistantTurn('output-1'));
|
|
375
|
-
const o1 = await handler(node, makeContext(), makeGraph());
|
|
376
|
-
// Invocation 2
|
|
377
|
-
mockHistory.length = 0;
|
|
378
|
-
mockHistory.push(makeAssistantTurn('output-2'));
|
|
379
|
-
const o2 = await handler(node, makeContext(), makeGraph());
|
|
380
|
-
// Invocation 3
|
|
381
|
-
mockHistory.length = 0;
|
|
382
|
-
mockHistory.push(makeAssistantTurn('output-3'));
|
|
383
|
-
const o3 = await handler(node, makeContext(), makeGraph());
|
|
384
|
-
expect(o1.status).toBe('SUCCESS');
|
|
385
|
-
expect(o2.status).toBe('SUCCESS');
|
|
386
|
-
expect(o3.status).toBe('SUCCESS');
|
|
387
|
-
});
|
|
388
|
-
it('direct: createSession called exactly 3 times across 3 invocations', async () => {
|
|
389
|
-
const directBackend = buildDirectBackend();
|
|
390
|
-
const handler = createCodergenHandler({ directBackend });
|
|
391
|
-
const node = makeNode({ id: 'node1', backend: 'direct' });
|
|
392
|
-
for (let i = 0; i < 3; i++) {
|
|
393
|
-
mockHistory.length = 0;
|
|
394
|
-
mockHistory.push(makeAssistantTurn(`output-${i + 1}`));
|
|
395
|
-
await handler(node, makeContext(), makeGraph());
|
|
396
|
-
}
|
|
397
|
-
expect(vi.mocked(createSession).mock.calls.length).toBe(3);
|
|
398
|
-
});
|
|
399
|
-
it('direct: session.close() called once per invocation — 3 times total', async () => {
|
|
400
|
-
const directBackend = buildDirectBackend();
|
|
401
|
-
const handler = createCodergenHandler({ directBackend });
|
|
402
|
-
const node = makeNode({ id: 'node1', backend: 'direct' });
|
|
403
|
-
for (let i = 0; i < 3; i++) {
|
|
404
|
-
mockHistory.length = 0;
|
|
405
|
-
mockHistory.push(makeAssistantTurn(`output-${i + 1}`));
|
|
406
|
-
await handler(node, makeContext(), makeGraph());
|
|
407
|
-
}
|
|
408
|
-
expect(mockClose).toHaveBeenCalledTimes(3);
|
|
409
|
-
});
|
|
410
|
-
});
|
|
411
|
-
//# sourceMappingURL=parity.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parity.test.js","sourceRoot":"","sources":["../../../src/backend/__tests__/parity.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for AutoSummarizer (story 49-3).
|
|
3
|
-
*
|
|
4
|
-
* Covers:
|
|
5
|
-
* - estimateTokens: empty, short, long strings
|
|
6
|
-
* - shouldTrigger: below threshold, exactly at threshold, one above threshold
|
|
7
|
-
* - compress: current-index preservation, previous-iteration compression,
|
|
8
|
-
* compressedIndices population, CompressionResult shape
|
|
9
|
-
* - Constructor validation: threshold out of range throws RangeError; boundaries accepted
|
|
10
|
-
*
|
|
11
|
-
* ≥ 14 it() cases required.
|
|
12
|
-
*/
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=auto-summarizer.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-summarizer.test.d.ts","sourceRoot":"","sources":["../../../src/context/__tests__/auto-summarizer.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for AutoSummarizer (story 49-3).
|
|
3
|
-
*
|
|
4
|
-
* Covers:
|
|
5
|
-
* - estimateTokens: empty, short, long strings
|
|
6
|
-
* - shouldTrigger: below threshold, exactly at threshold, one above threshold
|
|
7
|
-
* - compress: current-index preservation, previous-iteration compression,
|
|
8
|
-
* compressedIndices population, CompressionResult shape
|
|
9
|
-
* - Constructor validation: threshold out of range throws RangeError; boundaries accepted
|
|
10
|
-
*
|
|
11
|
-
* ≥ 14 it() cases required.
|
|
12
|
-
*/
|
|
13
|
-
import { describe, it, expect } from 'vitest';
|
|
14
|
-
import { AutoSummarizer, estimateTokens, } from '../auto-summarizer.js';
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
// MockSummaryEngine — local implementation, no vi.mock() needed
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
class MockSummaryEngine {
|
|
19
|
-
name = 'mock-summary-engine';
|
|
20
|
-
async summarize(content, targetLevel, _opts) {
|
|
21
|
-
return {
|
|
22
|
-
level: targetLevel,
|
|
23
|
-
content: content.slice(0, 10),
|
|
24
|
-
originalHash: 'mock-hash',
|
|
25
|
-
createdAt: new Date().toISOString(),
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
async expand(summary, _targetLevel, opts) {
|
|
29
|
-
return opts?.originalContent ?? summary.content;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
const mockEngine = new MockSummaryEngine();
|
|
33
|
-
// ---------------------------------------------------------------------------
|
|
34
|
-
// estimateTokens — 3 cases
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
describe('estimateTokens', () => {
|
|
37
|
-
it('returns 0 for an empty string', () => {
|
|
38
|
-
expect(estimateTokens('')).toBe(0);
|
|
39
|
-
});
|
|
40
|
-
it("returns 1 for 'abcd' (4 chars → Math.ceil(4/4) = 1)", () => {
|
|
41
|
-
expect(estimateTokens('abcd')).toBe(1);
|
|
42
|
-
});
|
|
43
|
-
it('returns 100 for a 400-char string (Math.ceil(400/4) = 100)', () => {
|
|
44
|
-
const text = 'a'.repeat(400);
|
|
45
|
-
expect(estimateTokens(text)).toBe(100);
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
// shouldTrigger — 3 cases
|
|
50
|
-
// ---------------------------------------------------------------------------
|
|
51
|
-
describe('shouldTrigger', () => {
|
|
52
|
-
// Model limit = 1000 tokens, threshold = 0.8 → trigger point = 800 tokens
|
|
53
|
-
const MODEL_LIMIT = 1000;
|
|
54
|
-
const THRESHOLD = 0.8;
|
|
55
|
-
function makeAutoSummarizer(threshold = THRESHOLD) {
|
|
56
|
-
return new AutoSummarizer(mockEngine, MODEL_LIMIT, { threshold });
|
|
57
|
-
}
|
|
58
|
-
it('returns false when total token estimate is below the threshold', () => {
|
|
59
|
-
const summarizer = makeAutoSummarizer();
|
|
60
|
-
// 790 tokens total — below 800
|
|
61
|
-
const iterations = [
|
|
62
|
-
{ index: 0, content: '', tokenEstimate: 400 },
|
|
63
|
-
{ index: 1, content: '', tokenEstimate: 390 },
|
|
64
|
-
];
|
|
65
|
-
expect(summarizer.shouldTrigger(iterations)).toBe(false);
|
|
66
|
-
});
|
|
67
|
-
it('returns false when total token estimate is exactly at the threshold (strict >)', () => {
|
|
68
|
-
const summarizer = makeAutoSummarizer();
|
|
69
|
-
// exactly 800 tokens — NOT strictly greater than 800, so false
|
|
70
|
-
const iterations = [
|
|
71
|
-
{ index: 0, content: '', tokenEstimate: 400 },
|
|
72
|
-
{ index: 1, content: '', tokenEstimate: 400 },
|
|
73
|
-
];
|
|
74
|
-
expect(summarizer.shouldTrigger(iterations)).toBe(false);
|
|
75
|
-
});
|
|
76
|
-
it('returns true when total token estimate is one above the threshold', () => {
|
|
77
|
-
const summarizer = makeAutoSummarizer();
|
|
78
|
-
// 801 tokens — strictly greater than 800
|
|
79
|
-
const iterations = [
|
|
80
|
-
{ index: 0, content: '', tokenEstimate: 400 },
|
|
81
|
-
{ index: 1, content: '', tokenEstimate: 401 },
|
|
82
|
-
];
|
|
83
|
-
expect(summarizer.shouldTrigger(iterations)).toBe(true);
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
// ---------------------------------------------------------------------------
|
|
87
|
-
// compress — 4 cases
|
|
88
|
-
// ---------------------------------------------------------------------------
|
|
89
|
-
describe('compress', () => {
|
|
90
|
-
const MODEL_LIMIT = 10000;
|
|
91
|
-
let summarizer;
|
|
92
|
-
// Set up summarizer before each test
|
|
93
|
-
function getSummarizer() {
|
|
94
|
-
return new AutoSummarizer(mockEngine, MODEL_LIMIT, { threshold: 0.8, targetLevel: 'medium' });
|
|
95
|
-
}
|
|
96
|
-
it('preserves the current-index iteration with original content (no compressed field)', async () => {
|
|
97
|
-
summarizer = getSummarizer();
|
|
98
|
-
const iterations = [
|
|
99
|
-
{ index: 0, content: 'earlier output' },
|
|
100
|
-
{ index: 1, content: 'current output' },
|
|
101
|
-
];
|
|
102
|
-
const result = await summarizer.compress(iterations, /* currentIndex */ 1);
|
|
103
|
-
const currentIter = result.iterations.find((c) => c.index === 1);
|
|
104
|
-
expect(currentIter).toBeDefined();
|
|
105
|
-
// Should NOT be compressed
|
|
106
|
-
expect('compressed' in currentIter).toBe(false);
|
|
107
|
-
// Should have original content
|
|
108
|
-
expect(currentIter.content).toBe('current output');
|
|
109
|
-
});
|
|
110
|
-
it('compresses previous iterations with compressed: true and a Summary', async () => {
|
|
111
|
-
summarizer = getSummarizer();
|
|
112
|
-
const iterations = [
|
|
113
|
-
{ index: 0, content: 'output zero' },
|
|
114
|
-
{ index: 1, content: 'output one' },
|
|
115
|
-
{ index: 2, content: 'output two — current' },
|
|
116
|
-
];
|
|
117
|
-
const result = await summarizer.compress(iterations, /* currentIndex */ 2);
|
|
118
|
-
const compressed0 = result.iterations.find((c) => c.index === 0);
|
|
119
|
-
const compressed1 = result.iterations.find((c) => c.index === 1);
|
|
120
|
-
expect(compressed0.compressed).toBe(true);
|
|
121
|
-
expect(compressed0.summary).toBeDefined();
|
|
122
|
-
expect(compressed0.summary.level).toBe('medium');
|
|
123
|
-
expect(compressed1.compressed).toBe(true);
|
|
124
|
-
expect(compressed1.summary).toBeDefined();
|
|
125
|
-
});
|
|
126
|
-
it('populates compressedIndices with all indices that were compressed', async () => {
|
|
127
|
-
summarizer = getSummarizer();
|
|
128
|
-
const iterations = [
|
|
129
|
-
{ index: 0, content: 'output zero' },
|
|
130
|
-
{ index: 1, content: 'output one' },
|
|
131
|
-
{ index: 2, content: 'current' },
|
|
132
|
-
];
|
|
133
|
-
const result = await summarizer.compress(iterations, /* currentIndex */ 2);
|
|
134
|
-
expect(result.compressedIndices).toContain(0);
|
|
135
|
-
expect(result.compressedIndices).toContain(1);
|
|
136
|
-
expect(result.compressedIndices).not.toContain(2);
|
|
137
|
-
expect(result.compressedIndices).toHaveLength(2);
|
|
138
|
-
});
|
|
139
|
-
it('CompressionResult has iterations array with expected length (all iterations preserved)', async () => {
|
|
140
|
-
summarizer = getSummarizer();
|
|
141
|
-
const iterations = [
|
|
142
|
-
{ index: 0, content: 'a' },
|
|
143
|
-
{ index: 1, content: 'b' },
|
|
144
|
-
{ index: 2, content: 'c' },
|
|
145
|
-
];
|
|
146
|
-
const result = await summarizer.compress(iterations, /* currentIndex */ 2);
|
|
147
|
-
// All 3 iterations are present (0 and 1 compressed, 2 unchanged)
|
|
148
|
-
expect(result.iterations).toHaveLength(3);
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
// ---------------------------------------------------------------------------
|
|
152
|
-
// Constructor validation — 4 cases
|
|
153
|
-
// ---------------------------------------------------------------------------
|
|
154
|
-
describe('AutoSummarizer constructor — threshold validation', () => {
|
|
155
|
-
it('throws RangeError when threshold is 0.4 (below 0.5)', () => {
|
|
156
|
-
expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.4 })).toThrowError(RangeError);
|
|
157
|
-
expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.4 })).toThrowError('context_summarize_threshold must be between 0.5 and 0.95');
|
|
158
|
-
});
|
|
159
|
-
it('throws RangeError when threshold is 0.96 (above 0.95)', () => {
|
|
160
|
-
expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.96 })).toThrowError(RangeError);
|
|
161
|
-
expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.96 })).toThrowError('context_summarize_threshold must be between 0.5 and 0.95');
|
|
162
|
-
});
|
|
163
|
-
it('constructs without error when threshold is exactly 0.5 (lower boundary)', () => {
|
|
164
|
-
expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.5 })).not.toThrow();
|
|
165
|
-
});
|
|
166
|
-
it('constructs without error when threshold is exactly 0.95 (upper boundary)', () => {
|
|
167
|
-
expect(() => new AutoSummarizer(mockEngine, 1000, { threshold: 0.95 })).not.toThrow();
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
// ---------------------------------------------------------------------------
|
|
171
|
-
// Additional coverage — estimateTokens used when tokenEstimate absent + default threshold
|
|
172
|
-
// ---------------------------------------------------------------------------
|
|
173
|
-
describe('shouldTrigger — uses estimateTokens when tokenEstimate absent', () => {
|
|
174
|
-
it('computes token estimate from content.length/4 when tokenEstimate is not set', () => {
|
|
175
|
-
// model limit 100, threshold 0.8 → trigger at > 80 tokens
|
|
176
|
-
// content = 400 chars → estimateTokens = 100 tokens → should trigger
|
|
177
|
-
const summarizer = new AutoSummarizer(mockEngine, 100, { threshold: 0.8 });
|
|
178
|
-
const iterations = [
|
|
179
|
-
{ index: 0, content: 'x'.repeat(400) }, // no tokenEstimate — computed as 100
|
|
180
|
-
];
|
|
181
|
-
expect(summarizer.shouldTrigger(iterations)).toBe(true);
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
describe('AutoSummarizer — default threshold accepted (undefined config)', () => {
|
|
185
|
-
it('constructs without error when no config is passed (default threshold 0.8)', () => {
|
|
186
|
-
expect(() => new AutoSummarizer(mockEngine, 1000)).not.toThrow();
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
//# sourceMappingURL=auto-summarizer.test.js.map
|