/**
 * Function allow-list registry — Task H.1.5 + H.4 (ReDoS-hardened `match()`).
 *
 * ALLOW-LIST ONLY. The interpreter dispatches `call` nodes through this
 * frozen registry; missing names throw `InterpreterRuntimeError('unknown
 * function: <name>')`. To add a new function, follow the 5-point expansion
 * checklist (pre-research §4.4):
 *
 *   1. **Cite a real skill** that needs it. Speculative adds rejected.
 *   2. **Confirm pure** — deterministic + side-effect-free (no I/O, no time,
 *      no random). Tests must include a determinism case.
 *   3. **Document new attack surface** —
 *        - Regex-accepting → use RE2 (ReDoS-immune by construction; follow
 *          `match()` precedent).
 *        - String-returning → bounded length (cap ~10k chars to prevent
 *          step-cap evasion via huge strings).
 *        - Object-returning → must `Object.create(null)` the result.
 *   4. **Coercion table** documented per-input-type, every input → defined
 *      output, `undefined`/`null` defined, never throw.
 *   5. **≥3 tests** — happy + type-mismatch + edge (empty / null). Add a
 *      fuzz/adversarial case for any function touching strings.
 *
 * Comparable sets (post-research §4.2):
 *   - **Cerbos CEL:** size, contains, startsWith, endsWith, matches, in,
 *     filter, map, exists, all, sort (+ arithmetic, IP, time, path).
 *   - **GitHub Actions:** contains, startsWith, endsWith, format, join,
 *     toJSON, fromJSON, hashFiles, success, failure, always, cancelled.
 *   - Our 5 align with Cerbos's core string ops + GHA's core matchers. We
 *     deliberately OMIT `format`/`join`/`toJSON` (handled by `{{var}}`
 *     interpolation), `in` (sugar for `contains` with swapped args), and
 *     arithmetic (no skill needs math in v1).
 *
 * Coercion + signature reference (pre-research §4.3):
 *
 *   | Name         | Signature                              | Type-mismatch |
 *   | ------------ | -------------------------------------- | ------------- |
 *   | len(x)       | string|array|object → number           | returns 0     |
 *   | contains     | string × string → bool                 | returns false |
 *   | startsWith   | string × string → bool                 | returns false |
 *   | endsWith     | string × string → bool                 | returns false |
 *   | match        | string × string → bool (RE2 grammar)   | returns false |
 *
 * Handlers do NOT throw on type-mismatch — they return `false`/`0` (matches
 * the relational-op convention from `interpreter.ts:applyCompare`). Only
 * the interpreter's unknown-function path throws `InterpreterRuntimeError`.
 * Wrong arity is acceptable failure mode: missing args arrive as
 * `undefined` and the type guards coerce to the default.
 */
/** Handler signature: positional args are passed evaluated and unmodified. */
export type FnHandler = (...args: unknown[]) => unknown;
/**
 * Frozen allow-list registry. Built on a null-prototype base so author-
 * supplied call names like `__proto__` / `constructor` / `toString` can't
 * resolve to inherited Object.prototype methods on lookup. `Object.freeze`
 * prevents bracket-assignment mutation at runtime; the audit grep on the
 * registry name (see H.1.5 spec verification commands) enforces no late
 * mutation at source-review time. Both layers are intentional — runtime
 * + source-time defense.
 */
export declare const FUNCTIONS: Readonly<Record<string, FnHandler>>;
//# sourceMappingURL=functions.d.ts.map