---
slug: 90-builtins
title: Índice de builtins
description: Un índice categorizado de las funciones integradas de Synsema — colecciones, texto, matemática, bytes, tiempo, JSON, I/O, HTTP, DB, memoria y response helpers.
example_ids: [builtins]
---

# Índice de builtins

Un mapa categorizado de los builtins. Las firmas completas viven en cada página de tema; los centrales están doctested acá para que esta referencia no driftee.

```synsema
-- Doc reference: a few core builtins, doctested so the reference can't drift.
intent: "doc reference: core builtins"

print("upper(\"hi\") = " + upper("hi") + ",  join([a,b],\"-\") = " + join(["a", "b"], "-"))

test "collections"
    assert_eq(length([1, 2, 3]), 3)
    assert(contains([1, 2, 3], 2))
    assert_eq(slice([1, 2, 3, 4], 1, 3), [2, 3])     -- Python-style end-exclusive
    assert_eq(keys({"a": 1, "b": 2}), ["a", "b"])
    assert_eq(values({"a": 1, "b": 2}), [1, 2])

test "text"
    assert_eq(upper("hi"), "HI")
    assert_eq(trim("  x  "), "x")
    assert_eq(split("a,b,c", ","), ["a", "b", "c"])
    assert_eq(join(["a", "b"], "-"), "a-b")
    assert(starts_with("hello", "he"))

test "intentional ops"
    assert_eq(apply((n) => n * 2, [1, 2, 3]), [2, 4, 6])
    assert_eq(where([1, 2, 3, 4], (n) => n > 2), [3, 4])
    assert_eq(reduce([1, 2, 3], (a, b) => a + b, 0), 6)

test "intentional ops accept both orders (fn-first and list-first)"
    assert_eq(apply([1, 2, 3], (n) => n * 2), [2, 4, 6])     -- list-first also works
    assert_eq(where((n) => n > 2, [1, 2, 3, 4]), [3, 4])     -- fn-first also works
    assert_eq(reduce((a, b) => a + b, [1, 2, 3], 10), 16)    -- extra args stay at the end

test "unique and index_of"
    assert_eq(unique([3, 1, 3, 2, 1]), [3, 1, 2])            -- first-appearance order
    assert_eq(index_of([10, 20, 30], 20), 1)                 -- by item
    assert_eq(index_of([1, 2, 3], (n) => n > 1), 1)          -- by predicate
    assert_eq(index_of([1, 2], 9), nothing)                  -- absent → nothing, not -1

test "program & subprocess: args() and self_path() (no capability)"
    assert_eq(type_of(args()), "list")           -- the program's argv (empty under `synsema test`)
    assert_eq(type_of(self_path()), "text")       -- this executable's path
    assert(length(self_path()) > 0)
```

## Por categoría

- **Colecciones:** `length`, `contains`, `slice`, `keys`, `values`, `apply`, `where`, `reduce`, `sort_by`, `group_by`, `find_first`, `every`, `some`, `collect`, `count_where`, `flatten`, `chunk`, `zip_with`, `unique` (dedupe, orden de primera aparición, igualdad estructural), `index_of` (índice base 0 por item o predicado; ausente → `nothing`, no -1). `enumerate(list)` → `[{index, item}, …]` para loops con índice (lenguaje y templates). Los ops intencionales que toman un callable aceptan **ambos** órdenes — `apply(fn, lista)` y `apply(lista, fn)` se leen igual de bien; dos tasks o dos listas donde se esperaba una-y-una es error explícito.
- **Texto:** `upper`, `lower`, `fold`, `trim`, `starts_with`, `split`, `join`, `replace_text`, `replace_re`, `matches`, `capture`, `text`, `fmt`, `strip_ansi` (engine v0.6.8+: salida de terminal → texto plano; escapes CSI/OSC/charset y bytes de control fuera, los redibujos con `\r` conservan el último cuadro).
- **Números / matemática:** `+ - * / % **`, `number`, constantes `pi`/`tau`/`e`/`inf`/`nan`; `abs`, `sign`, `min`, `max`, `clamp`, `sqrt`, `cbrt`, `hypot`, `pow`, `exp`, `ln`, `log10`, `log2`, `log_base`, `floor`, `ceil`, `round`, `trunc`, `round_to`, `sin`/`cos`/`tan`/`asin`/`acos`/`atan`/`atan2`, `radians`/`degrees`, `sinh`/`cosh`/`tanh`/`asinh`/`acosh`/`atanh`, `gcd`, `lcm`, `factorial`, `is_nan`/`is_infinite`/`is_finite`, `gamma`/`lgamma`/`erf`/`erfc`/`beta`; `decimal`, `complex`/`real`/`imag`/`conj`/`arg`; predicados de tipo `is_decimal`, `is_complex`, `is_array`, `is_bytes`, `type_of`; arrays `array`, `arange`, `linspace`, `zeros`, `ones`, `eye`, `full`, `reshape`, `shape`, `ndim`, `size`, `transpose`, `trace`, `dot`, `norm`, `matmul`, `solve`, `det`, `inv`, `eig`, `svd`; `bytes_to_int`, `int_to_bytes`, `int_to_bytes_le` — ver [Bytes, matemática y arrays](/es/0.6.x/35-bytes-math-arrays).
- **Bytes / cripto:** `bytes`, `decode` (encodings: `utf8`, `hex`, `base64`, `base64url`, `base58`, `base32`), `sha256`, `sha512`, `hmac_sha256`, `verify_hmac`, `constant_time_eq`.
- **Web Push** (engine v0.6.15+ — ver [Tu app en el teléfono](/es/0.6.x/41b-pwa)): `push_vapid_keys()` → `{public, private}` (`require random`; la privada vuelve como `secret` con label `vapid_private`); `push_send(subscription, payload, opts)` → `{status, ok, gone, retry_after, body}` (`require net("<host del endpoint>")` — `fcm.googleapis.com` y `jmt17.google.com` (Chrome usa cualquiera), `*.notify.windows.com`, `updates.push.services.mozilla.com`, `web.push.apple.com`; `opts.vapid = {public, private: secret, subject}` obligatorio, `ttl`, `urgency`, `topic`, `timeout`; payload texto / map→JSON / bytes / `nothing`, ≤ 3993 bytes; `gone` con 404/410). RFC 8291 `aes128gcm` + VAPID RFC 8292, sin proveedor; no está en el perfil wasm.
- **Web auth** (engine v0.5.5+ — ver [Login y sesiones](/es/0.6.x/40a-web-auth)): `password_hash`, `password_verify`, `jwt_sign`, `jwt_verify`, `totp`, `totp_verify` (puros); `random_bytes`, `token` (`require random`); respuestas `with_header`, `set_cookie`, `clear_cookie`; `request.cookies`; auth task de 2 parámetros.
- **Identidad de agentes y auth** (engine v0.5.6+ — ver [Identidad de agentes](/es/0.6.x/46-agent-identity)): tokens de capacidad `captoken_mint`, `captoken_attenuate` (offline, sin clave), `captoken_verify`, `captoken_allows` (puros); requests firmadas `http_sign` (`require sign("CLAVE")` + auditoría) y `http_signature_verify` (puro, `opts.alg` obligatorio); OIDC de terceros `oidc_verify` (`iss`+`aud` obligatorios; el JWKS necesita `require net(host)`); `mtls_identity(cert, key, opts?)` con alcance por `opts.hosts` (`require file.read`); medición por identidad: `spend_total(unidad, identidad?)`, rate limits por identidad y `SYNSEMA_SPEND_CEILING_PER_IDENTITY="agente=UNIDAD:tope"` (cualquier unidad — ninguna moneda privilegiada); descubrimiento en `/.well-known/synsema-auth`.
- **Tiempo / random:** `now`, `format_time`, `parse_time`, `date_parts` (→ `{year, month, day, hour, minute, second}`, UTC), `sleep`, `random`, `random_int` (`random`, `random_bytes` y `token` necesitan `require random`).
- **JSON:** `json_encode`, `json_decode`; `json_for_script` (el mismo JSON con `<`/`>`/`&` escapados `\u00XX` — la forma segura de incrustar datos en un `<script>` inline).
- **CSV:** `csv_parse`, `csv_encode`.
- **Estadística:** `median`, `percentile`, `histogram` (también `sum`, `mean`, `std`, `var`).
- **Gráficos:** `chart_svg`; `chart` (nodo de contenido negociado).
- **I/O (gateado por capacidad):** `read_file`, `write_file`, `append_file`, `edit_file`, `file_exists`, `file_info`, `list_dir`, `grep`, `read_file_bytes`.
- **HTTP:** `http`, `http_get`, `http_post`, `http_put`, `http_delete`, `fetch`.
- **WebSocket:** `ws_connect`, `ws_send`, `ws_recv`, `ws_close`, más multiplexado/resiliencia `ws_select`, `ws_select_all`, `ws_broadcast`, `ws_status`, `ws_stats` (todos gateados por `net`). Opts de `ws_connect`: `subprotocols`, `max_queue`, `max_queue_bytes`, `on_full`, `reconnect` (`{max_retries, backoff, backoff_max, on_reconnect}`), `keepalive` (`{interval, timeout}`).
- **Blockchain (puros):** `keccak256`, `sha512_256`, `secp256k1_verify/recover/pubkey`, `ed25519_verify/pubkey`, `eth_address`, `rlp_encode/decode`, `abi_encode/decode/selector`, `eip191_digest`, `eip712_digest`, `solana_message/tx`, `solana_pda`, `spl_ata`, `spl_transfer_data`, `spl_transfer_checked_data`, `algorand_tx_encode/tx`, `algo_address`, `bytes_to_int`, `int_to_bytes`, `int_to_bytes_le`.
- **Blockchain (gateados):** `secp256k1_sign` / `ed25519_sign` / `schnorr_sign` (`require sign`); `mnemonic_generate`, `mnemonic_to_seed`, `hd_derive`, `algorand_mnemonic`, `keystore_import`/`keystore_export`, `wif_import` (`require wallet`).
- **Bitcoin (puros):** `hash160`, `btc_address`, `btc_address_decode`, `btc_script`, `btc_txid`, `schnorr_verify`, `schnorr_pubkey`, `btc_tx`, `btc_tx_raw`, `psbt_encode`, `psbt_decode`, `psbt_finalize`.
- **Bitcoin (lado de lectura, gateado por `net`):** `btc_utxos`, `btc_balance`, `btc_fee_estimates`, `btc_send`, `btc_wait`, `btc_rpc`.
- **Lado de lectura de blockchain (gateado por `net`, como HTTP):** `eth_rpc`, `eth_nonce`, `eth_balance`, `eth_gas_price`, `eth_chain_id`, `eth_estimate_gas`, `eth_call`, `eth_fee_history`, `eth_send_raw`, `eth_receipt`, `eth_wait_receipt`; `solana_rpc`, `solana_latest_blockhash`, `solana_balance`, `solana_send`, `solana_confirm`, `spl_balance`; `algorand_params`, `algorand_account`, `algorand_send`, `algorand_wait`. Más los builders puros `tx_eip1559` / `tx_eip1559_raw`.
- **DB:** `db_open`, `db_close`, `sql`, `sql_exec`, `sql_batch`, `sql_tables`, `paged`; `mongo_find`, `mongo_find_one`, `mongo_insert`, `mongo_insert_many`, `mongo_update`, `mongo_delete`, `mongo_count`, `mongo_aggregate`, `mongo_collections`; `redis_get`/`set`/`del`/`exists`/`mget`/`mset`/`keys`/`type`, `redis_incr`/`decr`/`incrby`, `redis_expire`/`ttl`/`persist`, `redis_hget`/`hset`/`hdel`/`hgetall`/`hincrby`, `redis_lpush`/`rpush`/`lpop`/`rpop`/`lrange`/`llen`, `redis_sadd`/`srem`/`smembers`/`sismember`, `redis_lock`/`unlock` — ver [SQL, Mongo y Redis](/es/0.6.x/33-sql-mongo-redis).
- **Serve — respuestas, contenido, estado:** `ok`, `created`, `not_found`, `fail`, `html`, `respond`, `redirect`, `binary`, `render`, `with_header`, `set_cookie`, `clear_cookie`; nodos de contenido `page`, `heading`, `prose`, `list`, `ordered_list`, `link`, `image`, `section`, `code`, `raw`, `content`, `chart`; estado compartido `state_set`, `state_get`, `state_incr`, `state_delete`, `state_all` — ver [Servidor HTTP](/es/0.6.x/40-serve).
- **Cron:** `cron_every`, `cron_after`, `cron_cancel`, `cron_list`, `cron_status`.
- **Apps agénticas** (engine v0.6.7+ — ver [Apps agénticas](/es/0.6.x/47-agentic-apps)): una sola espera `select(targets, timeout?)`; procesos vivos `proc_spawn`, `proc_recv`, `proc_select`, `proc_send`, `proc_close_stdin`, `proc_resize` (v0.6.8+, sólo pty), `proc_status`, `proc_kill`, `proc_wait`, `proc_stats`, `proc_close` (gateados por `exec`, como `run`; `proc_spawn(…, {"pty": true})` desde v0.6.8; el kill alcanza al árbol de procesos entero y `{"process_group": false}` desprende a propósito, v0.6.9+); file-watch `watch`, `watch_recv`, `watch_stats`, `watch_close` (v0.6.9+, gateados por `file.read` como `list_dir`; polling con snapshot, los mismos eventos en todos los SO); la terminal propia del programa `term_open`, `term_recv`, `term_size`, `term_write`, `term_stats`, `term_close` (v0.6.11+, gateados por `stdin`; raw mode, cada tecla como evento, entra en `select`; `term_open` es `nothing` sin TTY); bus de eventos `bus_publish`, `bus_subscribe`, `bus_recv`, `bus_unsubscribe`, `bus_topics` (sin capability); control de agentes `agents`, `agent_stop`; el binding `socket` de un bloque `route … socket` es un handle WebSocket para la familia `ws_*`.
- **Programa y subproceso** (engine v0.6.14+): `args()` → el argv propio del programa (lo que sigue a `--` en `synsema run`, o el argv entero de un binario `synsema build`) — **sin capability** (es input que tipeó quien llama); `self_path()` → el path de este ejecutable, exactamente como lo da el SO (pasáselo a `run`/`proc_spawn` — el scope `exec` coincide byte a byte) — sin capability; `platform()` → `{os, arch}` (v0.6.18+: `"windows"`/`"macos"`/`"linux"` y otros nombres tal como los reporta Rust; `"x86_64"`/`"aarch64"`; `"wasm"`/`"wasm32"` en el build para navegador) — sin capability, la misma respuesta bajo `--sandbox` y `--profile pure` (un hecho del binario, como `args()`); `shutdown(reason?)` (v0.6.18+) → le pide al server que corre su drain ordenado y exit 0 — desde una ruta, un socket, un job de cron o un agente; idempotente; error bajo `run` y antes de que algo escuche; un motivo `secret` se rechaza; sin capability — ver **[Tu app en el escritorio](/es/0.6.x/41c-desktop)**; `run_program(source, opts)` — **`require sandbox_run`** — corre otro programa Synsema en un **proceso hijo** bajo un techo que es la intersección con el del padre, con su propio `env`/`cwd`/`timeout` y su audit devuelto como un valor — ver **[Correr Synsema bajo un techo](/es/0.6.x/22-sandbox)**.
- **LLM / tools:** `llm_available`, `llm_usage` (tokens consumidos por este proceso; `0` offline — ver [Primitivas LLM](/es/0.6.x/50-llm-primitives)), `llm_step`, `call`, `call_tool`.
- **Dinero / ledger de gasto** (`require spend("UNIDAD")` — ver [Capacidades](/es/0.6.x/20-capabilities)): `spend(monto, unidad, motivo)` → total acumulado de la unidad (auditado en `spend.log`, techo del host `SYNSEMA_SPEND_CEILING`); `spend_total(unidad)` → total del proceso, sin capability.
- **Memoria / progreso / reglas** (toda la familia necesita `require memory("name")` — ver **[Memoria y estado](/es/0.6.x/61-memory)**): `remember`, `recall`, `forget_memory`, `memory_summary`, `create_progress`, `start_step`, `complete_step`, `fail_step`, `resume_point`, `progress_display`, `progress_percent`, `add_rule`, `check_rules`, `get_rules`.
- **Secretos:** `secret`, `as_secret`, `bearer`, `reveal`.
- **Respuestas (serve):** `ok`, `created`, `fail`, `not_found`, `respond`, `redirect`, `render`, `content`, `paged`; `form of request` (body de formulario parseado urlencoded/multipart, archivos como bytes exactos).
- **Errores:** `raise`, `assert`, `assert_eq`, `assert_ne`, `assert_error`.
