@the-open-engine/zeroshot 6.38.1 → 6.39.0
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/cli/event-copy.js +8 -7
- package/cli/event-copy.ts +12 -0
- package/cli/index.js +7 -31
- package/cli/json-export.js +61 -64
- package/cli/json-export.ts +112 -0
- package/cli/message-formatter-utils.js +68 -56
- package/cli/message-formatter-utils.ts +121 -0
- package/cli/message-formatters-normal.js +124 -259
- package/cli/message-formatters-normal.ts +250 -0
- package/cli/message-formatters-watch.js +81 -84
- package/cli/message-formatters-watch.ts +189 -0
- package/lib/cluster/generated/protocol-schema.cjs +1 -1
- package/lib/cluster/generated/protocol-schema.mjs +1 -1
- package/lib/cluster/generated/protocol.d.cts +8 -0
- package/lib/cluster/generated/protocol.d.mts +8 -0
- package/lib/cluster/generated/protocol.d.ts +8 -0
- package/lib/clusters-registry.d.ts +23 -0
- package/lib/clusters-registry.js +17 -29
- package/lib/completion.d.ts +12 -0
- package/lib/completion.js +84 -94
- package/lib/compose-utils.d.ts +32 -0
- package/lib/compose-utils.js +57 -72
- package/lib/detached-startup.d.ts +83 -0
- package/lib/detached-startup.js +231 -302
- package/lib/docker-config.d.ts +43 -0
- package/lib/docker-config.js +150 -325
- package/lib/docker-env-auth.d.ts +17 -0
- package/lib/docker-env-auth.js +75 -0
- package/lib/git-remote-utils.d.ts +48 -0
- package/lib/git-remote-utils.js +147 -213
- package/lib/id-detector.d.ts +15 -0
- package/lib/id-detector.js +37 -41
- package/lib/path-check.d.ts +30 -0
- package/lib/path-check.js +42 -45
- package/lib/process-liveness.d.ts +16 -0
- package/lib/process-liveness.js +19 -12
- package/lib/provider-credential-path.d.ts +16 -0
- package/lib/provider-credential-path.js +31 -29
- package/lib/provider-defaults.d.ts +30 -0
- package/lib/provider-defaults.js +47 -42
- package/lib/provider-detection.d.ts +11 -0
- package/lib/provider-detection.js +91 -54
- package/lib/provider-names.d.ts +38 -0
- package/lib/provider-names.js +56 -64
- package/lib/repo-settings.d.ts +28 -0
- package/lib/repo-settings.js +83 -59
- package/lib/run-mode.d.ts +21 -0
- package/lib/run-mode.js +21 -20
- package/lib/run-plan.d.ts +28 -0
- package/lib/run-plan.js +17 -16
- package/lib/settings/claude-auth.d.ts +35 -0
- package/lib/settings/claude-auth.js +30 -47
- package/lib/settings-defaults.d.ts +20 -0
- package/lib/settings-defaults.js +149 -0
- package/lib/settings-error.d.ts +7 -0
- package/lib/settings-error.js +8 -0
- package/lib/settings-issue-providers.d.ts +10 -0
- package/lib/settings-issue-providers.js +12 -0
- package/lib/settings-models.d.ts +22 -0
- package/lib/settings-models.js +93 -0
- package/lib/settings-storage.d.ts +23 -0
- package/lib/settings-storage.js +205 -0
- package/lib/settings-validation.d.ts +7 -0
- package/lib/settings-validation.js +182 -0
- package/lib/settings.d.ts +29 -0
- package/lib/settings.js +41 -736
- package/lib/setup-apply-types.d.ts +66 -0
- package/lib/setup-apply-types.js +2 -0
- package/lib/setup-apply.d.ts +39 -0
- package/lib/setup-apply.js +267 -264
- package/lib/setup-journal.d.ts +41 -0
- package/lib/setup-journal.js +119 -76
- package/lib/setup-plan-types.d.ts +102 -0
- package/lib/setup-plan-types.js +2 -0
- package/lib/setup-plan.d.ts +30 -0
- package/lib/setup-plan.js +300 -324
- package/lib/setup-undo.d.ts +44 -0
- package/lib/setup-undo.js +61 -74
- package/lib/start-cluster-config.d.ts +26 -0
- package/lib/start-cluster-config.js +56 -0
- package/lib/start-cluster-environment.d.ts +40 -0
- package/lib/start-cluster-environment.js +134 -0
- package/lib/start-cluster-run-options.d.ts +53 -0
- package/lib/start-cluster-run-options.js +147 -0
- package/lib/start-cluster.d.ts +64 -0
- package/lib/start-cluster.js +98 -454
- package/lib/stream-json-parser.d.ts +17 -0
- package/lib/stream-json-parser.js +51 -52
- package/npm-shrinkwrap.json +2 -2
- package/package.json +12 -6
- package/scripts/postinstall.js +27 -0
- package/scripts/rust-distribution.js +23 -14
- package/src/agent/agent-command-proofs-context.js +35 -45
- package/src/agent/agent-command-proofs-context.ts +87 -0
- package/src/agent/agent-config-settings.js +19 -0
- package/src/agent/agent-config-settings.ts +41 -0
- package/src/agent/agent-config.js +122 -231
- package/src/agent/agent-config.ts +285 -0
- package/src/agent/agent-context-builder.js +38 -273
- package/src/agent/agent-context-builder.ts +51 -0
- package/src/agent/agent-context-environment-sections.js +105 -0
- package/src/agent/agent-context-environment-sections.ts +134 -0
- package/src/agent/agent-context-packs.js +165 -0
- package/src/agent/agent-context-packs.ts +296 -0
- package/src/agent/agent-context-prompt-sections.js +100 -0
- package/src/agent/agent-context-prompt-sections.ts +148 -0
- package/src/agent/agent-context-sections.js +25 -334
- package/src/agent/agent-context-sections.ts +36 -0
- package/src/agent/agent-context-sources.js +96 -149
- package/src/agent/agent-context-sources.ts +253 -0
- package/src/agent/agent-context-types.js +2 -0
- package/src/agent/agent-context-types.ts +132 -0
- package/src/agent/agent-context-validation-sections.js +73 -0
- package/src/agent/agent-context-validation-sections.ts +129 -0
- package/src/agent/agent-input-injector.js +99 -118
- package/src/agent/agent-input-injector.ts +195 -0
- package/src/agent/agent-liveness-poll.js +74 -78
- package/src/agent/agent-liveness-poll.ts +163 -0
- package/src/agent/agent-quality-gate-schema.js +77 -86
- package/src/agent/agent-quality-gate-schema.ts +135 -0
- package/src/agent/agent-quality-gates-context.js +44 -50
- package/src/agent/agent-quality-gates-context.ts +91 -0
- package/src/agent/agent-stuck-detector.js +171 -239
- package/src/agent/agent-stuck-detector.ts +288 -0
- package/src/agent/agent-trigger-evaluator.js +29 -46
- package/src/agent/agent-trigger-evaluator.ts +98 -0
- package/src/agent/context-metrics.js +110 -141
- package/src/agent/context-metrics.ts +261 -0
- package/src/agent/context-pack-builder.js +72 -358
- package/src/agent/context-pack-builder.ts +105 -0
- package/src/agent/context-pack-core.js +70 -0
- package/src/agent/context-pack-core.ts +96 -0
- package/src/agent/context-pack-selection.js +119 -0
- package/src/agent/context-pack-selection.ts +187 -0
- package/src/agent/context-pack-truncation.js +139 -0
- package/src/agent/context-pack-truncation.ts +208 -0
- package/src/agent/context-pack-types.js +2 -0
- package/src/agent/context-pack-types.ts +98 -0
- package/src/agent/context-replay-policy.js +30 -39
- package/src/agent/context-replay-policy.ts +71 -0
- package/src/agent/critical-agent-policy.js +6 -10
- package/src/agent/critical-agent-policy.ts +20 -0
- package/src/agent/guidance-queue.js +74 -87
- package/src/agent/guidance-queue.ts +166 -0
- package/src/agent/output-extraction-error-detail.js +45 -0
- package/src/agent/output-extraction-error-detail.ts +49 -0
- package/src/agent/output-extraction-failures.js +125 -0
- package/src/agent/output-extraction-failures.ts +149 -0
- package/src/agent/output-extraction-json.js +234 -0
- package/src/agent/output-extraction-json.ts +235 -0
- package/src/agent/output-extraction-pi.js +124 -0
- package/src/agent/output-extraction-pi.ts +137 -0
- package/src/agent/output-extraction-types.js +2 -0
- package/src/agent/output-extraction-types.ts +49 -0
- package/src/agent/output-extraction.js +17 -617
- package/src/agent/output-extraction.ts +30 -0
- package/src/agent/output-reformatter-errors.js +83 -0
- package/src/agent/output-reformatter-errors.ts +106 -0
- package/src/agent/output-reformatter-types.js +2 -0
- package/src/agent/output-reformatter-types.ts +86 -0
- package/src/agent/output-reformatter.js +140 -185
- package/src/agent/output-reformatter.ts +238 -0
- package/src/agent/pi-terminal-lifecycle-types.js +2 -0
- package/src/agent/pi-terminal-lifecycle-types.ts +41 -0
- package/src/agent/pi-terminal-lifecycle.js +186 -206
- package/src/agent/pi-terminal-lifecycle.ts +297 -0
- package/src/agent/provider-control-plane.js +22 -21
- package/src/agent/provider-control-plane.ts +52 -0
- package/src/agent/provider-terminal-failure-types.js +2 -0
- package/src/agent/provider-terminal-failure-types.ts +60 -0
- package/src/agent/provider-terminal-failure.js +194 -191
- package/src/agent/provider-terminal-failure.ts +262 -0
- package/src/agent/rate-limit-backoff.js +31 -74
- package/src/agent/rate-limit-backoff.ts +71 -0
- package/src/agent/schema-utils.js +85 -125
- package/src/agent/schema-utils.ts +148 -0
- package/src/agent/structured-output-error.js +34 -33
- package/src/agent/structured-output-error.ts +105 -0
- package/src/agent/validation-platform.js +27 -27
- package/src/agent/validation-platform.ts +49 -0
- package/src/attach/attach-client.js +232 -405
- package/src/attach/attach-client.ts +300 -0
- package/src/attach/attach-server-cleanup.js +43 -0
- package/src/attach/attach-server-cleanup.ts +39 -0
- package/src/attach/attach-server-clients.js +117 -0
- package/src/attach/attach-server-clients.ts +122 -0
- package/src/attach/attach-server-events.js +38 -0
- package/src/attach/attach-server-events.ts +36 -0
- package/src/attach/attach-server-pty.js +45 -0
- package/src/attach/attach-server-pty.ts +64 -0
- package/src/attach/attach-server-runtime.js +73 -0
- package/src/attach/attach-server-runtime.ts +62 -0
- package/src/attach/attach-server-socket.js +28 -0
- package/src/attach/attach-server-socket.ts +23 -0
- package/src/attach/attach-server-types.js +2 -0
- package/src/attach/attach-server-types.ts +82 -0
- package/src/attach/attach-server.js +106 -523
- package/src/attach/attach-server.ts +158 -0
- package/src/attach/index.js +18 -35
- package/src/attach/index.ts +18 -0
- package/src/attach/protocol.js +95 -184
- package/src/attach/protocol.ts +181 -0
- package/src/attach/ring-buffer.js +76 -102
- package/src/attach/ring-buffer.ts +109 -0
- package/src/attach/send-input.js +64 -75
- package/src/attach/send-input.ts +94 -0
- package/src/attach/socket-discovery.js +164 -218
- package/src/attach/socket-discovery.ts +230 -0
- package/src/attach/socket-paths.js +42 -61
- package/src/attach/socket-paths.ts +81 -0
- package/src/claude-credentials.js +51 -54
- package/src/claude-credentials.ts +89 -0
- package/src/cluster/generated/protocol-schema.ts +1 -1
- package/src/cluster/generated/protocol.ts +2 -1
- package/src/command-proofs.js +110 -141
- package/src/command-proofs.ts +216 -0
- package/src/config-router.js +81 -73
- package/src/config-router.ts +131 -0
- package/src/copy-worker.js +53 -29
- package/src/copy-worker.ts +75 -0
- package/src/darwin-keychain-boundary.js +80 -111
- package/src/darwin-keychain-boundary.ts +148 -0
- package/src/guidance-topics.js +4 -5
- package/src/guidance-topics.ts +10 -0
- package/src/input-helpers.js +33 -54
- package/src/input-helpers.ts +58 -0
- package/src/ledger-sequence.js +45 -48
- package/src/ledger-sequence.ts +63 -0
- package/src/legacy-lib/clusters-registry.ts +40 -0
- package/src/legacy-lib/completion.ts +148 -0
- package/src/legacy-lib/compose-utils.ts +102 -0
- package/src/legacy-lib/detached-startup.ts +449 -0
- package/src/legacy-lib/docker-config.ts +282 -0
- package/src/legacy-lib/docker-env-auth.ts +116 -0
- package/src/legacy-lib/git-remote-utils.ts +244 -0
- package/src/legacy-lib/id-detector.ts +57 -0
- package/src/legacy-lib/js-yaml.d.ts +3 -0
- package/src/legacy-lib/omelette.d.ts +15 -0
- package/src/legacy-lib/path-check.ts +89 -0
- package/src/legacy-lib/process-liveness.ts +36 -0
- package/src/legacy-lib/provider-credential-path.ts +57 -0
- package/src/legacy-lib/provider-defaults.ts +114 -0
- package/src/legacy-lib/provider-detection.ts +67 -0
- package/src/legacy-lib/provider-names.ts +126 -0
- package/src/legacy-lib/repo-settings.ts +88 -0
- package/src/legacy-lib/run-mode.ts +58 -0
- package/src/legacy-lib/run-plan.ts +49 -0
- package/src/legacy-lib/settings/claude-auth.ts +80 -0
- package/src/legacy-lib/settings-defaults.ts +212 -0
- package/src/legacy-lib/settings-error.ts +8 -0
- package/src/legacy-lib/settings-issue-providers.ts +18 -0
- package/src/legacy-lib/settings-models.ts +124 -0
- package/src/legacy-lib/settings-storage.ts +277 -0
- package/src/legacy-lib/settings-validation.ts +220 -0
- package/src/legacy-lib/settings.ts +87 -0
- package/src/legacy-lib/setup-apply-types.ts +70 -0
- package/src/legacy-lib/setup-apply.ts +456 -0
- package/src/legacy-lib/setup-journal.ts +185 -0
- package/src/legacy-lib/setup-plan-types.ts +96 -0
- package/src/legacy-lib/setup-plan.ts +500 -0
- package/src/legacy-lib/setup-undo.ts +142 -0
- package/src/legacy-lib/start-cluster-config.ts +124 -0
- package/src/legacy-lib/start-cluster-environment.ts +165 -0
- package/src/legacy-lib/start-cluster-run-options.ts +279 -0
- package/src/legacy-lib/start-cluster.ts +237 -0
- package/src/legacy-lib/stream-json-parser.ts +88 -0
- package/src/message-buffer.js +55 -71
- package/src/message-buffer.ts +107 -0
- package/src/message-bus-bridge.js +92 -133
- package/src/message-bus-bridge.ts +149 -0
- package/src/name-generator-shared.js +220 -0
- package/src/name-generator-shared.ts +231 -0
- package/src/name-generator.js +8 -217
- package/src/name-generator.ts +27 -0
- package/src/omp-blob-root.js +83 -64
- package/src/omp-blob-root.ts +116 -0
- package/src/omp-config-overlay.js +65 -38
- package/src/omp-config-overlay.ts +110 -0
- package/src/omp-execution-fingerprint.js +38 -43
- package/src/omp-execution-fingerprint.ts +92 -0
- package/src/omp-session-limits.js +10 -15
- package/src/omp-session-limits.ts +53 -0
- package/src/omp-session-partition.js +2 -2
- package/src/omp-session-verifier.js +1 -1
- package/src/orchestrator.js +19 -4
- package/src/providers/anthropic/index.js +3 -1
- package/src/providers/anthropic/index.ts +13 -0
- package/src/providers/capabilities.js +19 -27
- package/src/providers/capabilities.ts +44 -0
- package/src/providers/google/index.js +3 -1
- package/src/providers/google/index.ts +13 -0
- package/src/providers/openai/index.js +3 -1
- package/src/providers/openai/index.ts +13 -0
- package/src/providers/opencode/index.js +3 -1
- package/src/providers/opencode/index.ts +13 -0
- package/src/quality-gates.js +67 -127
- package/src/quality-gates.ts +149 -0
- package/src/repo-settings-access.js +40 -0
- package/src/repo-settings-access.ts +64 -0
- package/src/schemas/sub-cluster.js +127 -183
- package/src/schemas/sub-cluster.ts +238 -0
- package/src/state-snapshot-normalization.js +224 -0
- package/src/state-snapshot-normalization.ts +222 -0
- package/src/state-snapshot.js +192 -359
- package/src/state-snapshot.ts +291 -0
- package/src/state-snapshotter.js +118 -130
- package/src/state-snapshotter.ts +167 -0
- package/src/sub-cluster-wrapper.js +4 -13
- package/src/task-run-model-args.js +87 -124
- package/src/task-run-model-args.ts +204 -0
- package/src/task-runner.js +5 -25
- package/src/task-runner.ts +28 -0
- package/src/task-startup-error.js +73 -58
- package/src/task-startup-error.ts +126 -0
- package/src/template-validation/consensus-gate-contracts.js +2 -0
- package/src/template-validation/consensus-gate-contracts.ts +70 -0
- package/src/template-validation/consensus-gate-scenarios.js +76 -0
- package/src/template-validation/consensus-gate-scenarios.ts +130 -0
- package/src/template-validation/consensus-gate-stage.js +34 -0
- package/src/template-validation/consensus-gate-stage.ts +56 -0
- package/src/template-validation/random-topology-contracts.js +2 -0
- package/src/template-validation/random-topology-contracts.ts +54 -0
- package/src/template-validation/random-topology-dispatch.js +25 -0
- package/src/template-validation/random-topology-dispatch.ts +33 -0
- package/src/template-validation/random-topology-message-loop.js +53 -0
- package/src/template-validation/random-topology-message-loop.ts +73 -0
- package/src/template-validation/random-topology-operations.js +79 -0
- package/src/template-validation/random-topology-operations.ts +101 -0
- package/src/template-validation/random-topology-runtime.js +25 -0
- package/src/template-validation/random-topology-runtime.ts +43 -0
- package/src/template-validation/random-topology-scenario.js +52 -0
- package/src/template-validation/random-topology-scenario.ts +57 -0
- package/src/template-validation/random-topology-schema.js +159 -0
- package/src/template-validation/random-topology-schema.ts +190 -0
- package/src/template-validation/random-topology-state.js +28 -0
- package/src/template-validation/random-topology-state.ts +30 -0
- package/src/template-validation/random-topology-trigger-evaluation.js +45 -0
- package/src/template-validation/random-topology-trigger-evaluation.ts +65 -0
- package/src/template-validation/random-topology-trigger.js +75 -0
- package/src/template-validation/random-topology-trigger.ts +88 -0
- package/src/template-validation/report-formatter.js +40 -46
- package/src/template-validation/report-formatter.ts +101 -0
- package/src/template-validation/simulate-consensus-gates.js +111 -302
- package/src/template-validation/simulate-consensus-gates.ts +196 -0
- package/src/template-validation/simulate-random-topology.js +26 -519
- package/src/template-validation/simulate-random-topology.ts +57 -0
- package/src/template-validation/simulate-two-stage-validation.js +41 -265
- package/src/template-validation/simulate-two-stage-validation.ts +55 -0
- package/src/template-validation/simulation-agent-runtime.js +25 -0
- package/src/template-validation/simulation-agent-runtime.ts +40 -0
- package/src/template-validation/simulation-agent.js +29 -0
- package/src/template-validation/simulation-agent.ts +73 -0
- package/src/template-validation/simulation-runtime.js +34 -0
- package/src/template-validation/simulation-runtime.ts +72 -0
- package/src/template-validation/two-stage-contracts.js +2 -0
- package/src/template-validation/two-stage-contracts.ts +41 -0
- package/src/template-validation/two-stage-inputs.js +21 -0
- package/src/template-validation/two-stage-inputs.ts +29 -0
- package/src/template-validation/two-stage-results.js +30 -0
- package/src/template-validation/two-stage-results.ts +40 -0
- package/src/template-validation/two-stage-scenario.js +86 -0
- package/src/template-validation/two-stage-scenario.ts +120 -0
- package/src/worktree-claude-config.js +182 -220
- package/src/worktree-claude-config.ts +272 -0
- package/src/worktree-tooling-env.js +103 -125
- package/src/worktree-tooling-env.ts +142 -0
- package/task-lib/completion.js +2 -3
- package/task-lib/completion.ts +9 -0
- package/task-lib/config.js +1 -4
- package/task-lib/config.ts +11 -0
- package/task-lib/name-generator.js +4 -226
- package/task-lib/name-generator.ts +11 -0
- package/task-lib/omp-session-cleanup.js +1 -1
- package/task-lib/omp-storage-root.js +8 -12
- package/task-lib/omp-storage-root.ts +62 -0
- package/task-lib/process-termination.js +143 -166
- package/task-lib/process-termination.ts +268 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { SimulationAgentConfig, SimulationCluster } from './simulation-agent';
|
|
2
|
+
|
|
3
|
+
export type RandomNumberGenerator = () => number;
|
|
4
|
+
|
|
5
|
+
export interface RandomTrigger {
|
|
6
|
+
topic: string;
|
|
7
|
+
logic?: { script?: string };
|
|
8
|
+
action?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface RandomAgentConfig extends SimulationAgentConfig {
|
|
12
|
+
triggers?: RandomTrigger[];
|
|
13
|
+
hooks?: { onComplete?: unknown };
|
|
14
|
+
jsonSchema?: unknown;
|
|
15
|
+
structuredOutput?: unknown;
|
|
16
|
+
maxIterations?: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface RandomTemplateConfig {
|
|
20
|
+
agents?: RandomAgentConfig[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface SimulationMessage {
|
|
24
|
+
topic: string;
|
|
25
|
+
[key: string]: unknown;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface RandomSimulationState {
|
|
29
|
+
agentConfigs: RandomAgentConfig[];
|
|
30
|
+
cluster: SimulationCluster;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface SimulationMessageBus {
|
|
34
|
+
publish(message: unknown): unknown;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface RandomDispatchContext {
|
|
38
|
+
state: RandomSimulationState;
|
|
39
|
+
messageBus: SimulationMessageBus;
|
|
40
|
+
logicEngine: unknown;
|
|
41
|
+
iterations: Map<string, number>;
|
|
42
|
+
rng: RandomNumberGenerator;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type ScenarioOutcome = { ok: true } | { ok: false; reason: string };
|
|
46
|
+
|
|
47
|
+
export interface RunScenarioOptions {
|
|
48
|
+
config: RandomTemplateConfig;
|
|
49
|
+
templateId: string;
|
|
50
|
+
seed: number;
|
|
51
|
+
maxSteps: number;
|
|
52
|
+
maxScenarioMs: number;
|
|
53
|
+
templatesDir: string;
|
|
54
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dispatchScenarioMessage = dispatchScenarioMessage;
|
|
4
|
+
const randomTopologyRuntime = require("./random-topology-runtime");
|
|
5
|
+
const random_topology_trigger_1 = require("./random-topology-trigger");
|
|
6
|
+
function isRandomTrigger(value) {
|
|
7
|
+
return (typeof value === 'object' &&
|
|
8
|
+
value !== null &&
|
|
9
|
+
'topic' in value &&
|
|
10
|
+
typeof value.topic === 'string');
|
|
11
|
+
}
|
|
12
|
+
async function dispatchScenarioMessage(context, message) {
|
|
13
|
+
for (const agentConfig of context.state.agentConfigs) {
|
|
14
|
+
const triggerValue = randomTopologyRuntime.findMatchingTrigger({
|
|
15
|
+
triggers: agentConfig.triggers || [],
|
|
16
|
+
message,
|
|
17
|
+
});
|
|
18
|
+
if (!isRandomTrigger(triggerValue))
|
|
19
|
+
continue;
|
|
20
|
+
const outcome = await (0, random_topology_trigger_1.executeAgentTrigger)(context, agentConfig, triggerValue, message);
|
|
21
|
+
if (outcome)
|
|
22
|
+
return outcome;
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
RandomDispatchContext,
|
|
3
|
+
RandomTrigger,
|
|
4
|
+
ScenarioOutcome,
|
|
5
|
+
SimulationMessage,
|
|
6
|
+
} from './random-topology-contracts';
|
|
7
|
+
import randomTopologyRuntime = require('./random-topology-runtime');
|
|
8
|
+
import { executeAgentTrigger } from './random-topology-trigger';
|
|
9
|
+
|
|
10
|
+
function isRandomTrigger(value: unknown): value is RandomTrigger {
|
|
11
|
+
return (
|
|
12
|
+
typeof value === 'object' &&
|
|
13
|
+
value !== null &&
|
|
14
|
+
'topic' in value &&
|
|
15
|
+
typeof value.topic === 'string'
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function dispatchScenarioMessage(
|
|
20
|
+
context: RandomDispatchContext,
|
|
21
|
+
message: SimulationMessage
|
|
22
|
+
): Promise<ScenarioOutcome | null> {
|
|
23
|
+
for (const agentConfig of context.state.agentConfigs) {
|
|
24
|
+
const triggerValue = randomTopologyRuntime.findMatchingTrigger({
|
|
25
|
+
triggers: agentConfig.triggers || [],
|
|
26
|
+
message,
|
|
27
|
+
});
|
|
28
|
+
if (!isRandomTrigger(triggerValue)) continue;
|
|
29
|
+
const outcome = await executeAgentTrigger(context, agentConfig, triggerValue, message);
|
|
30
|
+
if (outcome) return outcome;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runMessageLoop = runMessageLoop;
|
|
4
|
+
const random_topology_dispatch_1 = require("./random-topology-dispatch");
|
|
5
|
+
const random_topology_operations_1 = require("./random-topology-operations");
|
|
6
|
+
function isSimulationMessage(value) {
|
|
7
|
+
return (typeof value === 'object' &&
|
|
8
|
+
value !== null &&
|
|
9
|
+
'topic' in value &&
|
|
10
|
+
typeof value.topic === 'string');
|
|
11
|
+
}
|
|
12
|
+
function errorMessage(error) {
|
|
13
|
+
return error instanceof Error ? error.message : String(error);
|
|
14
|
+
}
|
|
15
|
+
function processMessage(context, message) {
|
|
16
|
+
if (message.topic === 'CLUSTER_COMPLETE')
|
|
17
|
+
return Promise.resolve({ ok: true });
|
|
18
|
+
if (message.topic === 'CLUSTER_FAILED') {
|
|
19
|
+
return Promise.resolve({ ok: false, reason: 'scenario reached CLUSTER_FAILED' });
|
|
20
|
+
}
|
|
21
|
+
if (message.topic === 'CLUSTER_OPERATIONS') {
|
|
22
|
+
try {
|
|
23
|
+
(0, random_topology_operations_1.handleClusterOperationsMessage)(context.state, context.messageBus, message, context.templatesDir);
|
|
24
|
+
return Promise.resolve(null);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return Promise.resolve({
|
|
28
|
+
ok: false,
|
|
29
|
+
reason: `invalid CLUSTER_OPERATIONS: ${errorMessage(error)}`,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return (0, random_topology_dispatch_1.dispatchScenarioMessage)(context, message);
|
|
34
|
+
}
|
|
35
|
+
async function runMessageLoop(context) {
|
|
36
|
+
let stepCount = 0;
|
|
37
|
+
while (context.queue.length > 0) {
|
|
38
|
+
if (Date.now() - context.startedAt > context.maxScenarioMs) {
|
|
39
|
+
return { ok: false, reason: `scenario timed out after ${context.maxScenarioMs}ms` };
|
|
40
|
+
}
|
|
41
|
+
if (stepCount >= context.maxSteps) {
|
|
42
|
+
return { ok: false, reason: `scenario exceeded step budget (${context.maxSteps})` };
|
|
43
|
+
}
|
|
44
|
+
stepCount += 1;
|
|
45
|
+
const messageValue = context.queue.shift();
|
|
46
|
+
if (!isSimulationMessage(messageValue))
|
|
47
|
+
continue;
|
|
48
|
+
const outcome = await processMessage(context, messageValue);
|
|
49
|
+
if (outcome)
|
|
50
|
+
return outcome;
|
|
51
|
+
}
|
|
52
|
+
return { ok: false, reason: 'message flow quiesced without CLUSTER_COMPLETE' };
|
|
53
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
RandomDispatchContext,
|
|
3
|
+
ScenarioOutcome,
|
|
4
|
+
SimulationMessage,
|
|
5
|
+
} from './random-topology-contracts';
|
|
6
|
+
import { dispatchScenarioMessage } from './random-topology-dispatch';
|
|
7
|
+
import { handleClusterOperationsMessage } from './random-topology-operations';
|
|
8
|
+
|
|
9
|
+
export interface MessageLoopContext extends RandomDispatchContext {
|
|
10
|
+
queue: unknown[];
|
|
11
|
+
templatesDir: string;
|
|
12
|
+
startedAt: number;
|
|
13
|
+
maxSteps: number;
|
|
14
|
+
maxScenarioMs: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function isSimulationMessage(value: unknown): value is SimulationMessage {
|
|
18
|
+
return (
|
|
19
|
+
typeof value === 'object' &&
|
|
20
|
+
value !== null &&
|
|
21
|
+
'topic' in value &&
|
|
22
|
+
typeof value.topic === 'string'
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function errorMessage(error: unknown): string {
|
|
27
|
+
return error instanceof Error ? error.message : String(error);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function processMessage(
|
|
31
|
+
context: MessageLoopContext,
|
|
32
|
+
message: SimulationMessage
|
|
33
|
+
): Promise<ScenarioOutcome | null> {
|
|
34
|
+
if (message.topic === 'CLUSTER_COMPLETE') return Promise.resolve({ ok: true });
|
|
35
|
+
if (message.topic === 'CLUSTER_FAILED') {
|
|
36
|
+
return Promise.resolve({ ok: false, reason: 'scenario reached CLUSTER_FAILED' });
|
|
37
|
+
}
|
|
38
|
+
if (message.topic === 'CLUSTER_OPERATIONS') {
|
|
39
|
+
try {
|
|
40
|
+
handleClusterOperationsMessage(
|
|
41
|
+
context.state,
|
|
42
|
+
context.messageBus,
|
|
43
|
+
message,
|
|
44
|
+
context.templatesDir
|
|
45
|
+
);
|
|
46
|
+
return Promise.resolve(null);
|
|
47
|
+
} catch (error) {
|
|
48
|
+
return Promise.resolve({
|
|
49
|
+
ok: false,
|
|
50
|
+
reason: `invalid CLUSTER_OPERATIONS: ${errorMessage(error)}`,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return dispatchScenarioMessage(context, message);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export async function runMessageLoop(context: MessageLoopContext): Promise<ScenarioOutcome> {
|
|
58
|
+
let stepCount = 0;
|
|
59
|
+
while (context.queue.length > 0) {
|
|
60
|
+
if (Date.now() - context.startedAt > context.maxScenarioMs) {
|
|
61
|
+
return { ok: false, reason: `scenario timed out after ${context.maxScenarioMs}ms` };
|
|
62
|
+
}
|
|
63
|
+
if (stepCount >= context.maxSteps) {
|
|
64
|
+
return { ok: false, reason: `scenario exceeded step budget (${context.maxSteps})` };
|
|
65
|
+
}
|
|
66
|
+
stepCount += 1;
|
|
67
|
+
const messageValue = context.queue.shift();
|
|
68
|
+
if (!isSimulationMessage(messageValue)) continue;
|
|
69
|
+
const outcome = await processMessage(context, messageValue);
|
|
70
|
+
if (outcome) return outcome;
|
|
71
|
+
}
|
|
72
|
+
return { ok: false, reason: 'message flow quiesced without CLUSTER_COMPLETE' };
|
|
73
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleClusterOperationsMessage = handleClusterOperationsMessage;
|
|
4
|
+
const randomTopologyRuntime = require("./random-topology-runtime");
|
|
5
|
+
const random_topology_state_1 = require("./random-topology-state");
|
|
6
|
+
function parseOperations(raw) {
|
|
7
|
+
if (Array.isArray(raw))
|
|
8
|
+
return raw.map((operation) => operation);
|
|
9
|
+
if (typeof raw === 'string') {
|
|
10
|
+
const parsed = JSON.parse(raw);
|
|
11
|
+
return Array.isArray(parsed) ? parsed.map((operation) => operation) : null;
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
function isRecord(value) {
|
|
16
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
17
|
+
}
|
|
18
|
+
function resolveConfigOperation(configOperation, templatesDir) {
|
|
19
|
+
const resolver = new randomTopologyRuntime.TemplateResolver(templatesDir);
|
|
20
|
+
const resolved = resolver.resolveConfigReference(configOperation);
|
|
21
|
+
if (!isRecord(resolved) || !isRecord(resolved.loadedConfig)) {
|
|
22
|
+
throw new TypeError('TemplateResolver returned an invalid loadedConfig');
|
|
23
|
+
}
|
|
24
|
+
return resolved.loadedConfig;
|
|
25
|
+
}
|
|
26
|
+
function publishOperation(state, messageBus, operation, sourceMessage) {
|
|
27
|
+
messageBus.publish({
|
|
28
|
+
cluster_id: state.cluster.id,
|
|
29
|
+
topic: operation.topic,
|
|
30
|
+
sender: '__sim_orchestrator__',
|
|
31
|
+
receiver: operation.receiver || 'broadcast',
|
|
32
|
+
content: operation.content || {},
|
|
33
|
+
metadata: operation.metadata || { fromTopic: sourceMessage.topic },
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function applyClusterOperation(options) {
|
|
37
|
+
const { state, messageBus, operation: operationValue, sourceMessage, templatesDir } = options;
|
|
38
|
+
if (!isRecord(operationValue) || !operationValue.action)
|
|
39
|
+
return;
|
|
40
|
+
const operation = operationValue;
|
|
41
|
+
if (operation.action === 'load_config') {
|
|
42
|
+
(0, random_topology_state_1.addAgentsToState)(state, resolveConfigOperation(operation.config, templatesDir).agents);
|
|
43
|
+
}
|
|
44
|
+
else if (operation.action === 'add_agents') {
|
|
45
|
+
(0, random_topology_state_1.addAgentsToState)(state, operation.agents);
|
|
46
|
+
}
|
|
47
|
+
else if (operation.action === 'remove_agents') {
|
|
48
|
+
const ids = new Set(operationAgentIds(operation.agentIds));
|
|
49
|
+
state.agentConfigs = state.agentConfigs.filter((agent) => !ids.has(agent.id));
|
|
50
|
+
state.cluster.agents = state.cluster.agents.filter((agent) => !ids.has(agent.id));
|
|
51
|
+
}
|
|
52
|
+
else if (operation.action === 'update_agent') {
|
|
53
|
+
const target = state.agentConfigs.find((agent) => agent.id === operation.agentId);
|
|
54
|
+
if (target && isRecord(operation.updates))
|
|
55
|
+
Object.assign(target, operation.updates);
|
|
56
|
+
}
|
|
57
|
+
else if (operation.action === 'publish') {
|
|
58
|
+
publishOperation(state, messageBus, operation, sourceMessage);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function operationAgentIds(value) {
|
|
62
|
+
return Array.isArray(value) ? value : [];
|
|
63
|
+
}
|
|
64
|
+
function operationsValue(message) {
|
|
65
|
+
const content = message.content;
|
|
66
|
+
if (!isRecord(content) || !isRecord(content.data))
|
|
67
|
+
return undefined;
|
|
68
|
+
return content.data.operations;
|
|
69
|
+
}
|
|
70
|
+
function handleClusterOperationsMessage(state, messageBus, message, templatesDir) {
|
|
71
|
+
const raw = operationsValue(message);
|
|
72
|
+
const operations = parseOperations(raw);
|
|
73
|
+
if (!operations) {
|
|
74
|
+
throw new Error(`CLUSTER_OPERATIONS missing operations array: ${JSON.stringify(raw)}`);
|
|
75
|
+
}
|
|
76
|
+
for (const operation of operations) {
|
|
77
|
+
applyClusterOperation({ state, messageBus, operation, sourceMessage: message, templatesDir });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import randomTopologyRuntime = require('./random-topology-runtime');
|
|
2
|
+
import type {
|
|
3
|
+
RandomSimulationState,
|
|
4
|
+
SimulationMessage,
|
|
5
|
+
SimulationMessageBus,
|
|
6
|
+
} from './random-topology-contracts';
|
|
7
|
+
import { addAgentsToState } from './random-topology-state';
|
|
8
|
+
|
|
9
|
+
type UnknownRecord = Record<string, unknown>;
|
|
10
|
+
|
|
11
|
+
function parseOperations(raw: unknown): unknown[] | null {
|
|
12
|
+
if (Array.isArray(raw)) return raw.map((operation: unknown) => operation);
|
|
13
|
+
if (typeof raw === 'string') {
|
|
14
|
+
const parsed: unknown = JSON.parse(raw);
|
|
15
|
+
return Array.isArray(parsed) ? parsed.map((operation: unknown) => operation) : null;
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function isRecord(value: unknown): value is UnknownRecord {
|
|
21
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function resolveConfigOperation(configOperation: unknown, templatesDir: string): UnknownRecord {
|
|
25
|
+
const resolver = new randomTopologyRuntime.TemplateResolver(templatesDir);
|
|
26
|
+
const resolved = resolver.resolveConfigReference(configOperation);
|
|
27
|
+
if (!isRecord(resolved) || !isRecord(resolved.loadedConfig)) {
|
|
28
|
+
throw new TypeError('TemplateResolver returned an invalid loadedConfig');
|
|
29
|
+
}
|
|
30
|
+
return resolved.loadedConfig;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface ApplyOperationOptions {
|
|
34
|
+
state: RandomSimulationState;
|
|
35
|
+
messageBus: SimulationMessageBus;
|
|
36
|
+
operation: unknown;
|
|
37
|
+
sourceMessage: SimulationMessage;
|
|
38
|
+
templatesDir: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function publishOperation(
|
|
42
|
+
state: RandomSimulationState,
|
|
43
|
+
messageBus: SimulationMessageBus,
|
|
44
|
+
operation: UnknownRecord,
|
|
45
|
+
sourceMessage: SimulationMessage
|
|
46
|
+
): void {
|
|
47
|
+
messageBus.publish({
|
|
48
|
+
cluster_id: state.cluster.id,
|
|
49
|
+
topic: operation.topic,
|
|
50
|
+
sender: '__sim_orchestrator__',
|
|
51
|
+
receiver: operation.receiver || 'broadcast',
|
|
52
|
+
content: operation.content || {},
|
|
53
|
+
metadata: operation.metadata || { fromTopic: sourceMessage.topic },
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function applyClusterOperation(options: ApplyOperationOptions): void {
|
|
58
|
+
const { state, messageBus, operation: operationValue, sourceMessage, templatesDir } = options;
|
|
59
|
+
if (!isRecord(operationValue) || !operationValue.action) return;
|
|
60
|
+
const operation = operationValue;
|
|
61
|
+
if (operation.action === 'load_config') {
|
|
62
|
+
addAgentsToState(state, resolveConfigOperation(operation.config, templatesDir).agents);
|
|
63
|
+
} else if (operation.action === 'add_agents') {
|
|
64
|
+
addAgentsToState(state, operation.agents);
|
|
65
|
+
} else if (operation.action === 'remove_agents') {
|
|
66
|
+
const ids = new Set(operationAgentIds(operation.agentIds));
|
|
67
|
+
state.agentConfigs = state.agentConfigs.filter((agent) => !ids.has(agent.id));
|
|
68
|
+
state.cluster.agents = state.cluster.agents.filter((agent) => !ids.has(agent.id));
|
|
69
|
+
} else if (operation.action === 'update_agent') {
|
|
70
|
+
const target = state.agentConfigs.find((agent) => agent.id === operation.agentId);
|
|
71
|
+
if (target && isRecord(operation.updates)) Object.assign(target, operation.updates);
|
|
72
|
+
} else if (operation.action === 'publish') {
|
|
73
|
+
publishOperation(state, messageBus, operation, sourceMessage);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function operationAgentIds(value: unknown): unknown[] {
|
|
78
|
+
return Array.isArray(value) ? value : [];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function operationsValue(message: SimulationMessage): unknown {
|
|
82
|
+
const content = message.content;
|
|
83
|
+
if (!isRecord(content) || !isRecord(content.data)) return undefined;
|
|
84
|
+
return content.data.operations;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export function handleClusterOperationsMessage(
|
|
88
|
+
state: RandomSimulationState,
|
|
89
|
+
messageBus: SimulationMessageBus,
|
|
90
|
+
message: SimulationMessage,
|
|
91
|
+
templatesDir: string
|
|
92
|
+
): void {
|
|
93
|
+
const raw = operationsValue(message);
|
|
94
|
+
const operations = parseOperations(raw);
|
|
95
|
+
if (!operations) {
|
|
96
|
+
throw new Error(`CLUSTER_OPERATIONS missing operations array: ${JSON.stringify(raw)}`);
|
|
97
|
+
}
|
|
98
|
+
for (const operation of operations) {
|
|
99
|
+
applyClusterOperation({ state, messageBus, operation, sourceMessage: message, templatesDir });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
function isTemplateResolverConstructor(value) {
|
|
3
|
+
return typeof value === 'function';
|
|
4
|
+
}
|
|
5
|
+
function isTriggerEvaluatorModule(value) {
|
|
6
|
+
return (typeof value === 'object' &&
|
|
7
|
+
value !== null &&
|
|
8
|
+
'findMatchingTrigger' in value &&
|
|
9
|
+
typeof value.findMatchingTrigger === 'function' &&
|
|
10
|
+
'evaluateTrigger' in value &&
|
|
11
|
+
typeof value.evaluateTrigger === 'function');
|
|
12
|
+
}
|
|
13
|
+
const templateResolverModule = require('../template-resolver');
|
|
14
|
+
const triggerEvaluatorModule = require('../agent/agent-trigger-evaluator');
|
|
15
|
+
if (!isTemplateResolverConstructor(templateResolverModule)) {
|
|
16
|
+
throw new TypeError('template-resolver must export a constructor');
|
|
17
|
+
}
|
|
18
|
+
if (!isTriggerEvaluatorModule(triggerEvaluatorModule)) {
|
|
19
|
+
throw new TypeError('agent-trigger-evaluator must export trigger functions');
|
|
20
|
+
}
|
|
21
|
+
module.exports = {
|
|
22
|
+
TemplateResolver: templateResolverModule,
|
|
23
|
+
findMatchingTrigger: triggerEvaluatorModule.findMatchingTrigger,
|
|
24
|
+
evaluateTrigger: triggerEvaluatorModule.evaluateTrigger,
|
|
25
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
interface TemplateResolverInstance {
|
|
2
|
+
resolveConfigReference(configOperation: unknown): unknown;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
interface TemplateResolverConstructor {
|
|
6
|
+
new (templatesDirectory: string): TemplateResolverInstance;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface TriggerEvaluatorModule {
|
|
10
|
+
findMatchingTrigger(options: unknown): unknown;
|
|
11
|
+
evaluateTrigger(options: unknown): boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function isTemplateResolverConstructor(value: unknown): value is TemplateResolverConstructor {
|
|
15
|
+
return typeof value === 'function';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function isTriggerEvaluatorModule(value: unknown): value is TriggerEvaluatorModule {
|
|
19
|
+
return (
|
|
20
|
+
typeof value === 'object' &&
|
|
21
|
+
value !== null &&
|
|
22
|
+
'findMatchingTrigger' in value &&
|
|
23
|
+
typeof value.findMatchingTrigger === 'function' &&
|
|
24
|
+
'evaluateTrigger' in value &&
|
|
25
|
+
typeof value.evaluateTrigger === 'function'
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const templateResolverModule: unknown = require('../template-resolver');
|
|
30
|
+
const triggerEvaluatorModule: unknown = require('../agent/agent-trigger-evaluator');
|
|
31
|
+
|
|
32
|
+
if (!isTemplateResolverConstructor(templateResolverModule)) {
|
|
33
|
+
throw new TypeError('template-resolver must export a constructor');
|
|
34
|
+
}
|
|
35
|
+
if (!isTriggerEvaluatorModule(triggerEvaluatorModule)) {
|
|
36
|
+
throw new TypeError('agent-trigger-evaluator must export trigger functions');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export = {
|
|
40
|
+
TemplateResolver: templateResolverModule,
|
|
41
|
+
findMatchingTrigger: triggerEvaluatorModule.findMatchingTrigger,
|
|
42
|
+
evaluateTrigger: triggerEvaluatorModule.evaluateTrigger,
|
|
43
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runScenario = runScenario;
|
|
4
|
+
const random_topology_message_loop_1 = require("./random-topology-message-loop");
|
|
5
|
+
const random_topology_schema_1 = require("./random-topology-schema");
|
|
6
|
+
const random_topology_state_1 = require("./random-topology-state");
|
|
7
|
+
const simulationRuntime = require("./simulation-runtime");
|
|
8
|
+
function createIssueOpenedMessage(clusterId) {
|
|
9
|
+
return {
|
|
10
|
+
cluster_id: clusterId,
|
|
11
|
+
topic: 'ISSUE_OPENED',
|
|
12
|
+
sender: 'system',
|
|
13
|
+
receiver: 'broadcast',
|
|
14
|
+
content: { text: 'template validation simulation', data: {} },
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function createState(options) {
|
|
18
|
+
const agentConfigs = (0, random_topology_state_1.cloneAgentConfigs)(options.config.agents || []);
|
|
19
|
+
return {
|
|
20
|
+
agentConfigs,
|
|
21
|
+
cluster: {
|
|
22
|
+
id: `sim-${options.templateId}-${options.seed}`,
|
|
23
|
+
agents: agentConfigs.map((agent) => ({ id: agent.id, role: agent.role })),
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async function runScenario(options) {
|
|
28
|
+
const state = createState(options);
|
|
29
|
+
const runtime = simulationRuntime.createSimulationRuntime(state.cluster);
|
|
30
|
+
const queue = [];
|
|
31
|
+
const unsubscribe = runtime.messageBus.subscribe((message) => queue.push(message));
|
|
32
|
+
const startedAt = Date.now();
|
|
33
|
+
try {
|
|
34
|
+
runtime.messageBus.publish(createIssueOpenedMessage(state.cluster.id));
|
|
35
|
+
return await (0, random_topology_message_loop_1.runMessageLoop)({
|
|
36
|
+
state,
|
|
37
|
+
messageBus: runtime.messageBus,
|
|
38
|
+
logicEngine: runtime.logicEngine,
|
|
39
|
+
iterations: new Map(),
|
|
40
|
+
rng: (0, random_topology_schema_1.createSeededRng)(options.seed),
|
|
41
|
+
queue,
|
|
42
|
+
templatesDir: options.templatesDir,
|
|
43
|
+
startedAt,
|
|
44
|
+
maxSteps: options.maxSteps,
|
|
45
|
+
maxScenarioMs: options.maxScenarioMs,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
unsubscribe();
|
|
50
|
+
runtime.ledger.close();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
RandomSimulationState,
|
|
3
|
+
RunScenarioOptions,
|
|
4
|
+
ScenarioOutcome,
|
|
5
|
+
SimulationMessage,
|
|
6
|
+
} from './random-topology-contracts';
|
|
7
|
+
import { runMessageLoop } from './random-topology-message-loop';
|
|
8
|
+
import { createSeededRng } from './random-topology-schema';
|
|
9
|
+
import { cloneAgentConfigs } from './random-topology-state';
|
|
10
|
+
import simulationRuntime = require('./simulation-runtime');
|
|
11
|
+
|
|
12
|
+
function createIssueOpenedMessage(clusterId: string): SimulationMessage {
|
|
13
|
+
return {
|
|
14
|
+
cluster_id: clusterId,
|
|
15
|
+
topic: 'ISSUE_OPENED',
|
|
16
|
+
sender: 'system',
|
|
17
|
+
receiver: 'broadcast',
|
|
18
|
+
content: { text: 'template validation simulation', data: {} },
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function createState(options: RunScenarioOptions): RandomSimulationState {
|
|
23
|
+
const agentConfigs = cloneAgentConfigs(options.config.agents || []);
|
|
24
|
+
return {
|
|
25
|
+
agentConfigs,
|
|
26
|
+
cluster: {
|
|
27
|
+
id: `sim-${options.templateId}-${options.seed}`,
|
|
28
|
+
agents: agentConfigs.map((agent) => ({ id: agent.id, role: agent.role })),
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function runScenario(options: RunScenarioOptions): Promise<ScenarioOutcome> {
|
|
34
|
+
const state = createState(options);
|
|
35
|
+
const runtime = simulationRuntime.createSimulationRuntime(state.cluster);
|
|
36
|
+
const queue: unknown[] = [];
|
|
37
|
+
const unsubscribe = runtime.messageBus.subscribe((message) => queue.push(message));
|
|
38
|
+
const startedAt = Date.now();
|
|
39
|
+
try {
|
|
40
|
+
runtime.messageBus.publish(createIssueOpenedMessage(state.cluster.id));
|
|
41
|
+
return await runMessageLoop({
|
|
42
|
+
state,
|
|
43
|
+
messageBus: runtime.messageBus,
|
|
44
|
+
logicEngine: runtime.logicEngine,
|
|
45
|
+
iterations: new Map(),
|
|
46
|
+
rng: createSeededRng(options.seed),
|
|
47
|
+
queue,
|
|
48
|
+
templatesDir: options.templatesDir,
|
|
49
|
+
startedAt,
|
|
50
|
+
maxSteps: options.maxSteps,
|
|
51
|
+
maxScenarioMs: options.maxScenarioMs,
|
|
52
|
+
});
|
|
53
|
+
} finally {
|
|
54
|
+
unsubscribe();
|
|
55
|
+
runtime.ledger.close();
|
|
56
|
+
}
|
|
57
|
+
}
|