Dashboard › opencode-lore › Session 0xKKMAyKMLYW
0xKKMAyKMLYWljKKQIndependent read-only security/privacy review immutable provider candidate /home/byk/Code/opencode-lore-provider-error stable qzwttkwltwzr commit 493b0655a388, base 2cbf40060c67, expected plain SHA 93617337752dee74776c2fb173d829f37c6616727fa72268f07c8c8f2f195422, six declared files, clean child qnmstlol. Read guidance/scripts; repo-setup unavailable note. No edits/format/install/VCS/network/server/prod DB. Verify integrity start/end. Threat audit: all failure aliases fixed envelope; non-JSON error bypass; trusted response.created metadata/in-progress projection; failure prevalidation/state rollback; source sequence before mutation; usage exactly once independent demand/cancel; recall failure private args/output; unsuccessful callback minimal state/no Codex private metadata; exactly one fixed categorical log after validation; malformed events no log; throwing/malicious registered sinks/capture hooks never alter response or leak sink-controlled content; arbitrary callback/rollback/parser/provider errors not logged/Sentry; retries/resource/cleanup. Assess tests/mutants. Supplied 445/661/30, static bundle. Exact HEAD evidence PASS/CONCERN/MUST-FIX/residual. Never warning-only; lore fallback. 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>
<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/quality</path> <type>directory</type> <entries> benchmarks/ CCH.md COMPLETENESS_REPORT.md CONTRACTS.md COVERAGE_MATRIX.md eval-artifacts/ EXPLORATION.md formal_docs_manifest.json MUTATION_TESTING.md plans/ PROGRESS.md PROMPT_CHANGES.md QUALITY.md requirements_manifest.json REQUIREMENTS.md results/ REVIEW.md RUN_CODE_REVIEW.md RUN_INTEGRATION_TESTS.md RUN_SPEC_AUDIT.md RUN_TDD_TESTS.md use_cases_manifest.json (22 entries) </entries>
<path>/home/byk/Code/opencode-lore-provider-error/quality/RUN_CODE_REVIEW.md</path> <type>file</type> <content> 1: > Generated by [Quality Playbook](https://github.com/andrewstellman/quality-playbook) v1.5.6 — Andrew Stellman 2: > Date: 2026-05-16 · Project: lore 3: 4: # Code Review Protocol 5: 6: Three-pass code review of the Lore codebase. All findings reference `quality/EXPLORATION.md` requirements (REQ-001 through REQ-014) and candidate bugs (CB-001 through CB-012). 7: 8: ## Requirement Cross-Reference 9: 10: For this review, the 14 derived requirements from EXPLORATION.md are assigned stable IDs: 11: 12: | ID | Exploration ID | Title | 13: |----|---------------|-------| 14: | REQ-001 | REQ-EMB-001 | Recoverable embedding provider fallback | 15: | REQ-002 | REQ-SEARCH-001 | FTS5 degradation signal | 16: | REQ-003 | REQ-NET-001 | Multi-interface port conflict probe | 17: | REQ-004 | REQ-SESSION-001 | Serialized fingerprint-based session lookup | 18: | REQ-005 | REQ-LTM-001 | ...
<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/scripts</path> <type>directory</type> <entries> bump-version.sh cch-scan.c check-cc-version.ts check-docs-links.mjs check-patches.ts check-preview-links.mjs check-social-meta.mjs extract-cch-seed.ts generate-config-docs.ts generate-env-docs.ts generate-release-checksums.mjs smoke-install.mjs (12 entries) </entries>
No files found
/home/byk/Code/opencode-lore-provider-error The working copy has no changes. Working copy (@) : qnmstlol 248b42ff (empty) (no description set) Parent commit (@-): qzwttkwl 493b0655 fix/responses-provider-failures | fix(responses): isolate failure telemetry 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.
qnmstlolnsoz 248b42ffd04c parents=493b0655a388 conflict=false empty=true qzwttkwltwzr 493b0655a388 parents=0dd569b520ba conflict=false empty=false pxrvwsvvkmpo 2cbf40060c67 parents=e977b4b1da8f conflict=false empty=false qzwttkwltwzr 493b0655a388 fix(responses): isolate failure telemetry lpmvqrurxwlm 0dd569b520ba fix(responses): unify provider failure handling wswlsmrnuzlq 24880457763b fix(responses): reject non-monotonic provider failures plzxzousrzuv a1020a45be13 fix(responses): preserve trusted failure metadata skwrwnvkvulp 01a6e06b08ba fix(responses): make provider failure settlement atomic xqmskzvmnqkr b1bc7cd46c4e fix(responses): complete provider failure sanitization qnlnmzlxyynv 29dee093d7ce fix(responses): bind sanitized failures to trusted state prpmozzzqvkt d385b39653b0 fix(responses): sanitize provider failures pxrvwsvvkmpo 2cbf40060c67 feat(cch): add seeds for Claude Code up to 2.1.272 (#1780)
93617337752dee74776c2fb173d829f37c6616727fa72268f07c8c8f2f195422 - 3f9e082ae94f1c0b6493562b3cce151d29095b120f22fc24505d69235443caab -
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 packages/gateway/src/pipeline.ts | 369 ++++- packages/gateway/src/stream/openai-responses.ts | 1099 ++++++++++------ ...st/openai-responses-recall-aware-stream.test.ts | 1440 +++++++++++++++++++++- ...es/gateway/test/openai-responses-stream.test.ts | 1129 ++++++++++++++++- packages/gateway/test/pipeline-streaming.test.ts | 147 +- packages/gateway/test/recall-codex-stream.test.ts | 3 +- 6 files changed, 3687 insertions(+), 500 deletions(-)
Modified regular file packages/gateway/src/pipeline.ts:
...
203 203: streamResponsesPassthrough,
204 204: translateAnthropicStreamToResponses,
205 205: applyResponsesEvent,
206: cloneResponsesAccState,
206 207: finalizeResponsesAcc,
208: finalizeUnsuccessfulResponsesAcc,
207 209: formatResponsesEvent,
208 210: makeResponsesAccState,
209 211: mapStatusFromStopReason,
...
212 214: isValidResponsesReasoningEncryptedContent,
213 215: responsesDoneItemMatchesAdded,
214 216: responsesTerminalItemMatches,
217: restoreResponsesAccState,
215 218: normalizeCodexResponsesEvent,
219: projectResponsesInProgressEvent,
220: reportResponsesProviderFailure,
221: sanitizeResponsesProviderFailureTerminal,
222: validateResponsesProviderFailureTerminal,
223: validateResponsesSourceSequence,
216 224: ResponsesTerminalError,
217 225: type ResponsesAccState,
218 226: } from ...
...output truncated...
Full output saved to: /home/byk/.local/share/opencode/tool-output/tool_0ac699aa7001D4aaSO2A2lGBPf
1074: ...(state.codexRateLimits
1075: ? { codexRateLimits: structuredClone(state.codexRateLimits) }
1076: : {}),
1077: };
1078: }
1079:
903 1080: // ---------------------------------------------------------------------------
904 1081: // Stream accumulator (buffered)
905 1082: // ---------------------------------------------------------------------------
...
942 1119: if (!response || typeof response !== "object" || Array.isArray(response)) {
943 1120: throw new Error("malformed Responses terminal event");
944 1121: }
1122: if (event === "response.created" && state.created) {
1123: malformed();
1124: } else if (event === "response.in_progress" && !state.created) {
1125: malformed();
1126: }
945 1127: if (state.id && response.id !== ...
<path>/home/byk/.local/share/opencode/tool-output/tool_0ac699aa7001D4aaSO2A2lGBPf</path>
<type>file</type>
<content>
1: Modified regular file packages/gateway/src/stream/openai-responses.ts:
2: ...
3: 48 48: export interface ResponsesAccState {
4: 49 49: id: string;
5: 50 50: model: string;
6: 51: created: boolean;
7: 52: createdAt?: number;
8: 53: lastAcceptedSequenceNumber?: number;
9: 51 54: stopReason: string;
10: 52 55: usage: GatewayUsage;
11: 53 56: terminalEvent?:
12: ...
13: 557 560: return {
14: 558 561: id: "",
15: 559 562: model: "",
16: 563: created: false,
17: 560 564: stopReason: "end_turn",
18: 561 565: usage: { inputTokens: 0, outputTokens: 0 },
19: 562 566: items: new Map(),
20: ... ...
<path>/home/byk/.local/share/opencode/tool-output/tool_0ac699aa7001D4aaSO2A2lGBPf</path>
<type>file</type>
<content>
1083: 2528: const completedSnapshot = completeCodexMessageSnapshot(
1084: 2529: snapshot,
1085: 2530: outputIndex,
1086: 2531: terminalContentParts,
1087: 2532: );
1088: 2533: reconcileCodexDoneItem(state, outputIndex, completedSnapshot);
1089: 2534: if (
1090: 2535: !responsesDoneItemMatchesAdded(completedSnapshot, accumulated)
1091: 2536: ) {
1092: 2537: throw new Error("malformed Responses terminal event");
1093: 2538: }
1094: 2539: assertResponsesDoneMatchesAccumulatedState(
1095: 2540: state,
1096: 2541: outputIndex,
1097: 2542: ...
<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>
1101:
1102: if (parsed.type !== undefined && parsed.type !== event) malformed();
1103: if (
1104: parsed.sequence_number !== undefined &&
1105: (!Number.isSafeInteger(parsed.sequence_number) ||
1106: (parsed.sequence_number as number) < 0)
1107: ) {
1108: malformed();
1109: }
1110: if (
1111: event === "response.created" ||
1112: event === "response.in_progress" ||
1113: event === "response.failed" ||
1114: event === "response.completed" ||
1115: event === "response.incomplete" ||
1116: event === "response.done"
1117: ) {
1118: const response = parsed.response as Record<string, unknown> | undefined;
1119: if (!response || typeof response !== "object" || Array.isArray(response)) {
1120: throw new Error("malformed Responses terminal event");
1121: }
1122: if (event === ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/stream/openai-responses.ts</path>
<type>file</type>
<content>
2201: ) {
2202: throw new Error("response.failed terminal");
2203: }
2204: if (sanitizedFailure) {
2205: const diagnostic = event === "error" || event === "response.error";
2206: if (opts.validation) {
2207: validateResponsesProviderFailureTerminal(
2208: event,
2209: parsed,
2210: state,
2211: opts.validation,
2212: maxSparseIndex,
2213: sanitizedFailure,
2214: );
2215: }
2216: if (opts.validation && sourceSequenceNumber !== undefined) {
2217: lastSequenceNumber = sourceSequenceNumber;
2218: }
2219: applyResponsesEvent(
2220: state,
2221: diagnostic ? sanitizedFailure.event : event,
2222: diagnostic
2223: ? ...
Found 100 matches (more matches available)
/home/byk/Code/opencode-lore-provider-error/packages/core/src/semantic-lint/prompt.ts:
Line 19: * "this is the fix" option. The `fixes` bucket captures removal of violating
/home/byk/Code/opencode-lore-provider-error/packages/core/src/log.ts:
Line 13: * An optional {@link LogSink} can be registered via {@link registerSink}.
Line 52: captureException(err: unknown): void;
Line 66: export function registerSink(s: LogSink): void {
Line 497: export function error(...args: unknown[]): void {
Line 504: if (err) sink?.captureException(sanitizedError(err));
/home/byk/Code/opencode-lore-provider-error/packages/core/src/instruction-detect.ts:
Line 58: * are unlikely to capture it)?
Line 362: // Drop instructions already captured as a preference entry, so the curator is
Line 396: `(${repeated.length - novel.length} already captured as ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/core/src/log.ts</path>
<type>file</type>
<content>
1: /**
2: * Lightweight logger that suppresses informational messages by default.
3: *
4: * In TUI mode, all stderr output renders as red "error" text — confusing
5: * for routine status messages like "incremental distillation" or "pruned
6: * temporal messages". Only actual errors should be visible by default.
7: *
8: * Set LORE_DEBUG=1 to see informational messages (useful when debugging
9: * the plugin itself).
10: *
11: * ## Sink registration
12: *
13: * An optional {@link LogSink} can be registered via {@link registerSink}.
14: * When registered, every log call (regardless of `isDebug`) also forwards
15: * to the sink. This is used by the gateway to bridge logs → Sentry without
16: * adding a Sentry dependency to `@loreai/core`.
17: *
18: * ## File logging
19: *
20: * All log calls (info, warn, error) are written to a persistent log file
21: * at ...
Empty output is invalid. Resume same immutable provider security review with prior inspection preserved. Recover via local lore recall --project /home/byk/Code/opencode-lore --scope project --limit 30 provider security qzwttkwl 493b0655 or /ui/search. Complete substantive exact-head PASS/CONCERN/MUST-FIX file:line findings and end exactly MERGE or DO-NOT-MERGE. Verify identity/hash/status end. No edits/VCS/server/prod DB/exhaustive. Never empty/warning-only.
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
11034: const implicitItem = contState.rawItems.get(ci);
11035: if (
11036: opts.validation === "codex" &&
11037: ce !== "response.output_item.added" &&
11038: ce !== "response.output_item.done" &&
11039: implicitItem?.type === "function_call" &&
11040: implicitItem.name === ""
11041: ) {
11042: contUnresolvedToolIndices.add(ci);
11043: }
11044: }
11045: let resolvingRecallTool = false;
11046: let resolvingVisibleTool = false;
11047: if (
11048: (ce === ...
Found 26 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts:
Line 6835: onComplete: (response: GatewayResponse) => void,
Line 6904: onComplete(response);
Line 7795: * `onComplete` mirrors `streamResponsesPassthrough` (invoked exactly once with
Line 7805: onComplete: (response: GatewayResponse, successful: boolean) => void;
Line 8019: let transactionProviderUsage: GatewayUsage = { ...ZERO_USAGE };
Line 8036: const rollbackTransaction = (): void => {
Line 9621: const finish = (resp: GatewayResponse, successful: boolean): boolean => {
Line 9626: opts.onComplete(resp, successful);
Line 9630: log.error("openai-responses recall-aware onComplete error:", err);
Line 10674: transactionProviderUsage = { ...ZERO_USAGE };
Line 10896: let continuationCompleted = false;
Line 10996: continuationCompleted = true;
Line 11243: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
7740: },
7741: });
7742:
7743: const response = new Response(stream, {
7744: status: 200,
7745: headers: {
7746: "content-type": "text/event-stream",
7747: "cache-control": "no-cache",
7748: connection: "keep-alive",
7749: },
7750: });
7751: if (!recallPersistence || recallContext?.onTransactionReady) return response;
7752: // Standalone callers also commit only when the returned body reaches EOF.
7753: return wrapBodyWithCleanup(
7754: response,
7755: () => {
7756: if (!sourceSucceeded || cancelled || streamSignal.aborted) {
7757: recallPersistence.rollback();
7758: return;
7759: }
7760: try {
7761: withTenant(recallContext?.sessionState.storageTenantId ?? "", () =>
7762: withSavepoint("native_recall_delivery", recallPersistence.commit),
7763: );
7764: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
9580: syntheticIdentities.add(syntheticId);
9581: };
9582:
9583: // --- Keepalive (same as streamResponsesPassthrough) ---
9584: const KEEPALIVE_INACTIVITY_MS = 30_000;
9585: const keepaliveComment = encoder.encode(`: keepalive\n\n`);
9586: let keepaliveTimer: ReturnType<typeof setTimeout> | null = null;
9587: let completed = false;
9588: let completionAttempted = false;
9589: let nextSequenceNumber = 0;
9590:
9591: const sequenceChunk = (chunk: Uint8Array): Uint8Array => {
9592: const text = new TextDecoder().decode(chunk);
9593: if (!text.startsWith("event: ")) return chunk;
9594: let output = "";
9595: for (const frame of text.split("\n\n")) {
9596: if (!frame) continue;
9597: const lines = frame.split("\n");
9598: const eventLine = lines.find((line) => line.startsWith("event: "));
9599: const dataLines ...
Found 100 matches (more matches available)
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/background-limiter.test.ts:
Line 109: test("propagates task errors", async () => {
Line 121: const failure = new DOMException("task cancelled", "AbortError");
Line 124: if (synchronous) throw failure;
Line 125: return Promise.reject(failure);
Line 127: ).rejects.toBe(failure);
Line 260: // Per-provider circuit breaker isolation
Line 263: describe("per-provider circuit breaker", () => {
Line 264: test("a 429 from one provider does not pause another provider", () => {
Line 269: // Unknown-provider (undefined) work is NOT paused by a provider-scoped trip. ...
Found 100 matches (more matches available)
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-stream.test.ts:
Line 32: captureException: () => {},
Line 69: status: "in_progress",
Line 143: response: { id: "resp_fc", model: "gpt-4o", status: "in_progress" },
Line 220: response: { id: "resp_mix", model: "gpt-4o", status: "in_progress" },
Line 311: response: { id: "resp_inc", model: "gpt-4o", status: "in_progress" },
Line 369: response: { id: "resp_d", model: "gpt-4o", status: "in_progress" },
Line 397: response: { id: "resp_t", model: "gpt-4o", status: "in_progress" },
Line 456: status: "in_progress",
Line 511: response: { id: "resp_nc", model: "gpt-4o", status: "in_progress" },
Line 629: captureException: (error) => capturedLogs.push(String(error)),
Line 645: status: "in_progress",
Line 650: event: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-stream.test.ts</path>
<type>file</type>
<content>
1: /**
2: * Tests for the OpenAI Responses API SSE stream accumulator.
3: *
4: * Covers:
5: * - Text output accumulation from delta events
6: * - Function call accumulation from arguments delta events
7: * - Usage extraction from response.completed
8: * - Stop reason mapping from status
9: * - Mixed text + function_call output
10: */
11: import { log } from "@loreai/core";
12: import { afterEach, describe, test, expect, vi } from "vitest";
13: import {
14: accumulateResponsesSSEStream,
15: isSupportedResponsesOutputItemType,
16: isValidResponsesOutputItemStatus,
17: makeResponsesAccState,
18: responsesDoneItemMatchesAdded,
19: responsesTerminalItemMatches,
20: SUPPORTED_RESPONSES_OUTPUT_ITEM_TYPES,
21: streamResponsesPassthrough,
22: translateAnthropicStreamToResponses,
23: } from ...
Found 17 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-stream.test.ts:
Line 505: test("cacheReadInputTokens is undefined when no cached_tokens in usage", async () => {
Line 618: test("uses created metadata and failure usage in the plain streaming route", async () => {
Line 691: test("contains a throwing failure log sink in the plain passthrough settlement path", async () => {
Line 776: test("projects trusted in-progress metadata in the plain streaming route", async () => {
Line 884: test("strict validation accepts nullable optional usage details", async () => {
Line 2130: test("Codex rejects malformed reasoning ciphertext in sparse item lifecycles", async () => {
Line 3959: test("Anthropic translator emits inclusive Responses cache usage", async () => {
Line 4120: test("an already-aborted external signal errors downstream and cancels upstream", async () => {
Line 4152: test("external abort wakes a ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-stream.test.ts</path>
<type>file</type>
<content>
4000: output_tokens: 1,
4001: total_tokens: 121,
4002: input_tokens_details: { cached_tokens: 90, cache_write_tokens: 20 },
4003: });
4004: expect(() =>
4005: validateResponsesUsage(
4006: completed.response.usage,
4007: "invalid translated usage",
4008: ),
4009: ).not.toThrow();
4010: });
4011:
4012: test("Anthropic translator emits content_filter as response.incomplete", async () => {
4013: const event = (type: string, data: Record<string, unknown>) =>
4014: `event: ${type}\ndata: ${JSON.stringify({ type, ...data })}\n\n`;
4015: const upstream = new Response(
4016: event("message_start", {
4017: message: {
4018: id: "msg_filtered",
4019: type: "message",
4020: role: "assistant",
4021: model: "claude-test",
4022: content: [],
4023: stop_reason: ...
Found 49 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts:
Line 247: test("finalizes when the client cancels immediately after a no-recall terminal", async () => {
Line 411: test("contains a throwing failure log sink in the recall-aware principal settlement path", async () => {
Line 735: test("uses created metadata and clears failed output from completion state", async () => {
Line 828: test("sanitizes a recall-bearing provider failure before later lifecycle checks", async () => {
Line 918: test("keeps created metadata authoritative through a hidden recall and provider failure", async () => {
Line 994: test("projects trusted in-progress metadata before a provider failure", async () => {
Line 1128: test("restores principal state when terminal usage is malformed", async () => {
Line 1336: test("finalizes validated failure usage when cancellation wins terminal backpressure", async ...
<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>
8840:
8841: const out = await drain(client);
8842: expect(seen).toEqual(expected);
8843: expect(out).toContain("answer");
8844: },
8845: );
8846:
8847: test("holds no-index continuation events after chained recall detection", async () => {
8848: const malformed = streamFrom([
8849: created("resp_malformed", "gpt-5.6-terra"),
8850: sseEvent("response.output_item.added", {
8851: output_index: 0,
8852: item: {
8853: type: "function_call",
8854: id: "fc_malformed",
8855: call_id: "call_malformed",
8856: name: "recall",
8857: },
8858: }),
8859: sseEvent("response.custom", { secret: "must-not-leak" }),
8860: completed("resp_malformed"),
8861: ]);
8862: const client = streamResponsesRecallAware(
8863: ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/recall-continuation-failure.ts</path>
<type>file</type>
<content>
1: export const RECALL_CONTINUATION_FAILURE_CATEGORIES = [
2: "recall_execution",
3: "follow_up_setup",
4: "follow_up_transport",
5: "follow_up_protocol",
6: "follow_up_failed",
7: "follow_up_missing_output",
8: "follow_up_incomplete_arguments",
9: "parallel_recall",
10: "nested_recall_incomplete",
11: "nested_recall_execution",
12: "depth_exhausted",
13: "missing_recall_block",
14: "resource_limit",
15: "delivery",
16: "unexpected",
17: ] as const;
18:
19: export type RecallContinuationFailureCategory =
20: (typeof RECALL_CONTINUATION_FAILURE_CATEGORIES)[number];
21:
22: type RecallContinuationFailureHook = (
23: category: RecallContinuationFailureCategory,
24: ) => void;
25:
26: let failureHook: RecallContinuationFailureHook | undefined;
27:
28: export class RecallContinuationFailure extends Error {
29: ...
No files found
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/pipeline-streaming.test.ts
Found 100 matches (more matches available)
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/pipeline-streaming.test.ts:
Line 136: usage: { input_tokens: 1, output_tokens: 0 },
Line 150: usage: { output_tokens: 1 },
Line 164: usage: Record<string, unknown> = {
Line 215: usage,
Line 253: usage: { input_tokens: 10, output_tokens: 1 },
Line 271: usage: { input_tokens: 1, output_tokens: 0 },
Line 340: expect(output).not.toContain("response.failed");
Line 352: describe("non-stream recall usage aggregation", () => {
Line 359: ).toThrow("recall usage token overflow");
Line 365: ).toThrow("recall usage token overflow");
Line 402: usage: { input_tokens: 1, output_tokens: 1 },
Line 409: throw new DOMException("upstream cancelled", "AbortError");
Line 462: usage: { input_tokens: 1, output_tokens: 1 },
Line 489: usage: { input_tokens: 1, ...
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/pipeline-streaming.test.ts</path>
<type>file</type>
<content>
1420: setUpstreamInterceptor(undefined);
1421: await resetPipelineState();
1422: }
1423: });
1424:
1425: it("ends an unsuccessful Responses stream span exactly once", async () => {
1426: const end = vi.fn();
1427: const span = {
1428: end,
1429: setAttribute: vi.fn(),
1430: setAttributes: vi.fn(),
1431: setStatus: vi.fn(),
1432: updateName: vi.fn(),
1433: } as unknown as Sentry.Span;
1434: const actualSentry =
1435: await vi.importActual<typeof import("@sentry/bun")>("@sentry/bun");
1436: vi.mocked(Sentry.startInactiveSpan).mockImplementation((options) =>
1437: options.op === "gen_ai.chat"
1438: ? span
1439: : actualSentry.startInactiveSpan(options),
1440: );
1441: setUpstreamInterceptor(
1442: async () =>
1443: new ...
Modified regular file packages/gateway/test/recall-codex-stream.test.ts:
...
402 402: ),
403 403: );
404 404: expect(failure.match(/event: response\.failed/g)).toHaveLength(1);
405 : expect(failure).toContain("provider terminal");
405: expect(failure).not.toContain("provider terminal");
406: expect(failure).toContain("Gateway request failed");
406 407: });
407 408:
408 409: test("non-codex openai-responses also streams the follow-up", async () => {
...
Modified regular file packages/gateway/test/pipeline-streaming.test.ts:
...
85 85: import { translateAnthropicStreamToOpenAI } from "../src/stream/openai";
86 86: import { translateAnthropicStreamToResponses } from "../src/stream/openai-responses";
87 87: import { translateAnthropicStreamToGemini } from "../src/stream/gemini";
88: import { setRecallContinuationFailureHook } from "../src/recall-continuation-failure";
88 89: import {
89 90: makeConversationFixtures,
90 91: STANDARD_TOOLS,
...
726 727: afterEach(() => harness?.teardown());
727 728: afterEach(() => vi.mocked(getDegradationWarning).mockReset());
728 729: afterEach(() => vi.mocked(Sentry.startInactiveSpan).mockReset());
730: afterEach(() => setRecallContinuationFailureHook(undefined));
729 731:
730 732: it("does not deadlock when an OpenAI translator drops Anthropic lifecycle frames", async () => {
731 733: const anthropic = buildStreamingResponse(
...
...output truncated...
Full output saved to: /home/byk/.local/share/opencode/tool-output/tool_0ac925bd6001HRszM3Qw8L401c
608: },
609: }),
610: sseEvent(failureEvent, failureData),
611: ]),
612: {
613: onComplete: (response, successful) =>
614: completions.push({ response, successful }),
615: onRecall: async () => {
616: recalls++;
617: return { anchorText: "", resultText: "" };
618: },
619: runFollowUp: async () => {
620: followUps++;
621: throw new Error("should not be called");
622: },
623: },
624: );
625:
626: const out = await drain(client);
627: const terminalFrame = out
628: .split("\n\n")
629: .find((frame) => frame.startsWith("event: ...
/home/byk/Code/opencode-lore-provider-error/vitest.mutation.config.ts /home/byk/Code/opencode-lore-provider-error/packages/gateway/test/prompt-delta-mutation-trigger.test.ts /home/byk/Code/opencode-lore-provider-error/packages/gateway/test/helpers/project-mutation-child.ts
--- qzwttkwltwzr 493b0655a388 --- fix(responses): isolate failure telemetry --- lpmvqrurxwlm 0dd569b520ba --- fix(responses): unify provider failure handling --- wswlsmrnuzlq 24880457763b --- fix(responses): reject non-monotonic provider failures --- plzxzousrzuv a1020a45be13 --- fix(responses): preserve trusted failure metadata --- skwrwnvkvulp 01a6e06b08ba --- fix(responses): make provider failure settlement atomic --- xqmskzvmnqkr b1bc7cd46c4e --- fix(responses): complete provider failure sanitization --- qnlnmzlxyynv 29dee093d7ce --- fix(responses): bind sanitized failures to trusted state --- prpmozzzqvkt d385b39653b0 --- fix(responses): sanitize provider failures
Found 2 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-stream.test.ts:
Line 4274: new Response("event: response.created\ndata: {bad}\n\n"),
Line 4279: expect(output).not.toContain("{bad}");
Found 11 matches /home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts: Line 224: ResponsesTerminalError, Line 12255: ? accumulateResponsesNonStreamJSON Line 12267: throw new ResponsesTerminalError(response, parsed.status); Line 12275: if (!requireValidCompletion || error instanceof ResponsesTerminalError) Line 12292: const response = accumulateResponsesNonStreamJSON(json); Line 12307: error instanceof ResponsesTerminalError && Line 12400: item.status === "failed" || Line 12687: export function accumulateResponsesNonStreamJSON( Line 15878: if (!(error instanceof ResponsesTerminalError)) throw error; Line 18603: fetchErr instanceof ResponsesTerminalError || Line 18856: if (!(error instanceof ResponsesTerminalError)) throw error;
<path>/home/byk/Code/opencode-lore-provider-error/packages/gateway/src/pipeline.ts</path>
<type>file</type>
<content>
12120: // Reaching the cap is conservatively treated as truncation: proving
12121: // exact EOF would require one more read, which may stall forever.
12122: onTruncated?.();
12123: if (remaining > 0) chunks.push(value.subarray(0, remaining));
12124: bytes += Math.max(0, remaining);
12125: break;
12126: }
12127: }
12128: chunks.push(value);
12129: bytes += value.byteLength;
12130: }
12131: const body = Buffer.concat(chunks);
12132: if (diagnostic) return new TextDecoder().decode(body);
12133: try {
12134: return new TextDecoder("utf-8", { fatal: true }).decode(body);
12135: } catch {
12136: throw new Error("malformed upstream response UTF-8");
12137: }
12138: } finally {
12139: cancelAndReleaseReader(reader);
12140: }
12141: }
12142:
12143: ...
Found 7 matches
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-recall-aware-stream.test.ts:
Line 1066: const secret = "private-late-terminal-mutation";
Line 7885: test("rolls back every recall mutation when a commit callback fails", async () => {
/home/byk/Code/opencode-lore-provider-error/packages/gateway/test/openai-responses-stream.test.ts:
Line 1728: "%s rejects terminal mutation of an established extension field",
Line 3797: id: "rs_terminal_mutation",
Line 3808: id: "rs_terminal_mutation",
Line 3822: id: "rs_terminal_mutation",
Line 5506: // …and exactly once (the `completed` guard must not double-fire).
packages/gateway/src/pipeline.ts packages/gateway/src/stream/openai-responses.ts packages/gateway/test/openai-responses-recall-aware-stream.test.ts packages/gateway/test/openai-responses-stream.test.ts packages/gateway/test/pipeline-streaming.test.ts packages/gateway/test/recall-codex-stream.test.ts 9376719ec9b3af41ae9ae6154447be8a72c776540ec76773cacd861095399908 packages/gateway/dist/index.cjs The working copy has no changes. Working copy (@) : qnmstlol 248b42ff (empty) (no description set) Parent commit (@-): qzwttkwl 493b0655 fix/responses-provider-failures | fix(responses): isolate failure telemetry 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. ...
MUST-FIX — non-JSON error events bypass sanitization and leak provider data.
packages/gateway/src/pipeline.ts:10137-10159 rejects malformed JSON only when the event starts with response.. A bare event: error with free-form data is forwarded unchanged. The continuation path repeats this at pipeline.ts:10927-10949. Neither reaches the sanitizer at stream/openai-responses.ts:616-661. A provider can expose private diagnostics instead of the fixed failure envelope.
MUST-FIX — logging and registered sinks remain privacy- and response-affecting.
stream/openai-responses.ts:2918-2923.onComplete errors are logged at stream/openai-responses.ts:2841-2845 and pipeline.ts:9625-9631.pipeline.ts:8036-8043.log.error() forwards errors to captureException and does not contain sink exceptions at packages/core/src/log.ts:497-504.A throwing sink can interrupt rollback or terminal settlement; callback, rollback, parser, provider, or sink-controlled text can reach persistent logs or Sentry. The protected provider log at stream/openai-responses.ts:602-608 does not protect these other paths.
The telemetry policy also violates the stated exact-once rule:
pipeline.ts:11831-11840; the test explicitly requires it at openai-responses-recall-aware-stream.test.ts:669-671.pipeline.ts:10994, 11580-11582, and 11838-11840; the test requires all three at openai-responses-recall-aware-stream.test.ts:9113-9123.MUST-FIX — unsuccessful callbacks retain private Codex account metadata.
finalizeUnsuccessfulResponsesAcc() copies codexRateLimits at stream/openai-responses.ts:1063-1077. Those entries can contain plan, credits, and quota details collected at :724-739. ...
Date: Sep 16, 2026 * 🔴 (22:53) User established that failed usage/accounting never depends on client demand; on `response.failed`, `finish(false, finalizeUnsuccessfulResponsesAcc(state))` runs before `await waitForDemand()`. * 🔴 (22:54) User reaffirmed the logging invariant in code: “Logging is best-effort. Never recurse with a sink-controlled error.” * 🔴 (22:54) User established the response-…
Date: Sep 16, 2026 * 🔴 (22:52) User established the logging invariant: “Logging is best-effort. Never recurse with a sink-controlled error.” * 🔴 (22:52) User established the failed-output invariant: “Failed output is never authoritative and must not reach accounting hooks.”
Date: Sep 16, 2026 * 🔴 (22:50) User established the invariant: “Failed usage/accounting never depends on client demand.” * 🟡 (22:50) Truncated tool output was saved to `/home/byk/.local/share/opencode/tool-output/tool_0ac699aa7001D4aaSO2A2lGBPf`. * 🟡 (22:50) Response-stream validation rejects malformed terminal events when `response` is absent, non-object, or an array; when duplicate `response…
Date: Sep 16, 2026 * 🟡 (22:47) Root `package.json` identifies `lore-monorepo` as private, ESM (`"type": "module"`), licensed `FSL-1.1-Apache-2.0`, described as “Monorepo root for Lore — three-tier memory architecture,” with entry point and `"."` export both set to `./packages/opencode/src/index.ts`; repository is `git+https://github.com/BYK/loreai.git`, author is `BYK`, and workspaces are `packa…
Date: Sep 16, 2026 * 🔴 [enforced-workflow] (22:43) User-provided `jj-guide` states that `/home/byk/Code/opencode-lore-provider-error` is a colocated Jujutsu repository because both `.jj/` and `.git/` exist; mutations must use `jj`, while Git is limited to read-only operations or unsupported tasks such as `git submodule`. * 🔴 (22:43) User stated `jj` never fails on conflict: `rebase`, `new`, and…
Date: Sep 16, 2026 * 🟡 [requested-review] (22:36) User requested an independent read-only security/privacy review of immutable provider candidate `/home/byk/Code/opencode-lore-provider-error`, stable `qzwttkwltwzr`, at commit `493b0655a388`, based on `2cbf40060c67`; expected plain SHA `93617337752dee74776c2fb173d829f37c6616727fa72268f07c8c8f2f195422`; candidate has six declared files and clean c…