Synsemadocsv0.6.xENES

Primeros pasos

Inicio rápido

Synsema es un lenguaje de programación diseñado para agentes de IA — el razonamiento LLM, la coordinación multi-agente, los gates de aprobación humana, un servidor HTTP y un modelo de seguridad deny-by-default están integrados en el lenguaje, no atornillados como frameworks. Viene como un único binario autocontenido (escrito en Rust) — sin Python, sin Node, sin runtime que instalar.

Instalación§

macOS / Linux:

curl -fsSL https://synsema.com/install.sh | sh

Windows (PowerShell):

irm https://synsema.com/install.ps1 | iex

Desde npm (Linux, macOS, Windows — el mismo binario nativo, no corre nada más; v0.6.3+):

npm i -g synsema          # después: synsema run app.syn
npx synsema run app.syn   # por proyecto, sin instalación global

Actualizar: synsema update (o npm i -g synsema@latest cuando lo instaló npm — el binario se da cuenta y lo dice).

Verificá:

synsema version

Hola, mundo§

El arranque más rápido es el scaffold — genera un hello.syn comentado (un tour corto del lenguaje, con su test), un .env.example con cada knob explicado, un .gitignore, y un .mcp.json que registra el servidor MCP local synsema-code para tu agente de código:

synsema init mi-proyecto

O escribilo vos — poné esto en hello.syn:

hello-world.syn
-- Doc example: your first Synsema program. Comments in English (universal code).
intent: "doc example: hello world + a tiny task"

task greet(name)
    give "Hello, " + name + "!"

print(greet("World"))                 -- run shows: Hello, World!

test "greet builds a friendly message"
    assert_eq(greet("World"), "Hello, World!")
    assert_eq(greet("Synsema"), "Hello, Synsema!")

Correlo:

synsema run hello.syn

synsema run ejecuta un archivo (cada print aparece en el momento); synsema test corre los bloques test — de un archivo, o de varios archivos y directorios a la vez (synsema test a.syn tests/); synsema check parsea sin ejecutar y avisa de lo que cambió entre versiones (un nombre de builtin deprecado, un escape \u, una escritura que la semántica de valor perdería). Si venís de otro lenguaje, leé Contra tus instintos antes de escribir mucho.

Tu primer servidor HTTP§

Synsema trae un servidor HTTP de producción integrado — sin framework que agregar. Todo es deny-by-default: declarás lo que el programa puede hacer con require.

require serve(8080)

serve on 8080
    route "GET /hello"
        give {"msg": "hi"}
synsema serve app.syn          # → http://127.0.0.1:8080/hello

Tu primera página web§

El mismo servidor sirve HTML de verdad. Una página es un template con { huecos }; tu CSS/JS viven en static/ (se recargan en caliente por request — editás, refrescás, listo):

require serve(8080)
require file.read("./static/**")         -- static serves this folder: that is reading it
require file.read("pages/*")             -- render() reads the template from disk

serve on 8080
    static "/assets" from "./static"        -- app.css, app.js
    route "GET /"
        give render("pages/home.html", {"title": "My site"})
<!-- pages/home.html -->
<!DOCTYPE html><html><head><title>{ title }</title>
<link rel="stylesheet" href="/assets/app.css"></head>
<body><h1>{ title }</h1></body></html>

Las dos líneas require file.read hacen falta: servir una carpeta y renderizar un template es leer archivos, y nada lee un archivo sin decirlo. Sacá la primera y el servidor no arranca — el error nombra la línea que falta (add require file.read("static/")); sacá la segunda y la página es un 500 Capability not granted: file_read("pages/home.html"). es "esta carpeta y todo lo que hay abajo".

Recorrido completo (layout, componentes, formularios, páginas de error): Construí un sitio web.

Tu primera llamada al LLM§

El LLM es una primitiva integrada. Poné la clave de tu proveedor en .env (nunca se expone al programa) y:

require llm

let summary be generate "a one-line summary" given report
let action be decide between ["approve", "reject"] given request

El resultado de un decide se valida para que sea una de las opciones — con reintentos automáticos. Mirá LLM en la barra lateral para las operaciones nativas y para llamar a la API HTTP del proveedor directamente.

Siguiente§