repositories / pi-ext
pi-ext
bugabingas pi extensions
owned by admin
extensions/fast/index.ts
Rawimport {
type Api,
clampThinkingLevel,
type Model,
type SimpleStreamOptions,
type TranscriptContext,
} from "@earendil-works/pi-ai";
import {
streamOpenAICodexResponses,
streamSimpleOpenAICodexResponses,
} from "@earendil-works/pi-ai/compat";
import type {
ExtensionAPI,
ExtensionContext,
} from "@earendil-works/pi-coding-agent";
import { closeDebug, dbg, span } from "./src/debug.ts";
import {
parseBooleanSetting,
resolveSetting,
type SettingDeclaration,
} from "./src/pi-ext-settings.ts";
import { isStaleContextError } from "./src/pi-ext-stale-context.ts";
const PROVIDER = "openai-codex";
const API = "openai-codex-responses";
const STATUS_ID = "fast";
const FAST_ICON = "";
// Precedence: trusted project, user, false.
const ENABLE_SETTING: SettingDeclaration<boolean> = {
key: "fast.enable",
parse: parseBooleanSetting,
default: false,
};
function fastActive(
ctx: Pick<ExtensionContext, "model">,
enabled: boolean,
): boolean {
return enabled && ctx.model?.provider === PROVIDER;
}
export default function fast(pi: ExtensionAPI): void {
// Until a session reports trust, project settings stay unread.
let settingsCtx = { cwd: process.cwd(), isProjectTrusted: () => false };
let enabled: boolean | undefined;
let settingsError: string | undefined;
let generation = 0;
function ensureEnabled(): boolean {
if (enabled === undefined) {
const setting = resolveSetting(pi, settingsCtx, ENABLE_SETTING);
enabled = setting.ok && setting.value;
settingsError = setting.ok ? undefined : setting.error;
}
return enabled;
}
function clear(ctx?: ExtensionContext): void {
pi.events.emit("model-route:fast", { active: false });
if (ctx?.hasUI) ctx.ui.setStatus(STATUS_ID, undefined);
}
function publish(ctx: ExtensionContext): void {
if (!ctx.hasUI) return;
if (!fastActive(ctx, enabled ?? false)) {
clear(ctx);
return;
}
ctx.ui.setStatus(STATUS_ID, FAST_ICON);
pi.events.emit("model-route:fast", { active: true });
}
pi.registerProvider(PROVIDER, {
api: API,
streamSimple(
model: Model<Api>,
context: TranscriptContext,
options?: SimpleStreamOptions,
) {
if (!ensureEnabled())
return streamSimpleOpenAICodexResponses(
model as Model<typeof API>,
context,
options,
);
const clampedReasoning = options?.reasoning
? clampThinkingLevel(model, options.reasoning)
: undefined;
const reasoningEffort =
clampedReasoning === "off" ? undefined : clampedReasoning;
return streamOpenAICodexResponses(model as Model<typeof API>, context, {
...options,
reasoningEffort,
serviceTier: "priority",
});
},
});
function scheduleRefresh(ctx: ExtensionContext): void {
const ticket = ++generation;
const end = span?.("settings.refresh", { generation: ticket });
const trusted = ctx.isProjectTrusted();
settingsCtx = { cwd: ctx.cwd, isProjectTrusted: () => trusted };
enabled = undefined;
const timer = setTimeout(() => {
if (ticket !== generation) {
end?.("finish", { status: "stale" });
return;
}
try {
const isEnabled = ensureEnabled();
if (settingsError && ctx.hasUI)
ctx.ui.notify(`${settingsError}; fast mode off`, "warning");
publish(ctx);
end?.("finish", {
status: settingsError
? "invalid"
: !isEnabled
? "disabled"
: ctx.model?.provider === PROVIDER
? "active"
: "provider-mismatch",
});
} catch (error) {
end?.("error", { type: "publish" });
if (!isStaleContextError(error)) throw error;
}
}, 0);
timer.unref?.();
}
pi.on("session_start", (_event, ctx) => {
dbg?.("session.start", { mode: ctx.mode });
scheduleRefresh(ctx);
});
pi.on("model_select", (_event, ctx) => scheduleRefresh(ctx));
pi.on("session_shutdown", (_event, ctx) => {
dbg?.("session.shutdown", { mode: ctx.mode });
generation++;
enabled = undefined;
clear(ctx);
closeDebug();
});
}
export const _test = { fastActive };