@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,166 @@
|
|
|
1
|
+
import ledgerSequence = require('../ledger-sequence');
|
|
2
|
+
|
|
3
|
+
const GUIDANCE_BLOCK_START = '<<GUIDANCE_QUEUE_START>>';
|
|
4
|
+
const GUIDANCE_BLOCK_END = '<<GUIDANCE_QUEUE_END>>';
|
|
5
|
+
const { compareMessageSequences } = ledgerSequence;
|
|
6
|
+
|
|
7
|
+
interface GuidanceContent {
|
|
8
|
+
text?: string;
|
|
9
|
+
data?: unknown;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
interface GuidanceMessage {
|
|
13
|
+
sequence?: string;
|
|
14
|
+
timestamp?: number;
|
|
15
|
+
sender?: string;
|
|
16
|
+
topic?: string;
|
|
17
|
+
receiver?: string;
|
|
18
|
+
target_agent_id?: string;
|
|
19
|
+
content?: GuidanceContent;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
interface GuidanceFormatOptions {
|
|
23
|
+
orderBySequence?: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface GuidanceMailboxQuery {
|
|
27
|
+
cluster_id: string;
|
|
28
|
+
target_agent_id: string;
|
|
29
|
+
afterId: string | undefined;
|
|
30
|
+
throughId: string | undefined;
|
|
31
|
+
lastDeliveredAt: number | null | undefined;
|
|
32
|
+
limit: number | undefined;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface GuidanceMessageBus {
|
|
36
|
+
queryGuidanceMailbox(query: GuidanceMailboxQuery): GuidanceMessage[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface CollectQueuedGuidanceOptions {
|
|
40
|
+
messageBus?: GuidanceMessageBus | null;
|
|
41
|
+
clusterId?: string | null;
|
|
42
|
+
agentId?: string | null;
|
|
43
|
+
afterId?: string;
|
|
44
|
+
throughId?: string;
|
|
45
|
+
lastDeliveredAt?: number | null;
|
|
46
|
+
limit?: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface QueuedGuidance {
|
|
50
|
+
messages: GuidanceMessage[];
|
|
51
|
+
latestSequence: string | null | undefined;
|
|
52
|
+
latestTimestamp: number | null | undefined;
|
|
53
|
+
guidanceBlock: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function formatGuidanceMessage(message: GuidanceMessage): string {
|
|
57
|
+
const timestamp =
|
|
58
|
+
typeof message.timestamp === 'number' && Number.isFinite(message.timestamp)
|
|
59
|
+
? new Date(message.timestamp).toISOString()
|
|
60
|
+
: new Date().toISOString();
|
|
61
|
+
const sender = message.sender || 'unknown';
|
|
62
|
+
const topic = message.topic || 'GUIDANCE';
|
|
63
|
+
const target = message.receiver || message.target_agent_id;
|
|
64
|
+
const targetSuffix = target ? ` -> ${target}` : '';
|
|
65
|
+
|
|
66
|
+
let formatted = `[${timestamp}] ${sender} (${topic}${targetSuffix})\n`;
|
|
67
|
+
if (message.content?.text) {
|
|
68
|
+
formatted += `${message.content.text}\n`;
|
|
69
|
+
}
|
|
70
|
+
if (message.content?.data) {
|
|
71
|
+
formatted += `${JSON.stringify(message.content.data, null, 2)}\n`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return formatted.trimEnd();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function orderGuidanceMessages(
|
|
78
|
+
messages: GuidanceMessage[],
|
|
79
|
+
orderBySequence: boolean
|
|
80
|
+
): GuidanceMessage[] {
|
|
81
|
+
return messages.slice().sort((left, right) => {
|
|
82
|
+
if (orderBySequence) {
|
|
83
|
+
return compareMessageSequences(left.sequence || '0', right.sequence || '0');
|
|
84
|
+
}
|
|
85
|
+
return (left.timestamp || 0) - (right.timestamp || 0);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function formatGuidanceBlock(
|
|
90
|
+
messages: GuidanceMessage[] | null | undefined,
|
|
91
|
+
{ orderBySequence = false }: GuidanceFormatOptions = {}
|
|
92
|
+
): string {
|
|
93
|
+
if (!Array.isArray(messages) || messages.length === 0) return '';
|
|
94
|
+
|
|
95
|
+
const ordered = orderGuidanceMessages(messages, orderBySequence);
|
|
96
|
+
|
|
97
|
+
let block = '## Guidance (Queued)\n\n';
|
|
98
|
+
block += `${GUIDANCE_BLOCK_START}\n`;
|
|
99
|
+
|
|
100
|
+
ordered.forEach((message, index) => {
|
|
101
|
+
block += `${formatGuidanceMessage(message)}\n`;
|
|
102
|
+
if (index < ordered.length - 1) {
|
|
103
|
+
block += '\n';
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
block += `\n${GUIDANCE_BLOCK_END}\n\n`;
|
|
108
|
+
return block;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function emptyQueuedGuidance(): QueuedGuidance {
|
|
112
|
+
return { messages: [], latestSequence: null, latestTimestamp: null, guidanceBlock: '' };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function collectQueuedGuidance({
|
|
116
|
+
messageBus,
|
|
117
|
+
clusterId,
|
|
118
|
+
agentId,
|
|
119
|
+
afterId,
|
|
120
|
+
throughId,
|
|
121
|
+
lastDeliveredAt,
|
|
122
|
+
limit,
|
|
123
|
+
}: CollectQueuedGuidanceOptions): QueuedGuidance {
|
|
124
|
+
if (!messageBus) {
|
|
125
|
+
throw new Error('collectQueuedGuidance: messageBus is required');
|
|
126
|
+
}
|
|
127
|
+
if (!clusterId) {
|
|
128
|
+
throw new Error('collectQueuedGuidance: clusterId is required');
|
|
129
|
+
}
|
|
130
|
+
if (!agentId) {
|
|
131
|
+
throw new Error('collectQueuedGuidance: agentId is required');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const messages = messageBus.queryGuidanceMailbox({
|
|
135
|
+
cluster_id: clusterId,
|
|
136
|
+
target_agent_id: agentId,
|
|
137
|
+
afterId,
|
|
138
|
+
throughId,
|
|
139
|
+
lastDeliveredAt,
|
|
140
|
+
limit,
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
if (!messages.length) {
|
|
144
|
+
return emptyQueuedGuidance();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const sequenceBounded = afterId !== undefined || throughId !== undefined;
|
|
148
|
+
const ordered = orderGuidanceMessages(messages, sequenceBounded);
|
|
149
|
+
const latestMessage = ordered.at(-1);
|
|
150
|
+
if (!latestMessage) {
|
|
151
|
+
return emptyQueuedGuidance();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const latestSequence = latestMessage.sequence;
|
|
155
|
+
const latestTimestamp = latestMessage.timestamp;
|
|
156
|
+
const guidanceBlock = formatGuidanceBlock(ordered, { orderBySequence: sequenceBounded });
|
|
157
|
+
|
|
158
|
+
return { messages: ordered, latestSequence, latestTimestamp, guidanceBlock };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export = {
|
|
162
|
+
GUIDANCE_BLOCK_START,
|
|
163
|
+
GUIDANCE_BLOCK_END,
|
|
164
|
+
formatGuidanceBlock,
|
|
165
|
+
collectQueuedGuidance,
|
|
166
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const node_crypto_1 = require("node:crypto");
|
|
3
|
+
const MAX_CLI_ERROR_BYTES = 4096;
|
|
4
|
+
const CLI_ERROR_TRUNCATION_SUFFIX = '… [truncated]';
|
|
5
|
+
function truncateUtf8(text, maxBytes = MAX_CLI_ERROR_BYTES) {
|
|
6
|
+
if (Buffer.byteLength(text) <= maxBytes)
|
|
7
|
+
return text;
|
|
8
|
+
const suffixBytes = Buffer.byteLength(CLI_ERROR_TRUNCATION_SUFFIX);
|
|
9
|
+
const contentBudget = Math.max(0, maxBytes - suffixBytes);
|
|
10
|
+
let bytes = 0;
|
|
11
|
+
let truncated = '';
|
|
12
|
+
for (const character of text) {
|
|
13
|
+
const characterBytes = Buffer.byteLength(character);
|
|
14
|
+
if (bytes + characterBytes > contentBudget)
|
|
15
|
+
break;
|
|
16
|
+
truncated += character;
|
|
17
|
+
bytes += characterBytes;
|
|
18
|
+
}
|
|
19
|
+
return `${truncated}${CLI_ERROR_TRUNCATION_SUFFIX}`;
|
|
20
|
+
}
|
|
21
|
+
function primitiveErrorText(value) {
|
|
22
|
+
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'
|
|
23
|
+
? String(value)
|
|
24
|
+
: '';
|
|
25
|
+
}
|
|
26
|
+
function cliErrorDetail(value, fallback) {
|
|
27
|
+
const candidate = Array.isArray(value)
|
|
28
|
+
? value
|
|
29
|
+
.map(primitiveErrorText)
|
|
30
|
+
.filter((message) => message.trim())
|
|
31
|
+
.join('; ')
|
|
32
|
+
: primitiveErrorText(value);
|
|
33
|
+
const raw = candidate.trim() ? candidate : fallback;
|
|
34
|
+
return {
|
|
35
|
+
error: truncateUtf8(raw.trim()),
|
|
36
|
+
diagnostic: {
|
|
37
|
+
byteLength: Buffer.byteLength(raw),
|
|
38
|
+
sha256: (0, node_crypto_1.createHash)('sha256').update(raw).digest('hex'),
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
module.exports = {
|
|
43
|
+
MAX_CLI_ERROR_BYTES,
|
|
44
|
+
cliErrorDetail,
|
|
45
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import type { CliErrorDetail } from './output-extraction-types';
|
|
3
|
+
|
|
4
|
+
const MAX_CLI_ERROR_BYTES = 4096;
|
|
5
|
+
const CLI_ERROR_TRUNCATION_SUFFIX = '… [truncated]';
|
|
6
|
+
|
|
7
|
+
function truncateUtf8(text: string, maxBytes = MAX_CLI_ERROR_BYTES): string {
|
|
8
|
+
if (Buffer.byteLength(text) <= maxBytes) return text;
|
|
9
|
+
|
|
10
|
+
const suffixBytes = Buffer.byteLength(CLI_ERROR_TRUNCATION_SUFFIX);
|
|
11
|
+
const contentBudget = Math.max(0, maxBytes - suffixBytes);
|
|
12
|
+
let bytes = 0;
|
|
13
|
+
let truncated = '';
|
|
14
|
+
for (const character of text) {
|
|
15
|
+
const characterBytes = Buffer.byteLength(character);
|
|
16
|
+
if (bytes + characterBytes > contentBudget) break;
|
|
17
|
+
truncated += character;
|
|
18
|
+
bytes += characterBytes;
|
|
19
|
+
}
|
|
20
|
+
return `${truncated}${CLI_ERROR_TRUNCATION_SUFFIX}`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function primitiveErrorText(value: unknown): string {
|
|
24
|
+
return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean'
|
|
25
|
+
? String(value)
|
|
26
|
+
: '';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function cliErrorDetail(value: unknown, fallback: string): CliErrorDetail {
|
|
30
|
+
const candidate = Array.isArray(value)
|
|
31
|
+
? value
|
|
32
|
+
.map(primitiveErrorText)
|
|
33
|
+
.filter((message) => message.trim())
|
|
34
|
+
.join('; ')
|
|
35
|
+
: primitiveErrorText(value);
|
|
36
|
+
const raw = candidate.trim() ? candidate : fallback;
|
|
37
|
+
return {
|
|
38
|
+
error: truncateUtf8(raw.trim()),
|
|
39
|
+
diagnostic: {
|
|
40
|
+
byteLength: Buffer.byteLength(raw),
|
|
41
|
+
sha256: createHash('sha256').update(raw).digest('hex'),
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export = {
|
|
47
|
+
MAX_CLI_ERROR_BYTES,
|
|
48
|
+
cliErrorDetail,
|
|
49
|
+
};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const errorDetail = require("./output-extraction-error-detail");
|
|
3
|
+
const jsonExtraction = require("./output-extraction-json");
|
|
4
|
+
const piExtraction = require("./output-extraction-pi");
|
|
5
|
+
const { MAX_CLI_ERROR_BYTES, cliErrorDetail } = errorDetail;
|
|
6
|
+
const { isObjectRecord, parseJsonRecordLine } = jsonExtraction;
|
|
7
|
+
const { extractSettledPiFailure } = piExtraction;
|
|
8
|
+
function firstTruthyValue(...values) {
|
|
9
|
+
for (const value of values) {
|
|
10
|
+
if (value)
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
function recordField(value, field) {
|
|
16
|
+
return isObjectRecord(value) ? value[field] : undefined;
|
|
17
|
+
}
|
|
18
|
+
function nestedRecordField(value, parent, field) {
|
|
19
|
+
return recordField(recordField(value, parent), field);
|
|
20
|
+
}
|
|
21
|
+
function claudeFailureFromObject(value) {
|
|
22
|
+
if (value.type !== 'result')
|
|
23
|
+
return null;
|
|
24
|
+
if (value.is_error === true) {
|
|
25
|
+
const errors = value.errors;
|
|
26
|
+
const source = Array.isArray(errors) ? errors : firstTruthyValue(value.error, value.result);
|
|
27
|
+
return { ...cliErrorDetail(source, 'Unknown CLI error'), provider: 'claude' };
|
|
28
|
+
}
|
|
29
|
+
if (value.subtype !== 'error')
|
|
30
|
+
return null;
|
|
31
|
+
return {
|
|
32
|
+
...cliErrorDetail(firstTruthyValue(value.error, value.result), 'CLI returned error'),
|
|
33
|
+
provider: 'claude',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function codexFailureFromObject(value) {
|
|
37
|
+
if (value.type !== 'turn.failed')
|
|
38
|
+
return null;
|
|
39
|
+
const source = firstTruthyValue(nestedRecordField(value, 'error', 'message'), nestedRecordField(value, 'error', 'code'), value.error);
|
|
40
|
+
return { ...cliErrorDetail(source, 'Turn failed'), provider: 'codex' };
|
|
41
|
+
}
|
|
42
|
+
function geminiFailureFromObject(value) {
|
|
43
|
+
const failure = (value.type === 'result' && value.status === 'error') ||
|
|
44
|
+
(value.type === 'error' && value.severity === 'error');
|
|
45
|
+
if (!failure)
|
|
46
|
+
return null;
|
|
47
|
+
const source = firstTruthyValue(nestedRecordField(value, 'error', 'message'), value.message);
|
|
48
|
+
return { ...cliErrorDetail(source, 'Gemini CLI error'), provider: 'gemini' };
|
|
49
|
+
}
|
|
50
|
+
function opencodeFailureFromObject(value) {
|
|
51
|
+
if (value.type !== 'session.error' && value.type !== 'error')
|
|
52
|
+
return null;
|
|
53
|
+
const error = value.error;
|
|
54
|
+
const source = firstTruthyValue(recordField(recordField(error, 'data'), 'message'), recordField(error, 'message'), recordField(error, 'name'));
|
|
55
|
+
return { ...cliErrorDetail(source, 'Session error'), provider: 'opencode' };
|
|
56
|
+
}
|
|
57
|
+
function failureFromProviderObject(value, providerName) {
|
|
58
|
+
if (!isObjectRecord(value))
|
|
59
|
+
return null;
|
|
60
|
+
if (providerName === 'claude')
|
|
61
|
+
return claudeFailureFromObject(value);
|
|
62
|
+
if (providerName === 'codex')
|
|
63
|
+
return codexFailureFromObject(value);
|
|
64
|
+
if (providerName === 'gemini')
|
|
65
|
+
return geminiFailureFromObject(value);
|
|
66
|
+
if (providerName === 'opencode')
|
|
67
|
+
return opencodeFailureFromObject(value);
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
function vertexModelFromResult(parsed, useVertex) {
|
|
71
|
+
if (parsed.type !== 'result' ||
|
|
72
|
+
parsed.is_error !== true ||
|
|
73
|
+
parsed.api_error_status !== 404 ||
|
|
74
|
+
typeof parsed.result !== 'string') {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
const model = /model\s+\(([^)]+)\)/.exec(parsed.result)?.[1];
|
|
78
|
+
const explicitVertexSignal = parsed.result.includes('vertex deployment');
|
|
79
|
+
const configuredVertexFallback = useVertex && parsed.result.includes('may not exist or you may not have access');
|
|
80
|
+
return model && (explicitVertexSignal || configuredVertexFallback) ? { model } : null;
|
|
81
|
+
}
|
|
82
|
+
function extractClaudeVertexModelError(output, { useVertex = false } = {}) {
|
|
83
|
+
if (!output || typeof output !== 'string')
|
|
84
|
+
return null;
|
|
85
|
+
for (const line of output.split('\n')) {
|
|
86
|
+
const parsed = parseJsonRecordLine(line);
|
|
87
|
+
if (parsed === null)
|
|
88
|
+
continue;
|
|
89
|
+
const failure = vertexModelFromResult(parsed, useVertex);
|
|
90
|
+
if (failure)
|
|
91
|
+
return failure;
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
function extractCliFailure(output, providerName = 'claude') {
|
|
96
|
+
if (providerName === 'pi') {
|
|
97
|
+
const lines = typeof output === 'string' ? output.split('\n') : [];
|
|
98
|
+
return extractSettledPiFailure(lines);
|
|
99
|
+
}
|
|
100
|
+
if (!output || typeof output !== 'string')
|
|
101
|
+
return null;
|
|
102
|
+
const lines = output.split('\n');
|
|
103
|
+
if (providerName === 'codex')
|
|
104
|
+
lines.reverse();
|
|
105
|
+
for (const line of lines) {
|
|
106
|
+
const parsed = parseJsonRecordLine(line);
|
|
107
|
+
if (parsed === null)
|
|
108
|
+
continue;
|
|
109
|
+
const failure = failureFromProviderObject(parsed, providerName);
|
|
110
|
+
if (failure)
|
|
111
|
+
return failure;
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
function extractCliError(output, providerName = 'claude') {
|
|
116
|
+
const failure = extractCliFailure(output, providerName);
|
|
117
|
+
return failure ? { error: failure.error, provider: failure.provider } : null;
|
|
118
|
+
}
|
|
119
|
+
module.exports = {
|
|
120
|
+
MAX_CLI_ERROR_BYTES,
|
|
121
|
+
cliErrorDetail,
|
|
122
|
+
extractClaudeVertexModelError,
|
|
123
|
+
extractCliError,
|
|
124
|
+
extractCliFailure,
|
|
125
|
+
};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import errorDetail = require('./output-extraction-error-detail');
|
|
2
|
+
import jsonExtraction = require('./output-extraction-json');
|
|
3
|
+
import piExtraction = require('./output-extraction-pi');
|
|
4
|
+
import type {
|
|
5
|
+
CliError,
|
|
6
|
+
CliFailure,
|
|
7
|
+
JsonRecord,
|
|
8
|
+
VertexModelFailure,
|
|
9
|
+
} from './output-extraction-types';
|
|
10
|
+
|
|
11
|
+
const { MAX_CLI_ERROR_BYTES, cliErrorDetail } = errorDetail;
|
|
12
|
+
const { isObjectRecord, parseJsonRecordLine } = jsonExtraction;
|
|
13
|
+
const { extractSettledPiFailure } = piExtraction;
|
|
14
|
+
|
|
15
|
+
function firstTruthyValue(...values: readonly unknown[]): unknown {
|
|
16
|
+
for (const value of values) {
|
|
17
|
+
if (value) return value;
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function recordField(value: unknown, field: string): unknown {
|
|
23
|
+
return isObjectRecord(value) ? value[field] : undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function nestedRecordField(value: unknown, parent: string, field: string): unknown {
|
|
27
|
+
return recordField(recordField(value, parent), field);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function claudeFailureFromObject(value: JsonRecord): CliFailure | null {
|
|
31
|
+
if (value.type !== 'result') return null;
|
|
32
|
+
if (value.is_error === true) {
|
|
33
|
+
const errors = value.errors;
|
|
34
|
+
const source = Array.isArray(errors) ? errors : firstTruthyValue(value.error, value.result);
|
|
35
|
+
return { ...cliErrorDetail(source, 'Unknown CLI error'), provider: 'claude' };
|
|
36
|
+
}
|
|
37
|
+
if (value.subtype !== 'error') return null;
|
|
38
|
+
return {
|
|
39
|
+
...cliErrorDetail(firstTruthyValue(value.error, value.result), 'CLI returned error'),
|
|
40
|
+
provider: 'claude',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function codexFailureFromObject(value: JsonRecord): CliFailure | null {
|
|
45
|
+
if (value.type !== 'turn.failed') return null;
|
|
46
|
+
const source = firstTruthyValue(
|
|
47
|
+
nestedRecordField(value, 'error', 'message'),
|
|
48
|
+
nestedRecordField(value, 'error', 'code'),
|
|
49
|
+
value.error
|
|
50
|
+
);
|
|
51
|
+
return { ...cliErrorDetail(source, 'Turn failed'), provider: 'codex' };
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function geminiFailureFromObject(value: JsonRecord): CliFailure | null {
|
|
55
|
+
const failure =
|
|
56
|
+
(value.type === 'result' && value.status === 'error') ||
|
|
57
|
+
(value.type === 'error' && value.severity === 'error');
|
|
58
|
+
if (!failure) return null;
|
|
59
|
+
const source = firstTruthyValue(nestedRecordField(value, 'error', 'message'), value.message);
|
|
60
|
+
return { ...cliErrorDetail(source, 'Gemini CLI error'), provider: 'gemini' };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function opencodeFailureFromObject(value: JsonRecord): CliFailure | null {
|
|
64
|
+
if (value.type !== 'session.error' && value.type !== 'error') return null;
|
|
65
|
+
const error = value.error;
|
|
66
|
+
const source = firstTruthyValue(
|
|
67
|
+
recordField(recordField(error, 'data'), 'message'),
|
|
68
|
+
recordField(error, 'message'),
|
|
69
|
+
recordField(error, 'name')
|
|
70
|
+
);
|
|
71
|
+
return { ...cliErrorDetail(source, 'Session error'), provider: 'opencode' };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function failureFromProviderObject(value: unknown, providerName: string): CliFailure | null {
|
|
75
|
+
if (!isObjectRecord(value)) return null;
|
|
76
|
+
if (providerName === 'claude') return claudeFailureFromObject(value);
|
|
77
|
+
if (providerName === 'codex') return codexFailureFromObject(value);
|
|
78
|
+
if (providerName === 'gemini') return geminiFailureFromObject(value);
|
|
79
|
+
if (providerName === 'opencode') return opencodeFailureFromObject(value);
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
interface VertexOptions {
|
|
84
|
+
useVertex?: boolean;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function vertexModelFromResult(parsed: JsonRecord, useVertex: boolean): VertexModelFailure | null {
|
|
88
|
+
if (
|
|
89
|
+
parsed.type !== 'result' ||
|
|
90
|
+
parsed.is_error !== true ||
|
|
91
|
+
parsed.api_error_status !== 404 ||
|
|
92
|
+
typeof parsed.result !== 'string'
|
|
93
|
+
) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const model = /model\s+\(([^)]+)\)/.exec(parsed.result)?.[1];
|
|
98
|
+
const explicitVertexSignal = parsed.result.includes('vertex deployment');
|
|
99
|
+
const configuredVertexFallback =
|
|
100
|
+
useVertex && parsed.result.includes('may not exist or you may not have access');
|
|
101
|
+
return model && (explicitVertexSignal || configuredVertexFallback) ? { model } : null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function extractClaudeVertexModelError(
|
|
105
|
+
output: unknown,
|
|
106
|
+
{ useVertex = false }: VertexOptions = {}
|
|
107
|
+
): VertexModelFailure | null {
|
|
108
|
+
if (!output || typeof output !== 'string') return null;
|
|
109
|
+
for (const line of output.split('\n')) {
|
|
110
|
+
const parsed = parseJsonRecordLine(line);
|
|
111
|
+
if (parsed === null) continue;
|
|
112
|
+
const failure = vertexModelFromResult(parsed, useVertex);
|
|
113
|
+
if (failure) return failure;
|
|
114
|
+
}
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function extractCliFailure(output: unknown, providerName = 'claude'): CliFailure | null {
|
|
119
|
+
if (providerName === 'pi') {
|
|
120
|
+
const lines = typeof output === 'string' ? output.split('\n') : [];
|
|
121
|
+
return extractSettledPiFailure(lines);
|
|
122
|
+
}
|
|
123
|
+
if (!output || typeof output !== 'string') return null;
|
|
124
|
+
|
|
125
|
+
const lines = output.split('\n');
|
|
126
|
+
if (providerName === 'codex') lines.reverse();
|
|
127
|
+
|
|
128
|
+
for (const line of lines) {
|
|
129
|
+
const parsed = parseJsonRecordLine(line);
|
|
130
|
+
if (parsed === null) continue;
|
|
131
|
+
const failure = failureFromProviderObject(parsed, providerName);
|
|
132
|
+
if (failure) return failure;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function extractCliError(output: unknown, providerName = 'claude'): CliError | null {
|
|
139
|
+
const failure = extractCliFailure(output, providerName);
|
|
140
|
+
return failure ? { error: failure.error, provider: failure.provider } : null;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export = {
|
|
144
|
+
MAX_CLI_ERROR_BYTES,
|
|
145
|
+
cliErrorDetail,
|
|
146
|
+
extractClaudeVertexModelError,
|
|
147
|
+
extractCliError,
|
|
148
|
+
extractCliFailure,
|
|
149
|
+
};
|