ai-chatbot/lib/canvas/agent-feature-flags.ts

83 lines
2.3 KiB
TypeScript

export type CanvasAgentWritebackMode =
| "legacy_canvas_media"
| "operation_shadow"
| "operation_authoritative";
export type CanvasAgentFeatureFlags = {
operationProtocolEnabled: boolean;
writebackMode: CanvasAgentWritebackMode;
slotEnabled: boolean;
viewOperationEnabled: boolean;
annotationEditEnabled: boolean;
};
type EnvLike = Record<string, string | undefined>;
const WRITEBACK_MODES = new Set<CanvasAgentWritebackMode>([
"legacy_canvas_media",
"operation_shadow",
"operation_authoritative",
]);
export function normalizeCanvasAgentBoolean(
value: unknown,
fallback: boolean
) {
if (typeof value !== "string") return fallback;
const normalized = value.trim().toLowerCase();
if (!normalized) return fallback;
if (["1", "true", "yes", "on", "enabled"].includes(normalized)) return true;
if (["0", "false", "no", "off", "disabled"].includes(normalized)) return false;
return fallback;
}
export function normalizeCanvasAgentWritebackMode(
value: unknown,
fallback: CanvasAgentWritebackMode = "operation_authoritative"
): CanvasAgentWritebackMode {
const normalized = typeof value === "string" ? value.trim() : "";
return WRITEBACK_MODES.has(normalized as CanvasAgentWritebackMode)
? (normalized as CanvasAgentWritebackMode)
: fallback;
}
export function getCanvasAgentFeatureFlags(
env: EnvLike = process.env
): CanvasAgentFeatureFlags {
return {
operationProtocolEnabled: normalizeCanvasAgentBoolean(
env.CANVAS_AGENT_OPERATION_PROTOCOL_ENABLED,
true
),
writebackMode: normalizeCanvasAgentWritebackMode(
env.CANVAS_AGENT_WRITEBACK_MODE,
"operation_authoritative"
),
slotEnabled: normalizeCanvasAgentBoolean(
env.CANVAS_AGENT_SLOT_ENABLED,
true
),
viewOperationEnabled: normalizeCanvasAgentBoolean(
env.CANVAS_AGENT_VIEW_OPERATION_ENABLED,
true
),
annotationEditEnabled: normalizeCanvasAgentBoolean(
env.CANVAS_AGENT_ANNOTATION_EDIT_ENABLED,
true
),
};
}
export function canApplyCanvasAgentMutations(flags: CanvasAgentFeatureFlags) {
return (
flags.operationProtocolEnabled &&
flags.writebackMode === "operation_authoritative"
);
}
export function shouldStreamCanvasAgentShadowOperations(
flags: CanvasAgentFeatureFlags
) {
return flags.operationProtocolEnabled && flags.writebackMode === "operation_shadow";
}