mirror of
http://192.168.0.88:13333/lywsvip/openclaw-zero-token.git
synced 2026-05-08 00:02:20 +08:00
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
47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
export type BytesParseOptions = {
|
|
defaultUnit?: "b" | "kb" | "mb" | "gb" | "tb";
|
|
};
|
|
|
|
const UNIT_MULTIPLIERS: Record<string, number> = {
|
|
b: 1,
|
|
kb: 1024,
|
|
k: 1024,
|
|
mb: 1024 ** 2,
|
|
m: 1024 ** 2,
|
|
gb: 1024 ** 3,
|
|
g: 1024 ** 3,
|
|
tb: 1024 ** 4,
|
|
t: 1024 ** 4,
|
|
};
|
|
|
|
export function parseByteSize(raw: string, opts?: BytesParseOptions): number {
|
|
const trimmed = String(raw ?? "")
|
|
.trim()
|
|
.toLowerCase();
|
|
if (!trimmed) {
|
|
throw new Error("invalid byte size (empty)");
|
|
}
|
|
|
|
const m = /^(\d+(?:\.\d+)?)([a-z]+)?$/.exec(trimmed);
|
|
if (!m) {
|
|
throw new Error(`invalid byte size: ${raw}`);
|
|
}
|
|
|
|
const value = Number(m[1]);
|
|
if (!Number.isFinite(value) || value < 0) {
|
|
throw new Error(`invalid byte size: ${raw}`);
|
|
}
|
|
|
|
const unit = (m[2] ?? opts?.defaultUnit ?? "b").toLowerCase();
|
|
const multiplier = UNIT_MULTIPLIERS[unit];
|
|
if (!multiplier) {
|
|
throw new Error(`invalid byte size unit: ${raw}`);
|
|
}
|
|
|
|
const bytes = Math.round(value * multiplier);
|
|
if (!Number.isFinite(bytes)) {
|
|
throw new Error(`invalid byte size: ${raw}`);
|
|
}
|
|
return bytes;
|
|
}
|