@the-open-engine/zeroshot 6.38.0 → 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/agent-cli-provider/adapters/codex.d.ts.map +1 -1
- package/lib/agent-cli-provider/adapters/codex.js +3 -1
- package/lib/agent-cli-provider/adapters/codex.js.map +1 -1
- 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/agent-cli-provider/adapters/codex.ts +3 -1
- 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,208 @@
|
|
|
1
|
+
import contextMetrics = require('./context-metrics');
|
|
2
|
+
import contextPackCore = require('./context-pack-core');
|
|
3
|
+
|
|
4
|
+
import type {
|
|
5
|
+
ContextPackTruncationStage,
|
|
6
|
+
MutableContextPackDecision,
|
|
7
|
+
NormalizedContextPack,
|
|
8
|
+
RenderedVariant,
|
|
9
|
+
SelectedVariant,
|
|
10
|
+
} from './context-pack-types';
|
|
11
|
+
|
|
12
|
+
interface MaxCharsGuardParams {
|
|
13
|
+
packs: NormalizedContextPack[];
|
|
14
|
+
selected: Map<string, SelectedVariant>;
|
|
15
|
+
decisions: Map<string, MutableContextPackDecision>;
|
|
16
|
+
cache: Map<string, RenderedVariant>;
|
|
17
|
+
maxChars: number | undefined;
|
|
18
|
+
totalChars: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
interface MaxCharsMutationParams {
|
|
22
|
+
selected: Map<string, SelectedVariant>;
|
|
23
|
+
decisions: Map<string, MutableContextPackDecision>;
|
|
24
|
+
cache: Map<string, RenderedVariant>;
|
|
25
|
+
maxChars: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface RequiredTruncationParams {
|
|
29
|
+
packs: readonly NormalizedContextPack[];
|
|
30
|
+
selected: Map<string, SelectedVariant>;
|
|
31
|
+
decisions: Map<string, MutableContextPackDecision>;
|
|
32
|
+
currentChars: number;
|
|
33
|
+
maxChars: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const { estimateTokensFromChars } = contextMetrics;
|
|
37
|
+
const { renderVariant, sortByPriorityDescThenOrderDesc } = contextPackCore;
|
|
38
|
+
|
|
39
|
+
const TRUNCATION_SUFFIX = '\n\n[Context truncated to fit limit]\n';
|
|
40
|
+
|
|
41
|
+
function truncateText(text: string, targetChars: number): { text: string; truncated: boolean } {
|
|
42
|
+
if (text.length <= targetChars) {
|
|
43
|
+
return { text, truncated: false };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (targetChars <= 0) {
|
|
47
|
+
return { text: '', truncated: true };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (targetChars <= TRUNCATION_SUFFIX.length) {
|
|
51
|
+
return { text: text.slice(0, targetChars), truncated: true };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const sliceLength = targetChars - TRUNCATION_SUFFIX.length;
|
|
55
|
+
return {
|
|
56
|
+
text: text.slice(0, sliceLength) + TRUNCATION_SUFFIX,
|
|
57
|
+
truncated: true,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function compactOptionalPacks(
|
|
62
|
+
packs: readonly NormalizedContextPack[],
|
|
63
|
+
{ selected, decisions, cache, maxChars }: MaxCharsMutationParams,
|
|
64
|
+
startingChars: number
|
|
65
|
+
): number {
|
|
66
|
+
let currentChars = startingChars;
|
|
67
|
+
for (const pack of packs) {
|
|
68
|
+
if (currentChars <= maxChars) break;
|
|
69
|
+
const decision = decisions.get(pack.id);
|
|
70
|
+
if (!decision || decision.variant === 'compact' || !pack.compact) continue;
|
|
71
|
+
|
|
72
|
+
const compact = renderVariant(pack, 'compact', cache);
|
|
73
|
+
if (compact.chars === 0 || compact.chars >= decision.chars) continue;
|
|
74
|
+
|
|
75
|
+
const previousChars = decision.chars;
|
|
76
|
+
selected.set(pack.id, { ...compact, variant: 'compact' });
|
|
77
|
+
decision.variant = 'compact';
|
|
78
|
+
decision.chars = compact.chars;
|
|
79
|
+
decision.estimatedTokens = compact.estimatedTokens;
|
|
80
|
+
decision.reason = decision.reason || 'max_chars';
|
|
81
|
+
|
|
82
|
+
currentChars -= previousChars - compact.chars;
|
|
83
|
+
currentChars = Math.max(0, currentChars);
|
|
84
|
+
}
|
|
85
|
+
return currentChars;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function dropOptionalPacks(
|
|
89
|
+
packs: readonly NormalizedContextPack[],
|
|
90
|
+
{ selected, decisions, maxChars }: MaxCharsMutationParams,
|
|
91
|
+
startingChars: number
|
|
92
|
+
): number {
|
|
93
|
+
let currentChars = startingChars;
|
|
94
|
+
for (const pack of packs) {
|
|
95
|
+
if (currentChars <= maxChars) break;
|
|
96
|
+
if (!selected.has(pack.id)) continue;
|
|
97
|
+
|
|
98
|
+
const decision = decisions.get(pack.id);
|
|
99
|
+
currentChars -= decision?.chars || 0;
|
|
100
|
+
selected.delete(pack.id);
|
|
101
|
+
if (decision) {
|
|
102
|
+
decision.status = 'skipped';
|
|
103
|
+
decision.reason = decision.reason || 'max_chars';
|
|
104
|
+
decision.chars = 0;
|
|
105
|
+
decision.estimatedTokens = 0;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return currentChars;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function sortRequiredTruncationCandidates(
|
|
112
|
+
packs: readonly NormalizedContextPack[],
|
|
113
|
+
selected: ReadonlyMap<string, SelectedVariant>
|
|
114
|
+
): NormalizedContextPack[] {
|
|
115
|
+
return packs
|
|
116
|
+
.filter((pack) => selected.has(pack.id) && pack.required)
|
|
117
|
+
.sort((a, b) => {
|
|
118
|
+
const preserveDelta = (a.preserve ? 1 : 0) - (b.preserve ? 1 : 0);
|
|
119
|
+
if (preserveDelta !== 0) return preserveDelta;
|
|
120
|
+
const sizeDelta = (selected.get(b.id)?.chars || 0) - (selected.get(a.id)?.chars || 0);
|
|
121
|
+
if (sizeDelta !== 0) return sizeDelta;
|
|
122
|
+
return b.order - a.order;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function truncateRequiredPacks({
|
|
127
|
+
packs,
|
|
128
|
+
selected,
|
|
129
|
+
decisions,
|
|
130
|
+
currentChars,
|
|
131
|
+
maxChars,
|
|
132
|
+
}: RequiredTruncationParams): void {
|
|
133
|
+
let overage = currentChars - maxChars;
|
|
134
|
+
const requiredCandidates = sortRequiredTruncationCandidates(packs, selected);
|
|
135
|
+
|
|
136
|
+
for (const pack of requiredCandidates) {
|
|
137
|
+
if (overage <= 0) break;
|
|
138
|
+
const decision = decisions.get(pack.id);
|
|
139
|
+
const selectedPack = selected.get(pack.id);
|
|
140
|
+
if (!decision || !selectedPack) continue;
|
|
141
|
+
|
|
142
|
+
const targetChars = Math.max(0, selectedPack.chars - overage);
|
|
143
|
+
const truncated = truncateText(selectedPack.text, targetChars);
|
|
144
|
+
if (truncated.text.length === selectedPack.chars) continue;
|
|
145
|
+
|
|
146
|
+
const newChars = truncated.text.length;
|
|
147
|
+
overage -= selectedPack.chars - newChars;
|
|
148
|
+
selected.set(pack.id, {
|
|
149
|
+
text: truncated.text,
|
|
150
|
+
chars: newChars,
|
|
151
|
+
estimatedTokens: estimateTokensFromChars(newChars),
|
|
152
|
+
variant: selectedPack.variant,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
decision.chars = newChars;
|
|
156
|
+
decision.estimatedTokens = estimateTokensFromChars(newChars);
|
|
157
|
+
decision.truncated = true;
|
|
158
|
+
decision.reason = decision.reason || 'max_chars';
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function selectedChars(selected: ReadonlyMap<string, SelectedVariant>): number {
|
|
163
|
+
return Array.from(selected.values()).reduce((sum, item) => sum + item.chars, 0);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function applyMaxCharsGuard({
|
|
167
|
+
packs,
|
|
168
|
+
selected,
|
|
169
|
+
decisions,
|
|
170
|
+
cache,
|
|
171
|
+
maxChars,
|
|
172
|
+
totalChars,
|
|
173
|
+
}: MaxCharsGuardParams): ContextPackTruncationStage {
|
|
174
|
+
if (typeof maxChars !== 'number' || !Number.isFinite(maxChars) || totalChars <= maxChars) {
|
|
175
|
+
return {
|
|
176
|
+
applied: false,
|
|
177
|
+
beforeChars: totalChars,
|
|
178
|
+
afterChars: totalChars,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const includedOptional = packs
|
|
183
|
+
.filter((pack) => selected.has(pack.id) && !pack.required)
|
|
184
|
+
.sort(sortByPriorityDescThenOrderDesc);
|
|
185
|
+
const mutationParams = { selected, decisions, cache, maxChars };
|
|
186
|
+
let currentChars = compactOptionalPacks(includedOptional, mutationParams, totalChars);
|
|
187
|
+
currentChars = dropOptionalPacks(includedOptional, mutationParams, currentChars);
|
|
188
|
+
|
|
189
|
+
if (currentChars > maxChars) {
|
|
190
|
+
truncateRequiredPacks({
|
|
191
|
+
packs,
|
|
192
|
+
selected,
|
|
193
|
+
decisions,
|
|
194
|
+
currentChars,
|
|
195
|
+
maxChars,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return {
|
|
200
|
+
applied: true,
|
|
201
|
+
beforeChars: totalChars,
|
|
202
|
+
afterChars: selectedChars(selected),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export = {
|
|
207
|
+
applyMaxCharsGuard,
|
|
208
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export type ContextPackPriority = 'required' | 'high' | 'medium' | 'low';
|
|
2
|
+
export type ContextPackVariant = 'full' | 'compact';
|
|
3
|
+
export type ContextPackStatus = 'included' | 'skipped';
|
|
4
|
+
|
|
5
|
+
export interface ContextPack {
|
|
6
|
+
id: string;
|
|
7
|
+
section?: string | null;
|
|
8
|
+
priority?: string;
|
|
9
|
+
required?: boolean;
|
|
10
|
+
order?: number;
|
|
11
|
+
preserve?: boolean;
|
|
12
|
+
render?: () => unknown;
|
|
13
|
+
compact?: () => unknown;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface NormalizedContextPack extends ContextPack {
|
|
17
|
+
priority: ContextPackPriority;
|
|
18
|
+
required: boolean;
|
|
19
|
+
order: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface RenderedVariant {
|
|
23
|
+
text: string;
|
|
24
|
+
chars: number;
|
|
25
|
+
estimatedTokens: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface SelectedVariant extends RenderedVariant {
|
|
29
|
+
variant: ContextPackVariant;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface IncludedSelection extends SelectedVariant {
|
|
33
|
+
status: 'included';
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface SkippedSelection {
|
|
37
|
+
status: 'skipped';
|
|
38
|
+
variant: null;
|
|
39
|
+
reason: 'empty' | 'budget';
|
|
40
|
+
chars: 0;
|
|
41
|
+
estimatedTokens: 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export type PackSelection = IncludedSelection | SkippedSelection;
|
|
45
|
+
|
|
46
|
+
export interface ContextPackDecision {
|
|
47
|
+
id: string;
|
|
48
|
+
section: string | null;
|
|
49
|
+
priority: ContextPackPriority;
|
|
50
|
+
required: boolean;
|
|
51
|
+
status: ContextPackStatus;
|
|
52
|
+
variant: ContextPackVariant | null;
|
|
53
|
+
chars: number;
|
|
54
|
+
estimatedTokens: number;
|
|
55
|
+
order: number;
|
|
56
|
+
reason: string | null;
|
|
57
|
+
truncated: boolean;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface MutableContextPackDecision extends Omit<ContextPackDecision, 'truncated'> {
|
|
61
|
+
truncated?: boolean;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface PackSelectionState {
|
|
65
|
+
renderCache: Map<string, RenderedVariant>;
|
|
66
|
+
decisions: Map<string, MutableContextPackDecision>;
|
|
67
|
+
selected: Map<string, SelectedVariant>;
|
|
68
|
+
remainingTokens: number;
|
|
69
|
+
overBudgetTokens: number;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface ContextPackBudget {
|
|
73
|
+
maxTokens: number | undefined;
|
|
74
|
+
remainingTokens: number | null;
|
|
75
|
+
overBudgetTokens: number;
|
|
76
|
+
finalTokens: number;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface ContextPackTruncationStage {
|
|
80
|
+
applied: boolean;
|
|
81
|
+
beforeChars: number;
|
|
82
|
+
afterChars: number;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface ContextPackResult {
|
|
86
|
+
context: string;
|
|
87
|
+
packDecisions: ContextPackDecision[];
|
|
88
|
+
budget: ContextPackBudget;
|
|
89
|
+
truncation: {
|
|
90
|
+
maxContextChars: ContextPackTruncationStage;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface BuildContextPacksParams {
|
|
95
|
+
packs: ContextPack[];
|
|
96
|
+
maxTokens?: number | undefined;
|
|
97
|
+
maxChars?: number | undefined;
|
|
98
|
+
}
|
|
@@ -1,51 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
const RAW_LOG_ONLY_REPLAY_POLICY = 'raw_log_only';
|
|
2
3
|
const CONTEXT_REPLAY_POLICY = 'context';
|
|
3
|
-
|
|
4
4
|
function buildRawLogOnlyMetadata(extra = {}) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
return {
|
|
6
|
+
...extra,
|
|
7
|
+
contextSafe: false,
|
|
8
|
+
replayPolicy: RAW_LOG_ONLY_REPLAY_POLICY,
|
|
9
|
+
};
|
|
10
10
|
}
|
|
11
|
-
|
|
12
11
|
function getReplayPolicy(message) {
|
|
13
|
-
|
|
12
|
+
return message?.metadata?.replayPolicy ?? message?.content?.data?.replayPolicy;
|
|
14
13
|
}
|
|
15
|
-
|
|
16
14
|
function getContextSafe(message) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return null;
|
|
15
|
+
if (typeof message?.metadata?.contextSafe === 'boolean') {
|
|
16
|
+
return message.metadata.contextSafe;
|
|
17
|
+
}
|
|
18
|
+
if (typeof message?.content?.data?.contextSafe === 'boolean') {
|
|
19
|
+
return message.content.data.contextSafe;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
26
22
|
}
|
|
27
|
-
|
|
28
23
|
function isReplayableMessage(message) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return message?.topic !== 'AGENT_OUTPUT';
|
|
24
|
+
const contextSafe = getContextSafe(message);
|
|
25
|
+
if (contextSafe !== null) {
|
|
26
|
+
return contextSafe;
|
|
27
|
+
}
|
|
28
|
+
const replayPolicy = getReplayPolicy(message);
|
|
29
|
+
if (replayPolicy === RAW_LOG_ONLY_REPLAY_POLICY) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if (replayPolicy === CONTEXT_REPLAY_POLICY) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
return message?.topic !== 'AGENT_OUTPUT';
|
|
44
36
|
}
|
|
45
|
-
|
|
46
37
|
module.exports = {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
38
|
+
RAW_LOG_ONLY_REPLAY_POLICY,
|
|
39
|
+
CONTEXT_REPLAY_POLICY,
|
|
40
|
+
buildRawLogOnlyMetadata,
|
|
41
|
+
isReplayableMessage,
|
|
51
42
|
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const RAW_LOG_ONLY_REPLAY_POLICY = 'raw_log_only';
|
|
2
|
+
const CONTEXT_REPLAY_POLICY = 'context';
|
|
3
|
+
|
|
4
|
+
type ReplayMetadata = Record<string, unknown> & {
|
|
5
|
+
readonly contextSafe?: unknown;
|
|
6
|
+
readonly replayPolicy?: unknown;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
interface ReplayMessage {
|
|
10
|
+
readonly topic?: unknown;
|
|
11
|
+
readonly metadata?: ReplayMetadata | null;
|
|
12
|
+
readonly content?: {
|
|
13
|
+
readonly data?: {
|
|
14
|
+
readonly contextSafe?: unknown;
|
|
15
|
+
readonly replayPolicy?: unknown;
|
|
16
|
+
} | null;
|
|
17
|
+
} | null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function buildRawLogOnlyMetadata(extra: Record<string, unknown> = {}): {
|
|
21
|
+
contextSafe: false;
|
|
22
|
+
replayPolicy: typeof RAW_LOG_ONLY_REPLAY_POLICY;
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
} {
|
|
25
|
+
return {
|
|
26
|
+
...extra,
|
|
27
|
+
contextSafe: false,
|
|
28
|
+
replayPolicy: RAW_LOG_ONLY_REPLAY_POLICY,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function getReplayPolicy(message: ReplayMessage | null | undefined): unknown {
|
|
33
|
+
return message?.metadata?.replayPolicy ?? message?.content?.data?.replayPolicy;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function getContextSafe(message: ReplayMessage | null | undefined): boolean | null {
|
|
37
|
+
if (typeof message?.metadata?.contextSafe === 'boolean') {
|
|
38
|
+
return message.metadata.contextSafe;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (typeof message?.content?.data?.contextSafe === 'boolean') {
|
|
42
|
+
return message.content.data.contextSafe;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function isReplayableMessage(message: ReplayMessage | null | undefined): boolean {
|
|
49
|
+
const contextSafe = getContextSafe(message);
|
|
50
|
+
if (contextSafe !== null) {
|
|
51
|
+
return contextSafe;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const replayPolicy = getReplayPolicy(message);
|
|
55
|
+
if (replayPolicy === RAW_LOG_ONLY_REPLAY_POLICY) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (replayPolicy === CONTEXT_REPLAY_POLICY) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return message?.topic !== 'AGENT_OUTPUT';
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export = {
|
|
67
|
+
RAW_LOG_ONLY_REPLAY_POLICY,
|
|
68
|
+
CONTEXT_REPLAY_POLICY,
|
|
69
|
+
buildRawLogOnlyMetadata,
|
|
70
|
+
isReplayableMessage,
|
|
71
|
+
};
|
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
"use strict";
|
|
3
2
|
// Validators publish a rejection when their task exhausts retries. Every other named role can
|
|
4
3
|
// execute provider work, including user-defined and orchestrator roles, so exhaustion must
|
|
5
4
|
// terminalize the cluster by default instead of requiring this policy to know each future role.
|
|
6
5
|
const NON_TERMINAL_AGENT_ROLES = new Set(['validator']);
|
|
7
|
-
|
|
8
6
|
function isCriticalAgent(agent) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
typeof agent?.role === 'string' &&
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
);
|
|
7
|
+
if (agent?.id === 'consensus-coordinator')
|
|
8
|
+
return true;
|
|
9
|
+
return (typeof agent?.role === 'string' &&
|
|
10
|
+
agent.role.length > 0 &&
|
|
11
|
+
!NON_TERMINAL_AGENT_ROLES.has(agent.role));
|
|
15
12
|
}
|
|
16
|
-
|
|
17
13
|
module.exports = { isCriticalAgent };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface AgentIdentity {
|
|
2
|
+
readonly id?: unknown;
|
|
3
|
+
readonly role?: unknown;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
// Validators publish a rejection when their task exhausts retries. Every other named role can
|
|
7
|
+
// execute provider work, including user-defined and orchestrator roles, so exhaustion must
|
|
8
|
+
// terminalize the cluster by default instead of requiring this policy to know each future role.
|
|
9
|
+
const NON_TERMINAL_AGENT_ROLES: ReadonlySet<string> = new Set(['validator']);
|
|
10
|
+
|
|
11
|
+
function isCriticalAgent(agent: AgentIdentity | null | undefined): boolean {
|
|
12
|
+
if (agent?.id === 'consensus-coordinator') return true;
|
|
13
|
+
return (
|
|
14
|
+
typeof agent?.role === 'string' &&
|
|
15
|
+
agent.role.length > 0 &&
|
|
16
|
+
!NON_TERMINAL_AGENT_ROLES.has(agent.role)
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export = { isCriticalAgent };
|
|
@@ -1,99 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const ledgerSequence = require("../ledger-sequence");
|
|
1
3
|
const GUIDANCE_BLOCK_START = '<<GUIDANCE_QUEUE_START>>';
|
|
2
4
|
const GUIDANCE_BLOCK_END = '<<GUIDANCE_QUEUE_END>>';
|
|
3
|
-
const { compareMessageSequences } =
|
|
4
|
-
|
|
5
|
+
const { compareMessageSequences } = ledgerSequence;
|
|
5
6
|
function formatGuidanceMessage(message) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return formatted.trimEnd();
|
|
7
|
+
const timestamp = typeof message.timestamp === 'number' && Number.isFinite(message.timestamp)
|
|
8
|
+
? new Date(message.timestamp).toISOString()
|
|
9
|
+
: new Date().toISOString();
|
|
10
|
+
const sender = message.sender || 'unknown';
|
|
11
|
+
const topic = message.topic || 'GUIDANCE';
|
|
12
|
+
const target = message.receiver || message.target_agent_id;
|
|
13
|
+
const targetSuffix = target ? ` -> ${target}` : '';
|
|
14
|
+
let formatted = `[${timestamp}] ${sender} (${topic}${targetSuffix})\n`;
|
|
15
|
+
if (message.content?.text) {
|
|
16
|
+
formatted += `${message.content.text}\n`;
|
|
17
|
+
}
|
|
18
|
+
if (message.content?.data) {
|
|
19
|
+
formatted += `${JSON.stringify(message.content.data, null, 2)}\n`;
|
|
20
|
+
}
|
|
21
|
+
return formatted.trimEnd();
|
|
23
22
|
}
|
|
24
|
-
|
|
25
23
|
function orderGuidanceMessages(messages, orderBySequence) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
return messages.slice().sort((left, right) => {
|
|
25
|
+
if (orderBySequence) {
|
|
26
|
+
return compareMessageSequences(left.sequence || '0', right.sequence || '0');
|
|
27
|
+
}
|
|
28
|
+
return (left.timestamp || 0) - (right.timestamp || 0);
|
|
29
|
+
});
|
|
32
30
|
}
|
|
33
|
-
|
|
34
31
|
function formatGuidanceBlock(messages, { orderBySequence = false } = {}) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
block += `\n${GUIDANCE_BLOCK_END}\n\n`;
|
|
50
|
-
return block;
|
|
32
|
+
if (!Array.isArray(messages) || messages.length === 0)
|
|
33
|
+
return '';
|
|
34
|
+
const ordered = orderGuidanceMessages(messages, orderBySequence);
|
|
35
|
+
let block = '## Guidance (Queued)\n\n';
|
|
36
|
+
block += `${GUIDANCE_BLOCK_START}\n`;
|
|
37
|
+
ordered.forEach((message, index) => {
|
|
38
|
+
block += `${formatGuidanceMessage(message)}\n`;
|
|
39
|
+
if (index < ordered.length - 1) {
|
|
40
|
+
block += '\n';
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
block += `\n${GUIDANCE_BLOCK_END}\n\n`;
|
|
44
|
+
return block;
|
|
51
45
|
}
|
|
52
|
-
|
|
53
|
-
function collectQueuedGuidance({
|
|
54
|
-
messageBus,
|
|
55
|
-
clusterId,
|
|
56
|
-
agentId,
|
|
57
|
-
afterId,
|
|
58
|
-
throughId,
|
|
59
|
-
lastDeliveredAt,
|
|
60
|
-
limit,
|
|
61
|
-
}) {
|
|
62
|
-
if (!messageBus) {
|
|
63
|
-
throw new Error('collectQueuedGuidance: messageBus is required');
|
|
64
|
-
}
|
|
65
|
-
if (!clusterId) {
|
|
66
|
-
throw new Error('collectQueuedGuidance: clusterId is required');
|
|
67
|
-
}
|
|
68
|
-
if (!agentId) {
|
|
69
|
-
throw new Error('collectQueuedGuidance: agentId is required');
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const messages = messageBus.queryGuidanceMailbox({
|
|
73
|
-
cluster_id: clusterId,
|
|
74
|
-
target_agent_id: agentId,
|
|
75
|
-
afterId,
|
|
76
|
-
throughId,
|
|
77
|
-
lastDeliveredAt,
|
|
78
|
-
limit,
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
if (!messages.length) {
|
|
46
|
+
function emptyQueuedGuidance() {
|
|
82
47
|
return { messages: [], latestSequence: null, latestTimestamp: null, guidanceBlock: '' };
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const sequenceBounded = afterId !== undefined || throughId !== undefined;
|
|
86
|
-
const ordered = orderGuidanceMessages(messages, sequenceBounded);
|
|
87
|
-
const latestSequence = ordered[ordered.length - 1].sequence;
|
|
88
|
-
const latestTimestamp = ordered[ordered.length - 1].timestamp;
|
|
89
|
-
const guidanceBlock = formatGuidanceBlock(ordered, { orderBySequence: sequenceBounded });
|
|
90
|
-
|
|
91
|
-
return { messages: ordered, latestSequence, latestTimestamp, guidanceBlock };
|
|
92
48
|
}
|
|
93
|
-
|
|
49
|
+
function collectQueuedGuidance({ messageBus, clusterId, agentId, afterId, throughId, lastDeliveredAt, limit, }) {
|
|
50
|
+
if (!messageBus) {
|
|
51
|
+
throw new Error('collectQueuedGuidance: messageBus is required');
|
|
52
|
+
}
|
|
53
|
+
if (!clusterId) {
|
|
54
|
+
throw new Error('collectQueuedGuidance: clusterId is required');
|
|
55
|
+
}
|
|
56
|
+
if (!agentId) {
|
|
57
|
+
throw new Error('collectQueuedGuidance: agentId is required');
|
|
58
|
+
}
|
|
59
|
+
const messages = messageBus.queryGuidanceMailbox({
|
|
60
|
+
cluster_id: clusterId,
|
|
61
|
+
target_agent_id: agentId,
|
|
62
|
+
afterId,
|
|
63
|
+
throughId,
|
|
64
|
+
lastDeliveredAt,
|
|
65
|
+
limit,
|
|
66
|
+
});
|
|
67
|
+
if (!messages.length) {
|
|
68
|
+
return emptyQueuedGuidance();
|
|
69
|
+
}
|
|
70
|
+
const sequenceBounded = afterId !== undefined || throughId !== undefined;
|
|
71
|
+
const ordered = orderGuidanceMessages(messages, sequenceBounded);
|
|
72
|
+
const latestMessage = ordered.at(-1);
|
|
73
|
+
if (!latestMessage) {
|
|
74
|
+
return emptyQueuedGuidance();
|
|
75
|
+
}
|
|
76
|
+
const latestSequence = latestMessage.sequence;
|
|
77
|
+
const latestTimestamp = latestMessage.timestamp;
|
|
78
|
+
const guidanceBlock = formatGuidanceBlock(ordered, { orderBySequence: sequenceBounded });
|
|
79
|
+
return { messages: ordered, latestSequence, latestTimestamp, guidanceBlock };
|
|
80
|
+
}
|
|
94
81
|
module.exports = {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
82
|
+
GUIDANCE_BLOCK_START,
|
|
83
|
+
GUIDANCE_BLOCK_END,
|
|
84
|
+
formatGuidanceBlock,
|
|
85
|
+
collectQueuedGuidance,
|
|
99
86
|
};
|