@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,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const LIMITS = {
|
|
3
|
+
errors: 5,
|
|
4
|
+
criteriaResults: 10,
|
|
5
|
+
acceptanceCriteria: 10,
|
|
6
|
+
filesAffected: 20,
|
|
7
|
+
blockers: 5,
|
|
8
|
+
nextSteps: 10,
|
|
9
|
+
rootCauses: 5,
|
|
10
|
+
};
|
|
11
|
+
const TEXT_LIMITS = {
|
|
12
|
+
task: 2000,
|
|
13
|
+
plan: 2500, // Slightly increased for actionable plans with embedded patterns (was 2000)
|
|
14
|
+
fixPlan: 1200,
|
|
15
|
+
summary: 300,
|
|
16
|
+
listItem: 200,
|
|
17
|
+
};
|
|
18
|
+
function isRecord(value) {
|
|
19
|
+
return typeof value === 'object' && value !== null;
|
|
20
|
+
}
|
|
21
|
+
function asRecord(value) {
|
|
22
|
+
return isRecord(value) ? value : null;
|
|
23
|
+
}
|
|
24
|
+
function isPresentString(value) {
|
|
25
|
+
return Boolean(value);
|
|
26
|
+
}
|
|
27
|
+
function toTimestamp(message) {
|
|
28
|
+
const timestamp = asRecord(message)?.timestamp;
|
|
29
|
+
if (typeof timestamp === 'number' && Number.isFinite(timestamp)) {
|
|
30
|
+
return timestamp;
|
|
31
|
+
}
|
|
32
|
+
return Date.now();
|
|
33
|
+
}
|
|
34
|
+
function normalizeText(value, maxLength, singleLine = false) {
|
|
35
|
+
if (value === undefined || value === null)
|
|
36
|
+
return undefined;
|
|
37
|
+
let text = String(value);
|
|
38
|
+
if (singleLine) {
|
|
39
|
+
text = text.replace(/\s+/g, ' ').trim();
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
text = text.trim();
|
|
43
|
+
}
|
|
44
|
+
if (!text)
|
|
45
|
+
return undefined;
|
|
46
|
+
if (maxLength && text.length > maxLength) {
|
|
47
|
+
return `${text.slice(0, maxLength - 3)}...`;
|
|
48
|
+
}
|
|
49
|
+
return text;
|
|
50
|
+
}
|
|
51
|
+
function normalizeStringList(list, maxItems) {
|
|
52
|
+
if (!Array.isArray(list))
|
|
53
|
+
return undefined;
|
|
54
|
+
const normalized = list
|
|
55
|
+
.map((item) => normalizeText(item, TEXT_LIMITS.listItem, true))
|
|
56
|
+
.filter(isPresentString);
|
|
57
|
+
if (normalized.length === 0)
|
|
58
|
+
return undefined;
|
|
59
|
+
if (maxItems && normalized.length > maxItems) {
|
|
60
|
+
return normalized.slice(-maxItems);
|
|
61
|
+
}
|
|
62
|
+
return normalized;
|
|
63
|
+
}
|
|
64
|
+
function normalizeAcceptanceCriteria(criteria) {
|
|
65
|
+
if (!Array.isArray(criteria))
|
|
66
|
+
return undefined;
|
|
67
|
+
const normalized = criteria
|
|
68
|
+
.map((item) => {
|
|
69
|
+
if (typeof item === 'string') {
|
|
70
|
+
return normalizeText(item, TEXT_LIMITS.listItem, true);
|
|
71
|
+
}
|
|
72
|
+
const itemRecord = asRecord(item);
|
|
73
|
+
if (!itemRecord)
|
|
74
|
+
return undefined;
|
|
75
|
+
const id = itemRecord.id ? String(itemRecord.id) : '';
|
|
76
|
+
const priority = itemRecord.priority ? ` (${String(itemRecord.priority)})` : '';
|
|
77
|
+
const criterion = itemRecord.criterion || itemRecord.text || itemRecord.summary || '';
|
|
78
|
+
const label = id ? `${id}${priority}: ` : '';
|
|
79
|
+
const merged = `${label}${String(criterion)}`.trim();
|
|
80
|
+
if (!merged)
|
|
81
|
+
return undefined;
|
|
82
|
+
return normalizeText(merged, TEXT_LIMITS.listItem, true);
|
|
83
|
+
})
|
|
84
|
+
.filter(isPresentString);
|
|
85
|
+
if (normalized.length === 0)
|
|
86
|
+
return undefined;
|
|
87
|
+
if (normalized.length > LIMITS.acceptanceCriteria) {
|
|
88
|
+
return normalized.slice(-LIMITS.acceptanceCriteria);
|
|
89
|
+
}
|
|
90
|
+
return normalized;
|
|
91
|
+
}
|
|
92
|
+
function normalizeCriteriaEvidence(evidence) {
|
|
93
|
+
const evidenceRecord = asRecord(evidence);
|
|
94
|
+
if (!evidenceRecord)
|
|
95
|
+
return undefined;
|
|
96
|
+
const normalized = {};
|
|
97
|
+
if (evidenceRecord.command) {
|
|
98
|
+
const command = normalizeText(evidenceRecord.command, TEXT_LIMITS.listItem, true);
|
|
99
|
+
if (command)
|
|
100
|
+
normalized.command = command;
|
|
101
|
+
}
|
|
102
|
+
if (typeof evidenceRecord.exitCode === 'number' && Number.isFinite(evidenceRecord.exitCode)) {
|
|
103
|
+
normalized.exitCode = evidenceRecord.exitCode;
|
|
104
|
+
}
|
|
105
|
+
return Object.keys(normalized).length > 0 ? normalized : undefined;
|
|
106
|
+
}
|
|
107
|
+
function normalizeCriteriaResult(item) {
|
|
108
|
+
const itemRecord = asRecord(item);
|
|
109
|
+
if (!itemRecord)
|
|
110
|
+
return undefined;
|
|
111
|
+
const entry = {};
|
|
112
|
+
if (itemRecord.id)
|
|
113
|
+
entry.id = String(itemRecord.id);
|
|
114
|
+
if (itemRecord.status)
|
|
115
|
+
entry.status = String(itemRecord.status);
|
|
116
|
+
if (itemRecord.reason) {
|
|
117
|
+
const reason = normalizeText(itemRecord.reason, TEXT_LIMITS.listItem, true);
|
|
118
|
+
if (reason)
|
|
119
|
+
entry.reason = reason;
|
|
120
|
+
}
|
|
121
|
+
const evidence = normalizeCriteriaEvidence(itemRecord.evidence);
|
|
122
|
+
if (evidence)
|
|
123
|
+
entry.evidence = evidence;
|
|
124
|
+
return Object.keys(entry).length > 0 ? entry : undefined;
|
|
125
|
+
}
|
|
126
|
+
function isPresentRecord(value) {
|
|
127
|
+
return value !== undefined;
|
|
128
|
+
}
|
|
129
|
+
function normalizeCriteriaResults(results) {
|
|
130
|
+
if (!Array.isArray(results))
|
|
131
|
+
return undefined;
|
|
132
|
+
const normalized = results.map(normalizeCriteriaResult).filter(isPresentRecord);
|
|
133
|
+
if (normalized.length === 0)
|
|
134
|
+
return undefined;
|
|
135
|
+
if (normalized.length > LIMITS.criteriaResults) {
|
|
136
|
+
return normalized.slice(-LIMITS.criteriaResults);
|
|
137
|
+
}
|
|
138
|
+
return normalized;
|
|
139
|
+
}
|
|
140
|
+
function normalizeErrors(data) {
|
|
141
|
+
const dataRecord = asRecord(data);
|
|
142
|
+
if (!dataRecord)
|
|
143
|
+
return undefined;
|
|
144
|
+
if (Array.isArray(dataRecord.errors)) {
|
|
145
|
+
return normalizeStringList(dataRecord.errors, LIMITS.errors);
|
|
146
|
+
}
|
|
147
|
+
if (Array.isArray(dataRecord.issues)) {
|
|
148
|
+
const mapped = dataRecord.issues.map((issue) => {
|
|
149
|
+
if (typeof issue === 'string')
|
|
150
|
+
return issue;
|
|
151
|
+
const issueRecord = asRecord(issue);
|
|
152
|
+
if (!issueRecord)
|
|
153
|
+
return undefined;
|
|
154
|
+
return (issueRecord.bug ||
|
|
155
|
+
issueRecord.message ||
|
|
156
|
+
issueRecord.error ||
|
|
157
|
+
issueRecord.summary ||
|
|
158
|
+
undefined);
|
|
159
|
+
});
|
|
160
|
+
return normalizeStringList(mapped, LIMITS.errors);
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
function normalizeRootCauses(rootCauses) {
|
|
165
|
+
if (!Array.isArray(rootCauses))
|
|
166
|
+
return undefined;
|
|
167
|
+
const normalized = rootCauses
|
|
168
|
+
.map((cause) => {
|
|
169
|
+
if (typeof cause === 'string') {
|
|
170
|
+
return normalizeText(cause, TEXT_LIMITS.listItem, true);
|
|
171
|
+
}
|
|
172
|
+
const causeRecord = asRecord(cause);
|
|
173
|
+
if (!causeRecord)
|
|
174
|
+
return undefined;
|
|
175
|
+
return normalizeText(causeRecord.cause || causeRecord.summary || causeRecord.description, TEXT_LIMITS.listItem, true);
|
|
176
|
+
})
|
|
177
|
+
.filter(isPresentString);
|
|
178
|
+
if (normalized.length === 0)
|
|
179
|
+
return undefined;
|
|
180
|
+
if (normalized.length > LIMITS.rootCauses) {
|
|
181
|
+
return normalized.slice(-LIMITS.rootCauses);
|
|
182
|
+
}
|
|
183
|
+
return normalized;
|
|
184
|
+
}
|
|
185
|
+
function normalizeFilesAffected(filesAffected) {
|
|
186
|
+
return normalizeStringList(filesAffected, LIMITS.filesAffected);
|
|
187
|
+
}
|
|
188
|
+
function normalizeBoolean(value) {
|
|
189
|
+
if (typeof value === 'boolean')
|
|
190
|
+
return value;
|
|
191
|
+
if (value === 'true')
|
|
192
|
+
return true;
|
|
193
|
+
if (value === 'false')
|
|
194
|
+
return false;
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
function normalizeProgressStatus(data) {
|
|
198
|
+
const dataRecord = asRecord(data);
|
|
199
|
+
if (!dataRecord)
|
|
200
|
+
return undefined;
|
|
201
|
+
const completionStatus = asRecord(dataRecord.completionStatus);
|
|
202
|
+
if (completionStatus) {
|
|
203
|
+
return completionStatus;
|
|
204
|
+
}
|
|
205
|
+
const hasProgressFields = Object.prototype.hasOwnProperty.call(dataRecord, 'canValidate') ||
|
|
206
|
+
Object.prototype.hasOwnProperty.call(dataRecord, 'percentComplete');
|
|
207
|
+
return hasProgressFields ? dataRecord : undefined;
|
|
208
|
+
}
|
|
209
|
+
module.exports = {
|
|
210
|
+
LIMITS,
|
|
211
|
+
TEXT_LIMITS,
|
|
212
|
+
asRecord,
|
|
213
|
+
isPresentString,
|
|
214
|
+
toTimestamp,
|
|
215
|
+
normalizeText,
|
|
216
|
+
normalizeStringList,
|
|
217
|
+
normalizeAcceptanceCriteria,
|
|
218
|
+
normalizeCriteriaResults,
|
|
219
|
+
normalizeErrors,
|
|
220
|
+
normalizeRootCauses,
|
|
221
|
+
normalizeFilesAffected,
|
|
222
|
+
normalizeBoolean,
|
|
223
|
+
normalizeProgressStatus,
|
|
224
|
+
};
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
type UnknownRecord = Record<string, unknown>;
|
|
2
|
+
|
|
3
|
+
const LIMITS = {
|
|
4
|
+
errors: 5,
|
|
5
|
+
criteriaResults: 10,
|
|
6
|
+
acceptanceCriteria: 10,
|
|
7
|
+
filesAffected: 20,
|
|
8
|
+
blockers: 5,
|
|
9
|
+
nextSteps: 10,
|
|
10
|
+
rootCauses: 5,
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const TEXT_LIMITS = {
|
|
14
|
+
task: 2000,
|
|
15
|
+
plan: 2500, // Slightly increased for actionable plans with embedded patterns (was 2000)
|
|
16
|
+
fixPlan: 1200,
|
|
17
|
+
summary: 300,
|
|
18
|
+
listItem: 200,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
function isRecord(value: unknown): value is UnknownRecord {
|
|
22
|
+
return typeof value === 'object' && value !== null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function asRecord(value: unknown): UnknownRecord | null {
|
|
26
|
+
return isRecord(value) ? value : null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function isPresentString(value: string | undefined): value is string {
|
|
30
|
+
return Boolean(value);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function toTimestamp(message: unknown): number {
|
|
34
|
+
const timestamp = asRecord(message)?.timestamp;
|
|
35
|
+
if (typeof timestamp === 'number' && Number.isFinite(timestamp)) {
|
|
36
|
+
return timestamp;
|
|
37
|
+
}
|
|
38
|
+
return Date.now();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function normalizeText(value: unknown, maxLength: number, singleLine = false): string | undefined {
|
|
42
|
+
if (value === undefined || value === null) return undefined;
|
|
43
|
+
let text = String(value);
|
|
44
|
+
if (singleLine) {
|
|
45
|
+
text = text.replace(/\s+/g, ' ').trim();
|
|
46
|
+
} else {
|
|
47
|
+
text = text.trim();
|
|
48
|
+
}
|
|
49
|
+
if (!text) return undefined;
|
|
50
|
+
if (maxLength && text.length > maxLength) {
|
|
51
|
+
return `${text.slice(0, maxLength - 3)}...`;
|
|
52
|
+
}
|
|
53
|
+
return text;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function normalizeStringList(list: unknown, maxItems: number): string[] | undefined {
|
|
57
|
+
if (!Array.isArray(list)) return undefined;
|
|
58
|
+
const normalized = list
|
|
59
|
+
.map((item: unknown) => normalizeText(item, TEXT_LIMITS.listItem, true))
|
|
60
|
+
.filter(isPresentString);
|
|
61
|
+
if (normalized.length === 0) return undefined;
|
|
62
|
+
if (maxItems && normalized.length > maxItems) {
|
|
63
|
+
return normalized.slice(-maxItems);
|
|
64
|
+
}
|
|
65
|
+
return normalized;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function normalizeAcceptanceCriteria(criteria: unknown): string[] | undefined {
|
|
69
|
+
if (!Array.isArray(criteria)) return undefined;
|
|
70
|
+
const normalized = criteria
|
|
71
|
+
.map((item: unknown) => {
|
|
72
|
+
if (typeof item === 'string') {
|
|
73
|
+
return normalizeText(item, TEXT_LIMITS.listItem, true);
|
|
74
|
+
}
|
|
75
|
+
const itemRecord = asRecord(item);
|
|
76
|
+
if (!itemRecord) return undefined;
|
|
77
|
+
const id = itemRecord.id ? String(itemRecord.id) : '';
|
|
78
|
+
const priority = itemRecord.priority ? ` (${String(itemRecord.priority)})` : '';
|
|
79
|
+
const criterion = itemRecord.criterion || itemRecord.text || itemRecord.summary || '';
|
|
80
|
+
const label = id ? `${id}${priority}: ` : '';
|
|
81
|
+
const merged = `${label}${String(criterion)}`.trim();
|
|
82
|
+
if (!merged) return undefined;
|
|
83
|
+
return normalizeText(merged, TEXT_LIMITS.listItem, true);
|
|
84
|
+
})
|
|
85
|
+
.filter(isPresentString);
|
|
86
|
+
if (normalized.length === 0) return undefined;
|
|
87
|
+
if (normalized.length > LIMITS.acceptanceCriteria) {
|
|
88
|
+
return normalized.slice(-LIMITS.acceptanceCriteria);
|
|
89
|
+
}
|
|
90
|
+
return normalized;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function normalizeCriteriaEvidence(evidence: unknown): UnknownRecord | undefined {
|
|
94
|
+
const evidenceRecord = asRecord(evidence);
|
|
95
|
+
if (!evidenceRecord) return undefined;
|
|
96
|
+
const normalized: UnknownRecord = {};
|
|
97
|
+
if (evidenceRecord.command) {
|
|
98
|
+
const command = normalizeText(evidenceRecord.command, TEXT_LIMITS.listItem, true);
|
|
99
|
+
if (command) normalized.command = command;
|
|
100
|
+
}
|
|
101
|
+
if (typeof evidenceRecord.exitCode === 'number' && Number.isFinite(evidenceRecord.exitCode)) {
|
|
102
|
+
normalized.exitCode = evidenceRecord.exitCode;
|
|
103
|
+
}
|
|
104
|
+
return Object.keys(normalized).length > 0 ? normalized : undefined;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function normalizeCriteriaResult(item: unknown): UnknownRecord | undefined {
|
|
108
|
+
const itemRecord = asRecord(item);
|
|
109
|
+
if (!itemRecord) return undefined;
|
|
110
|
+
const entry: UnknownRecord = {};
|
|
111
|
+
if (itemRecord.id) entry.id = String(itemRecord.id);
|
|
112
|
+
if (itemRecord.status) entry.status = String(itemRecord.status);
|
|
113
|
+
if (itemRecord.reason) {
|
|
114
|
+
const reason = normalizeText(itemRecord.reason, TEXT_LIMITS.listItem, true);
|
|
115
|
+
if (reason) entry.reason = reason;
|
|
116
|
+
}
|
|
117
|
+
const evidence = normalizeCriteriaEvidence(itemRecord.evidence);
|
|
118
|
+
if (evidence) entry.evidence = evidence;
|
|
119
|
+
return Object.keys(entry).length > 0 ? entry : undefined;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function isPresentRecord(value: UnknownRecord | undefined): value is UnknownRecord {
|
|
123
|
+
return value !== undefined;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function normalizeCriteriaResults(results: unknown): UnknownRecord[] | undefined {
|
|
127
|
+
if (!Array.isArray(results)) return undefined;
|
|
128
|
+
const normalized = results.map(normalizeCriteriaResult).filter(isPresentRecord);
|
|
129
|
+
if (normalized.length === 0) return undefined;
|
|
130
|
+
if (normalized.length > LIMITS.criteriaResults) {
|
|
131
|
+
return normalized.slice(-LIMITS.criteriaResults);
|
|
132
|
+
}
|
|
133
|
+
return normalized;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function normalizeErrors(data: unknown): string[] | undefined {
|
|
137
|
+
const dataRecord = asRecord(data);
|
|
138
|
+
if (!dataRecord) return undefined;
|
|
139
|
+
if (Array.isArray(dataRecord.errors)) {
|
|
140
|
+
return normalizeStringList(dataRecord.errors, LIMITS.errors);
|
|
141
|
+
}
|
|
142
|
+
if (Array.isArray(dataRecord.issues)) {
|
|
143
|
+
const mapped = dataRecord.issues.map((issue: unknown) => {
|
|
144
|
+
if (typeof issue === 'string') return issue;
|
|
145
|
+
const issueRecord = asRecord(issue);
|
|
146
|
+
if (!issueRecord) return undefined;
|
|
147
|
+
return (
|
|
148
|
+
issueRecord.bug ||
|
|
149
|
+
issueRecord.message ||
|
|
150
|
+
issueRecord.error ||
|
|
151
|
+
issueRecord.summary ||
|
|
152
|
+
undefined
|
|
153
|
+
);
|
|
154
|
+
});
|
|
155
|
+
return normalizeStringList(mapped, LIMITS.errors);
|
|
156
|
+
}
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function normalizeRootCauses(rootCauses: unknown): string[] | undefined {
|
|
161
|
+
if (!Array.isArray(rootCauses)) return undefined;
|
|
162
|
+
const normalized = rootCauses
|
|
163
|
+
.map((cause: unknown) => {
|
|
164
|
+
if (typeof cause === 'string') {
|
|
165
|
+
return normalizeText(cause, TEXT_LIMITS.listItem, true);
|
|
166
|
+
}
|
|
167
|
+
const causeRecord = asRecord(cause);
|
|
168
|
+
if (!causeRecord) return undefined;
|
|
169
|
+
return normalizeText(
|
|
170
|
+
causeRecord.cause || causeRecord.summary || causeRecord.description,
|
|
171
|
+
TEXT_LIMITS.listItem,
|
|
172
|
+
true
|
|
173
|
+
);
|
|
174
|
+
})
|
|
175
|
+
.filter(isPresentString);
|
|
176
|
+
if (normalized.length === 0) return undefined;
|
|
177
|
+
if (normalized.length > LIMITS.rootCauses) {
|
|
178
|
+
return normalized.slice(-LIMITS.rootCauses);
|
|
179
|
+
}
|
|
180
|
+
return normalized;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function normalizeFilesAffected(filesAffected: unknown): string[] | undefined {
|
|
184
|
+
return normalizeStringList(filesAffected, LIMITS.filesAffected);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function normalizeBoolean(value: unknown): boolean | undefined {
|
|
188
|
+
if (typeof value === 'boolean') return value;
|
|
189
|
+
if (value === 'true') return true;
|
|
190
|
+
if (value === 'false') return false;
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function normalizeProgressStatus(data: unknown): UnknownRecord | undefined {
|
|
195
|
+
const dataRecord = asRecord(data);
|
|
196
|
+
if (!dataRecord) return undefined;
|
|
197
|
+
const completionStatus = asRecord(dataRecord.completionStatus);
|
|
198
|
+
if (completionStatus) {
|
|
199
|
+
return completionStatus;
|
|
200
|
+
}
|
|
201
|
+
const hasProgressFields =
|
|
202
|
+
Object.prototype.hasOwnProperty.call(dataRecord, 'canValidate') ||
|
|
203
|
+
Object.prototype.hasOwnProperty.call(dataRecord, 'percentComplete');
|
|
204
|
+
return hasProgressFields ? dataRecord : undefined;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export = {
|
|
208
|
+
LIMITS,
|
|
209
|
+
TEXT_LIMITS,
|
|
210
|
+
asRecord,
|
|
211
|
+
isPresentString,
|
|
212
|
+
toTimestamp,
|
|
213
|
+
normalizeText,
|
|
214
|
+
normalizeStringList,
|
|
215
|
+
normalizeAcceptanceCriteria,
|
|
216
|
+
normalizeCriteriaResults,
|
|
217
|
+
normalizeErrors,
|
|
218
|
+
normalizeRootCauses,
|
|
219
|
+
normalizeFilesAffected,
|
|
220
|
+
normalizeBoolean,
|
|
221
|
+
normalizeProgressStatus,
|
|
222
|
+
};
|