mirror of
https://github.com/ruvnet/ruflo.git
synced 2026-09-14 14:01:28 +08:00
72fb129397
Widens the ruflo-watermark WASM surface (src/wasm.rs) to select schemes by
name ("tournament" | "tournament_nd" | "gumbel") and adds the indel-robust
self-sync and exact-Gamma short-text detectors to the bindings.
Adds v3/@claude-flow/watermark: a Node (CommonJS) npm package wrapping the
wasm-pack-generated bindings behind an ergonomic API (Watermarker, detect,
detectSelfSync, detectExact), with a clean .d.ts, a committed 37KB .wasm so
`npm install` needs no Rust toolchain, a regenerate script (build:wasm), a
README, and a smoke test. Verified: all 3 schemes generate+detect, wrong-key
and null streams rejected, and the specialized detectors fire — both in-repo
and from a fresh tarball install.
No watermark-removal tooling is exposed.
Claude-Session: https://claude.ai/code/session_01VYDa3Hah5VJLS2ceEuTLKz
54 lines
2.0 KiB
TypeScript
54 lines
2.0 KiB
TypeScript
// Type definitions for @claude-flow/watermark.
|
|
|
|
export type Scheme = 'tournament' | 'tournament_nd' | 'gumbel';
|
|
|
|
export interface Detection {
|
|
/** Standardized deviation from the null. Larger => stronger evidence. */
|
|
zScore: number;
|
|
/** Upper-tail p-value under the null (floors at 0 for extreme z). */
|
|
pValue: number;
|
|
/** log10(pValue), stable even when pValue underflows to 0. */
|
|
log10P: number;
|
|
/** Number of watermarked positions that were scored. */
|
|
scoredPositions: number;
|
|
/** True if the evidence clears the given false-positive rate (default 1e-6). */
|
|
isWatermarked(alpha?: number): boolean;
|
|
}
|
|
|
|
export interface WatermarkerOptions {
|
|
/** Secret key material. Carries no user-identifying information. */
|
|
key: string | Uint8Array;
|
|
/** Scheme (default `gumbel`, the distortion-free option). */
|
|
scheme?: Scheme;
|
|
/** Context window H — preceding tokens seeding each draw (default 4). */
|
|
contextWidth?: number;
|
|
/** Tournament depth (default 6; ignored by `gumbel`). */
|
|
layers?: number;
|
|
}
|
|
|
|
export interface DetectOptions extends WatermarkerOptions {}
|
|
export interface SelfSyncOptions {
|
|
key: string | Uint8Array;
|
|
contextWidth?: number;
|
|
}
|
|
|
|
/** Streaming watermarked sampler. */
|
|
export class Watermarker {
|
|
constructor(opts: WatermarkerOptions);
|
|
/** Emit one token; returns the index of the chosen candidate. */
|
|
step(tokens: Uint32Array | number[], probs: Float32Array | number[]): number;
|
|
/** Release the WASM instance. */
|
|
free(): void;
|
|
}
|
|
|
|
/** Detect a watermark over an emitted token-id sequence. */
|
|
export function detect(tokens: Uint32Array | number[], opts: DetectOptions): Detection;
|
|
|
|
/** Indel-robust detection (Gumbel self-sync) — stronger on edited/repetitive text. */
|
|
export function detectSelfSync(tokens: Uint32Array | number[], opts: SelfSyncOptions): Detection;
|
|
|
|
/** Exact-null short-text detection (Gumbel, exact Gamma tail). */
|
|
export function detectExact(tokens: Uint32Array | number[], opts: SelfSyncOptions): Detection;
|
|
|
|
export const SCHEMES: ReadonlySet<Scheme>;
|