@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
package/src/state-snapshot.js
CHANGED
|
@@ -1,398 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const normalization = require("./state-snapshot-normalization");
|
|
1
3
|
const SNAPSHOT_VERSION = 1;
|
|
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 toTimestamp(message) {
|
|
22
|
-
if (message && Number.isFinite(message.timestamp)) {
|
|
23
|
-
return message.timestamp;
|
|
24
|
-
}
|
|
25
|
-
return Date.now();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function normalizeText(value, maxLength, singleLine = false) {
|
|
29
|
-
if (value === undefined || value === null) return undefined;
|
|
30
|
-
let text = String(value);
|
|
31
|
-
if (singleLine) {
|
|
32
|
-
text = text.replace(/\s+/g, ' ').trim();
|
|
33
|
-
} else {
|
|
34
|
-
text = text.trim();
|
|
35
|
-
}
|
|
36
|
-
if (!text) return undefined;
|
|
37
|
-
if (maxLength && text.length > maxLength) {
|
|
38
|
-
return `${text.slice(0, maxLength - 3)}...`;
|
|
39
|
-
}
|
|
40
|
-
return text;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function normalizeStringList(list, maxItems) {
|
|
44
|
-
if (!Array.isArray(list)) return undefined;
|
|
45
|
-
const normalized = list
|
|
46
|
-
.map((item) => normalizeText(item, TEXT_LIMITS.listItem, true))
|
|
47
|
-
.filter(Boolean);
|
|
48
|
-
if (normalized.length === 0) return undefined;
|
|
49
|
-
if (maxItems && normalized.length > maxItems) {
|
|
50
|
-
return normalized.slice(-maxItems);
|
|
51
|
-
}
|
|
52
|
-
return normalized;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function normalizeAcceptanceCriteria(criteria) {
|
|
56
|
-
if (!Array.isArray(criteria)) return undefined;
|
|
57
|
-
const normalized = criteria
|
|
58
|
-
.map((item) => {
|
|
59
|
-
if (typeof item === 'string') {
|
|
60
|
-
return normalizeText(item, TEXT_LIMITS.listItem, true);
|
|
61
|
-
}
|
|
62
|
-
if (!item || typeof item !== 'object') return undefined;
|
|
63
|
-
const id = item.id ? String(item.id) : '';
|
|
64
|
-
const priority = item.priority ? ` (${item.priority})` : '';
|
|
65
|
-
const criterion = item.criterion || item.text || item.summary || '';
|
|
66
|
-
const label = id ? `${id}${priority}: ` : '';
|
|
67
|
-
const merged = `${label}${criterion}`.trim();
|
|
68
|
-
if (!merged) return undefined;
|
|
69
|
-
return normalizeText(merged, TEXT_LIMITS.listItem, true);
|
|
70
|
-
})
|
|
71
|
-
.filter(Boolean);
|
|
72
|
-
if (normalized.length === 0) return undefined;
|
|
73
|
-
if (normalized.length > LIMITS.acceptanceCriteria) {
|
|
74
|
-
return normalized.slice(-LIMITS.acceptanceCriteria);
|
|
75
|
-
}
|
|
76
|
-
return normalized;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function normalizeCriteriaEvidence(evidence) {
|
|
80
|
-
if (!evidence || typeof evidence !== 'object') return undefined;
|
|
81
|
-
const normalized = {};
|
|
82
|
-
if (evidence.command) {
|
|
83
|
-
const command = normalizeText(evidence.command, TEXT_LIMITS.listItem, true);
|
|
84
|
-
if (command) normalized.command = command;
|
|
85
|
-
}
|
|
86
|
-
if (Number.isFinite(evidence.exitCode)) {
|
|
87
|
-
normalized.exitCode = evidence.exitCode;
|
|
88
|
-
}
|
|
89
|
-
return Object.keys(normalized).length > 0 ? normalized : undefined;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function normalizeCriteriaResult(item) {
|
|
93
|
-
if (!item || typeof item !== 'object') return undefined;
|
|
94
|
-
const entry = {};
|
|
95
|
-
if (item.id) entry.id = String(item.id);
|
|
96
|
-
if (item.status) entry.status = String(item.status);
|
|
97
|
-
if (item.reason) {
|
|
98
|
-
const reason = normalizeText(item.reason, TEXT_LIMITS.listItem, true);
|
|
99
|
-
if (reason) entry.reason = reason;
|
|
100
|
-
}
|
|
101
|
-
const evidence = normalizeCriteriaEvidence(item.evidence);
|
|
102
|
-
if (evidence) entry.evidence = evidence;
|
|
103
|
-
return Object.keys(entry).length > 0 ? entry : undefined;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function normalizeCriteriaResults(results) {
|
|
107
|
-
if (!Array.isArray(results)) return undefined;
|
|
108
|
-
const normalized = results.map(normalizeCriteriaResult).filter(Boolean);
|
|
109
|
-
if (normalized.length === 0) return undefined;
|
|
110
|
-
if (normalized.length > LIMITS.criteriaResults) {
|
|
111
|
-
return normalized.slice(-LIMITS.criteriaResults);
|
|
112
|
-
}
|
|
113
|
-
return normalized;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function normalizeErrors(data) {
|
|
117
|
-
if (!data || typeof data !== 'object') return undefined;
|
|
118
|
-
if (Array.isArray(data.errors)) {
|
|
119
|
-
return normalizeStringList(data.errors, LIMITS.errors);
|
|
120
|
-
}
|
|
121
|
-
if (Array.isArray(data.issues)) {
|
|
122
|
-
const mapped = data.issues.map((issue) => {
|
|
123
|
-
if (typeof issue === 'string') return issue;
|
|
124
|
-
if (!issue || typeof issue !== 'object') return undefined;
|
|
125
|
-
return issue.bug || issue.message || issue.error || issue.summary || undefined;
|
|
126
|
-
});
|
|
127
|
-
return normalizeStringList(mapped, LIMITS.errors);
|
|
128
|
-
}
|
|
129
|
-
return undefined;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function normalizeRootCauses(rootCauses) {
|
|
133
|
-
if (!Array.isArray(rootCauses)) return undefined;
|
|
134
|
-
const normalized = rootCauses
|
|
135
|
-
.map((cause) => {
|
|
136
|
-
if (typeof cause === 'string') {
|
|
137
|
-
return normalizeText(cause, TEXT_LIMITS.listItem, true);
|
|
138
|
-
}
|
|
139
|
-
if (!cause || typeof cause !== 'object') return undefined;
|
|
140
|
-
return normalizeText(
|
|
141
|
-
cause.cause || cause.summary || cause.description,
|
|
142
|
-
TEXT_LIMITS.listItem,
|
|
143
|
-
true
|
|
144
|
-
);
|
|
145
|
-
})
|
|
146
|
-
.filter(Boolean);
|
|
147
|
-
if (normalized.length === 0) return undefined;
|
|
148
|
-
if (normalized.length > LIMITS.rootCauses) {
|
|
149
|
-
return normalized.slice(-LIMITS.rootCauses);
|
|
150
|
-
}
|
|
151
|
-
return normalized;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
function normalizeFilesAffected(filesAffected) {
|
|
155
|
-
return normalizeStringList(filesAffected, LIMITS.filesAffected);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
function normalizeBoolean(value) {
|
|
159
|
-
if (typeof value === 'boolean') return value;
|
|
160
|
-
if (value === 'true') return true;
|
|
161
|
-
if (value === 'false') return false;
|
|
162
|
-
return undefined;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
function normalizeProgressStatus(data) {
|
|
166
|
-
if (!data || typeof data !== 'object') return undefined;
|
|
167
|
-
if (data.completionStatus && typeof data.completionStatus === 'object') {
|
|
168
|
-
return data.completionStatus;
|
|
169
|
-
}
|
|
170
|
-
const hasProgressFields =
|
|
171
|
-
Object.prototype.hasOwnProperty.call(data, 'canValidate') ||
|
|
172
|
-
Object.prototype.hasOwnProperty.call(data, 'percentComplete');
|
|
173
|
-
return hasProgressFields ? data : undefined;
|
|
174
|
-
}
|
|
175
|
-
|
|
4
|
+
const { LIMITS, TEXT_LIMITS, asRecord, isPresentString, toTimestamp, normalizeText, normalizeStringList, normalizeAcceptanceCriteria, normalizeCriteriaResults, normalizeErrors, normalizeRootCauses, normalizeFilesAffected, normalizeBoolean, normalizeProgressStatus, } = normalization;
|
|
176
5
|
function buildBaseState(state, message) {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
6
|
+
const stateRecord = asRecord(state);
|
|
7
|
+
const messageRecord = asRecord(message);
|
|
8
|
+
return {
|
|
9
|
+
version: SNAPSHOT_VERSION,
|
|
10
|
+
updatedAt: toTimestamp(message),
|
|
11
|
+
clusterId: messageRecord?.cluster_id || stateRecord?.clusterId || null,
|
|
12
|
+
sourceMessageId: messageRecord?.id || stateRecord?.sourceMessageId || null,
|
|
13
|
+
task: stateRecord?.task,
|
|
14
|
+
plan: stateRecord?.plan,
|
|
15
|
+
progress: stateRecord?.progress,
|
|
16
|
+
validation: stateRecord?.validation,
|
|
17
|
+
debug: stateRecord?.debug,
|
|
18
|
+
};
|
|
188
19
|
}
|
|
189
|
-
|
|
190
20
|
function pruneEmpty(value) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}
|
|
195
|
-
if (value && typeof value === 'object') {
|
|
196
|
-
const next = {};
|
|
197
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
198
|
-
const pruned = pruneEmpty(entry);
|
|
199
|
-
if (pruned !== undefined) {
|
|
200
|
-
next[key] = pruned;
|
|
201
|
-
}
|
|
21
|
+
if (Array.isArray(value)) {
|
|
22
|
+
const next = value.map(pruneEmpty).filter((item) => item !== undefined);
|
|
23
|
+
return next.length > 0 ? next : undefined;
|
|
202
24
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
25
|
+
const valueRecord = asRecord(value);
|
|
26
|
+
if (valueRecord) {
|
|
27
|
+
const next = {};
|
|
28
|
+
for (const [key, entry] of Object.entries(valueRecord)) {
|
|
29
|
+
const pruned = pruneEmpty(entry);
|
|
30
|
+
if (pruned !== undefined) {
|
|
31
|
+
next[key] = pruned;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return Object.keys(next).length > 0 ? next : undefined;
|
|
35
|
+
}
|
|
36
|
+
if (value === undefined || value === null)
|
|
37
|
+
return undefined;
|
|
38
|
+
return value;
|
|
207
39
|
}
|
|
208
|
-
|
|
209
40
|
function finalizeState(state) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
41
|
+
const result = {
|
|
42
|
+
version: state.version ?? SNAPSHOT_VERSION,
|
|
43
|
+
updatedAt: state.updatedAt ?? Date.now(),
|
|
44
|
+
clusterId: state.clusterId ?? null,
|
|
45
|
+
sourceMessageId: state.sourceMessageId ?? null,
|
|
46
|
+
};
|
|
47
|
+
const sections = asRecord(pruneEmpty({
|
|
48
|
+
task: state.task,
|
|
49
|
+
plan: state.plan,
|
|
50
|
+
progress: state.progress,
|
|
51
|
+
validation: state.validation,
|
|
52
|
+
debug: state.debug,
|
|
53
|
+
}));
|
|
54
|
+
if (sections) {
|
|
55
|
+
Object.assign(result, sections);
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
function messageContent(message) {
|
|
60
|
+
return asRecord(asRecord(message)?.content) ?? {};
|
|
61
|
+
}
|
|
62
|
+
function contentData(content) {
|
|
63
|
+
return asRecord(content.data) ?? {};
|
|
227
64
|
}
|
|
228
|
-
|
|
229
65
|
function initStateFromIssue(issueMessage) {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
66
|
+
const messageRecord = asRecord(issueMessage);
|
|
67
|
+
const content = messageContent(issueMessage);
|
|
68
|
+
const data = contentData(content);
|
|
69
|
+
const task = {
|
|
70
|
+
raw: normalizeText(content.text, TEXT_LIMITS.task),
|
|
71
|
+
title: normalizeText(data.title, TEXT_LIMITS.summary, true),
|
|
72
|
+
issueNumber: data.issue_number ?? data.issueNumber,
|
|
73
|
+
source: asRecord(messageRecord?.metadata)?.source,
|
|
74
|
+
};
|
|
75
|
+
const base = buildBaseState(null, issueMessage);
|
|
76
|
+
base.task = pruneEmpty(task);
|
|
77
|
+
return finalizeState(base);
|
|
241
78
|
}
|
|
242
|
-
|
|
243
79
|
function applyIssueOpened(state, message) {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
80
|
+
const messageRecord = asRecord(message);
|
|
81
|
+
const base = buildBaseState(state, message);
|
|
82
|
+
const content = messageContent(message);
|
|
83
|
+
const data = contentData(content);
|
|
84
|
+
const task = {
|
|
85
|
+
raw: normalizeText(content.text, TEXT_LIMITS.task),
|
|
86
|
+
title: normalizeText(data.title, TEXT_LIMITS.summary, true),
|
|
87
|
+
issueNumber: data.issue_number ?? data.issueNumber,
|
|
88
|
+
source: asRecord(messageRecord?.metadata)?.source,
|
|
89
|
+
};
|
|
90
|
+
base.task = pruneEmpty(task);
|
|
91
|
+
return finalizeState(base);
|
|
255
92
|
}
|
|
256
|
-
|
|
257
93
|
function applyPlanReady(state, message) {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
94
|
+
const base = buildBaseState(state, message);
|
|
95
|
+
const content = messageContent(message);
|
|
96
|
+
const data = contentData(content);
|
|
97
|
+
const plan = {
|
|
98
|
+
text: normalizeText(content.text, TEXT_LIMITS.plan),
|
|
99
|
+
summary: normalizeText(data.summary, TEXT_LIMITS.summary, true),
|
|
100
|
+
acceptanceCriteria: normalizeAcceptanceCriteria(data.acceptanceCriteria),
|
|
101
|
+
filesAffected: normalizeFilesAffected(data.filesAffected),
|
|
102
|
+
updatedAt: toTimestamp(message),
|
|
103
|
+
};
|
|
104
|
+
base.plan = pruneEmpty(plan);
|
|
105
|
+
return finalizeState(base);
|
|
270
106
|
}
|
|
271
|
-
|
|
272
107
|
function applyWorkerProgress(state, message) {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
108
|
+
const base = buildBaseState(state, message);
|
|
109
|
+
const content = messageContent(message);
|
|
110
|
+
const status = normalizeProgressStatus(content.data || {});
|
|
111
|
+
if (!status) {
|
|
112
|
+
return finalizeState(base);
|
|
113
|
+
}
|
|
114
|
+
const progress = {
|
|
115
|
+
canValidate: normalizeBoolean(status.canValidate),
|
|
116
|
+
percentComplete: typeof status.percentComplete === 'number' && Number.isFinite(status.percentComplete)
|
|
117
|
+
? status.percentComplete
|
|
118
|
+
: undefined,
|
|
119
|
+
blockers: normalizeStringList(status.blockers, LIMITS.blockers),
|
|
120
|
+
nextSteps: normalizeStringList(status.nextSteps, LIMITS.nextSteps),
|
|
121
|
+
lastSummary: normalizeText(content.text || status.summary, TEXT_LIMITS.summary, true),
|
|
122
|
+
updatedAt: toTimestamp(message),
|
|
123
|
+
};
|
|
124
|
+
base.progress = pruneEmpty(progress);
|
|
277
125
|
return finalizeState(base);
|
|
278
|
-
}
|
|
279
|
-
const progress = {
|
|
280
|
-
canValidate: normalizeBoolean(status.canValidate),
|
|
281
|
-
percentComplete: Number.isFinite(status.percentComplete) ? status.percentComplete : undefined,
|
|
282
|
-
blockers: normalizeStringList(status.blockers, LIMITS.blockers),
|
|
283
|
-
nextSteps: normalizeStringList(status.nextSteps, LIMITS.nextSteps),
|
|
284
|
-
lastSummary: normalizeText(content.text || status.summary, TEXT_LIMITS.summary, true),
|
|
285
|
-
updatedAt: toTimestamp(message),
|
|
286
|
-
};
|
|
287
|
-
base.progress = pruneEmpty(progress);
|
|
288
|
-
return finalizeState(base);
|
|
289
126
|
}
|
|
290
|
-
|
|
291
127
|
function applyImplementationReady(state, message) {
|
|
292
|
-
|
|
128
|
+
return applyWorkerProgress(state, message);
|
|
293
129
|
}
|
|
294
|
-
|
|
295
130
|
function applyValidationResult(state, message) {
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
131
|
+
const base = buildBaseState(state, message);
|
|
132
|
+
const content = messageContent(message);
|
|
133
|
+
const data = contentData(content);
|
|
134
|
+
const validation = {
|
|
135
|
+
approved: normalizeBoolean(data.approved),
|
|
136
|
+
errors: normalizeErrors(data),
|
|
137
|
+
criteriaResults: normalizeCriteriaResults(data.criteriaResults),
|
|
138
|
+
updatedAt: toTimestamp(message),
|
|
139
|
+
};
|
|
140
|
+
base.validation = pruneEmpty(validation);
|
|
141
|
+
return finalizeState(base);
|
|
307
142
|
}
|
|
308
|
-
|
|
309
143
|
function applyInvestigationComplete(state, message) {
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
144
|
+
const base = buildBaseState(state, message);
|
|
145
|
+
const content = messageContent(message);
|
|
146
|
+
const data = contentData(content);
|
|
147
|
+
const debug = {
|
|
148
|
+
fixPlan: normalizeText(content.text, TEXT_LIMITS.fixPlan),
|
|
149
|
+
successCriteria: normalizeText(data.successCriteria, TEXT_LIMITS.summary, true),
|
|
150
|
+
rootCauses: normalizeRootCauses(data.rootCauses),
|
|
151
|
+
updatedAt: toTimestamp(message),
|
|
152
|
+
};
|
|
153
|
+
base.debug = pruneEmpty(debug);
|
|
154
|
+
return finalizeState(base);
|
|
155
|
+
}
|
|
156
|
+
function sectionFor(state, key) {
|
|
157
|
+
return asRecord(asRecord(state)?.[key]);
|
|
321
158
|
}
|
|
322
|
-
|
|
323
159
|
function buildTaskSummary(state) {
|
|
324
|
-
|
|
325
|
-
|
|
160
|
+
const task = sectionFor(state, 'task');
|
|
161
|
+
const taskTitle = normalizeText(task?.title || task?.raw, TEXT_LIMITS.summary, true);
|
|
162
|
+
return taskTitle ? `Task: ${taskTitle}` : undefined;
|
|
326
163
|
}
|
|
327
|
-
|
|
328
164
|
function buildPlanSummary(state) {
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
true
|
|
333
|
-
);
|
|
334
|
-
return planSummary ? `Plan: ${planSummary}` : undefined;
|
|
165
|
+
const plan = sectionFor(state, 'plan');
|
|
166
|
+
const planSummary = normalizeText(plan?.summary || plan?.text, TEXT_LIMITS.summary, true);
|
|
167
|
+
return planSummary ? `Plan: ${planSummary}` : undefined;
|
|
335
168
|
}
|
|
336
|
-
|
|
337
169
|
function buildProgressSummary(state) {
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
parts
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
170
|
+
const progress = sectionFor(state, 'progress');
|
|
171
|
+
if (!progress)
|
|
172
|
+
return undefined;
|
|
173
|
+
const parts = [];
|
|
174
|
+
if (typeof progress.percentComplete === 'number' && Number.isFinite(progress.percentComplete)) {
|
|
175
|
+
parts.push(`${progress.percentComplete}%`);
|
|
176
|
+
}
|
|
177
|
+
if (typeof progress.canValidate === 'boolean') {
|
|
178
|
+
parts.push(`canValidate=${progress.canValidate}`);
|
|
179
|
+
}
|
|
180
|
+
const firstNextStep = Array.isArray(progress.nextSteps)
|
|
181
|
+
? progress.nextSteps[0]
|
|
182
|
+
: undefined;
|
|
183
|
+
const nextStepText = normalizeText(firstNextStep, TEXT_LIMITS.listItem, true);
|
|
184
|
+
if (nextStepText) {
|
|
185
|
+
parts.push(`next: ${nextStepText}`);
|
|
186
|
+
}
|
|
187
|
+
return parts.length > 0 ? `Progress: ${parts.join(' | ')}` : undefined;
|
|
351
188
|
}
|
|
352
|
-
|
|
353
189
|
function resolveValidationStatus(approved) {
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
190
|
+
if (approved === true)
|
|
191
|
+
return 'approved';
|
|
192
|
+
if (approved === false)
|
|
193
|
+
return 'rejected';
|
|
194
|
+
return 'pending';
|
|
357
195
|
}
|
|
358
|
-
|
|
359
196
|
function buildValidationSummary(state) {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
197
|
+
const validation = sectionFor(state, 'validation');
|
|
198
|
+
if (!validation)
|
|
199
|
+
return undefined;
|
|
200
|
+
const status = resolveValidationStatus(validation.approved);
|
|
201
|
+
const errorCount = Array.isArray(validation.errors) ? validation.errors.length : 0;
|
|
202
|
+
return `Validation: ${status}${errorCount ? ` (${errorCount} errors)` : ''}`;
|
|
364
203
|
}
|
|
365
|
-
|
|
366
204
|
function buildDebugSummary(state) {
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
true
|
|
371
|
-
);
|
|
372
|
-
return debugSummary ? `Debug: ${debugSummary}` : undefined;
|
|
205
|
+
const debug = sectionFor(state, 'debug');
|
|
206
|
+
const debugSummary = normalizeText(debug?.fixPlan || debug?.successCriteria, TEXT_LIMITS.summary, true);
|
|
207
|
+
return debugSummary ? `Debug: ${debugSummary}` : undefined;
|
|
373
208
|
}
|
|
374
|
-
|
|
375
209
|
function renderStateSummary(state) {
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
210
|
+
if (!asRecord(state))
|
|
211
|
+
return '';
|
|
212
|
+
const lines = [
|
|
213
|
+
buildTaskSummary(state),
|
|
214
|
+
buildPlanSummary(state),
|
|
215
|
+
buildProgressSummary(state),
|
|
216
|
+
buildValidationSummary(state),
|
|
217
|
+
buildDebugSummary(state),
|
|
218
|
+
].filter(isPresentString);
|
|
219
|
+
return lines.join('\n');
|
|
386
220
|
}
|
|
387
|
-
|
|
388
221
|
module.exports = {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
222
|
+
SNAPSHOT_VERSION,
|
|
223
|
+
initStateFromIssue,
|
|
224
|
+
applyIssueOpened,
|
|
225
|
+
applyPlanReady,
|
|
226
|
+
applyWorkerProgress,
|
|
227
|
+
applyImplementationReady,
|
|
228
|
+
applyValidationResult,
|
|
229
|
+
applyInvestigationComplete,
|
|
230
|
+
renderStateSummary,
|
|
398
231
|
};
|