chore(vendor): import pi 1.3.0

Imported as a linear vendor commit so forge rebases do not replay the upstream root tree.

git-subtree-dir: third_party/pi

git-subtree-split: 71023aec1546d6d677a65669c5665c0927ce0dd0
This commit is contained in:
2026-10-15 17:58:48 -04:00
parent 719370c8f7
commit 6081e3e325
1743 changed files with 205460 additions and 131705 deletions

View File

@@ -0,0 +1,25 @@
import type { ProviderHeaders, ProviderStreams, StreamOptions } from "../types.ts";
const OPENCODE_SESSION_HEADER = "x-opencode-session";
function hasHeader(headers: ProviderHeaders | undefined, name: string): boolean {
const expected = name.toLowerCase();
return Object.keys(headers ?? {}).some((key) => key.toLowerCase() === expected);
}
function withSessionHeader<TOptions extends StreamOptions>(options: TOptions | undefined): TOptions | undefined {
if (!options?.sessionId || hasHeader(options.headers, OPENCODE_SESSION_HEADER)) return options;
return {
...options,
headers: { ...options.headers, [OPENCODE_SESSION_HEADER]: options.sessionId },
};
}
/** Adds OpenCode's required per-conversation routing header before API dispatch. */
export function withOpenCodeSessionHeader(streams: ProviderStreams): ProviderStreams {
return {
...streams,
stream: (model, context, options) => streams.stream(model, context, withSessionHeader(options)),
streamSimple: (model, context, options) => streams.streamSimple(model, context, withSessionHeader(options)),
};
}