Dashboard › opencode-lore › Session 0QKMYCiHZ8zi
0QKMYCiHZ8ziiccoZIndependent immutable read-only security/privacy/pentest review in /home/byk/Code/opencode-lore-provider-error. Candidate stable change lpmvqrur commit 0dd569b520ba (resolve full), base main@origin 2cbf40060c67df229731cf1b9e34d5bf22ec2145, expected plain diff SHA-256 3458ce2dc248950b13dc69dda91a07f95a2dcd49f128f2f4ec8e218a6d68b46e, exactly six files. Do not edit/format/VCS mutate/run exhaustive/network/server/prod DB. Read instructions/scripts and every changed line plus parsing, state, output, callback, accounting, telemetry/logging/persistence/cancel paths. Attack all failure aliases, contradictory aliases/status, before-created events, duplicate/decreasing sequences, hostile identity/model/time/output/extensions/error/usage, unhidden in-progress metadata, recall-bearing failures, principal/continuation/plain/buffered/Codex routing, backpressure/cancel races, terminal rollback, logging/Sentry leakage. Verify one fixed public failure, empty failed output, immutable created metadata, trusted in-progress projection, route-independent validated usage, exactly one fixed categorical error only after accepted validation, never raw diagnostics, no successful persistence/recall side effects. Assess fail-first/mutation/fixed evidence supplied. Verify immutable identity/hash/status/conflicts start/end. Report PASS/CONCERN/MUST-FIX with exploit and exact file:line. Never empty/context-warning-only. End exactly MERGE or DO-NOT-MERGE.
<skill_content name="jj-guide"> # Skill: jj-guide # jj Guide for AI Agents Jujutsu (jj) is a Git-compatible VCS with mutable commits, automatic snapshotting, no staging area, and first-class conflicts. This skill teaches you how to use it safely from a non-interactive agent environment. If `.jj/` exists in the repo root, this is a jj repo. **Use `jj` commands, not `git`.** In a colocated repo (`.jj/` *and* `.git/`), git tools can read the state, but mutations should go through `jj` so the operation log stays consistent. ## Critical Rules - **NEVER** use interactive flags (`-i`, `--interactive`). TUI prompts hang in agent environments. This applies to `jj split -i`, `jj squash -i`, `jj commit -i`, `jj resolve`, `jj diffedit`, etc. - **ALWAYS** pass `-m "msg"` when describing/committing. Without `-m`, an editor opens and hangs. - **VERIFY** mutations with `jj st` and `jj log` after `squash`, `abandon`, `rebase`, `restore`, `commit`. ...
<path>/home/byk/Code/opencode-lore-provider-error</path> <type>directory</type> <entries> .craft.yml .git .github/ .gitignore .jj/ .lore.md .oxfmtrc.json .oxlintrc.json AGENTS.md CHANGELOG.md codecov.yml LICENSE node_modules/ package.json packages/ patches/ pnpm-lock.yaml pnpm-workspace.yaml quality/ README.md scripts/ stryker.config.mjs supabase/ tsconfig.base.json tsconfig.json vitest.config.ts vitest.evals.config.ts vitest.mutation.config.ts (28 entries) </entries>
/home/byk/Code/opencode-lore-provider-error/AGENTS.md
No files found
<path>/home/byk/Code/opencode-lore-provider-error/AGENTS.md</path> <type>file</type> <content> 1: <!-- This section is maintained by the coding agent via lore (https://github.com/BYK/loreai) --> 2: ## Long-term Knowledge 3: 4: For long-term knowledge entries managed by [lore](https://github.com/BYK/loreai) (gotchas, patterns, decisions, architecture), see [`.lore.md`](.lore.md) in the project root. 5: <!-- End lore-managed section --> 6: 7: ## Review 8: 9: See [`quality/REVIEW.md`](quality/REVIEW.md) for the review heuristics and workflow — regression-test discipline, adversarial-order state setup, fan-out registry coverage, recurring bug-class batteries, and the two-reviewer rule. Every non-trivial PR requires an adversarial correctness review before merge. 10: 11: # Project Overview 12: 13: Lore is a **three-tier memory architecture** for AI coding agents. ...
<path>/home/byk/Code/opencode-lore-provider-error/quality/REVIEW.md</path> <type>file</type> <content> 1: # Review Heuristics — Lore 2: 3: This document codifies the review bar for pull requests. It exists because 4: adversarial review has repeatedly caught correctness bugs that a green test 5: suite missed — skip/early-return branches, lifecycle sequences, and fan-out 6: registry gaps. Institutionalizing these patterns so they compound. 7: 8: The review workflow (§6) is referenced from AGENTS.md. 9: 10: --- 11: 12: ## 1. Regression-test discipline 13: 14: Every adversarial-review finding that surfaces a defect **must** land a 15: deterministic regression test in the same PR. The test: 16: - fails on the base branch (proving it reproduces the bug), 17: - passes on the fix (proving the fix works), 18: - drives the *real* precondition, not an artificially-constructed state (e.g. ...
<path>/home/byk/Code/opencode-lore-provider-error/package.json</path>
<type>file</type>
<content>
1: {
2: "name": "lore-monorepo",
3: "private": true,
4: "type": "module",
5: "license": "FSL-1.1-Apache-2.0",
6: "description": "Monorepo root for Lore — three-tier memory architecture",
7: "main": "./packages/opencode/src/index.ts",
8: "exports": {
9: ".": "./packages/opencode/src/index.ts"
10: },
11: "packageManager": "pnpm@10.28.0",
12: "volta": {
13: "node": "24.16.0",
14: "pnpm": "10.28.0"
15: },
16: "pnpm": {
17: "onlyBuiltDependencies": [
18: "esbuild",
19: "onnxruntime-node",
20: "sharp"
21: ],
22: "overrides": {
23: "basic-ftp": "5.3.1",
24: "ip-address": "10.2.0",
25: "fast-xml-parser": "5.7.3",
26: "@huggingface/hub": "2.11.0",
27: "onnxruntime-node": "1.27.0",
28: "yaml": ">=2.8.3",
29: "esbuild": ">=0.28.1",
30: "@opentelemetry/core": ">=2.8.0",
31: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/package.json</path>
<type>file</type>
<content>
1: {
2: "name": "@loreai/gateway",
3: "version": "0.40.0",
4: "type": "module",
5: "license": "FSL-1.1-Apache-2.0",
6: "description": "Lore as a transparent LLM proxy — context management for any AI coding client",
7: "main": "./dist/index.cjs",
8: "types": "./dist/index.d.cts",
9: "exports": {
10: ".": {
11: "types": "./dist/index.d.cts",
12: "bun": "./dist/index.bun.js",
13: "require": "./dist/index.cjs",
14: "default": "./dist/index.cjs"
15: }
16: },
17: "bin": {
18: "lore": "./dist/bin.cjs",
19: "lore-gateway": "./dist/bin.cjs"
20: },
21: "scripts": {
22: "typecheck": "tsc --noEmit",
23: "build": "tsx script/build.ts",
24: "bundle": "tsx script/bundle.ts",
25: "build:binary": "tsx script/build.ts --binary",
26: "build:binary:sea": "tsx script/build-binary-sea.ts",
27: "start": "tsx ...
The working copy has no changes. Working copy (@) : qzwttkwl 5f443b8e (empty) (no description set) Parent commit (@-): lpmvqrur 0dd569b5 fix/responses-provider-failures | fix(responses): unify provider failure handling Warning: These bookmarks have conflicts: fix/responses-private-references Hint: Use `jj bookmark list` to see details. Use `jj bookmark set <name> -r <rev>` to resolve.
lpmvqrurxwlmrmwnyllmxlvkmplvwnlz 0dd569b520bad37adbaea230f32100c7f83f463c parents=24880457763b6f10831856d01c41bd72d62ddc28 conflict=false description=fix(responses): unify provider failure handling wswlsmrnuzlqtxyskqotksrlqtzplrkl 24880457763b6f10831856d01c41bd72d62ddc28 parents=a1020a45be1382893a183e2ff39506e78a08fb76 conflict=false description=fix(responses): reject non-monotonic provider failures pxrvwsvvkmpoxnsqmrkwrnlqvvkoltwz 2cbf40060c67df229731cf1b9e34d5bf22ec2145 parents=e977b4b1da8f8197c3238466d41de0bccd8eb054 conflict=false description=feat(cch): add seeds for Claude Code up to 2.1.272 (#1780)
lpmvqrurxwlmrmwnyllmxlvkmplvwnlz 0dd569b520bad37adbaea230f32100c7f83f463c parents=24880457763b6f10831856d01c41bd72d62ddc28 conflict=false description=fix(responses): unify provider failure handling wswlsmrnuzlqtxyskqotksrlqtzplrkl 24880457763b6f10831856d01c41bd72d62ddc28 parents=a1020a45be1382893a183e2ff39506e78a08fb76 conflict=false description=fix(responses): reject non-monotonic provider failures plzxzousrzuvukvvtzlvvynqpokuptqu a1020a45be1382893a183e2ff39506e78a08fb76 parents=01a6e06b08ba1b54f42c5b4c757ec449eb8e8490 conflict=false description=fix(responses): preserve trusted failure metadata skwrwnvkvulpwztqsvprtnrozswvtptx 01a6e06b08ba1b54f42c5b4c757ec449eb8e8490 parents=b1bc7cd46c4eb09f23a7a5c6db257c380401ca02 conflict=false description=fix(responses): make provider failure settlement atomic xqmskzvmnqkrnvmyrznrxkxsxtwyurvu b1bc7cd46c4eb09f23a7a5c6db257c380401ca02 parents=29dee093d7ceed38b0ed823c9d5b26f8c1ba3d7c conflict=false description=fix(responses): complete provider ...
M packages/gateway/src/pipeline.ts M packages/gateway/src/stream/openai-responses.ts M packages/gateway/test/openai-responses-recall-aware-stream.test.ts M packages/gateway/test/openai-responses-stream.test.ts M packages/gateway/test/pipeline-streaming.test.ts M packages/gateway/test/recall-codex-stream.test.ts
3458ce2dc248950b13dc69dda91a07f95a2dcd49f128f2f4ec8e218a6d68b46e -
pxrvwsvvkmpoxnsqmrkwrnlqvvkoltwz 2cbf40060c67df229731cf1b9e34d5bf22ec2145 lpmvqrurxwlmrmwnyllmxlvkmplvwnlz 0dd569b520bad37adbaea230f32100c7f83f463c
packages/gateway/src/pipeline.ts | 369 +++++- packages/gateway/src/stream/openai-responses.ts | 1090 ++++++++++++------- ...st/openai-responses-recall-aware-stream.test.ts | 1245 ++++++++++++++++++++- ...es/gateway/test/openai-responses-stream.test.ts | 1044 +++++++++++++++++- packages/gateway/test/pipeline-streaming.test.ts | 147 +- packages/gateway/test/recall-codex-stream.test.ts | 3 +- 6 files changed, 3398 insertions(+), 500 deletions(-)
diff --git a/packages/gateway/src/pipeline.ts b/packages/gateway/src/pipeline.ts
index 004e03b3e2..a03a58d8da 100644
--- a/packages/gateway/src/pipeline.ts
+++ b/packages/gateway/src/pipeline.ts
@@ -203,7 +203,9 @@
streamResponsesPassthrough,
translateAnthropicStreamToResponses,
applyResponsesEvent,
+ cloneResponsesAccState,
finalizeResponsesAcc,
+ finalizeUnsuccessfulResponsesAcc,
formatResponsesEvent,
makeResponsesAccState,
mapStatusFromStopReason,
@@ -212,7 +214,13 @@
isValidResponsesReasoningEncryptedContent,
responsesDoneItemMatchesAdded,
responsesTerminalItemMatches,
+ restoreResponsesAccState,
normalizeCodexResponsesEvent,
+ projectResponsesInProgressEvent,
+ RESPONSES_PROVIDER_FAILURE_LOG,
+ sanitizeResponsesProviderFailureTerminal,
+ validateResponsesProviderFailureTerminal,
+ validateResponsesSourceSequence,
ResponsesTerminalError,
type ResponsesAccState,
} from "./stream/openai-responses";
@@ -10023,6 +10031,9 @@
| ...
diff --git a/packages/gateway/src/stream/openai-responses.ts b/packages/gateway/src/stream/openai-responses.ts
index 4c33c821b5..b5deac8af2 100644
--- a/packages/gateway/src/stream/openai-responses.ts
+++ b/packages/gateway/src/stream/openai-responses.ts
@@ -48,6 +48,9 @@
export interface ResponsesAccState {
id: string;
model: string;
+ created: boolean;
+ createdAt?: number;
+ lastAcceptedSequenceNumber?: number;
stopReason: string;
usage: GatewayUsage;
terminalEvent?:
@@ -557,6 +560,7 @@
return {
id: "",
model: "",
+ created: false,
stopReason: "end_turn",
usage: { inputTokens: 0, outputTokens: 0 },
items: new Map(),
@@ -575,6 +579,116 @@
};
}
+export function cloneResponsesAccState(
+ state: ResponsesAccState,
+): ResponsesAccState {
+ return structuredClone(state);
+}
+
+export function restoreResponsesAccState(
+ state: ResponsesAccState,
+ snapshot: ResponsesAccState,
+): void {
+ for (const key of Object.keys(state) ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/openai-responses.ts</path> <type>file</type> <content> 1: /** 2: * OpenAI Responses API SSE stream accumulator. 3: * 4: * Parses upstream Responses API streaming events and accumulates the full 5: * response into a `GatewayResponse`. The Responses API uses a different 6: * SSE event lifecycle than Anthropic: 7: * 8: * response.created → response.in_progress → 9: * response.output_item.added → response.output_text.delta (repeated) → 10: * response.output_item.done → response.function_call_arguments.delta → 11: * response.function_call_arguments.done → 12: * response.completed 13: * 14: * Reuses `parseSSEStream` from the Anthropic stream module since the 15: * underlying SSE wire format is the same. ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/openai-responses.ts</path>
<type>file</type>
<content>
1201: (state.itemIndexById.has(addedItem.id) ||
1202: state.callIndexById.has(addedItem.id))) ||
1203: (typeof addedCallID === "string" &&
1204: (state.callIndexById.has(addedCallID) ||
1205: state.itemIndexById.has(addedCallID))) ||
1206: (typeof addedItem.id === "string" && addedItem.id === addedCallID)
1207: ) {
1208: malformed();
1209: }
1210: if (typeof addedItem?.id === "string") {
1211: state.itemIndexById.set(addedItem.id, outputIndex as number);
1212: }
1213: if (typeof addedCallID === "string") {
1214: state.callIndexById.set(addedCallID, outputIndex as number);
1215: }
1216: break;
1217: }
1218: case "response.output_item.done": {
1219: const doneItem = parsed.item as Record<string, unknown> | ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/openai-responses.ts</path>
<type>file</type>
<content>
2451: ) {
2452: const outputIndex = parsed.output_index as number;
2453: const item = state.items.get(outputIndex);
2454: if (item?.type === "tool_use" && (item.callId || item.id)) {
2455: bindCodexEffectiveToolIdentity(
2456: state,
2457: outputIndex,
2458: item.callId || item.id,
2459: );
2460: }
2461: }
2462: if (event === "response.output_item.done") {
2463: const outputIndex = parsed.output_index as number;
2464: doneItems.add(outputIndex);
2465: state.activeTextItems.delete(outputIndex);
2466: state.activeToolItems.delete(outputIndex);
2467: state.unboundTextItems.delete(outputIndex);
2468: state.unboundToolItems.delete(outputIndex);
2469: }
2470: ...
Found 100 matches (more matches available) /home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-stream.test.ts: Line 125: const result = await accumulateResponsesSSEStream(response); Line 198: const result = await accumulateResponsesSSEStream(response); Line 285: const result = await accumulateResponsesSSEStream(response); Line 345: const result = await accumulateResponsesSSEStream(response); Line 359: const result = await accumulateResponsesSSEStream(response); Line 386: const result = await accumulateResponsesSSEStream(response); Line 440: const result = await accumulateResponsesSSEStream(response); Line 497: const result = await accumulateResponsesSSEStream(response); Line 528: const result = await accumulateResponsesSSEStream(response); Line 559: const result = await accumulateResponsesSSEStream(response); Line 583: const result = await ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
9700: } catch {
9701: // The aborted request no longer observes the callback result.
9702: }
9703: };
9704: if (signal.aborted) {
9705: void cancelLateReader();
9706: throw signal.reason;
9707: }
9708: let rejectAbort: ((reason: unknown) => void) | undefined;
9709: const abort = new Promise<never>((_, reject) => {
9710: rejectAbort = reject;
9711: });
9712: const onAbort = (): void => rejectAbort?.(signal.reason);
9713: signal.addEventListener("abort", onAbort, { once: true });
9714: let result: Awaited<ReturnType<typeof opts.runFollowUp>>;
9715: try {
9716: result = await Promise.race([operation, abort]);
9717: } catch (err) {
9718: if (signal.aborted) void cancelLateReader();
9719: throw err;
9720: } finally {
9721: signal.removeEventListener("abort", ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
10970: );
10971: if (continuationProviderFailure) {
10972: validateResponsesProviderFailureTerminal(
10973: ce,
10974: cparsed,
10975: contState,
10976: opts.validation ?? "public",
10977: Math.min(maxSSEFrames, DEFAULT_MAX_SSE_FRAMES),
10978: continuationProviderFailure,
10979: );
10980: validateResponseLifecycle(
10981: contState,
10982: continuationProviderFailure.event,
10983: continuationProviderFailure.parsed,
10984: );
10985: ...
Found 8 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts:
Line 9621: const finish = (resp: GatewayResponse, successful: boolean): boolean => {
Line 15191: const finish = (operation: () => void): void => {
Line 15258: let finished = false;
Line 15271: const finish = () => {
Line 15395: let finished = false;
Line 15418: async function finish(): Promise<void> {
Line 18749: function finishStreaming(resp: GatewayResponse): void {
Line 18817: function finishUnsuccessfulStreaming(resp: GatewayResponse): void {
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
9250: reason !== "content_filter"
9251: ) {
9252: throw new Error("malformed Responses terminal event");
9253: }
9254: }
9255: lifecycle.terminal = true;
9256: }
9257: };
9258: const assertOutputLifecyclesComplete = (
9259: acc: ResponsesAccState,
9260: allowedIncompleteIndices: ReadonlySet<number> = new Set(),
9261: ): void => {
9262: const lifecycles = lifecyclesFor(acc);
9263: for (const index of acc.rawItems.keys()) {
9264: if (lifecycles.get(index)?.outputDone) continue;
9265: if (allowedIncompleteIndices.has(index)) continue;
9266: if (opts.validation !== "codex") {
9267: throw new Error(
9268: `Responses stream ended before output_item.done for index ${index}`,
9269: );
9270: }
9271: const item = acc.rawItems.get(index);
9272: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
8550: );
8551: }
8552: let finalFunctionIdentity: { callId: string; name: string } | undefined;
8553: if (
8554: event === "response.output_item.done" &&
8555: item?.type === "function_call"
8556: ) {
8557: const normalized = state.items.get(outputIndex);
8558: if (normalized?.type !== "tool_use") {
8559: throw new Error(
8560: `Responses output_item.done changed item type for index ${outputIndex}`,
8561: );
8562: }
8563: const finalCallId = item.call_id;
8564: const finalName = item.name;
8565: if (
8566: typeof finalCallId !== "string" ||
8567: finalCallId.length === 0 ||
8568: typeof finalName !== "string" ||
8569: finalName.length === 0 ||
8570: finalCallId === item.id
8571: ) ...
Found 100 matches (more matches available)
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/llm-adapter.test.ts:
Line 1961: `event: response.failed\ndata: ${JSON.stringify({
Line 1964: "response.failed terminal",
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/pipeline-streaming.test.ts:
Line 340: expect(output).not.toContain("response.failed");
Line 1038: expect(body).not.toContain("event: response.failed");
Line 1040: expect(secondBody).not.toContain("event: response.failed");
Line 1042: expect(perSessionSaturatedBody).not.toContain("event: response.failed");
Line 1044: expect(globallySaturatedBody).not.toContain("event: response.failed");
Line 1517: expect(body.split("Gateway request failed")).toHaveLength(2);
Line 1621: responsesEvent("response.failed", {
Line 1643: expect(await response.text()).toContain("event: response.failed");
Line 1746: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
1: /**
2: * Unit tests for `streamResponsesRecallAware` — the true-streaming,
3: * recall-aware OpenAI Responses (codex/ChatGPT) streamer.
4: *
5: * Regression for the "Provider response headers timed out after 10000ms" issue:
6: * the buffered `accumulateResponsesSSEStream` path withholds ALL client bytes
7: * until the entire (slow, reasoning-heavy) upstream completes, so opencode's
8: * 10s `ProviderHeaderTimeoutError` fired on ChatGPT sessions. This streamer
9: * forwards events live while transparently intercepting a `recall`
10: * function_call (emit marker, run follow-up, rebuild the terminal
11: * `response.completed`).
12: */
13: import { log } from "@loreai/core";
14: import { afterEach, describe, test, expect } from "vitest";
15: import { streamResponsesRecallAware } from "../src/pipeline";
16: import {
17: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
1240: content: [{ type: "text", text: "safe before unresolved tool" }],
1241: usage: { inputTokens: 0, outputTokens: 0 },
1242: }),
1243: },
1244: ]);
1245: });
1246:
1247: test("finalizes validated failure usage when cancellation wins terminal backpressure", async () => {
1248: const completions: Array<{
1249: response: GatewayResponse;
1250: successful: boolean;
1251: }> = [];
1252: const client = streamResponsesRecallAware(
1253: streamFrom([
1254: created("resp_failure_backpressure", "gpt-5.6-terra"),
1255: sseEvent("response.failed", {
1256: response: {
1257: id: "resp_failure_backpressure",
1258: model: "gpt-5.6-terra",
1259: status: "failed",
1260: output: [],
1261: usage: ...
diff --git a/packages/gateway/test/openai-responses-recall-aware-stream.test.ts b/packages/gateway/test/openai-responses-recall-aware-stream.test.ts index dca2a57d78..2db7842fee 100644 --- a/packages/gateway/test/openai-responses-recall-aware-stream.test.ts +++ b/packages/gateway/test/openai-responses-recall-aware-stream.test.ts @@ -173,6 +173,20 @@ const PUBLIC_RECALL_ERROR = "Lore could not continue the response after recall"; const PUBLIC_GATEWAY_ERROR = "Gateway request failed"; +const nonMonotonicProviderFailures = ( + [ + ["response.failed", "response.failed", "failed"], + ["failed response.done", "response.done", "failed"], + ["cancelled response.done", "response.done", "cancelled"], + ["error", "error", undefined], + ["response.error", "response.error", undefined], + ] as const +).flatMap(([alias, event, status]) => + ([10, 9] as const).map( + (sequence) => [alias, sequence, event, status] as const, + ), +); + const textItem = ( outputIndex: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
8750: );
8751:
8752: const out = await drain(client);
8753: expect(seen).toEqual(expected);
8754: expect(out).toContain("answer");
8755: },
8756: );
8757:
8758: test("holds no-index continuation events after chained recall detection", async () => {
8759: const malformed = streamFrom([
8760: created("resp_malformed", "gpt-5.6-terra"),
8761: sseEvent("response.output_item.added", {
8762: output_index: 0,
8763: item: {
8764: type: "function_call",
8765: id: "fc_malformed",
8766: call_id: "call_malformed",
8767: name: "recall",
8768: },
8769: }),
8770: sseEvent("response.custom", { secret: "must-not-leak" }),
8771: completed("resp_malformed"),
8772: ]);
8773: const client = ...
diff --git a/packages/gateway/test/openai-responses-stream.test.ts b/packages/gateway/test/openai-responses-stream.test.ts
index 2a33ab9a35..38db5362f7 100644
--- a/packages/gateway/test/openai-responses-stream.test.ts
+++ b/packages/gateway/test/openai-responses-stream.test.ts
@@ -8,11 +8,13 @@
* - Stop reason mapping from status
* - Mixed text + function_call output
*/
-import { describe, test, expect, vi } from "vitest";
+import { log } from "@loreai/core";
+import { afterEach, describe, test, expect, vi } from "vitest";
import {
accumulateResponsesSSEStream,
isSupportedResponsesOutputItemType,
isValidResponsesOutputItemStatus,
+ makeResponsesAccState,
responsesDoneItemMatchesAdded,
responsesTerminalItemMatches,
SUPPORTED_RESPONSES_OUTPUT_ITEM_TYPES,
@@ -23,6 +25,17 @@
import type { GatewayResponse } from "../src/translate/types";
import { validateResponsesUsage } from "../src/usage-validation";
+const silentLogSink = {
+ info: () => {},
+ warn: () ...
Found 100 matches (more matches available)
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-stream.test.ts:
Line 26: import { validateResponsesUsage } from "../src/usage-validation";
Line 69: status: "in_progress",
Line 116: usage: {
Line 133: expect(result.usage?.inputTokens).toBe(15);
Line 134: expect(result.usage?.outputTokens).toBe(5);
Line 143: response: { id: "resp_fc", model: "gpt-4o", status: "in_progress" },
Line 192: usage: { input_tokens: 20, output_tokens: 10 },
Line 220: response: { id: "resp_mix", model: "gpt-4o", status: "in_progress" },
Line 279: usage: { input_tokens: 30, output_tokens: 15 },
Line 311: response: { id: "resp_inc", model: "gpt-4o", status: "in_progress" },
Line 339: usage: { input_tokens: 10, output_tokens: 4096 },
Line 369: response: { id: "resp_d", model: "gpt-4o", status: ...
diff --git a/packages/gateway/test/pipeline-streaming.test.ts b/packages/gateway/test/pipeline-streaming.test.ts
index 544a2f6ec1..694e9cf562 100644
--- a/packages/gateway/test/pipeline-streaming.test.ts
+++ b/packages/gateway/test/pipeline-streaming.test.ts
@@ -85,6 +85,7 @@
import { translateAnthropicStreamToOpenAI } from "../src/stream/openai";
import { translateAnthropicStreamToResponses } from "../src/stream/openai-responses";
import { translateAnthropicStreamToGemini } from "../src/stream/gemini";
+import { setRecallContinuationFailureHook } from "../src/recall-continuation-failure";
import {
makeConversationFixtures,
STANDARD_TOOLS,
@@ -726,6 +727,7 @@
afterEach(() => harness?.teardown());
afterEach(() => vi.mocked(getDegradationWarning).mockReset());
afterEach(() => vi.mocked(Sentry.startInactiveSpan).mockReset());
+ afterEach(() => setRecallContinuationFailureHook(undefined));
it("does not deadlock when an OpenAI translator drops Anthropic lifecycle ...
diff --git a/packages/gateway/test/recall-codex-stream.test.ts b/packages/gateway/test/recall-codex-stream.test.ts
index c7cfedbdf0..941acaa657 100644
--- a/packages/gateway/test/recall-codex-stream.test.ts
+++ b/packages/gateway/test/recall-codex-stream.test.ts
@@ -402,7 +402,8 @@
),
);
expect(failure.match(/event: response\.failed/g)).toHaveLength(1);
- expect(failure).toContain("provider terminal");
+ expect(failure).not.toContain("provider terminal");
+ expect(failure).toContain("Gateway request failed");
});
test("non-codex openai-responses also streams the follow-up", async () => {
b973f0add738ac7d2f18b5b73d7c81c16478d67ccbbc7319e0fc3c2f595e27e3 - a999b49e7bdd24ace94a56f92e6edceec7bebab71aa2ff476526fed4b2ef0cad -
Found 2 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts:
Line 7802: export function streamResponsesRecallAware(
Line 18893: streamResponsesRecallAware(upstreamResponse, {
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path> <type>file</type> <content> 7780: * client bytes until the entire slow reasoning-heavy upstream completes — the 7781: * cause of opencode's 10s `ProviderHeaderTimeoutError`), this function forwards 7782: * every upstream SSE event to the client AS IT ARRIVES, while transparently 7783: * intercepting a `recall` `function_call` output item: 7784: * 7785: * - **No recall**: forwards everything unchanged (identical to 7786: * `streamResponsesPassthrough`). 7787: * - **Recall + other tools (mixed)**: suppresses the recall item and its 7788: * flow events, emits a synthetic marker text item, then rebuilds the 7789: * terminal `response.completed` reflecting only client-visible output. ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
18350: const bufferedRecallDiagnostics = createRecallDiagnostics(
18351: !suppressTemporalStorage,
18352: );
18353: const finalizeWithRecall = async (
18354: resp: GatewayResponse,
18355: ): Promise<Response> => {
18356: // --- Recall interception (non-streaming) ---
18357: // Loop allows the model to call recall multiple times (e.g. drill down
18358: // into t:<id> source citations). Resource, progress, and time budgets
18359: // normally end the chain before its configured emergency ceiling.
18360: let currentResp = resp;
18361: let recallDepth = 0;
18362: let currentModifiedReq = modifiedReq;
18363: const responsesVisibleContent: GatewayContentBlock[] = [];
18364: const cumulativeUsage = { ...(resp.usage ?? ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
15670: if (wireProtocol === req.protocol) {
15671: if (req.stream && upstreamResponse.body) {
15672: return withLimits(
15673: validatedMetaStream(
15674: upstreamResponse,
15675: wireProtocol,
15676: req.codex === true,
15677: abortScope.signal,
15678: ),
15679: );
15680: }
15681: const body = await readForegroundBody(
15682: upstreamResponse,
15683: false,
15684: undefined,
15685: abortScope.signal,
15686: );
15687: if (wireProtocol === "openai-responses") {
15688: parseResponsesNonStreamEnvelope(
15689: JSON.parse(body) as Record<string, unknown>,
15690: );
15691: }
15692: const headers = new Headers({ "content-type": "application/json" });
15693: copyUsageLimitHeaders(upstreamResponse.headers, headers);
15694: return ...
Found 2 matches /home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts: Line 15468: export function validatedMetaStream( Line 15673: validatedMetaStream(
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
15420: finished = true;
15421: signal.removeEventListener("abort", onAbort);
15422: while (pendingOperations.size > 0) {
15423: await Promise.all(pendingOperations);
15424: }
15425: activePipelineRequests.delete(active);
15426: detachedPipelineRequests.delete(active);
15427: pumpPendingSessionClaims();
15428: settle?.();
15429: }
15430: function settleResponse(): void {
15431: if (bodySettled) return;
15432: bodySettled = true;
15433: onResponseBodySettled?.();
15434: void finish();
15435: }
15436: const active: ActivePipelineRequest = {
15437: admissionKey,
15438: abort: (reason) => {
15439: lifecycle.abort(reason);
15440: if (responseReturned) settleResponse();
15441: },
15442: settled,
15443: sessionIDs: new Set(),
15444: };
15445: ...
Found 3 matches /home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts: Line 12300: async function preserveIncompleteResponsesTerminal( Line 15737: const resp = await preserveIncompleteResponsesTerminal( Line 15776: const resp = await preserveIncompleteResponsesTerminal(
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
12190: export async function accumulateNonStreamResponse(
12191: upstreamResponse: Response,
12192: protocol:
12193: | "anthropic"
12194: | "openai"
12195: | "openai-responses"
12196: | "vertex"
12197: | "gemini" = "anthropic",
12198: codex = false,
12199: signal?: AbortSignal,
12200: requireValidCompletion = false,
12201: ): Promise<GatewayResponse> {
12202: // Some providers (the ChatGPT/Copilot/Codex backend, DeepSeek) return an SSE
12203: // stream even when stream: false was sent — sometimes WITHOUT the
12204: // text/event-stream content-type. Sniff the body: if it's SSE, run it through
12205: // the protocol's stream accumulator (merges EVERY chunk, so a multi-chunk
12206: // stream is reconstructed faithfully — taking only the last data: line would
12207: // drop all but the final delta, and JSON.parse-ing the body ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/llm-adapter.ts</path>
<type>file</type>
<content>
2930: maxTokens,
2931: sessionID,
2932: temperature,
2933: disableThinking,
2934: reasoningEffort,
2935: );
2936: }
2937: }
2938:
2939: /** Dispatch to the correct worker response parser for a resolved target. */
2940: function parseWorkerResponse(
2941: protocol: WorkerProtocol,
2942: rawData: unknown,
2943: ): { text: string | null; usage: AnthropicUsage | null; model: string | null } {
2944: switch (protocol) {
2945: case "openai-codex-responses":
2946: return parseResponsesWorkerResponse(
2947: rawData as Parameters<typeof parseResponsesWorkerResponse>[0],
2948: );
2949: case "openai-responses":
2950: // Same wire shape as the Codex path — reuse the existing Responses-API
2951: // worker parser; openai-responses and openai-codex-responses both
2952: // produce `{ ...
Found 7 matches
/home/byk/Code/opencode-lore-provider-error/packages/core/src/log.ts:
Line 51: error(message: string, attrs?: Record<string, unknown>): void;
Line 467: console.error("[lore]", ...safeArgs(args));
Line 476: console.error("[lore] WARN:", ...safeArgs(args));
Line 491: if (!readStderrSilenced()) console.error("[lore]", ...safeArgs(args));
Line 497: export function error(...args: unknown[]): void {
Line 499: if (!readStderrSilenced()) console.error("[lore]", ...safeArgs(args));
Line 500: sink?.error(msg);
<path>/home/byk/Code/opencode-lore-provider-error/packages/core/src/log.ts</path>
<type>file</type>
<content>
430: }
431:
432: /** Append a single log line to the persistent log file. */
433: function writeToFile(level: string, message: string): void {
434: const path = logFilePath();
435: if (!path) return;
436:
437: // Periodic rotation check
438: if (++writeCount % ROTATION_CHECK_INTERVAL === 0) {
439: maybeRotate();
440: }
441:
442: const ts = new Date().toISOString();
443: const tag = level.toUpperCase().padEnd(5);
444: // Flatten multiline messages for clean tail -f output
445: const flat = message.replace(/\n/g, "\\n");
446: const line = `${ts} [${tag}] ${flat}\n`;
447:
448: let fd: number | undefined;
449: try {
450: fd = openLogFileForAppend(path);
451: writeFileSync(fd, line, "utf8");
452: } catch {
453: // Silently degrade — logging failure shouldn't crash the app
454: } finally {
455: if (fd !== undefined) ...
Found 3 matches
/home/byk/Code/opencode-lore-provider-error/packages/core/src/log.ts:
Line 175: export function redactSensitiveLogText(value: string): string {
Line 206: function safeArgs(args: unknown[]): string[] {
Line 218: function sanitizedError(error: Error): Error {
<path>/home/byk/Code/opencode-lore-provider-error/packages/core/src/log.ts</path>
<type>file</type>
<content>
150: function formatArgs(args: unknown[]): string {
151: return args
152: .map((a) =>
153: typeof a === "string" ? a : a instanceof Error ? a.message : String(a),
154: )
155: .join(" ");
156: }
157:
158: /** Extract the first Error instance from the args list, if any. */
159: function findError(args: unknown[]): Error | undefined {
160: for (const a of args) {
161: if (a instanceof Error) return a;
162: }
163: return undefined;
164: }
165:
166: const LOG_FILTERED = "[Filtered]";
167: const LOG_SENSITIVE_KEY = ...
Found 1 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/recall-diagnostics.ts:
Line 8: export function createRecallDiagnostics(enabled = true) {
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/recall-diagnostics.ts</path>
<type>file</type>
<content>
1: import { createHash } from "node:crypto";
2: import { log, type RecallCoverage } from "@loreai/core";
3:
4: /** Keep request-local diagnostic state bounded while observing chains beyond ten rounds. */
5: export const MAX_RECALL_DIAGNOSTIC_ROUNDS = 64;
6:
7: /** Request-local comparisons only. Fingerprints and recall content never leave this closure. */
8: export function createRecallDiagnostics(enabled = true) {
9: const inputs = new Set<string>();
10: const results = new Set<string>();
11: const pairs = new Set<string>();
12: const coverage = new Set<string>();
13: const started = performance.now();
14: let finished = false;
15: let rounds = 0;
16: let detailCalls = 0;
17: let emptyBodies = 0;
18: let resultBytes = 0;
19: const fingerprint = (value: string) =>
20: createHash("sha256").update(value).digest("hex");
21: return ...
CHANGE lpmvqrurxwlm COMMIT 0dd569b520bad37adbaea230f32100c7f83f463c fix(responses): unify provider failure handling --- CHANGE wswlsmrnuzlq COMMIT 24880457763b6f10831856d01c41bd72d62ddc28 fix(responses): reject non-monotonic provider failures --- CHANGE plzxzousrzuv COMMIT a1020a45be1382893a183e2ff39506e78a08fb76 fix(responses): preserve trusted failure metadata --- CHANGE skwrwnvkvulp COMMIT 01a6e06b08ba1b54f42c5b4c757ec449eb8e8490 fix(responses): make provider failure settlement atomic --- CHANGE xqmskzvmnqkr COMMIT b1bc7cd46c4eb09f23a7a5c6db257c380401ca02 fix(responses): complete provider failure sanitization --- CHANGE qnlnmzlxyynv COMMIT 29dee093d7ceed38b0ed823c9d5b26f8c1ba3d7c fix(responses): bind sanitized failures to trusted state --- CHANGE prpmozzzqvkt COMMIT d385b39653b0085833e281b6347b15071cee6801 fix(responses): sanitize provider failures ---
Commit ID: d385b39653b0085833e281b6347b15071cee6801
Change ID: prpmozzzqvktqmyxkmyprklpmqxwktkv
Author : Burak Yigit Kaya <ben@byk.im> (2026-09-12 22:23:01)
Committer: Burak Yigit Kaya <ben@byk.im> (2026-09-16 10:18:43)
fix(responses): sanitize provider failures
packages/gateway/src/pipeline.ts | 19 ++-
packages/gateway/src/stream/openai-responses.ts | 100 ++++++++++++++--
...est/openai-responses-recall-aware-stream.test.ts | 130 +++++++++++++++++-----
...ges/gateway/test/openai-responses-stream.test.ts | 106 +++++++++++++----
packages/gateway/test/pipeline-streaming.test.ts | 18 ++-
packages/gateway/test/recall-codex-stream.test.ts | 3 +-
6 files changed, 313 insertions(+), 63 deletions(-)
Commit ID: 29dee093d7ceed38b0ed823c9d5b26f8c1ba3d7c
Change ID: qnlnmzlxyynvkvssnkusztrzyxzylkzo
Author : Burak Yigit Kaya <ben@byk.im> (2026-09-14 08:34:22)
Committer: Burak Yigit Kaya <ben@byk.im> (2026-09-16 10:18:43)
fix(responses): bind sanitized ...
diff --git a/packages/gateway/src/pipeline.ts b/packages/gateway/src/pipeline.ts
index 3a5a89dd15..a03a58d8da 100644
--- a/packages/gateway/src/pipeline.ts
+++ b/packages/gateway/src/pipeline.ts
@@ -216,7 +216,10 @@
responsesTerminalItemMatches,
restoreResponsesAccState,
normalizeCodexResponsesEvent,
+ projectResponsesInProgressEvent,
+ RESPONSES_PROVIDER_FAILURE_LOG,
sanitizeResponsesProviderFailureTerminal,
+ validateResponsesProviderFailureTerminal,
validateResponsesSourceSequence,
ResponsesTerminalError,
type ResponsesAccState,
@@ -10287,12 +10290,14 @@
throw new Error("malformed Responses terminal event");
}
if (providerFailureTerminal) {
- if (
- (event === "error" || event === "response.error") &&
- !responseLifecycleFor(state).created
- ) {
- throw new Error("Responses event before response.created");
- }
+ ...
Found 10 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/source-checkpoint.test.ts:
Line 360: `INSERT INTO temporal_messages(id, project_id, session_id, role, content, tokens, distilled, created_at) VALUES (?, ?, ?, 'user', 'legacy output', 1, 0, 1)`,
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-stream.test.ts:
Line 618: test("uses created metadata and failure usage in the plain streaming route", async () => {
Line 4722: test("binds a sanitized failure to created state and clears failed terminal output", async () => {
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts:
Line 646: test("uses created metadata and clears failed output from completion state", async () => {
Line 829: test("keeps created metadata authoritative through a hidden recall and provider failure", async () => {
Line 1296: ...
Found 1 matches /home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts: Line 13480: function accountUnsuccessfulResponse(
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
13390: // warmupCount is reset so the break-even cap starts from 0 on the next break.
13391: if (sessionState.warmup) {
13392: if (sessionState.warmup.disabled) {
13393: sessionState.warmup.disabled = false;
13394: log.info(
13395: `cache-warmer: re-enabled session=${sessionID.slice(0, 16)} (user resumed)`,
13396: );
13397: }
13398: if (
13399: sessionState.warmup.warmupCount > 0 &&
13400: !sessionState.warmup.forceKeepWarm
13401: ) {
13402: sessionState.warmup.warmupCount = 0;
13403: }
13404: }
13405:
13406: // --- Shadow context tracking for counterfactual compaction estimation ---
13407: // Track how large the context *would* be without Lore's distillation
13408: // compressing it. ...
<path>/home/byk/Code/opencode-lore-provider-error/vitest.config.ts</path>
<type>file</type>
<content>
1: import { defineConfig } from "vitest/config";
2: import path from "node:path";
3:
4: export default defineConfig({
5: // Alias @loreai/core and @loreai/gateway for test imports.
6: // MUST be at the top level of the vite config — putting this under
7: // `test.resolve.alias` does NOT work (vite's resolver is a top-level
8: // option, not a test.* option). The previous placement silently
9: // resolved to the stale dist build, masking real test failures.
10: resolve: {
11: alias: {
12: "@loreai/core": path.resolve(__dirname, "packages/core/src"),
13: "@loreai/gateway": path.resolve(__dirname, "packages/gateway/src"),
14: },
15: },
16: test: {
17: // Run all packages' tests
18: include: [
19: "packages/core/test/**/*.test.ts",
20: // Fast, pure unit tests for the eval suite's own logic (scorers,
21: // analysis). ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/core/test/setup.ts</path>
<type>file</type>
<content>
1: import { mkdtempSync, rmSync } from "node:fs";
2: import { join } from "node:path";
3: import { tmpdir } from "node:os";
4: import { afterAll, afterEach } from "vitest";
5: import { close, invalidateProjectIdCache } from "../src/db";
6: import { silenceStderr } from "../src/log";
7:
8: // Create an isolated temporary database for the entire test run.
9: // This prevents test fixtures from leaking into the live lore DB
10: // at ~/.local/share/lore/lore.db.
11: const tmp = mkdtempSync(join(tmpdir(), "lore-test-"));
12: process.env.LORE_DB_PATH = join(tmp, "test.db");
13:
14: // ---------------------------------------------------------------------------
15: // Block live network to models.dev during tests.
16: //
17: // `fetchModelData()` (gateway/src/worker-model.ts) hits
18: // https://models.dev/api.json to pull pricing/limits, and the gateway
19: // pre-warms it on ...
<path>/home/byk/Code/opencode-lore-provider-error/stryker.config.mjs</path> <type>file</type> <content> 1: // Mutation testing — issue #832. 2: // 3: // Measures whether our tests CONSTRAIN behavior (not merely pass) on the 4: // high-risk STATEFUL modules where review — not tests — caught the recent bugs 5: // (sync prune-floor wedge #828, tier residue #828, decay/evict edge cases #816). 6: // A surviving mutant = a line the suite does not pin (sometimes an equivalent 7: // mutant). ALWAYS hand-verify a survivor by applying the EXACT replacement from 8: // the report — Stryker splits compound `A && B` conditions, so a `:col → "true"` 9: // mutant may be a sub-operand, not the whole condition. See 10: // quality/MUTATION_TESTING.md. 11: // 12: // Run nightly / on-demand; NOT per-PR (slow). No hard gate while we establish a 13: // baseline: `thresholds.break` is null, so the run never fails CI — we record 14: // the score and ratchet over time. ...
<path>/home/byk/Code/opencode-lore-provider-error/quality/MUTATION_TESTING.md</path>
<type>file</type>
<content>
1: # Mutation testing (Stryker) — issue #832
2:
3: Mutation testing measures whether the test suite **constrains behavior**, not just
4: whether it passes. Stryker makes small edits ("mutants") to source — flip `<=` to
5: `<`, replace a return value, delete a guard — and re-runs the tests. A mutant the
6: tests **kill** is behavior they pin; a mutant that **survives** is a line no test
7: constrains: a named gap (sometimes an *equivalent* mutant — see below). It's the
8: tool that directly answers "are our tests adequate?" for the stateful modules
9: where review — not tests — caught the recent sync bugs (#828) and lifecycle edge
10: cases (#816).
11:
12: ## How to run
13:
14: ```bash
15: pnpm mutation # configured scope (sync modules)
16: pnpm mutation -- --mutate "packages/core/src/sync-data.ts" # one module
17: ```
18:
19: ...
Found 100 matches (more matches available)
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts:
Line 178: ["response.failed", "response.failed", "failed"],
Line 244: expect(out).not.toContain("response.failed");
Line 295: ["response.failed", "failed"],
Line 296: ["response.failed", "cancelled"],
Line 376: .find((frame) => frame.startsWith("event: response.failed\n"));
Line 384: type: "response.failed",
Line 540: .find((frame) => frame.startsWith("event: response.failed\n"));
Line 547: type: "response.failed",
Line 587: ["response.failed", "failed"],
Line 667: sseEvent("response.failed", {
Line 709: .find((frame) => frame.startsWith("event: response.failed\n"));
Line 716: type: "response.failed",
Line 758: sseEvent("response.failed", {
Line 801: .find((frame) => frame.startsWith("event: ...
Found 100 matches (more matches available)
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/llm-adapter.test.ts:
Line 1961: `event: response.failed\ndata: ${JSON.stringify({
Line 1964: "response.failed terminal",
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/recall-buffered-transaction.test.ts:
Line 599: response.status === "failed" ? "response.failed" : "response.completed",
Line 787: received.includes("event: response.failed")
Line 789: expect(received.match(/^event: response.failed$/gm)).toHaveLength(
Line 1042: expect(wire).toContain("event: response.failed");
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/session-adoption.e2e.test.ts:
Line 300: new Response("provider failed", {
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/responses-upstream-error-relay.test.ts:
Line 85: statusText: "provider secret ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/recall-buffered-transaction.test.ts</path>
<type>file</type>
<content>
500: index: 0,
501: finish_reason: invalid ? null : recalling ? "tool_calls" : "stop",
502: message: {
503: role: "assistant",
504: content: recalling ? null : "Completed answer",
505: ...(recalling
506: ? {
507: tool_calls: toolCalls.map((block) => ({
508: id: block.id,
509: type: "function",
510: function: {
511: name: block.name,
512: arguments: JSON.stringify(recallInput),
513: },
514: })),
515: }
516: : {}),
517: },
518: },
519: ],
520: usage: {
521: prompt_tokens: input,
522: completion_tokens: output,
523: total_tokens: ...
Your previous result was only a context warning and is not a substantive verdict. Retry the same immutable security/privacy review now. Return a full evidence-based report with PASS/CONCERN/MUST-FIX findings and exact current file:line citations. Verify candidate identity and the same plain diff hash at start/end. Do not edit files or mutate VCS. End exactly MERGE or DO-NOT-MERGE.
<skill_content name="jj-guide"> # Skill: jj-guide # jj Guide for AI Agents Jujutsu (jj) is a Git-compatible VCS with mutable commits, automatic snapshotting, no staging area, and first-class conflicts. This skill teaches you how to use it safely from a non-interactive agent environment. If `.jj/` exists in the repo root, this is a jj repo. **Use `jj` commands, not `git`.** In a colocated repo (`.jj/` *and* `.git/`), git tools can read the state, but mutations should go through `jj` so the operation log stays consistent. ## Critical Rules - **NEVER** use interactive flags (`-i`, `--interactive`). TUI prompts hang in agent environments. This applies to `jj split -i`, `jj squash -i`, `jj commit -i`, `jj resolve`, `jj diffedit`, etc. - **ALWAYS** pass `-m "msg"` when describing/committing. Without `-m`, an editor opens and hangs. - **VERIFY** mutations with `jj st` and `jj log` after `squash`, `abandon`, `rebase`, `restore`, `commit`. ...
The working copy has no changes. Working copy (@) : qzwttkwl 5f443b8e (empty) (no description set) Parent commit (@-): lpmvqrur 0dd569b5 fix/responses-provider-failures | fix(responses): unify provider failure handling Warning: These bookmarks have conflicts: fix/responses-private-references Hint: Use `jj bookmark list` to see details. Use `jj bookmark set <name> -r <rev>` to resolve. lpmvqrurxwlmrmwnyllmxlvkmplvwnlz 0dd569b520bad37adbaea230f32100c7f83f463c parents=24880457763b6f10831856d01c41bd72d62ddc28 conflicts=false desc=fix(responses): unify provider failure handling wswlsmrnuzlqtxyskqotksrlqtzplrkl 24880457763b6f10831856d01c41bd72d62ddc28 parents=a1020a45be1382893a183e2ff39506e78a08fb76 conflicts=false desc=fix(responses): reject non-monotonic provider failures pxrvwsvvkmpoxnsqmrkwrnlqvvkoltwz 2cbf40060c67df229731cf1b9e34d5bf22ec2145 parents=e977b4b1da8f8197c3238466d41de0bccd8eb054 conflicts=false desc=feat(cch): add seeds for Claude Code up to 2.1.272 (#1780) M ...
diff --git a/packages/gateway/src/pipeline.ts b/packages/gateway/src/pipeline.ts
index 004e03b3e2..a03a58d8da 100644
--- a/packages/gateway/src/pipeline.ts
+++ b/packages/gateway/src/pipeline.ts
@@ -203,7 +203,9 @@
streamResponsesPassthrough,
translateAnthropicStreamToResponses,
applyResponsesEvent,
+ cloneResponsesAccState,
finalizeResponsesAcc,
+ finalizeUnsuccessfulResponsesAcc,
formatResponsesEvent,
makeResponsesAccState,
mapStatusFromStopReason,
@@ -212,7 +214,13 @@
isValidResponsesReasoningEncryptedContent,
responsesDoneItemMatchesAdded,
responsesTerminalItemMatches,
+ restoreResponsesAccState,
normalizeCodexResponsesEvent,
+ projectResponsesInProgressEvent,
+ RESPONSES_PROVIDER_FAILURE_LOG,
+ sanitizeResponsesProviderFailureTerminal,
+ validateResponsesProviderFailureTerminal,
+ validateResponsesSourceSequence,
ResponsesTerminalError,
type ResponsesAccState,
} from "./stream/openai-responses";
@@ -10023,6 +10031,9 @@
| ...
diff --git a/packages/gateway/src/stream/openai-responses.ts b/packages/gateway/src/stream/openai-responses.ts
index 4c33c821b5..b5deac8af2 100644
--- a/packages/gateway/src/stream/openai-responses.ts
+++ b/packages/gateway/src/stream/openai-responses.ts
@@ -48,6 +48,9 @@
export interface ResponsesAccState {
id: string;
model: string;
+ created: boolean;
+ createdAt?: number;
+ lastAcceptedSequenceNumber?: number;
stopReason: string;
usage: GatewayUsage;
terminalEvent?:
@@ -557,6 +560,7 @@
return {
id: "",
model: "",
+ created: false,
stopReason: "end_turn",
usage: { inputTokens: 0, outputTokens: 0 },
items: new Map(),
@@ -575,6 +579,116 @@
};
}
+export function cloneResponsesAccState(
+ state: ResponsesAccState,
+): ResponsesAccState {
+ return structuredClone(state);
+}
+
+export function restoreResponsesAccState(
+ state: ResponsesAccState,
+ snapshot: ResponsesAccState,
+): void {
+ for (const key of Object.keys(state) ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/package.json</path>
<type>file</type>
<content>
1: {
2: "name": "@loreai/gateway",
3: "version": "0.40.0",
4: "type": "module",
5: "license": "FSL-1.1-Apache-2.0",
6: "description": "Lore as a transparent LLM proxy — context management for any AI coding client",
7: "main": "./dist/index.cjs",
8: "types": "./dist/index.d.cts",
9: "exports": {
10: ".": {
11: "types": "./dist/index.d.cts",
12: "bun": "./dist/index.bun.js",
13: "require": "./dist/index.cjs",
14: "default": "./dist/index.cjs"
15: }
16: },
17: "bin": {
18: "lore": "./dist/bin.cjs",
19: "lore-gateway": "./dist/bin.cjs"
20: },
21: "scripts": {
22: "typecheck": "tsc --noEmit",
23: "build": "tsx script/build.ts",
24: "bundle": "tsx script/bundle.ts",
25: "build:binary": "tsx script/build.ts --binary",
26: "build:binary:sea": "tsx script/build-binary-sea.ts",
27: "start": "tsx ...
Resume your existing immutable provider security review; do not restart or discard prior work. The model-facing recall tool is broken and emits context warnings. Do not use it. Recover any missing historical context by running the local CLI lore recall '<specific query>' in the repository, or use read-only HTTP search at http://127.0.0.1:3207/ui/search if needed. Continue reviewing the exact same frozen candidate and hash from your existing session. Do not edit files or mutate VCS. Return a substantive evidence-based PASS/CONCERN/MUST-FIX report with exact file:line citations, verify identity and plain diff hash at the end, and finish exactly MERGE or DO-NOT-MERGE. A context warning or empty result is not a verdict; keep working through it using the CLI workaround.
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
10000: try {
10001: controller.error(error);
10002: } catch {
10003: // Already closed/cancelled.
10004: }
10005: };
10006:
10007: const resetKeepalive = (): void => {
10008: if (keepaliveTimer) clearTimeout(keepaliveTimer);
10009: keepaliveTimer = setTimeout(function tick() {
10010: if (cancelled || signal.aborted) return;
10011: if ((controller.desiredSize ?? 1) > 0) {
10012: void safeEnqueue(keepaliveComment);
10013: }
10014: if (!signal.aborted) {
10015: keepaliveTimer = setTimeout(tick, KEEPALIVE_INACTIVITY_MS);
10016: }
10017: }, KEEPALIVE_INACTIVITY_MS);
10018: };
10019: const clearKeepalive = (): void => {
10020: if (keepaliveTimer) ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
10430: resolvedVisibleTool = unresolvedToolIndices.delete(outputIndex);
10431: unresolvedToolBytes.delete(outputIndex);
10432: otherToolSeen = true;
10433: }
10434:
10435: if (
10436: resolvedVisibleTool &&
10437: recallIndices.size === 0 &&
10438: unresolvedToolIndices.size === 0
10439: ) {
10440: for (const deferred of deferredEvents) {
10441: if (!(await enqueuePrincipal(deferred.chunk, true))) break;
10442: }
10443: deferredEvents.length = 0;
10444: deferredBytes = 0;
10445: }
10446:
10447: const isRecallEvent =
10448: outputIndex !== undefined && recallIndices.has(outputIndex);
10449: const isUnresolvedToolEvent =
10450: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
10880: const promoteContinuationCandidate = (
10881: outputIndex: number,
10882: ): void => {
10883: const bytes =
10884: contUnresolvedToolBytes.get(outputIndex) ?? 0;
10885: contUnresolvedToolBytes.delete(outputIndex);
10886: continuationRecallBytes += bytes;
10887: hiddenRecallBytes += bytes;
10888: if (
10889: continuationRecallBytes > maxDeferredBytes ||
10890: hiddenRecallBytes > maxHiddenRecallBytes
10891: ) {
10892: throw new RecallContinuationFailure("resource_limit");
10893: }
10894: };
10895: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/openai-responses.ts</path>
<type>file</type>
<content>
540: ? { type: "output_text", text: part.value }
541: : { type: "refusal", refusal: part.value },
542: );
543: return finalizedContent.length > 0
544: ? { ...snapshot, content: finalizedContent }
545: : snapshot;
546: }
547:
548: /** Validated unsuccessful terminal, carrying usage for accounting-only paths. */
549: export class ResponsesTerminalError extends Error {
550: constructor(
551: readonly response: GatewayResponse,
552: readonly status: string,
553: ) {
554: super(`upstream Responses request ended with status ${status}`);
555: this.name = "ResponsesTerminalError";
556: }
557: }
558:
559: export function makeResponsesAccState(): ResponsesAccState {
560: return {
561: id: "",
562: model: "",
563: created: false,
564: stopReason: "end_turn",
565: usage: { inputTokens: 0, ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/openai-responses.ts</path>
<type>file</type>
<content>
1030: }
1031:
1032: let stopReason = state.stopReason;
1033: // If we saw tool_use, map stop reason accordingly
1034: if (content.some((b) => b.type === "tool_use") && stopReason === "end_turn") {
1035: stopReason = "tool_use";
1036: }
1037:
1038: return {
1039: id: state.id,
1040: model: state.model,
1041: content,
1042: rawOutputItems: Array.from(state.rawItems.entries())
1043: .sort(([a], [b]) => a - b)
1044: .map(([, item]) => item)
1045: .filter((item) => item.type !== "item_reference"),
1046: stopReason,
1047: usage: state.usage,
1048: ...(state.codexRateLimits
1049: ? { codexRateLimits: state.codexRateLimits }
1050: : {}),
1051: };
1052: }
1053:
1054: /** Failed output is never authoritative and must not reach accounting hooks. ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/openai-responses.ts</path>
<type>file</type>
<content>
1970:
1971: function validatedTerminalStatus(
1972: event: "response.completed" | "response.done" | "response.incomplete",
1973: parsed: Record<string, unknown>,
1974: validation: ResponsesValidationMode,
1975: requireKnownIncompleteReason = false,
1976: ): string {
1977: const terminal = parsed.response as Record<string, unknown> | undefined;
1978: if (!terminal || typeof terminal !== "object" || Array.isArray(terminal)) {
1979: throw new Error("malformed Responses terminal event");
1980: }
1981: if (terminal.status !== undefined && typeof terminal.status !== "string") {
1982: throw new Error("malformed Responses terminal event");
1983: }
1984: const rawDetails = terminal.incomplete_details;
1985: if (
1986: rawDetails !== undefined &&
1987: rawDetails !== null &&
1988: !isRecord(rawDetails)
1989: ) {
1990: ...
Found 1 matches /home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts: Line 9152: const validateResponseLifecycle = (
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
9080: const finalPart = finalContent[contentIndex] as
9081: | Record<string, unknown>
9082: | undefined;
9083: if (!finalPart || finalPart.type !== contentState.kind) {
9084: throw new Error(
9085: `Responses output_item.done changed reasoning content type for index ${outputIndex}:${contentIndex}`,
9086: );
9087: }
9088: if (
9089: (contentState.deltaSeen && !contentState.valueDone) ||
9090: (contentState.partAdded && !contentState.partDone)
9091: ) {
9092: throw new Error(
9093: `Responses reasoning content ended before completion for index ${outputIndex}:${contentIndex}`,
9094: );
9095: }
9096: const ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
120: output_index: outputIndex,
121: item_id: itemId,
122: delta: argumentsText,
123: }) +
124: sseEvent("response.output_item.done", {
125: output_index: outputIndex,
126: item: {
127: type: "function_call",
128: id: itemId,
129: call_id: callId,
130: name: "read",
131: arguments: argumentsText,
132: status: "completed",
133: },
134: });
135:
136: const completed = (id: string, usage?: unknown) =>
137: sseEvent("response.completed", {
138: response: {
139: id,
140: model: "gpt-5.6-terra",
141: status: "completed",
142: ...(usage ? { usage } : {}),
143: },
144: });
145:
146: const incomplete = (id: string) =>
147: sseEvent("response.incomplete", {
148: response: {
149: id,
150: model: "gpt-5.6-terra",
151: ...
diff --git a/packages/gateway/test/openai-responses-stream.test.ts b/packages/gateway/test/openai-responses-stream.test.ts
index 2a33ab9a35..38db5362f7 100644
--- a/packages/gateway/test/openai-responses-stream.test.ts
+++ b/packages/gateway/test/openai-responses-stream.test.ts
@@ -8,11 +8,13 @@
* - Stop reason mapping from status
* - Mixed text + function_call output
*/
-import { describe, test, expect, vi } from "vitest";
+import { log } from "@loreai/core";
+import { afterEach, describe, test, expect, vi } from "vitest";
import {
accumulateResponsesSSEStream,
isSupportedResponsesOutputItemType,
isValidResponsesOutputItemStatus,
+ makeResponsesAccState,
responsesDoneItemMatchesAdded,
responsesTerminalItemMatches,
SUPPORTED_RESPONSES_OUTPUT_ITEM_TYPES,
@@ -23,6 +25,17 @@
import type { GatewayResponse } from "../src/translate/types";
import { validateResponsesUsage } from "../src/usage-validation";
+const silentLogSink = {
+ info: () => {},
+ warn: () ...
Found 3 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts:
Line 9621: const finish = (resp: GatewayResponse, successful: boolean): boolean => {
Line 15191: const finish = (operation: () => void): void => {
Line 15271: const finish = () => {
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
9540: const response = parsed.response as Record<string, unknown> | undefined;
9541: if (!Array.isArray(response?.output)) return parsed;
9542: const output = response.output.filter(
9543: (item) =>
9544: !(
9545: item &&
9546: typeof item === "object" &&
9547: !Array.isArray(item) &&
9548: (item as Record<string, unknown>).type === "item_reference" &&
9549: typeof (item as Record<string, unknown>).id === "string" &&
9550: referenceIdentities.has(
9551: (item as Record<string, unknown>).id as string,
9552: )
9553: ),
9554: );
9555: if (output.length === response.output.length) return parsed;
9556: return { ...parsed, response: { ...response, output } };
9557: };
9558: const reserveSyntheticIdentity = (
9559: syntheticId: string,
9560: ...
Found 24 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/openai-responses.ts:
Line 549: export class ResponsesTerminalError extends Error {
Line 555: this.name = "ResponsesTerminalError";
Line 2105: allowFailureTerminal?: boolean;
Line 2108: requireCompletedTerminal?: boolean;
Line 2190: !opts.allowFailureTerminal &&
Line 2191: !opts.requireCompletedTerminal
Line 2258: opts.requireCompletedTerminal,
Line 2474: ((opts.allowFailureTerminal || opts.requireCompletedTerminal) &&
Line 2598: opts.requireCompletedTerminal,
Line 2662: opts.requireCompletedTerminal &&
Line 2665: throw new ResponsesTerminalError(
Line 2850: allowFailureTerminal: true,
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts:
Line 224: ResponsesTerminalError,
Line 12234: requireCompletedTerminal: true,
Line ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
12150: true,
12151: () => {
12152: truncated = true;
12153: },
12154: signal,
12155: );
12156: const headers = new Headers(response.headers);
12157: // The retained body may be shorter than the provider's original payload.
12158: for (const name of [
12159: "connection",
12160: "content-encoding",
12161: "content-length",
12162: "keep-alive",
12163: "proxy-authenticate",
12164: "proxy-authorization",
12165: "set-cookie",
12166: "set-cookie2",
12167: "te",
12168: "trailer",
12169: "transfer-encoding",
12170: "upgrade",
12171: ]) {
12172: headers.delete(name);
12173: }
12174: if (truncated) headers.set("x-lore-body-truncated", "true");
12175: return new Response(body, {
12176: status: response.status,
12177: statusText: response.statusText,
12178: headers,
12179: ...
packages/gateway/src/pipeline.ts | 369 +++++-
packages/gateway/src/stream/openai-responses.ts | 1090 ++++++++++++-------
...st/openai-responses-recall-aware-stream.test.ts | 1245 ++++++++++++++++++++-
...es/gateway/test/openai-responses-stream.test.ts | 1044 +++++++++++++++++-
packages/gateway/test/pipeline-streaming.test.ts | 147 +-
packages/gateway/test/recall-codex-stream.test.ts | 3 +-
6 files changed, 3398 insertions(+), 500 deletions(-)
Commit ID: 0dd569b520bad37adbaea230f32100c7f83f463c
Change ID: lpmvqrurxwlmrmwnyllmxlvkmplvwnlz
Bookmarks: fix/responses-provider-failures fix/responses-provider-failures@git
Author : Burak Yigit Kaya <ben@byk.im> (2026-09-16 11:49:37)
Committer: Burak Yigit Kaya <ben@byk.im> (2026-09-16 12:50:50)
fix(responses): unify provider failure handling
packages/gateway/src/pipeline.ts | 38 +++--
packages/gateway/src/stream/openai-responses.ts | 98 ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
7600: );
7601: expect(await drain(client)).toContain(PUBLIC_RECALL_ERROR);
7602: expect(recalled).toBe(0);
7603: });
7604:
7605: test("rejects a chained recall call_id matching its future marker ID", async () => {
7606: const second = streamFrom([
7607: created("resp_second_collision", "gpt-5.6-terra"),
7608: recallCall(
7609: 0,
7610: { query: "detail" },
7611: "fc_second_collision",
7612: "msg_resp_first_collision_1",
7613: ),
7614: completed("resp_second_collision"),
7615: ]);
7616: let recalls = 0;
7617: const client = streamResponsesRecallAware(
7618: streamFrom([
7619: created("resp_first_collision", "gpt-5.6-terra"),
7620: recallCall(0, { query: "architecture" }),
7621: completed("resp_first_collision"),
7622: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
9150: resultText: "result",
9151: };
9152: },
9153: runFollowUp: async () => ({ reader: followUp.body!.getReader() }),
9154: },
9155: );
9156:
9157: const output = await drain(client);
9158: const completedJSON = JSON.stringify(completedResponse);
9159: expect(output.match(/^event: response\.failed$/gm)).toHaveLength(1);
9160: expect(output).toContain(PUBLIC_RECALL_ERROR);
9161: expect(output).not.toContain("response.completed");
9162: expect(output).not.toContain("private done-only continuation query");
9163: expect(output).not.toContain("fc_done_only_failed_followup");
9164: expect(output).not.toContain("call_done_only_failed_followup");
9165: expect(completedJSON).not.toContain("private done-only continuation query");
9166: ...
<path>/home/byk/Code/opencode-lore-provider-error/quality/REVIEW.md</path> <type>file</type> <content> 1: # Review Heuristics — Lore 2: 3: This document codifies the review bar for pull requests. It exists because 4: adversarial review has repeatedly caught correctness bugs that a green test 5: suite missed — skip/early-return branches, lifecycle sequences, and fan-out 6: registry gaps. Institutionalizing these patterns so they compound. 7: 8: The review workflow (§6) is referenced from AGENTS.md. 9: 10: --- 11: 12: ## 1. Regression-test discipline 13: 14: Every adversarial-review finding that surfaces a defect **must** land a 15: deterministic regression test in the same PR. The test: 16: - fails on the base branch (proving it reproduces the bug), 17: - passes on the fix (proving the fix works), 18: - drives the *real* precondition, not an artificially-constructed state (e.g. ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
9730: const shifted = index + offset;
9731: if (!Number.isSafeInteger(shifted) || shifted < 0) {
9732: throw new Error("Responses output_index overflow");
9733: }
9734: return shifted;
9735: };
9736:
9737: /**
9738: * Serialize a synthetic Responses output_text item as its SSE flow events
9739: * (`output_item.added`, `content_part.added`, repeated `output_text.delta`,
9740: * `output_text.done`, `content_part.done`, `output_item.done`).
9741: */
9742: function emitTextItem(
9743: outputIndex: number,
9744: text: string,
9745: itemId = `msg_${state.id || "lore"}_${outputIndex}`,
9746: ): string {
9747: return (
9748: formatResponsesEvent(
9749: "response.output_item.added",
9750: JSON.stringify({
9751: type: "response.output_item.added",
9752: output_index: ...
Found 100 matches (more matches available)
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/worker-copilot-responses.test.ts:
Line 170: // Force `reasoningEffort: "medium"` via a custom client that overrides opts.
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/bedrock-runtime.test.ts:
Line 69: connection: "keep-alive, x-connection-secret",
Line 70: cookie: "session=secret",
Line 71: "proxy-authorization": "Basic proxy-secret",
Line 74: "x-connection-secret": "remove-me",
Line 87: "x-connection-secret",
Line 111: // Version-suffix colons — provisioned-throughput / custom-model-import
Line 619: // Provisioned-throughput / custom-model-import IDs always carry a `:vN`
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/claude-usage-headers.test.ts:
Line 41: response.headers.set("set-cookie", "upstream-secret=private");
Line 104: ...
Found 32 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts:
Line 306: "principal-diagnostics-secret",
Line 330: provider_trace: secrets[2],
Line 344: diagnostics: { detail: secrets[3] },
Line 414: const secret = `private-${errorEvent}-principal-diagnostic`;
Line 439: diagnostics: { detail: secret },
Line 477: const secret = `private-principal-${failureEvent}-${failureStatus}-${failureSequence}`;
Line 496: diagnostics: { detail: secret },
Line 500: provider_trace: secret,
Line 508: diagnostics: { detail: secret },
Line 592: const secret = `private-sparse-${terminalEvent}-${terminalStatus}`;
Line 648: "private-failure-model",
Line 649: "private-failure-output",
Line 650: "private-failure-message",
Line 668: provider_trace: secrets[2],
Line ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
960: expect(JSON.stringify(completions)).not.toContain(hostileModel);
961: expect(capturedLogs).toEqual(["openai-responses provider failure"]);
962: expect(completions).toEqual([
963: {
964: successful: false,
965: response: expect.objectContaining({
966: id: "resp_visible_in_progress_failure",
967: model: "gpt-5.6-terra",
968: content: [],
969: rawOutputItems: [],
970: usage: { inputTokens: 7, outputTokens: 3 },
971: }),
972: },
973: ]);
974: });
975:
976: test("restores principal state when a later terminal item fails reconciliation", async () => {
977: const secret = "private-late-terminal-mutation";
978: const completions: Array<{
979: response: GatewayResponse;
980: successful: boolean;
981: }> = ...
diff --git a/packages/gateway/src/pipeline.ts b/packages/gateway/src/pipeline.ts
index 3a5a89dd15..a03a58d8da 100644
--- a/packages/gateway/src/pipeline.ts
+++ b/packages/gateway/src/pipeline.ts
@@ -216,7 +216,10 @@
responsesTerminalItemMatches,
restoreResponsesAccState,
normalizeCodexResponsesEvent,
+ projectResponsesInProgressEvent,
+ RESPONSES_PROVIDER_FAILURE_LOG,
sanitizeResponsesProviderFailureTerminal,
+ validateResponsesProviderFailureTerminal,
validateResponsesSourceSequence,
ResponsesTerminalError,
type ResponsesAccState,
@@ -10287,12 +10290,14 @@
throw new Error("malformed Responses terminal event");
}
if (providerFailureTerminal) {
- if (
- (event === "error" || event === "response.error") &&
- !responseLifecycleFor(state).created
- ) {
- throw new Error("Responses event before response.created");
- }
+ ...
Found 2 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts:
Line 7802: export function streamResponsesRecallAware(
Line 18893: streamResponsesRecallAware(upstreamResponse, {
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
18830: ) {
18831: dropStreamingFinalizer();
18832: return;
18833: }
18834: accountUnsuccessfulResponse(
18835: resp,
18836: sessionState.sessionID,
18837: sessionState.resolvedConversationTTL,
18838: genAiSpan,
18839: endGenAiSpan,
18840: () => {
18841: sessionState._dirty = true;
18842: },
18843: );
18844: },
18845: dropStreamingFinalizer,
18846: true,
18847: requestCredentialFingerprint(req.rawHeaders, config) ?? ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
19010: acc,
19011: new Map([[toolUseId, anchorText]]),
19012: ),
19013: );
19014: return {
19015: anchorText,
19016: resultText: result,
19017: coverage,
19018: commit: () => {
19019: if (suppressTemporalStorage) return;
19020: for (const record of deferredTransferRecordings) record();
19021: addRecallStoreEntry(
19022: sessionState.recallStore,
19023: storeKey,
19024: storedRecall,
19025: );
19026: persistStore();
19027: recallPersistenceCommitObserver?.();
19028: },
19029: rollback: () => ...
diff --git a/packages/gateway/src/stream/openai-responses.ts b/packages/gateway/src/stream/openai-responses.ts
index 4c33c821b5..b5deac8af2 100644
--- a/packages/gateway/src/stream/openai-responses.ts
+++ b/packages/gateway/src/stream/openai-responses.ts
@@ -48,6 +48,9 @@
export interface ResponsesAccState {
id: string;
model: string;
+ created: boolean;
+ createdAt?: number;
+ lastAcceptedSequenceNumber?: number;
stopReason: string;
usage: GatewayUsage;
terminalEvent?:
@@ -557,6 +560,7 @@
return {
id: "",
model: "",
+ created: false,
stopReason: "end_turn",
usage: { inputTokens: 0, outputTokens: 0 },
items: new Map(),
@@ -575,6 +579,116 @@
};
}
+export function cloneResponsesAccState(
+ state: ResponsesAccState,
+): ResponsesAccState {
+ return structuredClone(state);
+}
+
+export function restoreResponsesAccState(
+ state: ResponsesAccState,
+ snapshot: ResponsesAccState,
+): void {
+ for (const key of Object.keys(state) ...
<skill_content name="jj-guide"> # Skill: jj-guide # jj Guide for AI Agents Jujutsu (jj) is a Git-compatible VCS with mutable commits, automatic snapshotting, no staging area, and first-class conflicts. This skill teaches you how to use it safely from a non-interactive agent environment. If `.jj/` exists in the repo root, this is a jj repo. **Use `jj` commands, not `git`.** In a colocated repo (`.jj/` *and* `.git/`), git tools can read the state, but mutations should go through `jj` so the operation log stays consistent. ## Critical Rules - **NEVER** use interactive flags (`-i`, `--interactive`). TUI prompts hang in agent environments. This applies to `jj split -i`, `jj squash -i`, `jj commit -i`, `jj resolve`, `jj diffedit`, etc. - **ALWAYS** pass `-m "msg"` when describing/committing. Without `-m`, an editor opens and hangs. - **VERIFY** mutations with `jj st` and `jj log` after `squash`, `abandon`, `rebase`, `restore`, `commit`. ...
[lore]sqlite-vec: native vector search enabled (v0.1.9, /tmp/lore-native/pid-4155732/vec0.so) ## Recall Results Found 30 results, showing top 15 (score range: 0.065–0.047). ### Strong Matches #### People & Entities - **Seer Code Review** (service): aka sentry-bot — merge-gate reviewer for BYK/loreai PRs; AI code review that gates PR merges on BYK/loreai via GitHub CheckRun conclusions (MERGE/PASS/NEUTRAL) plus sentry-bot inline review comments on the head commit (details link to sentry.io) #### Distilled - Date: Sep 16, 2026 * 🔴 [requested-validation] (10:40) User requested exact immutable validation of the provider-failure candidate in `/home/byk/Code/opencode-lore-provider-error`. * 🔴 [enforced-read-only] (10:40) User required a read-only-only process: no edits, formatting, VCS mutations, server access, network access, or production DB access. ...
The working copy has no changes. Working copy (@) : qzwttkwl 5f443b8e (empty) (no description set) Parent commit (@-): lpmvqrur 0dd569b5 fix/responses-provider-failures | fix(responses): unify provider failure handling Warning: These bookmarks have conflicts: fix/responses-private-references Hint: Use `jj bookmark list` to see details. Use `jj bookmark set <name> -r <rev>` to resolve. lpmvqrurxwlmrmwnyllmxlvkmplvwnlz 0dd569b520bad37adbaea230f32100c7f83f463c fix(responses): unify provider failure handling wswlsmrnuzlqtxyskqotksrlqtzplrkl 24880457763b6f10831856d01c41bd72d62ddc28 fix(responses): reject non-monotonic provider failures pxrvwsvvkmpoxnsqmrkwrnlqvvkoltwz 2cbf40060c67df229731cf1b9e34d5bf22ec2145 feat(cch): add seeds for Claude Code up to 2.1.272 (#1780) M packages/gateway/src/pipeline.ts M packages/gateway/src/stream/openai-responses.ts M packages/gateway/test/openai-responses-recall-aware-stream.test.ts M packages/gateway/test/openai-responses-stream.test.ts M ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
1730: setRecallContinuationFailureHook((category) => failures.push(category));
1731: log.registerSink({
1732: info: () => {},
1733: warn: () => {},
1734: error: (message) => errors.push(message),
1735: captureException: () => {},
1736: });
1737: const client = streamResponsesRecallAware(
1738: streamFrom([
1739: created("resp_type_mismatch", "gpt-5.6-terra"),
1740: sseEvent("response.created", {
1741: type: "response.in_progress",
1742: response: { id: "resp_type_mismatch", model: "gpt-5.6-terra" },
1743: }),
1744: completed("resp_type_mismatch"),
1745: ]),
1746: {
1747: onComplete: () => {},
1748: onRecall: async () => ({ anchorText: "", resultText: "" }),
1749: runFollowUp: async () => {
1750: ...
[lore]sqlite-vec: native vector search enabled (v0.1.9, /tmp/lore-native/pid-4158983/vec0.so) ## Recall Results Found 30 results, showing top 15 (score range: 0.066–0.039). ### Strong Matches #### People & Entities - **Seer Code Review** (service): aka sentry-bot — merge-gate reviewer for BYK/loreai PRs; AI code review that gates PR merges on BYK/loreai via GitHub CheckRun conclusions (MERGE/PASS/NEUTRAL) plus sentry-bot inline review comments on the head commit (details link to sentry.io) #### Knowledge - **Exact-candidate validation, adversarial review, and merge workflow** (14h ago): For every candidate review or scoped validation, freeze and record repository/worktree identity, immutable base/head/parent and ancestry, conflicts, changed-file scope, plain diff, supplied-file SHA-256s, artifact hashes, and workspace workers. Recheck afterward; mismatches, background edits, partial inspection, or unrestored mutations invalidate evidence. ...
Found 4 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts:
Line 3946: test("rejects terminal recall arguments that contradict an established final value", async () => {
Line 4726: test("rejects finalized reasoning that contradicts summary deltas", async () => {
Line 5490: "rejects contradictory status in %s snapshots",
Line 7871: test("rolls back persistence without contradicting an already delivered terminal", async () => {
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
5400: id: "resp_terminal_failed_recall",
5401: model: "gpt-5.6-terra",
5402: status: "completed",
5403: output: [{ ...streamedItem, status: "failed" }],
5404: },
5405: }),
5406: ]),
5407: {
5408: onComplete: () => {},
5409: onRecall: async () => {
5410: recalled++;
5411: return { anchorText: "", resultText: "" };
5412: },
5413: runFollowUp: async () => {
5414: throw new Error("should not run");
5415: },
5416: },
5417: );
5418:
5419: expect(await drain(client)).toContain(PUBLIC_RECALL_ERROR);
5420: expect(recalled).toBe(0);
5421: });
5422:
5423: test("rejects nonterminal response.done status without executing recall", async () => {
5424: let recalled = 0;
5425: ...
[lore]sqlite-vec: native vector search enabled (v0.1.9, /tmp/lore-native/pid-4191353/vec0.so) ## Recall Results Found 30 results, showing top 15 (score range: 0.065–0.048). ### Strong Matches #### Distilled - Date: Sep 16, 2026 * 🔴 [requested-review] (12:53) User requested an independent, immutable, read-only security/privacy/pentest review in `/home/byk/Code/opencode-lore-provider-error`. * 🔴 (12:53) User identified candidate stable change `lpmvqrur`, resolving to commit `0dd569b520bad37adbaea230f32100c7f83f463c`, based on `main@origin` commit `2cbf40060c67df229731cf1b9e34d5bf22ec2145`. * 🔴 (12:53) User stated the expected plain diff SHA-256 is exactly `3458ce2dc248950b13dc69dda91a07f95a2dcd49f128f2f4ec8e218a6d68b46e` and the candidate must change exactly 6 files. * 🔴 (12:53) User required the review to avoid editing, formatting, VCS mutation, exhaustive runs, network access, server execution, and production-database access. ...
Found 3 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts:
Line 3134: test("supports done-only sparse Codex items on principal and continuation streams", async () => {
Line 3241: test("redacts a done-only failed Codex recall before lifecycle validation", async () => {
Line 9114: test("redacts a done-only failed Codex recall in a continuation", async () => {
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts</path>
<type>file</type>
<content>
3200: completedResponse = response;
3201: },
3202: onRecall: async ({ acc }) => {
3203: seenRecallCiphertexts.push(
3204: acc.rawOutputItems?.find(
3205: (item) => item.id === "rs_done_only_principal",
3206: )?.encrypted_content,
3207: );
3208: return {
3209: anchorText: buildAnchor("done-only recall"),
3210: resultText: "memory",
3211: };
3212: },
3213: runFollowUp: async () => ({ reader: followUp.body!.getReader() }),
3214: },
3215: );
3216:
3217: const output = await drain(client);
3218: expect(output).toContain("done-only answer");
3219: expect(output).not.toContain(PUBLIC_RECALL_ERROR);
3220: expect(seenRecallCiphertexts).toEqual(["ciphertext-B"]);
3221: ...
Found 7 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts:
Line 2309: test("counts failed continuation bytes against the request-wide stream limit", async () => {
Line 2357: test("counts failed continuation frames against the request-wide frame limit", async () => {
Line 8864: test("recall-only: never converts a failed continuation into completed", async () => {
Line 9038: test("finalizes failed continuation usage when cancellation wins terminal backpressure", async () => {
Line 9203: "treats response.done with %s status as a failed continuation",
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/eviction.test.ts:
Line 493: // A failed continuation still gets a finite grace period from its arrival.
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/session-retention.test.ts:
Line 226: it("expires a failed continuation after its owner settles", async ...
Found 14 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts:
Line 8018: let transactionBaseline: ResponsesAccState | undefined;
Line 8025: if (!transactionBaseline) return;
Line 8026: state.id = transactionBaseline.id;
Line 8027: state.model = transactionBaseline.model;
Line 8028: state.stopReason = transactionBaseline.stopReason;
Line 8029: state.terminalEvent = transactionBaseline.terminalEvent;
Line 8030: state.terminalResponse = transactionBaseline.terminalResponse;
Line 8031: state.usage = { ...transactionBaseline.usage };
Line 8032: state.items = new Map(transactionBaseline.items);
Line 8033: state.rawItems = new Map(transactionBaseline.rawItems);
Line 8034: transactionBaseline = undefined;
Line 8036: const rollbackTransaction = (): void => {
Line 10668: transactionBaseline = {
Line 11638: transactionBaseline = undefined;
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path> <type>file</type> <content> 7790: * - **Recall only**: suppresses the recall item, emits a synthetic marker 7791: * text item, runs the (streaming) recall follow-up, pipes the continuation 7792: * events inline continuing the `output_index` numbering, then rebuilds the 7793: * terminal `response.completed` reflecting marker + continuation. 7794: * 7795: * `onComplete` mirrors `streamResponsesPassthrough` (invoked exactly once with 7796: * the accumulated internal response for `postResponse`/calibration). 7797: * 7798: * The recall execution callback abstracts the pipeline-scope dependencies 7799: * (`executeRecall` + follow-up forwarding + recall store), so this function 7800: * stays a self-contained streamer in the Responses module. ...
[lore]sqlite-vec: native vector search enabled (v0.1.9, /tmp/lore-native/pid-13044/vec0.so) ## Recall Results Found 30 results, showing top 15 (score range: 0.067–0.045). ### Strong Matches #### People & Entities - **Seer Code Review** (service): aka sentry-bot — merge-gate reviewer for BYK/loreai PRs; AI code review that gates PR merges on BYK/loreai via GitHub CheckRun conclusions (MERGE/PASS/NEUTRAL) plus sentry-bot inline review comments on the head commit (details link to sentry.io) #### Distilled - Date: Sep 16, 2026 * 🔴 [requested-review] (12:53) User requested an independent, immutable, read-only security/privacy/pentest review in `/home/byk/Code/opencode-lore-provider-error`. * 🔴 (12:53) User identified candidate stable change `lpmvqrur`, resolving to commit `0dd569b520bad37adbaea230f32100c7f83f463c`, based on `main@origin` commit `2cbf40060c67df229731cf1b9e34d5bf22ec2145`. ...
The working copy has no changes. Working copy (@) : qzwttkwl 5f443b8e (empty) (no description set) Parent commit (@-): lpmvqrur 0dd569b5 fix/responses-provider-failures | fix(responses): unify provider failure handling Warning: These bookmarks have conflicts: fix/responses-private-references Hint: Use `jj bookmark list` to see details. Use `jj bookmark set <name> -r <rev>` to resolve. qzwttkwltwzroqvkvvuroqutmtumrwop 5f443b8ef7aaeb2b242615a0a619430c982d8ab1 lpmvqrurxwlmrmwnyllmxlvkmplvwnlz 0dd569b520bad37adbaea230f32100c7f83f463c fix(responses): unify provider failure handling pxrvwsvvkmpoxnsqmrkwrnlqvvkoltwz 2cbf40060c67df229731cf1b9e34d5bf22ec2145 feat(cch): add seeds for Claude Code up to 2.1.272 (#1780) M packages/gateway/src/pipeline.ts M packages/gateway/src/stream/openai-responses.ts M packages/gateway/test/openai-responses-recall-aware-stream.test.ts M packages/gateway/test/openai-responses-stream.test.ts M packages/gateway/test/pipeline-streaming.test.ts M ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/package.json</path>
<type>file</type>
<content>
1: {
2: "name": "@loreai/gateway",
3: "version": "0.40.0",
4: "type": "module",
5: "license": "FSL-1.1-Apache-2.0",
6: "description": "Lore as a transparent LLM proxy — context management for any AI coding client",
7: "main": "./dist/index.cjs",
8: "types": "./dist/index.d.cts",
9: "exports": {
10: ".": {
11: "types": "./dist/index.d.cts",
12: "bun": "./dist/index.bun.js",
13: "require": "./dist/index.cjs",
14: "default": "./dist/index.cjs"
15: }
16: },
17: "bin": {
18: "lore": "./dist/bin.cjs",
19: "lore-gateway": "./dist/bin.cjs"
20: },
21: "scripts": {
22: "typecheck": "tsc --noEmit",
23: "build": "tsx script/build.ts",
24: "bundle": "tsx script/bundle.ts",
25: "build:binary": "tsx script/build.ts --binary",
26: "build:binary:sea": "tsx script/build-binary-sea.ts",
27: "start": "tsx ...
Found 4 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-stream.test.ts:
Line 4269: "sanitizes a provider failure terminal received as %s with status %s",
Line 4427: "replaces a provider %s diagnostic with the fixed failure envelope",
Line 4961: test("does not mutate trusted state before validating terminal output", async () => {
Line 5052: test("finalizes validated failure usage when cancellation wins terminal backpressure", async () => {
Found 1 matches /home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts: Line 9455: const consumeReferenceEvent = (
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
9250: reason !== "content_filter"
9251: ) {
9252: throw new Error("malformed Responses terminal event");
9253: }
9254: }
9255: lifecycle.terminal = true;
9256: }
9257: };
9258: const assertOutputLifecyclesComplete = (
9259: acc: ResponsesAccState,
9260: allowedIncompleteIndices: ReadonlySet<number> = new Set(),
9261: ): void => {
9262: const lifecycles = lifecyclesFor(acc);
9263: for (const index of acc.rawItems.keys()) {
9264: if (lifecycles.get(index)?.outputDone) continue;
9265: if (allowedIncompleteIndices.has(index)) continue;
9266: if (opts.validation !== "codex") {
9267: throw new Error(
9268: `Responses stream ended before output_item.done for index ${index}`,
9269: );
9270: }
9271: const item = acc.rawItems.get(index);
9272: ...
[lore]sqlite-vec: native vector search enabled (v0.1.9, /tmp/lore-native/pid-27053/vec0.so) ## Recall Results Found 30 results, showing top 15 (score range: 0.065–0.047). ### Strong Matches #### Distilled - Date: Sep 16, 2026 * 🔴 [requested-validation] (12:52) User requested exact, exhaustive, read-only validation in `/home/byk/Code/opencode-lore-provider-error` for immutable provider candidate change `lpmvqrur`, commit prefix `0dd569b520ba` to be resolved fully, against base `main@origin` commit `2cbf40060c67df229731cf1b9e34d5bf22ec2145`. * 🔴 (12:52) User specified expected plain `jj` range-diff SHA-256 `3458ce2dc248950b13dc69dda91a07f95a2dcd49f128f2f4ec8e218a6d68b46e` and expected `dist/index.cjs` SHA-256 `41212b350998cd944d71db3aec29128368c16f2081194fe44632a29343c190d3`. ...
[lore]sqlite-vec: native vector search enabled (v0.1.9, /tmp/lore-native/pid-31256/vec0.so) ## Recall Results Found 30 results, showing top 15 (score range: 0.091–0.048). ### Strong Matches #### Distilled - Date: Sep 16, 2026 * 🟡 (13:21) Post-validation repository integrity check passed for stable change `lpmvqrurxwlmrmwnyllmxlvkmplvwnlz`, full commit `0dd569b520bad37adbaea230f32100c7f83f463c`, based on `main@origin` commit `2cbf40060c67df229731cf1b9e34d5bf22ec2145`; the candidate range contained exactly 7 conflict-free commits. * 🟡 (13:21) Candidate range plain-diff SHA-256 was unchanged before and after validation: `3458ce2dc248950b13dc69dda91a07f95a2dcd49f128f2f4ec8e218a6d68b46e`. * 🟡 (13:21) The clean empty child remained unchanged before and after validation: change `qzwttkwltwzroqvkvvuroqutmtumrwop`, commit `5f443b8ef7aaeb2b242615a0a619430c982d8ab1`, parent `0dd569b520bad37adbaea230f32100c7f83f463c`; the working copy had no diff. ...
Found 3 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/anthropic.ts:
Line 61: export class SSEStreamTransportError extends Error {
Line 88: throw new SSEStreamTransportError("read", "SSE stream read failed", {
Line 119: inactivityError = new SSEStreamTransportError(
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/anthropic.ts</path> <type>file</type> <content> 45: // --------------------------------------------------------------------------- 46: // SSE parsing 47: // --------------------------------------------------------------------------- 48: 49: type StreamChunkRead = Awaited< 50: ReturnType<ReadableStreamDefaultReader<Uint8Array>["read"]> 51: >; 52: 53: /** 54: * Foreground and worker SSE streams share this finite frame ceiling. The byte 55: * ceilings bound retained data, while this independently bounds parser work for 56: * tiny frames (including blank and comment-only frames). 57: */ 58: export const DEFAULT_MAX_SSE_FRAMES = 100_000; 59: 60: /** A post-header transport failure while reading an SSE response body. ...
[lore]sqlite-vec: native vector search enabled (v0.1.9, /tmp/lore-native/pid-39172/vec0.so) ## Recall Results Found 30 results, showing top 15 (score range: 0.065–0.050). ### Strong Matches #### Distilled - Date: Sep 16, 2026 * 🔴 [requested-validation] (12:52) User requested exact, exhaustive, read-only validation in `/home/byk/Code/opencode-lore-provider-error` for immutable provider candidate change `lpmvqrur`, commit prefix `0dd569b520ba` to be resolved fully, against base `main@origin` commit `2cbf40060c67df229731cf1b9e34d5bf22ec2145`. * 🔴 (12:52) User specified expected plain `jj` range-diff SHA-256 `3458ce2dc248950b13dc69dda91a07f95a2dcd49f128f2f4ec8e218a6d68b46e` and expected `dist/index.cjs` SHA-256 `41212b350998cd944d71db3aec29128368c16f2081194fe44632a29343c190d3`. ...
No files found
(no output)
Found 3 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/anthropic.ts:
Line 159: maxTotalBytes?: number;
Line 254: if (totalBytes > (opts.maxTotalBytes ?? Number.POSITIVE_INFINITY)) {
Line 1995: maxTotalBytes: opts.strict ? 4 * 1024 * 1024 : undefined,
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/anthropic.ts</path>
<type>file</type>
<content>
140:
141: /**
142: * Parse an SSE byte stream into typed events.
143: *
144: * Handles:
145: * - `event: <type>` followed by `data: <json>`
146: * - Multiple `data:` lines (joined with `\n`)
147: * - Blank lines as event delimiters
148: * - Default event type `"message"` when no `event:` line precedes data
149: */
150: export async function* parseSSEStream(
151: reader: ReadableStreamDefaultReader<Uint8Array>,
152: opts: {
153: maxEventBytes?: number;
154: maxFrames?: number;
155: frameCounter?: { count: number };
156: inactivityMs?: number;
157: signal?: AbortSignal;
158: requireEventTerminator?: boolean;
159: maxTotalBytes?: number;
160: fatalUtf8?: boolean;
161: } = {},
162: ): AsyncGenerator<{ event: string; data: string }> {
163: // Expose BOM code points to the parser; `stripInitialBom` below owns ...
Found 3 matches /home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/openai-responses.ts: Line 35: validateResponsesUsage, Line 910: const respUsage = validateResponsesUsage( Line 2050: validateResponsesUsage(parsed.response.usage, "malformed Responses usage");
Found 1 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts:
Line 18817: function finishUnsuccessfulStreaming(resp: GatewayResponse): void {
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
18750: if (streamingFinalizerRegistered) return;
18751: streamingFinalizerRegistered = true;
18752: scheduleStreamingPostResponse(
18753: sessionState.sessionID,
18754: requestGeneration,
18755: async () => {
18756: await downstreamSettled;
18757: await new Promise<void>((resolve) => setImmediate(resolve));
18758: if (requestGeneration !== streamingPostResponseGeneration) {
18759: dropStreamingFinalizer();
18760: return;
18761: }
18762: if (sessionSignal.aborted) {
18763: dropStreamingFinalizer();
18764: return;
18765: }
18766: if (downstreamWasCancelled()) {
18767: rollbackRecallPersistence();
18768: accountUnsuccessfulResponse(
18769: resp,
18770: sessionState.sessionID,
18771: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/usage-validation.ts</path>
<type>file</type>
<content>
1: /** Runtime validation for provider-reported token usage. */
2:
3: export function isRecord(value: unknown): value is Record<string, unknown> {
4: return !!value && typeof value === "object" && !Array.isArray(value);
5: }
6:
7: function invalid(message: string): never {
8: throw new Error(message);
9: }
10:
11: function tokenCount(
12: value: unknown,
13: message: string,
14: allowNull = false,
15: ): number | undefined {
16: if (value === undefined || (allowNull && value === null)) return undefined;
17: if (!Number.isSafeInteger(value) || (value as number) < 0) invalid(message);
18: return value as number;
19: }
20:
21: /** Add validated token counts without allowing a safe-integer overflow. ...
Found 1 matches /home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts: Line 13480: function accountUnsuccessfulResponse(
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
13440: loreConfig().curator.afterTurns * curationMultiplier;
13441: if (sessionState.turnsSinceCuration < effectiveAfterTurns) {
13442: log.info(
13443: `commit detected in session ${sessionID.slice(0, 16)} — triggering curation`,
13444: );
13445: sessionState.turnsSinceCuration = effectiveAfterTurns;
13446: }
13447: }
13448:
13449: // --- Schedule background work (fire-and-forget) ---
13450: saveSessionTracking(sessionID, {
13451: messageCount: sessionState.messageCount,
13452: turnsSinceCuration: sessionState.turnsSinceCuration,
13453: consecutiveTextOnlyTurns: sessionState.consecutiveTextOnlyTurns,
13454: projectPath: sessionState.projectPath || null,
13455: projectPathProvisional: sessionState.projectPathProvisional === true,
13456: ...
Found 89 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts:
Line 482: export function loreSessionToken(sessionID: string): string {
Line 578: function buildWorkerDegradationWarning(sessionID: string): string | null {
Line 727: sessionID: string;
Line 738: function activePipelineRequestsForSession(sessionID: string): number {
Line 762: function pipelineSessionHasCapacity(sessionID: string): boolean {
Line 800: function isPipelineSessionActive(sessionID: string): boolean {
Line 832: export function isPipelineSessionActiveForTest(sessionID: string): boolean {
Line 1096: sessionID: string,
Line 1109: sessionID: string,
Line 1203: sessionID: string,
Line 1272: sessionID: string;
Line 1380: sessionID: string,
Line 1430: sessionID: string,
Line 1441: function provisionalKeyOwned(key: string, sessionID: string): boolean {
Line 1450: sessionID: string,
Line 1458: sessionID: string,
Line 1476: ...
[lore]sqlite-vec: native vector search enabled (v0.1.9, /tmp/lore-native/pid-55306/vec0.so) ## Recall Results Found 30 results, showing top 15 (score range: 0.067–0.047). ### Strong Matches #### Distilled - Date: Sep 16, 2026 * 🔴 [requested-validation] (12:52) User requested exact, exhaustive, read-only validation in `/home/byk/Code/opencode-lore-provider-error` for immutable provider candidate change `lpmvqrur`, commit prefix `0dd569b520ba` to be resolved fully, against base `main@origin` commit `2cbf40060c67df229731cf1b9e34d5bf22ec2145`. * 🔴 (12:52) User specified expected plain `jj` range-diff SHA-256 `3458ce2dc248950b13dc69dda91a07f95a2dcd49f128f2f4ec8e218a6d68b46e` and expected `dist/index.cjs` SHA-256 `41212b350998cd944d71db3aec29128368c16f2081194fe44632a29343c190d3`. ...
response.failed, failed/cancelled response.done, error, and response.error—map to one canonical response.failed envelope with trusted response metadata, empty output, usage: null, and fixed text Gateway request failed (packages/gateway/src/stream/openai-responses.ts:607-652).response.created, exact event/type agreement, valid status/error shape, and valid bounded token usage (packages/gateway/src/stream/openai-responses.ts:2033-2085).packages/gateway/src/stream/openai-responses.ts:677-689, packages/gateway/src/stream/openai-responses.ts:2170-2228).packages/gateway/src/stream/openai-responses.ts:1054-1068).response.created establishes the trusted ID, model, and creation time (packages/gateway/src/stream/openai-responses.ts:732-745).response.in_progress frames are rebuilt from that trusted state instead of forwarding provider-controlled metadata (packages/gateway/src/stream/openai-responses.ts:655-675, packages/gateway/src/stream/openai-responses.ts:2639-2645).packages/gateway/src/stream/openai-responses.ts:869-951).packages/gateway/src/stream/openai-responses.ts:2235-2241, packages/gateway/src/stream/openai-responses.ts:2646-2650). ...Date: Sep 16, 2026 * 🔴 (13:45) User asserted: “Failed output is never authoritative and must not reach accounting hooks.” * 🔴 (13:45) User asserted: “Failed usage/accounting never depends on client demand.” * 🟡 (13:44) `packages/gateway/src/pipeline.ts` now calls `validateResponsesProviderFailureTerminal()` for provider-failure terminals on both the principal stream and recall continuation str…
Date: Sep 16, 2026 * 🔴 (13:42) User asserted that recall continuation diagnostics must “never alter the fixed public failure,” captured by test `recall continuation diagnostics never alter the fixed public failure` in `packages/gateway/test/openai-responses-recall-aware-stream.test.ts:9172`. * 🔴 (13:42) User asserted that recall must “never execute recall from an incomplete principal,” captured…
Date: Sep 16, 2026 * 🔴 (13:41) User asserted that an abort-ignoring recall callback that resolves late must never commit its result, captured by the test `never commits when an abort-ignoring recall callback resolves late`. * 🔴 (13:41) User asserted that cancellation must never wait for a non-settling recall callback, captured by the test `cancellation never waits for a non-settling recall call…
Date: Sep 16, 2026 * 🟡 (13:40) Test changes in `packages/gateway/test/openai-responses-stream.test.ts` add imports for `log`, `afterEach`, and `makeResponsesAccState`; define `silentLogSink` with no-op `info`, `warn`, `error`, and `captureException`; and restore that sink in `afterEach()`. * 🟡 (13:40) `packages/gateway/test/openai-responses-stream.test.ts` adds a test named `uses created metada…
Date: Sep 16, 2026 * 🟡 (13:39) In `/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts`, `seedImplicitCodexItem()` at lines 9121-9151 seeds a missing raw item from `normalizationState.rawItems` for events other than `response.output_item.added` and `response.output_item.done`; it requires a nonnegative safe-integer `output_index`, skips existing `acc.rawItems`, then invo…
Date: Sep 16, 2026 * 🔴 (13:38) User stated that `index + 1` always changes the value. * 🔴 (13:38) User stated sparse numeric identities never need more address space than the applicable bound; the remainder of the bound description was elided. * 🔴 (13:38) User stated that injected `tool_use` never leaks to the client. * 🔴 (13:38) User stated failed usage/accounting never depends on client dem…
Date: Sep 16, 2026 * 🔴 (13:38) User specified that failed output is never authoritative and must not reach accounting hooks. * 🟡 (13:38) Supplied Responses-stream code includes strict validation and normalization through `validateCodexResponsesEvent`, `normalizeCodexDataEvent`, and `bindCodexEffectiveToolIdentity`; malformed input can throw `"malformed Responses stream event"` or `"malformed Re…
Date: Sep 16, 2026 * 🔴 (13:37) User specified: “Replace accumulated text with the final version (more reliable),” overriding accumulated text when the final version arrives. * 🟡 (13:37) Supplied Responses accumulator excerpt implements this rule at line 814 and includes `finalizeResponsesAcc` at line 962; it handles events including `response.function_call_arguments.delta`, `response.completed`…
Date: Sep 16, 2026 * 🔴 [requested-review] (13:36) User requested continuation of the existing immutable provider security review without restarting or discarding prior work, covering the exact same frozen candidate and hash from the existing session. * 🔴 [enforced-workflow] (13:36) User prohibited editing files or mutating VCS during the security review. * 🔴 (13:36) User stated the model-facin…
Date: Sep 16, 2026 * 🔴 (13:35) User specified that failed output is never authoritative and must not reach accounting hooks. * 🔴 (13:35) User specified that failed usage/accounting never depends on client demand. * 🟡 (13:35) `packages/gateway/src/stream/openai-responses.ts` extends `ResponsesAccState` with `created: boolean`, `createdAt?: number`, and `lastAcceptedSequenceNumber?: number`; ini…
Date: Sep 16, 2026 * 🔴 (13:34) User stated that `jj` “never fails on conflict”; after `rebase`/`new`/`squash`, conflicts are recorded in the resulting commit, should be checked with `jj st`, and resolved manually rather than with interactive `jj resolve`. * 🟡 (13:34) Initial candidate identity verified as change ID `lpmvqrurxwlmrmwnyllmxlvkmplvwnlz`, commit ID `0dd569b520bad37adbaea230f32100c7f…
Date: Sep 16, 2026 * 🔴 [requested-review] (13:33) User requested a substantive immutable security/privacy review with a full evidence-based report, PASS/CONCERN/MUST-FIX findings, and exact current `file:line` citations. * 🔴 [enforced-workflow] (13:33) User required verification of candidate identity and the same plain diff hash at both the start and end of the review; prohibited editing files …
Date: Sep 16, 2026 * 🟡 (13:32) The supplied test code parameterizes `no-store` behavior with `test.each([true, false])("no-store=%s", ...)`; after a provider response, it asserts `stateFor(alias).recallStore.size` is `0` when `noStore` is true and `1` otherwise. * 🟡 (13:32) The supplied test code includes protocol/provider routing through `x-lore-provider`, explicitly setting `req.rawHeaders["x…
Date: Sep 16, 2026 * 🟡 (13:28) `quality/MUTATION_TESTING.md` explains Stryker’s purpose: killed mutants identify behavior constrained by tests; surviving mutants identify unconstrained lines, though some are behaviorally equivalent. It ties mutation testing to sync bugs from issue `#828` and lifecycle edge cases from issue `#816`. * 🟡 (13:28) `quality/MUTATION_TESTING.md` currently documents `.…
Date: Sep 16, 2026 * 🔴 (13:17) User specified request-local recall-diagnostic privacy with exact wording: “Fingerprints and recall content never leave this closure.” `createRecallDiagnostics(enabled = true)` keeps SHA-256 fingerprints only in closure-local `Set`s for inputs, results, pairs, and delivered coverage (`packages/gateway/src/recall-diagnostics.ts`, lines 7-20). * 🟡 (13:17) `createRec…
Date: Sep 16, 2026 * 🟡 (13:11) Inspection of `packages/gateway/src/pipeline.ts` found `validatedMetaStream()` at line 15468 and its same-protocol passthrough call at line 15673. * 🟡 (13:11) `validatedMetaStream(response, protocol, codex, signal)` validates streaming responses by protocol: `openai-responses` delegates to `streamResponsesPassthrough` with validation mode `codex ? "codex" : "publi…
Date: Sep 16, 2026 * 🔴 (13:09) User specified an invariant in `packages/gateway/src/pipeline.ts` around line 18530: “the follow-up's stream flag can never diverge from how the continuation” is delivered. * 🔴 (13:09) User specified a robustness invariant in `packages/gateway/src/pipeline.ts` around line 18705 using the exact wording “Never throws / never”; the surrounding comment says this appli…
Date: Sep 16, 2026 * 🔴 (13:08) User specified that private source coverage in `streamResponsesRecallAware` is never emitted to the client (`packages/gateway/src/pipeline.ts`, line 7862). * 🟡 (13:08) `streamResponsesRecallAware` defaults `maxRetainedStateBytes` to `16 * 1024 * 1024` and sets `maxPrincipalTransportRetries = 1` in `packages/gateway/src/pipeline.ts`. * 🟡 (13:08) Recall argument va…
Date: Sep 16, 2026 * 🟡 (13:07) `packages/gateway/test/openai-responses-stream.test.ts` now imports `log` from `@loreai/core`, `afterEach` from `vitest`, and `makeResponsesAccState`; it defines `silentLogSink` with no-op `info`, `warn`, `error`, and `captureException`, then restores that sink after each test via `log.registerSink(silentLogSink)`. * 🟡 (13:07) Added `test("uses created metadata an…
Date: Sep 16, 2026 * 🟡 (13:06) In `/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts`, the diff added `nonMonotonicProviderFailures`, a matrix covering 5 provider-terminal forms—`["response.failed", "response.failed", "failed"]`, `["failed response.done", "response.done", "failed"]`, `["cancelled response.done", "response.done", "cance…
Date: Sep 16, 2026 * 🟡 (13:06) Investigation continued through `/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts` lines 1262–2466, covering recall-tool suppression, continuation-failure hooks, retry rules, abort handling, frame/state budgets, and stream-integrity validation. * 🟡 (13:06) Recall suppression tests include `test("suppres…
Date: Sep 16, 2026 * 🟡 (13:06) Investigation continued through `/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts` lines 1–1222. The file imports from `../src/principal-transport-failure` and exercises `streamResponsesRecallAware` using streamed SSE fixtures, `drain(client)`, captured error logs, and both normal and `validation: "codex…
Date: Sep 16, 2026 * 🟡 (13:04) Investigation inspected `/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts` lines 9258–9739, covering `assertOutputLifecyclesComplete`, `assertTerminalOutputMatches`, terminal response/output validation, keepalive and SSE frame handling, the `finish(resp: GatewayResponse, successful: boolean): boolean` implementation near line 9621, recal…
Date: Sep 16, 2026 * 🟡 (13:03) Search in `/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts` found 8 `finish`-related matches: line 9621 `const finish = (resp: GatewayResponse, successful: boolean): boolean => {`; line 15191 `const finish = (operation: () => void): void => {`; line 15258 `let finished = false;`; line 15271 `const finish = () => {`; line 15395 `let fini…
Date: Sep 16, 2026 * 🔴 (13:03) User asserted: “Always accumulate into the internal state for postResponse,” documented near line 10415 in the provided code excerpt.
Date: Sep 16, 2026 * 🔴 (13:02) User asserted the stream must “Always feed the accumulator,” as documented near line 3136 in `packages/gateway/src/stream/openai-responses.ts`. * 🔴 (13:02) User asserted that an injected `recall` `tool_use` never leaks to the client; the optimization near lines 2702–2704 is safe only when no `recall` `tool_use` can appear in the stream. * 🔴 (13:02) User asserted …
Date: Sep 16, 2026 * 🔴 (13:01) User asserted that sparse numeric identities “never need more address space than the” [remainder elided in provided context], as documented near line 2127. * 🔴 (13:01) User asserted that `index + 1` always changes the value, as documented near line 2130. * 🟡 (13:01) In `packages/gateway/src/stream/openai-responses.ts`, the comment near line 1306 states that `publ…
Date: Sep 16, 2026 * 🔴 (13:00) User reaffirmed that failed output is never authoritative and must not reach accounting hooks. * 🔴 (13:00) User specified that accumulated text should be replaced with the final version because the final version is more reliable. * 🟡 (13:00) In `packages/gateway/src/stream/openai-responses.ts`, final text handling near line 814 replaces previously accumulated tex…
Date: Sep 16, 2026 * 🔴 (12:58) User specified that failed output is never authoritative and must not reach accounting hooks. * 🔴 (12:58) User specified that failed usage/accounting never depends on client demand. * 🟡 (12:58) Diff for `packages/gateway/src/stream/openai-responses.ts` extends `ResponsesAccState` with `created: boolean`, optional `createdAt?: number`, and optional `lastAcceptedSe…
Date: Sep 16, 2026 * 🟡 (12:56) Candidate diff statistics reported exactly 3,398 insertions and 500 deletions across 6 files: `packages/gateway/src/pipeline.ts` (369 changed lines), `packages/gateway/src/stream/openai-responses.ts` (1,090), `packages/gateway/test/openai-responses-recall-aware-stream.test.ts` (1,245), `packages/gateway/test/openai-responses-stream.test.ts` (1,044), `packages/gatew…
Date: Sep 16, 2026 * 🔴 [requested-review] (12:53) User requested an independent, immutable, read-only security/privacy/pentest review in `/home/byk/Code/opencode-lore-provider-error`. * 🔴 (12:53) User identified candidate stable change `lpmvqrur`, resolving to commit `0dd569b520bad37adbaea230f32100c7f83f463c`, based on `main@origin` commit `2cbf40060c67df229731cf1b9e34d5bf22ec2145`. * 🔴 (12:53…