tawasuyu

tawasuyu/brahman

Rust 570TOML 215Markdown 68JSON 198238 Sutichaykuna

⎇ e52b3fb572cec07d35c55d87519ecc8e0bd0505a shared_wit/protocol.wit HTML · 109 siq'ikuna · 3.4 KB Ñawpa willay ch'uya

chore: monorepo inicial con arje + minga + yahweh absorbidos 53dbdf0f1 · Sergio ·

1// Brahman — Protocolo central (handshake & ciclo de vida)
2//
3// Esta interfaz es el contrato de los módulos "conscientes". Los módulos
4// agnósticos sólo presentan un manifest TOML y son supervisados por convención
5// mínima; los módulos con WIT pueden negociar capacidades, reportar estado y
6// recibir señales del Admin.
7//
8// Versionado: este archivo declara `0.1.0`. Cambios major requieren un nuevo
9// archivo (`protocol-v2.wit`); cambios minor son aditivos.
10
11package brahman:protocol@0.1.0;
12
13interface types {
14    /// Identificador opaco emitido por el Admin tras un handshake exitoso.
15    type session-id = string;
16
17    /// Timestamp UNIX en segundos.
18    type unix-ts = u64;
19
20    record module-info {
21        /// Nombre canónico (debe coincidir con el manifest).
22        name: string,
23        /// SemVer del módulo.
24        version: string,
25        /// Versión del protocolo Brahman implementada.
26        protocol-version: string,
27        /// Capacidades que ofrece (ids libres, idealmente URIs).
28        provides: list<string>,
29        /// Capacidades que requiere para arrancar.
30        requires: list<string>,
31    }
32
33    record admin-info {
34        /// Versión del Admin que aceptó el handshake.
35        version: string,
36        /// Versión del protocolo soportada por el Admin.
37        protocol-version: string,
38        /// Identificador de sesión asignado.
39        session: session-id,
40        /// Si el Init está vinculado al Admin actualmente.
41        init-attached: bool,
42    }
43
44    /// Errores comunes durante negociación o ciclo de vida.
45    variant protocol-error {
46        protocol-mismatch(string),
47        unauthorized(string),
48        capability-unmet(string),
49        rejected(string),
50        internal(string),
51    }
52}
53
54interface handshake {
55    use types.{module-info, admin-info, protocol-error, session-id};
56
57    /// Negociación inicial de un módulo con el Admin.
58    /// El Admin valida protocolo, capacidades requeridas y permisos.
59    hello: func(info: module-info) -> result<admin-info, protocol-error>;
60
61    /// Cierre limpio (drena conexiones, libera recursos).
62    farewell: func(session: session-id) -> result<_, protocol-error>;
63
64    /// Latido para mantener viva la sesión. Devuelve el reloj del Admin.
65    ping: func(session: session-id) -> result<u64, protocol-error>;
66}
67
68interface lifecycle {
69    use types.{session-id, unix-ts, protocol-error};
70
71    enum module-state {
72        initializing,
73        ready,
74        running,
75        suspended,
76        degraded,
77        terminating,
78    }
79
80    record state-report {
81        state: module-state,
82        timestamp: unix-ts,
83        detail: option<string>,
84    }
85
86    /// Reporta cambio de estado al Admin (telemetría → Init si está adjunto).
87    report-state: func(session: session-id, report: state-report) -> result<_, protocol-error>;
88
89    /// Señal del Admin solicitando suspensión cooperativa.
90    on-suspend: func(session: session-id) -> result<_, protocol-error>;
91
92    /// Señal del Admin solicitando reanudación.
93    on-resume: func(session: session-id) -> result<_, protocol-error>;
94}
95
96/// Mundo que un módulo Brahman implementa.
97world module {
98    import handshake;
99    import lifecycle;
100
101    /// Punto de entrada que el Admin invoca tras instanciar el componente.
102    export run: func() -> result<_, string>;
103}
104
105/// Mundo que el Admin implementa (host-side) para los módulos.
106world admin-host {
107    export handshake;
108    export lifecycle;
109}