tawasuyu/llimphi
Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.
feat: llimphi standalone — framework UI soberano extraído del monorepo
1;; Plugin fixture: "hello-status".
2;;
3;; Lee el payload de args que el host escribió en memoria justo
4;; después del nombre de la capability, y lo concatena con un saludo
5;; fijo "hola, " en otro offset. Después emite el resultado via
6;; `plugin.set_status`.
7;;
8;; Layout de memoria al entrar `_invoke`:
9;; [0 .. cap_len) nombre de capability (UTF-8)
10;; [cap_len .. cap_len+arg_len) args del host (UTF-8)
11;;
12;; El plugin coloca su buffer de salida en el offset 256 para no
13;; pisar lo anterior. v0 del ABI no negocia layouts — la convención
14;; es que el plugin elige offsets altos.
15(module
16 (import "plugin" "log" (func $log (param i32 i32)))
17 (import "plugin" "set_status" (func $set_status (param i32 i32)))
18
19 (memory (export "memory") 1)
20
21 ;; "hola, " en offset 256 (6 bytes)
22 (data (i32.const 256) "hola, ")
23
24 (func (export "_invoke")
25 (param $cap_ptr i32) (param $cap_len i32)
26 (param $arg_ptr i32) (param $arg_len i32)
27 (result i32)
28 ;; Traza para debug: el host capturará "[plugin] greet"
29 (call $log (i32.const 256) (i32.const 5))
30
31 ;; Copia los args al final del prefijo "hola, " en 256+6=262
32 (memory.copy
33 (i32.const 262) ;; dst = 256 + len("hola, ")
34 (local.get $arg_ptr) ;; src = donde el host puso args
35 (local.get $arg_len))
36
37 ;; Total len = 6 ("hola, ") + arg_len
38 (call $set_status
39 (i32.const 256)
40 (i32.add (i32.const 6) (local.get $arg_len)))
41
42 (i32.const 0)
43 )
44)