Files
openclaw-zero-token/media-understanding/scope.ts
sjhu 571e14a236 feat: upgrade to upstream v2026.3.28
Major upgrade from e26988a38 to upstream v2026.3.28 (f9b107928).
Key changes:
- Upstream src/, ui/, extensions/ (89 bundled extensions)
- Zero-token web providers preserved in src/zero-token/
- AskOnce plugin restored and registered as CLI command
- Added missing packages: @anthropic-ai/vertex-sdk, @modelcontextprotocol/sdk
- Fixed tsconfig rootDir, skipLibCheck for plugin-sdk DTS build
- Added askonce to bundled plugin metadata and package.json exports
- Fixed AskOnce CLI command registration (missing commands metadata)
- Restored AskOnce adapter imports (correct 5-level relative paths)
- Removed stale migration artifacts from root directory
2026-03-30 17:58:12 +08:00

65 lines
1.9 KiB
TypeScript

import { normalizeChatType } from "../channels/chat-type.js";
import type { MediaUnderstandingScopeConfig } from "../config/types.tools.js";
export type MediaUnderstandingScopeDecision = "allow" | "deny";
function normalizeDecision(value?: string | null): MediaUnderstandingScopeDecision | undefined {
const normalized = value?.trim().toLowerCase();
if (normalized === "allow") {
return "allow";
}
if (normalized === "deny") {
return "deny";
}
return undefined;
}
function normalizeMatch(value?: string | null): string | undefined {
const normalized = value?.trim().toLowerCase();
return normalized || undefined;
}
export function normalizeMediaUnderstandingChatType(raw?: string | null): string | undefined {
return normalizeChatType(raw ?? undefined);
}
export function resolveMediaUnderstandingScope(params: {
scope?: MediaUnderstandingScopeConfig;
sessionKey?: string;
channel?: string;
chatType?: string;
}): MediaUnderstandingScopeDecision {
const scope = params.scope;
if (!scope) {
return "allow";
}
const channel = normalizeMatch(params.channel);
const chatType = normalizeMediaUnderstandingChatType(params.chatType);
const sessionKey = normalizeMatch(params.sessionKey) ?? "";
for (const rule of scope.rules ?? []) {
if (!rule) {
continue;
}
const action = normalizeDecision(rule.action) ?? "allow";
const match = rule.match ?? {};
const matchChannel = normalizeMatch(match.channel);
const matchChatType = normalizeMediaUnderstandingChatType(match.chatType);
const matchPrefix = normalizeMatch(match.keyPrefix);
if (matchChannel && matchChannel !== channel) {
continue;
}
if (matchChatType && matchChatType !== chatType) {
continue;
}
if (matchPrefix && !sessionKey.startsWith(matchPrefix)) {
continue;
}
return action;
}
return normalizeDecision(scope.default) ?? "allow";
}