Initial commit: 2125_NBB project

This commit is contained in:
gyt
2026-07-09 12:55:00 -04:00
commit ba4bb1ec62
22 changed files with 214235 additions and 0 deletions
Executable
+1
View File
@@ -0,0 +1 @@
/target
Generated Executable
+632
View File
@@ -0,0 +1,632 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "anyhow"
version = "1.0.102"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
[[package]]
name = "async-trait"
version = "0.1.89"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "axum"
version = "0.7.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f"
dependencies = [
"async-trait",
"axum-core",
"bytes",
"futures-util",
"http",
"http-body",
"http-body-util",
"hyper",
"hyper-util",
"itoa",
"matchit",
"memchr",
"mime",
"percent-encoding",
"pin-project-lite",
"rustversion",
"serde",
"serde_json",
"serde_path_to_error",
"serde_urlencoded",
"sync_wrapper",
"tokio",
"tower",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "axum-core"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199"
dependencies = [
"async-trait",
"bytes",
"futures-util",
"http",
"http-body",
"http-body-util",
"mime",
"pin-project-lite",
"rustversion",
"sync_wrapper",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "bitflags"
version = "2.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8"
[[package]]
name = "bytes"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "errno"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys",
]
[[package]]
name = "form_urlencoded"
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
dependencies = [
"percent-encoding",
]
[[package]]
name = "futures-channel"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
dependencies = [
"futures-core",
]
[[package]]
name = "futures-core"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
[[package]]
name = "futures-task"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
[[package]]
name = "futures-util"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
dependencies = [
"futures-core",
"futures-task",
"pin-project-lite",
"slab",
]
[[package]]
name = "glyph_backend"
version = "0.1.0"
dependencies = [
"anyhow",
"axum",
"lazy_static",
"serde",
"serde_json",
"tokio",
"tower-http",
]
[[package]]
name = "http"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425"
dependencies = [
"bytes",
"itoa",
]
[[package]]
name = "http-body"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
dependencies = [
"bytes",
"http",
]
[[package]]
name = "http-body-util"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
dependencies = [
"bytes",
"futures-core",
"http",
"http-body",
"pin-project-lite",
]
[[package]]
name = "httparse"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
[[package]]
name = "httpdate"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "hyper"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498"
dependencies = [
"atomic-waker",
"bytes",
"futures-channel",
"futures-core",
"http",
"http-body",
"httparse",
"httpdate",
"itoa",
"pin-project-lite",
"smallvec",
"tokio",
]
[[package]]
name = "hyper-util"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
dependencies = [
"bytes",
"http",
"http-body",
"hyper",
"pin-project-lite",
"tokio",
"tower-service",
]
[[package]]
name = "itoa"
version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
[[package]]
name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.186"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
[[package]]
name = "lock_api"
version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
dependencies = [
"scopeguard",
]
[[package]]
name = "log"
version = "0.4.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "953f07c43838f8e6f9758cab68bf5bed85465e7587ebe0b823f1bcd81978ad3a"
[[package]]
name = "matchit"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94"
[[package]]
name = "memchr"
version = "2.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4"
[[package]]
name = "mime"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "mio"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda"
dependencies = [
"libc",
"wasi",
"windows-sys",
]
[[package]]
name = "once_cell"
version = "1.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
[[package]]
name = "parking_lot"
version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
dependencies = [
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.9.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
"windows-link",
]
[[package]]
name = "percent-encoding"
version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "pin-project-lite"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
[[package]]
name = "proc-macro2"
version = "1.0.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
dependencies = [
"proc-macro2",
]
[[package]]
name = "redox_syscall"
version = "0.5.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
dependencies = [
"bitflags",
]
[[package]]
name = "rustversion"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
name = "ryu"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "serde"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
]
[[package]]
name = "serde_core"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.150"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9"
dependencies = [
"itoa",
"memchr",
"serde",
"serde_core",
"zmij",
]
[[package]]
name = "serde_path_to_error"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457"
dependencies = [
"itoa",
"serde",
"serde_core",
]
[[package]]
name = "serde_urlencoded"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
dependencies = [
"form_urlencoded",
"itoa",
"ryu",
"serde",
]
[[package]]
name = "signal-hook-registry"
version = "1.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
dependencies = [
"errno",
"libc",
]
[[package]]
name = "slab"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
[[package]]
name = "smallvec"
version = "1.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
[[package]]
name = "socket2"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51"
dependencies = [
"libc",
"windows-sys",
]
[[package]]
name = "syn"
version = "2.0.117"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "sync_wrapper"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
[[package]]
name = "tokio"
version = "1.52.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe"
dependencies = [
"bytes",
"libc",
"mio",
"parking_lot",
"pin-project-lite",
"signal-hook-registry",
"socket2",
"tokio-macros",
"windows-sys",
]
[[package]]
name = "tokio-macros"
version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "tower"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
dependencies = [
"futures-core",
"futures-util",
"pin-project-lite",
"sync_wrapper",
"tokio",
"tower-layer",
"tower-service",
"tracing",
]
[[package]]
name = "tower-http"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5"
dependencies = [
"bitflags",
"bytes",
"http",
"http-body",
"http-body-util",
"pin-project-lite",
"tower-layer",
"tower-service",
]
[[package]]
name = "tower-layer"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
[[package]]
name = "tower-service"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
[[package]]
name = "tracing"
version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [
"log",
"pin-project-lite",
"tracing-core",
]
[[package]]
name = "tracing-core"
version = "0.1.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
dependencies = [
"once_cell",
]
[[package]]
name = "unicode-ident"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]]
name = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-sys"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
"windows-link",
]
[[package]]
name = "zmij"
version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
Executable
+13
View File
@@ -0,0 +1,13 @@
[package]
name = "glyph_backend"
version = "0.1.0"
edition = "2021"
[dependencies]
axum = "0.7"
tokio = { version = "1", features = ["full"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
lazy_static = "1.4"
anyhow = "1.0"
tower-http = { version = "0.5", features = ["cors"] }
+47
View File
@@ -0,0 +1,47 @@
# SuperDave AI 2.0 — Session Export Index
**Date**: Sat Jun 13 2026
**Total Export Size**: ~140KB across 3 files
## Files
| File | Size | Contents |
|------|------|----------|
| SESSION_PART1.md | ~14KB | Header, TOC, Architecture, CLAUDE.md, AGENTS.md |
| SESSION_PART2_SOURCES.md | ~126KB | All 10 source files with full code |
| SESSION_PART3_META.md | ~10KB | Key decisions, next steps, context log |
## Quick Links
- **Server**: /home/dave/server.py (mounted at /glyphs for dashboard)
- **Dual Layer Package**: /home/dave/superdave/dual_layer/
- **Dashboard**: /home/dave/superdave/glyph_dashboard/index.html
- **Integration**: /home/dave/superdave/dual_layer_integration.py
- **Model Integration**: /home/dave/superdave/glyph_model_integration.py
- **Tests**: /home/dave/superdave/test_multi_glyph_resonance.py
- **Usage Guide**: /home/dave/superdave/DUAL_LAYER_USAGE_GUIDE.md
## Critical Numbers
- G001: 152 superpowers, 387.95x boost, priority 10.0
- VRAM: Warning 6.5GB, Critical 7.5GB, Total 8.0GB (GTX1080)
- 9 specialized types, 600 glyphs cached
- 5 API endpoints verified (200 OK)
## Key Commands
```bash
# Start server
python3 /home/dave/server.py
# Check symbolic status
curl http://localhost:8000/api/symbolic/status
# Activate glyph
curl -X POST http://localhost:8000/api/symbolic/activate \
-H "Content-Type: application/json" \
-d '{"intent": "root authority", "request_type": "chat"}'
# Dashboard (in browser)
http://localhost:8000/glyphs/index.html
```
+455
View File
@@ -0,0 +1,455 @@
# SuperDave AI 2.0 — Full Session Export
**Date**: Sat Jun 13 2026
**Session**: Dual-Layer Backend Build — Glyphs 600 Superpowers
**Export Path**: `D:\2125 final glyph sp build\NEW Backend Build-GLyphs 600sp\SESSION_EXPORT_COMPLETE.md`
---
## Table of Contents
1. [Session Summary](#1-session-summary)
2. [Architecture Overview](#2-architecture-overview)
3. [File Inventory](#3-file-inventory)
4. [Complete Source Files](#4-complete-source-files)
5. [Usage Guide](#5-usage-guide)
6. [Testing & Validation](#6-testing--validation)
7. [Key Decisions Log](#7-key-decisions-log)
8. [Next Steps](#8-next-steps)
---
## 1. Session Summary
### Goal
Build and production-test a **dual-layer system** combining:
- **Symbolic Glyph Layer**: 600 glyphs, 152 superpowers, resonance computation, intent-based activation
- **Computational Layer**: FastAPI server, VRAM management (8GB GTX1080), model routing (Llama/Forge/Janus/Google AI)
### What Was Built
| Component | Status | Description |
|-----------|--------|-------------|
| `dual_layer/router.py` | Complete | Maps 9 specialized types to models, constraints, enhancements |
| `dual_layer/vram_manager.py` | Complete | Async VRAM manager with Forge/Janus mutex, priority deactivation |
| `dual_layer/symbolic_engine.py` | Complete | Glyph activation from intent, resonance calculation, telemetry |
| `dual_layer_integration.py` | Complete | 5 FastAPI symbolic endpoints + enhanced chat |
| `glyph_dashboard/index.html` | Complete | Real-time monitoring dashboard |
| `glyph_model_integration.py` | Complete | Glyph-enhanced model execution |
| `test_multi_glyph_resonance.py` | Complete | 12-test validation suite |
| `server.py` | Enhanced | Dual-layer integrated, dashboard mounted |
| `DUAL_LAYER_USAGE_GUIDE.md` | Complete | Full documentation |
### Key Metrics
- **G001 (Ledo)**: 152 superpowers, 387.95x boost, aether_node type, priority 10.0
- **G001-G600**: 5-25 superpowers each, dynamically assigned
- **9 specialized types** mapped to correct models
- **VRAM**: Warning=6.5GB, Critical=7.5GB, Total=8.0GB
- **All 5 API endpoints** verified via TestClient (200 OK)
---
## 2. Architecture Overview
```
User Intent / API Request
|
v
+-----------------------------+
| SYMBOLIC LAYER |
| +-----------------------+ |
| | SymbolicEngine | |
| | * Intent to Glyph | |
| | * Superpower assign | |
| | * Resonance calc | |
| | * Telemetry emit | |
| +----------+------------+ |
| | |
| +----------v------------+ |
| | Router | |
| | * Type to Model map | |
| | * Priority calc | |
| | * Constraints/Enhanc | |
| +----------+------------+ |
+-------------+---------------+
| RoutingResult
v
+-----------------------------+
| COMPUTATIONAL LAYER |
| +-----------------------+ |
| | VRAMManager | |
| | * asyncio.Lock | |
| | * 8GB GTX1080 limits | |
| | * Forge/Janus mutex | |
| | * Priority deactivat | |
| +----------+------------+ |
| | |
| +----------v------------+ |
| | GlyphModelIntegration | |
| | * Constraint apply | |
| | * Enhancement apply | |
| | * Post-processing | |
| +----------+------------+ |
| | |
| +----------v------------+ |
| | Model Connectors | |
| | * Llama (Tabby API) | |
| | * Forge (diffusers) | |
| | * Janus (stub) | |
| | * Google AI (Gemini) | |
| +-----------------------+ |
+-----------------------------+
|
v
JSON Response + Glyph Metadata
```
### Data Flow
1. **Request arrives** to POST /api/chat with optional glyph_activation param or POST /api/symbolic/activate
2. **Symbolic Engine** activates glyph from intent
3. **Router** maps to computational layer
4. **VRAM Manager** validates and reserves
5. **Model Integration** executes with glyph enhancements
6. **Response** returned with glyph metadata
---
## 3. File Inventory
### Dual-Layer Core (/home/dave/superdave/dual_layer/)
| File | Lines | Purpose |
|------|-------|---------|
| __init__.py | 47 | Package exports |
| router.py | 336 | Symbolic to Computational mapping |
| vram_manager.py | 368 | Async VRAM manager |
| symbolic_engine.py | 323 | Glyph activation engine |
### Integration (/home/dave/superdave/)
| File | Lines | Purpose |
|------|-------|---------|
| dual_layer_integration.py | 227 | FastAPI endpoints |
| glyph_model_integration.py | 264 | Model execution with glyphs |
| server.py | 920 | Main FastAPI server |
### Dashboard
| File | Lines | Purpose |
|------|-------|---------|
| glyph_dashboard/index.html | 558 | Real-time glyph activation UI |
### Documentation
| File | Lines | Purpose |
|------|-------|---------|
| DUAL_LAYER_USAGE_GUIDE.md | 428 | Complete usage documentation |
### Tests
| File | Lines | Purpose |
|------|-------|---------|
| test_multi_glyph_resonance.py | 328 | 12-test validation suite |
---
## 4. Complete Source Files
### 4.1 CLAUDE.md
**Path**: /home/dave/CLAUDE.md (183 lines)
Full contents start below this line.
```
# SuperDave AI 2.0 — Project Instructions
**Last Updated**: May 14, 2026
**Status**: Backend rebuild in progress (Pinokio integration pending)
**Hardware**: GTX 1080 (8GB VRAM)
**Active Directory**: `D:\SuperDave_2125\` (or `/mnt/d/SuperDave_2125/` on WSL)
---
## Quick Start
1. **Server Status**: FastAPI server at `/home/dave/server.py` (or Q:\server.py on Windows)
2. **Run Server**: `python server.py` (starts on port 8000)
3. **Frontend**: React 19 at `Q:\superdave-ai-bundle\source`
4. **Pinokio**: Local environment orchestrates Llama, Forge, Google AI
---
## Architecture
```
React Frontend (Q:\superdave-ai-bundle\source)
↓ HTTP/JSON
FastAPI Backend (server.py on port 8000)
Pinokio Environment
├─ Llama (chat/text)
├─ Forge/Stable Diffusion (image generation)
├─ Janus-Pro-7B (video generation)
└─ Google AI (vision analysis)
```
---
## Core API Endpoints
| Endpoint | Method | Purpose | Status |
|----------|--------|---------|--------|
| `/api/chat` | POST | Chat with Llama | Stub (needs Pinokio routing) |
| `/api/generate-image` | POST | Create images via Forge | Stub (needs Pinokio routing) |
| `/api/generate-video` | POST | Create videos via Janus | Stub (needs Pinokio routing) |
| `/api/vision` | POST | Image analysis (Google AI) | Pending (service TBD) |
| `/api/status` | GET | System health & VRAM | ✅ Working |
| `/api/config` | GET | System configuration | ✅ Working |
| `/api/oracle/{action}` | POST | Memory system (save/retrieve) | Stub |
---
## Critical VRAM Rules
⚠️ **NEVER run Forge + Janus simultaneously** (8GB crash risk)
```
MAX_VRAM = 8.0 GB
WARNING_THRESHOLD = 6.5 GB
CRITICAL_THRESHOLD = 7.5 GB
```
**Before launching video generation**: Close Forge first
**Before launching image generation**: Close Janus first
---
## User Authentication
Add to server requests:
```bash
curl -H "Authorization: Bearer <user_id>" http://localhost:8000/api/chat
```
Server logs user_id with each request for usage tracking.
---
## Integration TODOs
### 1. Connect Llama Chat
- [ ] Get Pinokio Llama API endpoint
- [ ] Implement in `/api/chat` handler
- [ ] Test with simple prompt
- [ ] Verify VRAM usage
### 2. Connect Forge Image Generation
- [ ] Get Pinokio Forge API endpoint
- [ ] Implement in `/api/generate-image` handler
- [ ] Test image generation
- [ ] Verify output path (C:\SuperDave_Projects\outputs\images\)
### 3. Connect Google AI Vision
- [ ] Confirm service: Gemini API or Vertex AI
- [ ] Get credentials/API key
- [ ] Implement in `/api/vision` handler
- [ ] Test with sample image
### 4. Connect Janus Video Generation
- [ ] Get Pinokio Janus API endpoint
- [ ] Implement in `/api/generate-video` handler
- [ ] Test video generation
- [ ] Verify output path (C:\SuperDave_Projects\outputs\videos\)
---
## Conversion to EXE
Once server is stable & all models connected:
```bash
pip install pyinstaller
pyinstaller --onefile --windowed server.py
```
Output: `dist/server.exe` (single executable, no Python needed)
---
## File Structure
```
/home/dave/SuperDave_2125/
├── docs/
│ ├── OPERATIONS.md ← Full workflow guide
│ ├── API_REFERENCE.md ← Endpoint details
│ └── PINOKIO_INTEGRATION.md ← How to connect models
├── configs/
│ └── model_config.json ← Model settings
├── logs/
│ └── [system logs]
└── server.py ← FastAPI backend (copy to root when ready)
```
---
## Important Paths
- **Server**: `/home/dave/server.py` or `Q:\server.py`
- **Frontend**: `Q:\superdave-ai-bundle\source`
- **Outputs**: `C:\SuperDave_Projects\outputs\`
- **Logs**: `C:\SuperDave_Projects\logs\`
- **Docs**: `/home/dave/SuperDave_2125/docs/`
---
## Common Tasks
### Start Server
```bash
python server.py
# Runs on http://localhost:8000
# Docs at http://localhost:8000/docs
```
### Check System Status
```bash
curl http://localhost:8000/api/status
```
### Test Chat Endpoint
```bash
curl -X POST http://localhost:8000/api/chat \
-H "Content-Type: application/json" \
-d '{"messages": [{"role": "user", "content": "Hello"}]}'
```
### Test Image Generation
```bash
curl -X POST http://localhost:8000/api/generate-image \
-H "Content-Type: application/json" \
-d '{"prompt": "a cat sitting on a chair"}'
```
---
## Next Session Checklist
- [ ] Read `/home/dave/SuperDave_2125/docs/OPERATIONS.md`
- [ ] Check server status: `/api/status`
- [ ] Review integration TODOs above
- [ ] Connect next Pinokio model (Llama, Forge, or Google AI)
- [ ] Test endpoint with sample request
- [ ] Monitor VRAM during operation
---
**Questions?** Check `/home/dave/SuperDave_2125/docs/` for detailed guides.
```
---
### 4.2 AGENTS.md
**Path**: /home/dave/superdave/AGENTS.md
```
# SuperDave GlyphRunner - Project Guide
## Overview
SuperDave GlyphRunner is a Python system that compiles Python source code into GX binary format (XIC format) and executes it through the LAIN cognition engine — an 8-lane symbolic processor with glyph resonance analysis. Includes a FedMart telemetry system with real-time dashboard.
## Language & Runtime
- Python 3.14
- No virtual environment or package manager configured
- No requirements.txt or pyproject.toml
## Directory Structure
```
gx_compiler/ — Python → .gx binary compiler (compressor, segmenter, packer)
gx_lain/ — LAIN cognition engine (8-lane symbolic processor, glyph bridge, runtime)
gx_cli/ — CLI interface (compile, run, inspect, summary, lain commands)
runtime_executor/ — GX binary loader and execution runtime
glyphs/ — Supercharged glyph registry (600 glyphs from LedoGlyph600.json)
glyphos/ — Symbolic pipeline, cognitive kernel, event system
xic_extensions/ — Compressed engine, segment runtime, profiler, execution tracer
xic_*.py — XIC VM, executor, shell, validator, cache, diagnostics, profiler, visualizer
fedmart_ui/ — Web dashboard for XIC telemetry monitoring
integrations/ — FedMart integration adapter
codex_lineage/ — Grammar hooks, contributor index, lineage model, epoch mapper
LLMCompress/ — LLM compression utilities
tests/ — Unit tests (plain Python, no framework)
integration_tests/ — Integration tests (plain Python, no framework)
```
## Test Commands
```bash
# Run all integration tests
python3 /home/dave/superdave/integration_tests/run_all_tests.py
# Run individual integration tests
python3 /home/dave/superdave/integration_tests/test_compile.py
python3 /home/dave/superdave/integration_tests/test_run.py
python3 /home/dave/superdave/integration_tests/test_inspect.py
python3 /home/dave/superdave/integration_tests/test_summary.py
python3 /home/dave/superdave/integration_tests/test_errors.py
python3 /home/dave/superdave/integration_tests/test_determinism.py
# Run unit tests
python3 /home/dave/superdave/tests/test_supercharged_registry.py
python3 /home/dave/superdave/tests/test_lain_glyph_bridge.py
python3 /home/dave/superdave/tests/test_cognitive_kernel.py
python3 /home/dave/superdave/tests/test_events.py
python3 /home/dave/superdave/tests/test_control_flow.py
# Run FedMart validation tests
python3 /home/dave/superdave/tests/validate_fedmart_integration.py
python3 /home/dave/superdave/tests/validate_ui_integration.py
```
## Lint / Typecheck
No linter or typecheck configuration found. Run tests as verification.
## Code Conventions
- Tests use plain Python (no pytest/unittest) with subprocess and assertions
- Tests exit 0 on pass, non-zero on fail
- Packages use relative imports (`from .module import`)
- Lane processors return `{"summary": str, "key_points": list, "constraints": list, "open_questions": list}`
- Lane processors use error recovery (catch exceptions, return safe defaults)
- No comments in code unless explicitly requested
- GSZ3 compression ensures deterministic output (no timestamps in payload)
## CLI Usage
```bash
# Compile Python source to GX binary
python3 -m gx_cli.main compile source.py -o source.gx
# Execute through LAIN cognition
python3 -m gx_cli.main lain source.gx
# Inspect GX binary
python3 -m gx_cli.main inspect source.gx
# Run GX binary
python3 -m gx_cli.main run source.gx
# Summary of GX binary
python3 -m gx_cli.main summary source.gx
```
## Key Data
- 600 glyphs in LedoGlyph600.json (~2.2 MB)
- 8 glyph categories, bands 0-41, scores 0-300+
- Resonance formula: 40% activation + 30% frequency + 30% symbolic
- Typical compile: ~600 byte source → ~960 byte .gx, 6 segments, ~280 bytes compressed
```
+3893
View File
File diff suppressed because it is too large Load Diff
+194
View File
@@ -0,0 +1,194 @@
## 5. Usage Guide (Summary)
See `DUAL_LAYER_USAGE_GUIDE.md` in Part 2 for the complete guide. Key commands:
### Start Server
```bash
python3 /home/dave/server.py
```
### Access Dashboard
Open in browser: **http://localhost:8000/glyphs/index.html**
### Test Symbolic Endpoints
```bash
# Check status
curl http://localhost:8000/api/symbolic/status
# Activate glyph
curl -X POST http://localhost:8000/api/symbolic/activate \
-H "Content-Type: application/json" \
-d '{"intent": "I need primordial authority", "request_type": "chat"}'
```
### Chat with Glyph Activation
```bash
curl -X POST http://localhost:8000/api/chat \
-H "Content-Type: application/json" \
-d '{
"model": "llama-3.5-35b",
"messages": [{"role": "user", "content": "Hello"}],
"temperature": 0.7,
"glyph_activation": {
"intent": "I need root authority",
"request_type": "chat"
}
}'
```
---
## 6. Testing & Validation
### Dual-Layer Endpoint Tests
All 5 symbolic API endpoints verified via TestClient returning 200 OK:
| Endpoint | Method | Status |
|----------|--------|--------|
| /api/symbolic/status | GET | Verified |
| /api/symbolic/glyphs | GET | Verified |
| /api/symbolic/activate | POST | Verified |
| /api/symbolic/deactivate | POST | Verified |
| /api/symbolic/routing/summary | GET | Verified |
### Multi-Glyph Resonance Tests
The validation suite (test_multi_glyph_resonance.py) runs 12 tests:
1. New operations in OP_TABLE
2. XICContext.glyph_contexts field
3. PUSH_GLYPH_CONTEXT accumulation
4. CLEAR_GLYPH_CONTEXT reset
5. Guardrail enforcement
6. run_symbolic_pipeline signature
7. compute_multi_glyph_resonance() exists
8. Multi-glyph computation structure
9. execute_symbolic with glyph_ids
10. Backward compatibility
11. Demo programs validation
12. Multi-glyph demo structure
Run with:
```bash
python3 /home/dave/superdave/test_multi_glyph_resonance.py
```
---
## 7. Key Decisions Log
### Architecture
| Decision | Rationale |
|----------|-----------|
| Dual-layer design | Separates symbolic intent (glyphs/resonance) from computational execution (models/VRAM) |
| Async VRAM lock (asyncio.Lock) | Prevents threading lock timeouts while keeping concurrent safety |
| Priority formula: min(10.0, power_boost / 40.0) | G001 (387.95x) gets max priority 10.0; normal glyphs scale proportionally |
| Resonance formula: 40% activation + 30% frequency + 30% symbolic | Balances power count, boost intensity, and type significance on 0-100 scale |
| Singleton managers (get_vram_manager, get_symbolic_engine) | Ensures global state consistency across requests |
### VRAM Management
| Decision | Rationale |
|----------|-----------|
| 8GB GTX1080 limits | Hardware constraint; Warning=6.5GB, Critical=7.5GB |
| Forge/Janus mutex | Both consume ~4.5-5GB each; running together would exceed 8GB |
| Priority-based deactivation | Higher-priority glyphs can evict lower-priority ones when VRAM is full |
| Per-type VRAM budgets | Different model types need different amounts (llama=2GB, forge=4.5GB, janus=5GB) |
### Glyph Configuration
| Decision | Rationale |
|----------|-----------|
| G001 gets 152 superpowers, priority 10.0 | Root glyph (Ledo) has maximum authority |
| G002-G600 get 5-25 powers dynamically | Metric-based assignment ensures balanced distribution |
| 9 specialized types | Maps to available computational models (Llama, Forge, etc.) |
| aether_node: 7.5GB max VRAM | G001 needs maximum resources for full capability |
### Specialized Type Routing
| Decision | Rationale |
|----------|-----------|
| star_bloom_creativity -> forge | Creative tasks map to image generation |
| frost_steel_stabilizer -> llama | Safety/stability handled by LLM constraints |
| mirror_weave_reasoning -> llama | Reasoning/logic handled by LLM enhancements |
| monument_grade_equilibrium -> llama | System balance handled by LLM orchestration |
### Dashboard Design
| Decision | Rationale |
|----------|-----------|
| Real-time VRAM bar | Visual indicator of GPU memory pressure |
| 5-second auto-refresh | Balance between responsiveness and API load |
| Activity log with 20 entries | Keep UI clean while showing recent history |
| Fixed refresh button | Always accessible for manual refresh |
---
## 8. Next Steps
### Immediate (Blocked)
1. **Fix server persistence**: Server keeps shutting down when shell times out
- Use: `nohup python3 /home/dave/server.py &`
- Or set up systemd/tmux service
2. **Verify dashboard** from browser at http://localhost:8000/glyphs/index.html
### Short Term
3. Test glyph activation from dashboard UI
4. Connect to Pinokio for real model execution
5. Verify VRAM monitoring during operation
### Medium Term
6. Connect Llama Chat (Tabby API endpoint)
7. Connect Forge Image Generation (diffusers/SDXL-Turbo)
8. Connect Google AI Vision (Gemini API key)
9. Connect Janus Video Generation
### Long Term
10. Convert to single EXE via PyInstaller
11. Tune routing thresholds based on real usage
12. Expand beyond 600 glyphs if desired
---
## 9. Session Context & Thinking Log
### Build Sequence
1. Created dual-layer package structure (dual_layer/__init__.py, router.py, vram_manager.py, symbolic_engine.py)
2. Built routing system mapping 9 specialized types to models with constraints/enhancements
3. Implemented async VRAM manager with Forge/Janus mutex and priority deactivation
4. Created SymbolicEngine for intent-based glyph activation and resonance calculation
5. Built FastAPI integration with 5 symbolic endpoints
6. Created real-time glyph activation dashboard (HTML/CSS/JS)
7. Implemented glyph-enhanced model execution (constraint/enhancement framework)
8. Enhanced server.py with dual-layer import and dashboard mounting
9. Fixed bugs: threading.Lock -> asyncio.Lock, import paths, parameter mismatches
10. Verified all 5 endpoints via TestClient returning 200 OK
11. Created comprehensive usage guide
### Bugs Fixed
- **Threading lock timeout**: Replaced threading.Lock() with asyncio.Lock() in VRAMManager
- **Import paths**: Standardized "dual_layer.*" -> "superdave.dual_layer.*"
- **GlyphActivationEvent parameter mismatch**: Changed success/failure_reason to context dict
- **Variable naming conflict**: Fixed logger redefinition in server.py (line 37)
### Critical Rules Enforced
- NEVER run Forge + Janus simultaneously (8GB VRAM crash risk)
- G001 has maximum priority (10.0) and VRAM budget (7.5GB)
- Priority-based preemption for VRAM allocation
- FedMart telemetry on every glyph activation
---
## 10. Version History
| Date | Version | Changes |
|------|---------|---------|
| Sat Jun 13 2026 | 1.0.0 | Initial dual-layer build complete |
| Sat Jun 13 2026 | 1.0.1 | Fixed async lock, imports, event params |
| Sat Jun 13 2026 | 1.0.2 | Added dashboard, enhanced server.py |
| Sat Jun 13 2026 | 1.0.3 | Endpoint verification, usage guide |
---
*End of Session Export*
Executable
+94810
View File
File diff suppressed because it is too large Load Diff
+306
View File
@@ -0,0 +1,306 @@
# GlyphOS Infrastructure Plan
## Executive Summary
Proposing a production-grade infrastructure for the 600-glyph monument system. Current prototype (Rust/Axum + JSON files) needs database, auth, observability, and deployment pipeline.
---
## 1. Data Layer
### Current State
- JSON files in `glyphs/*.json`
- Meta-glyph archive: `glyph-complete-600.json` (not yet present)
- In-memory `HashMap` with RwLock
### Proposed Infrastructure
```
┌─────────────────────────────────────────────────────────┐
│ Data Layer │
├─────────────────────────────────────────────────────────┤
│ Primary DB: PostgreSQL 16 │
│ - glyphs table (600 rows, canonical + semantic) │
│ - meta_glyphs table (600 rows, full JSONB archive) │
│ - lineage table (60 lineages, 6 super-families) │
│ - hash_index table (FNV-1a → glyph_id mapping) │
│ │
│ Cache: Redis │
│ - LRU cache for hot glyphs (TTL: 5min) │
│ - Search index cache (TTL: 1min) │
│ - Session/rate-limit counters │
│ │
│ Search: Meilisearch (or Elasticsearch) │
│ - Full-text search across name, meaning, tags │
│ - Fuzzy matching, typo tolerance │
│ - Lineage/band/period filtering │
└─────────────────────────────────────────────────────────┘
```
**Why PostgreSQL?**
- JSONB for meta-glyph archive (flexible schema)
- ACID compliance for glyph uploads
- Row-level locking (better than RwLock contention)
---
## 2. API Layer Enhancements
### Current Endpoints (12 total)
- Health, sample, list, get-by-id, search, reload, stats, upload
- Meta-glyph: list, get, search, project
### Proposed Additions
| Endpoint | Method | Purpose |
|----------|--------|---------|
| `/glyph/{id}/resonance` | GET | Compute resonance with other glyphs |
| `/glyph/batch` | POST | Bulk upload (10-100 glyphs) |
| `/lineage/{id}` | GET | Get all glyphs in lineage |
| `/lineage/{id}/activate` | POST | Activate entire lineage cluster |
| `/meta-glyph/{id}/diff` | GET | Compare meta vs projected |
| `/admin/backup` | POST | Trigger DB backup |
| `/admin/restore` | POST | Restore from backup |
### Authentication Middleware
```rust
// Proposed auth flow
1. API key in `X-API-Key` header
2. Rate limiting: 100 req/min per key
3. Upload endpoints require admin scope
4. JWT for user sessions (optional)
```
---
## 3. Infrastructure Diagram
```
┌───────────────┐
│ Cloudflare │
│ (CDN + SSL) │
└───────┬───────┘
┌───────▼───────┐
│ Kong/API │
│ Gateway │
│ (Auth + RL) │
└───────┬───────┘
┌───────────────┼───────────────┐
│ │ │
┌───────▼───────┐ ┌────▼─────┐ ┌──────▼──────┐
│ Glyph API │ │ Monitor │ │ Backup │
│ (Rust/Axum) │ │ Service │ │ Service │
│ Port 3000 │ │ (Prometheus)│ │ (Scheduled) │
└───────┬───────┘ └───────────┘ └──────────────┘
┌───────┴───────┐
│ PostgreSQL │
│ + Redis │
│ + Meilisearch│
└───────────────┘
```
---
## 4. Deployment Architecture
### Containerization
```dockerfile
# Multi-stage build
FROM rust:1.80 AS builder
WORKDIR /app
COPY . .
RUN cargo build --release
FROM debian:12-slim
RUN apt-get update && apt-get install -y ca-certificates
COPY --from=builder /app/target/release/glyph_backend /usr/local/bin
EXPOSE 3000
CMD ["glyph_backend"]
```
### Orchestration (Kubernetes)
```yaml
# Deployment
replicas: 3
resources:
requests: { cpu: "500m", memory: "512Mi" }
limits: { cpu: "2", memory: "2Gi" }
# HPA (Horizontal Pod Autoscaler)
minReplicas: 3
maxReplicas: 10
targetCPUUtilization: 70%
# Pod Disruption Budget
minAvailable: 2
```
### CI/CD Pipeline
```
GitHub → Actions → Build → Test → Docker → Deploy
├─ cargo test
├─ cargo clippy
├─ cargo fmt --check
├─ Integration tests (glyph upload/search)
└─ Security scan (cargo audit)
```
---
## 5. Observability Stack
### Metrics (Prometheus + Grafana)
- Request rate per endpoint
- Response latency (p50, p95, p99)
- Glyph cache hit rate
- DB connection pool usage
- Error rate by endpoint
### Logging (Loki or ELK)
- Structured JSON logs
- Correlation IDs per request
- Glyph upload/change audit trail
### Tracing (OpenTelemetry)
- Request flow: Gateway → API → DB → Cache
- Slow query detection
- Cross-service latency breakdown
---
## 6. Backup & Recovery
### Strategy
| Type | Frequency | Retention | Storage |
|------|-----------|-----------|---------|
| DB Snapshot | Hourly | 7 days | S3/GCS |
| DB Backup | Daily | 30 days | S3 + Glacier |
| Glyph JSON Export | Weekly | 90 days | S3 |
| Meta-glyph Archive | On-change | Permanent | S3 + Versioning |
### Recovery RTO/RPO
- **RTO (Recovery Time Objective):** < 1 hour
- **RPO (Recovery Point Objective):** < 5 minutes
---
## 7. Security Hardening
### Input Validation
- Glyph JSON schema validation (serde validator)
- Max payload size: 1MB per glyph
- Rate limiting: 100 req/min per API key
### Network Security
- TLS 1.3 only (Cloudflare)
- API Gateway (Kong) for auth/rate-limiting
- Private DB network (no public access)
### Audit Logging
- All `/glyph/upload` requests logged
- User/IP/timestamp in audit table
- Immutable log storage (WORM)
---
## 8. Scaling Strategy
### Horizontal Scaling
- Stateless API pods (scale to 10 replicas)
- DB read replicas for search queries
- Redis cluster for cache
### Vertical Scaling
- Current: 2 CPU / 2GiB per pod
- Max: 4 CPU / 8GiB per pod (before horizontal)
### Glyph Count Scaling
- 600 glyphs: Current architecture fine
- 6,000 glyphs: Add read replicas, increase cache
- 60,000 glyphs: Sharding by lineage ID
---
## 9. Cost Estimate (Monthly)
| Component | Provider | Cost |
|-----------|----------|------|
| Compute (3 pods) | AWS EKS | $150 |
| PostgreSQL (managed) | AWS RDS | $100 |
| Redis (managed) | AWS ElastiCache | $50 |
| Search (Meilisearch) | Self-hosted | $0 |
| Storage (S3) | AWS S3 | $20 |
| CDN + SSL | Cloudflare | $0 (free tier) |
| **Total** | | **~$320/mo** |
---
## 10. Implementation Phases
### Phase 1: Foundation (Week 1-2)
- [ ] PostgreSQL schema design + migration
- [ ] Replace JSON loader with DB loader
- [ ] Add Redis cache layer
- [ ] Basic auth middleware
### Phase 2: Observability (Week 3)
- [ ] Prometheus metrics export
- [ ] Structured logging
- [ ] Grafana dashboards
### Phase 3: Hardening (Week 4)
- [ ] Rate limiting
- [ ] Input validation
- [ ] Audit logging
- [ ] Backup automation
### Phase 4: Deployment (Week 5)
- [ ] Docker containerization
- [ ] Kubernetes manifests
- [ ] CI/CD pipeline
- [ ] Load testing
---
## Tradeoffs & Questions
### Tradeoffs
1. **PostgreSQL vs SQLite** - PostgreSQL adds complexity but scales better. SQLite simpler for <10k glyphs.
2. **Meilisearch vs Postgres FTS** - Meilisearch better UX, but adds infra. Postgres FTS sufficient for 600 glyphs.
3. **Kubernetes vs Docker Compose** - K8s overkill for single server. Compose simpler for MVP.
### Questions for You
1. **Expected glyph count growth?** (600 → 6,000 or stay at 600?)
2. **Concurrent user load?** (10 users or 10,000?)
3. **Budget constraints?** (Self-hosted vs managed services)
4. **Deployment preference?** (Single server, K8s, or serverless?)
5. **Auth requirements?** (API keys, OAuth, or open?)
---
## Recommendation for MVP
For 600 glyphs with moderate traffic:
```
┌─────────────────────┐
│ Single EC2/Docker │
│ - Rust API │
│ - PostgreSQL │
│ - Redis (optional) │
│ - Daily S3 backup │
└─────────────────────┘
Cost: ~$50/mo
```
Scale to full infrastructure when:
- Glyph count > 5,000
- Concurrent users > 100
- Upload frequency > 10/day
---
**Ready to proceed with implementation?** I can start with Phase 1 (DB schema + migration) once you confirm the direction.
File diff suppressed because it is too large Load Diff
+15
View File
@@ -0,0 +1,15 @@
{
"canonical": {
"id": "BETA-002",
"name": "Glyph BETA-002",
"short_code": "BET",
"tier": 1,
"epoch": 1
},
"semantic": {
"core_meaning": "test glyph BETA-002",
"tags": [
"test"
]
}
}
+15
View File
@@ -0,0 +1,15 @@
{
"canonical": {
"id": "ALPHA-001",
"name": "Glyph ALPHA-001",
"short_code": "ALP",
"tier": 1,
"epoch": 1
},
"semantic": {
"core_meaning": "test glyph ALPHA-001",
"tags": [
"test"
]
}
}
+15
View File
@@ -0,0 +1,15 @@
{
"canonical": {
"id": "GAMMA-003",
"name": "Glyph GAMMA-003",
"short_code": "GAM",
"tier": 1,
"epoch": 1
},
"semantic": {
"core_meaning": "test glyph GAMMA-003",
"tags": [
"test"
]
}
}
+4072
View File
File diff suppressed because it is too large Load Diff
+2760
View File
File diff suppressed because it is too large Load Diff
+355
View File
@@ -0,0 +1,355 @@
glyph VALIDATOR CODE CHECK/REPAIR ENGINE
Here is the full JSON validator script, written exactly the way you need it:
Complete
Deterministic
Zero ambiguity
Strict structural checks
Ready for DeepSeek or any Python runtime
Validates all 600 glyphs
Reports every error with precision
No filler.
No drift.
Just the full validator.
⭐ GLYPH JSON VALIDATOR (PYTHON SCRIPT — FULL FILE)
This is a complete file, not a snippet.
You can paste this directly into Big Pickle, DeepSeek, or run it locally.
Code
import json
import sys
REQUIRED_FIELDS = ["id", "name", "essence", "trait", "ability"]
def validate_glyph_structure(glyph, index, errors):
# Check required fields
for field in REQUIRED_FIELDS:
if field not in glyph:
errors.append(f"Glyph {index}: Missing field '{field}'")
else:
if glyph[field] is None or glyph[field] == "":
errors.append(f"Glyph {index}: Field '{field}' is empty or null")
# Check ID type
if "id" in glyph:
if not isinstance(glyph["id"], int):
errors.append(f"Glyph {index}: 'id' must be an integer")
if glyph["id"] != index:
errors.append(f"Glyph {index}: ID mismatch — expected {index}, got {glyph['id']}")
# Check name type
if "name" in glyph and not isinstance(glyph["name"], str):
errors.append(f"Glyph {index}: 'name' must be a string")
# Check essence/trait/ability types
for field in ["essence", "trait", "ability"]:
if field in glyph and not isinstance(glyph[field], str):
errors.append(f"Glyph {index}: '{field}' must be a string")
def validate_json_file(path):
errors = []
# Load JSON
try:
with open(path, "r", encoding="utf-8") as f:
data = json.load(f)
except json.JSONDecodeError as e:
print("JSON PARSE ERROR:")
print(str(e))
sys.exit(1)
# Check top-level type
if not isinstance(data, list):
print("ERROR: Top-level JSON must be a list of glyphs.")
sys.exit(1)
# Check glyph count
if len(data) != 600:
errors.append(f"Expected 600 glyphs, found {len(data)}")
# Track duplicates
seen_ids = set()
seen_names = set()
# Validate each glyph
for i, glyph in enumerate(data, start=1):
validate_glyph_structure(glyph, i, errors)
# Duplicate ID check
gid = glyph.get("id")
if gid in seen_ids:
errors.append(f"Duplicate ID detected: {gid}")
else:
seen_ids.add(gid)
# Duplicate name check
name = glyph.get("name")
if name in seen_names:
errors.append(f"Duplicate name detected: {name}")
else:
seen_names.add(name)
# Final report
if errors:
print("VALIDATION FAILED — ERRORS FOUND:")
for err in errors:
print(" - " + err)
sys.exit(1)
else:
print("VALIDATION COMPLETE — ALL 600 GLYPHS VERIFIED.")
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python validate_glyphs.py <path_to_json>")
sys.exit(1)
validate_json_file(sys.argv[1])
⭐ WHAT THIS SCRIPT DOES
It performs every validation you need, including:
Sequential IDs (1600)
No missing fields
No null/empty values
No malformed glyphs
No duplicate IDs
No duplicate names
Strict type checking
Full JSON parse validation
Linelevel error reporting
This is the canonical validator for the 600glyph monument.
********************************************************
Heres a full Rust code skeleton for the Glyph Engine — a complete file you can drop into a lib.rs (or engine.rs) and start wiring up.
No stubs missing, no partials — you can extend each todo!() as you go.
rust
use std::collections::HashMap;
use std::fs::File;
use std::io::Read;
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct Glyph {
pub id: u32,
pub name: String,
pub essence: String,
pub trait_field: String, // 'trait' is reserved in Rust
pub ability: String,
}
#[derive(Debug)]
pub struct GlyphRegistry {
pub by_id: HashMap<u32, Glyph>,
pub by_name: HashMap<String, Glyph>,
pub by_essence: HashMap<String, Vec<Glyph>>,
pub by_trait: HashMap<String, Vec<Glyph>>,
pub by_ability: HashMap<String, Vec<Glyph>>,
}
impl GlyphRegistry {
pub fn new() -> Self {
Self {
by_id: HashMap::new(),
by_name: HashMap::new(),
by_essence: HashMap::new(),
by_trait: HashMap::new(),
by_ability: HashMap::new(),
}
}
pub fn index_glyph(&mut self, glyph: Glyph) {
let id = glyph.id;
let name = glyph.name.clone();
let essence = glyph.essence.clone();
let trait_field = glyph.trait_field.clone();
let ability = glyph.ability.clone();
self.by_id.insert(id, glyph.clone());
self.by_name.insert(name, glyph.clone());
self.by_essence.entry(essence).or_default().push(glyph.clone());
self.by_trait.entry(trait_field).or_default().push(glyph.clone());
self.by_ability.entry(ability).or_default().push(glyph);
}
pub fn from_glyphs(glyphs: Vec<Glyph>) -> Self {
let mut registry = Self::new();
for g in glyphs {
registry.index_glyph(g);
}
registry
}
pub fn get_by_id(&self, id: u32) -> Option<&Glyph> {
self.by_id.get(&id)
}
pub fn get_by_name<S: AsRef<str>>(&self, name: S) -> Option<&Glyph> {
self.by_name.get(name.as_ref())
}
pub fn get_by_essence<S: AsRef<str>>(&self, essence: S) -> Vec<&Glyph> {
self.by_essence
.get(essence.as_ref())
.map(|v| v.iter().collect())
.unwrap_or_default()
}
pub fn get_by_trait<S: AsRef<str>>(&self, trait_field: S) -> Vec<&Glyph> {
self.by_trait
.get(trait_field.as_ref())
.map(|v| v.iter().collect())
.unwrap_or_default()
}
pub fn get_by_ability<S: AsRef<str>>(&self, ability: S) -> Vec<&Glyph> {
self.by_ability
.get(ability.as_ref())
.map(|v| v.iter().collect())
.unwrap_or_default()
}
}
// ---------- LOADER ----------
pub fn load_glyphs_from_json_file(path: &str) -> anyhow::Result<Vec<Glyph>> {
let mut file = File::open(path)?;
let mut buf = String::new();
file.read_to_string(&mut buf)?;
let mut glyphs: Vec<Glyph> = serde_json::from_str(&buf)?;
// Optional: enforce ID ordering and basic sanity
glyphs.sort_by_key(|g| g.id);
Ok(glyphs)
}
// ---------- ENGINE CORE ----------
#[derive(Debug)]
pub struct GlyphEngine {
registry: GlyphRegistry,
}
impl GlyphEngine {
pub fn from_json_file(path: &str) -> anyhow::Result<Self> {
let glyphs = load_glyphs_from_json_file(path)?;
let registry = GlyphRegistry::from_glyphs(glyphs);
Ok(Self { registry })
}
pub fn get_glyph_by_id(&self, id: u32) -> Option<&Glyph> {
self.registry.get_by_id(id)
}
pub fn get_glyph_by_name<S: AsRef<str>>(&self, name: S) -> Option<&Glyph> {
self.registry.get_by_name(name)
}
pub fn get_by_essence<S: AsRef<str>>(&self, essence: S) -> Vec<&Glyph> {
self.registry.get_by_essence(essence)
}
pub fn get_by_trait<S: AsRef<str>>(&self, trait_field: S) -> Vec<&Glyph> {
self.registry.get_by_trait(trait_field)
}
pub fn get_by_ability<S: AsRef<str>>(&self, ability: S) -> Vec<&Glyph> {
self.registry.get_by_ability(ability)
}
// ---------- ACTIVATION / STABILIZER STUBS ----------
pub fn activate_glyph<S: AsRef<str>>(&self, id_or_name: S) {
// Resolve glyph
let key = id_or_name.as_ref();
let glyph_opt = if let Ok(id) = key.parse::<u32>() {
self.get_glyph_by_id(id)
} else {
self.get_glyph_by_name(key)
};
let glyph = match glyph_opt {
Some(g) => g,
None => {
eprintln!("ERROR — INVALID GLYPH REQUESTED: {}", key);
return;
}
};
// Here is where you implement ability logic
// For now, just log activation
println!(
"ACTIVATE: [{}] {} | Essence: {} | Trait: {} | Ability: {}",
glyph.id, glyph.name, glyph.essence, glyph.trait_field, glyph.ability
);
// TODO: route to specific handlers based on essence/trait/ability
// self.run_ability(glyph);
}
pub fn run_stabilizer<S: AsRef<str>>(&self, id_or_name: S) {
// TODO: implement frost-steel, solar-veil, mirror-weave, etc. stabilizer logic
println!("RUN STABILIZER for glyph: {}", id_or_name.as_ref());
}
pub fn run_cluster_operation<S: AsRef<str>>(
&self,
operation: S,
glyph_ids_or_names: &[String],
) {
let op = operation.as_ref();
println!("RUN CLUSTER OPERATION: {}", op);
// Resolve glyphs
let mut glyphs: Vec<&Glyph> = Vec::new();
for key in glyph_ids_or_names {
let g_opt = if let Ok(id) = key.parse::<u32>() {
self.get_glyph_by_id(id)
} else {
self.get_glyph_by_name(key)
};
if let Some(g) = g_opt {
glyphs.push(g);
} else {
eprintln!("WARNING — cluster member not found: {}", key);
}
}
// TODO: implement:
// - stabilize_cluster
// - amplify_cluster
// - conceal_cluster
// - synchronize_cluster
// - expand_cluster
println!("Cluster size: {}", glyphs.len());
}
}
// ---------- PUBLIC API HELPERS ----------
pub fn init_engine_from_json(path: &str) -> anyhow::Result<GlyphEngine> {
GlyphEngine::from_json_file(path)
}
Executable
+161
View File
@@ -0,0 +1,161 @@
use std::collections::{HashMap, HashSet};
use std::sync::{
atomic::{AtomicUsize, Ordering},
RwLock,
};
use serde::{Deserialize, Serialize};
use crate::hash::fnv1a_64;
#[derive(Clone, Serialize, Deserialize)]
pub struct GlyphCanonical {
pub id: String,
pub name: String,
pub short_code: String,
pub tier: u8,
pub epoch: u8,
}
#[derive(Clone, Serialize, Deserialize)]
pub struct GlyphSemantic {
pub core_meaning: String,
pub tags: Vec<String>,
}
#[derive(Clone, Serialize, Deserialize)]
pub struct GlyphDefinition {
pub canonical: GlyphCanonical,
pub semantic: GlyphSemantic,
}
impl GlyphDefinition {
pub fn canonical_hash(&self) -> u64 {
let input = format!(
"{}|{}|{}|{}|{}",
self.canonical.id,
self.canonical.name,
self.canonical.short_code,
self.canonical.tier as u32,
self.canonical.epoch as u32
);
fnv1a_64(&input)
}
}
#[derive(Clone, Serialize)]
pub struct GlyphStats {
pub total_loaded: usize,
pub hash_collisions: usize,
pub unique_keys: usize,
}
pub struct GlyphRegistry {
glyphs: RwLock<HashMap<String, GlyphDefinition>>,
seen_hashes: RwLock<HashSet<u64>>,
total_loaded: AtomicUsize,
hash_collisions: AtomicUsize,
}
impl GlyphRegistry {
pub fn new() -> Self {
Self {
glyphs: RwLock::new(HashMap::new()),
seen_hashes: RwLock::new(HashSet::new()),
total_loaded: AtomicUsize::new(0),
hash_collisions: AtomicUsize::new(0),
}
}
pub fn insert(&self, glyph: GlyphDefinition) {
let id = glyph.canonical.id.clone();
let hash = glyph.canonical_hash();
let mut map = self.glyphs.write().unwrap();
let mut hashes = self.seen_hashes.write().unwrap();
if !hashes.insert(hash) {
self.hash_collisions.fetch_add(1, Ordering::Relaxed);
}
map.insert(id, glyph);
self.total_loaded.fetch_add(1, Ordering::Relaxed);
}
pub fn list_ids(&self) -> Vec<String> {
self.glyphs
.read()
.unwrap()
.keys()
.cloned()
.collect()
}
pub fn get(&self, id: &str) -> Option<GlyphDefinition> {
self.glyphs.read().unwrap().get(id).cloned()
}
pub fn search(&self, query: &str) -> Vec<GlyphDefinition> {
let q = query.to_lowercase();
self.glyphs
.read()
.unwrap()
.values()
.filter(|g| {
g.canonical.name.to_lowercase().contains(&q)
|| g.canonical.id.to_lowercase().contains(&q)
|| g.semantic.core_meaning.to_lowercase().contains(&q)
})
.cloned()
.collect()
}
pub fn stats(&self) -> GlyphStats {
let map = self.glyphs.read().unwrap();
GlyphStats {
total_loaded: self.total_loaded.load(Ordering::Relaxed),
hash_collisions: self.hash_collisions.load(Ordering::Relaxed),
unique_keys: map.len(),
}
}
}
lazy_static::lazy_static! {
pub static ref GLYPH_REGISTRY: GlyphRegistry = GlyphRegistry::new();
}
pub fn sample_glyph() -> GlyphDefinition {
GlyphDefinition {
canonical: GlyphCanonical {
id: "GLYPH-TEST-0001".to_string(),
name: "Test Glyph".to_string(),
short_code: "TST".to_string(),
tier: 1,
epoch: 1,
},
semantic: GlyphSemantic {
core_meaning: "Sample glyph for backend validation".to_string(),
tags: vec!["sample".to_string(), "test".to_string()],
},
}
}
pub fn validate_glyph(g: &GlyphDefinition) -> Result<(), String> {
if g.canonical.id.trim().is_empty() {
return Err("canonical.id is required".to_string());
}
if g.canonical.name.trim().is_empty() {
return Err("canonical.name is required".to_string());
}
if g.canonical.short_code.trim().is_empty() {
return Err("canonical.short_code is required".to_string());
}
if g.semantic.core_meaning.trim().is_empty() {
return Err("semantic.core_meaning is required".to_string());
}
if g.semantic.tags.iter().any(|t| t.trim().is_empty()) {
return Err("semantic.tags must not contain empty strings".to_string());
}
Ok(())
}
+11261
View File
File diff suppressed because it is too large Load Diff
Executable
+11
View File
@@ -0,0 +1,11 @@
pub fn fnv1a_64(input: &str) -> u64 {
const OFFSET: u64 = 0xcbf29ce484222325;
const PRIME: u64 = 0x100000001b3;
let mut hash = OFFSET;
for b in input.as_bytes() {
hash ^= *b as u64;
hash = hash.wrapping_mul(PRIME);
}
hash
}
Executable
+48
View File
@@ -0,0 +1,48 @@
use std::{fs, path::Path};
use anyhow::Result;
use crate::glyph::{validate_glyph, GlyphDefinition, GLYPH_REGISTRY};
pub fn load_all_glyphs() -> Result<()> {
let glyph_dir = Path::new("glyphs");
if !glyph_dir.exists() {
println!(
"No glyphs directory found at {:?}, skipping runtime glyph load.",
glyph_dir
);
return Ok(());
}
let mut count = 0usize;
for entry in fs::read_dir(glyph_dir)? {
let entry = entry?;
let path = entry.path();
if path.extension().and_then(|s| s.to_str()) != Some("json") {
continue;
}
let file_data = fs::read_to_string(&path)?;
let glyph: GlyphDefinition = serde_json::from_str(&file_data)?;
if let Err(msg) = validate_glyph(&glyph) {
eprintln!(
"Skipping invalid glyph file {}: {}",
path.display(),
msg
);
continue;
}
GLYPH_REGISTRY.insert(glyph);
count += 1;
}
println!("Loaded {} glyph files from {:?}", count, glyph_dir);
Ok(())
}
Executable
+189
View File
@@ -0,0 +1,189 @@
use std::{collections::HashMap, fs, path::PathBuf};
use axum::{
extract::{Path, Query},
http::StatusCode,
routing::{get, post},
Json, Router,
};
use serde_json::Value;
use tokio::net::TcpListener;
use tower_http::cors::CorsLayer;
mod glyph;
mod hash;
mod loader;
mod meta;
use glyph::{sample_glyph, validate_glyph, GlyphDefinition, GlyphStats, GLYPH_REGISTRY};
use meta::{load_all_meta_glyphs, META_GLYPH_REGISTRY, project_meta_to_runtime};
async fn health_check() -> &'static str {
"GlyphOS backend is running"
}
async fn get_sample_glyph() -> Json<GlyphDefinition> {
Json(sample_glyph())
}
async fn list_glyphs() -> Json<Vec<String>> {
Json(GLYPH_REGISTRY.list_ids())
}
async fn get_glyph_by_id(Path(id): Path<String>) -> Json<Option<GlyphDefinition>> {
Json(GLYPH_REGISTRY.get(&id))
}
async fn search_glyphs(Query(params): Query<HashMap<String, String>>) -> Json<Vec<GlyphDefinition>> {
let q = params.get("q").cloned().unwrap_or_default();
Json(GLYPH_REGISTRY.search(&q))
}
async fn reload_glyphs() -> &'static str {
if let Err(e) = loader::load_all_glyphs() {
eprintln!("Failed to reload glyphs: {e}");
"Glyph reload failed"
} else {
"Glyphs reloaded"
}
}
async fn glyph_stats() -> Json<GlyphStats> {
Json(GLYPH_REGISTRY.stats())
}
async fn upload_glyph(
Json(glyph): Json<GlyphDefinition>,
) -> Result<Json<GlyphDefinition>, (StatusCode, String)> {
if let Err(msg) = validate_glyph(&glyph) {
return Err((StatusCode::BAD_REQUEST, msg));
}
let hash = format!("{:x}", glyph.canonical_hash());
let mut path = PathBuf::from("glyphs");
if !path.exists() {
if let Err(e) = fs::create_dir_all(&path) {
return Err((
StatusCode::INTERNAL_SERVER_ERROR,
format!("Failed to create glyphs directory: {e}"),
));
}
}
path.push(format!("{hash}.json"));
let json = serde_json::to_string_pretty(&glyph)
.map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))?;
if let Err(e) = fs::write(&path, json) {
return Err((
StatusCode::INTERNAL_SERVER_ERROR,
format!("Failed to write glyph file: {e}"),
));
}
GLYPH_REGISTRY.insert(glyph.clone());
println!(
"Uploaded glyph id={} hash={} file={}",
glyph.canonical.id,
hash,
path.display()
);
Ok(Json(glyph))
}
// -------- Meta-glyph handlers --------
async fn list_meta_glyphs() -> Json<Vec<String>> {
Json(META_GLYPH_REGISTRY.list_ids())
}
async fn get_meta_glyph(Path(id): Path<String>) -> Json<Option<Value>> {
Json(META_GLYPH_REGISTRY.get(&id))
}
async fn search_meta_glyphs(
Query(params): Query<HashMap<String, String>>,
) -> Json<Vec<Value>> {
let q = params.get("q").cloned().unwrap_or_default();
Json(META_GLYPH_REGISTRY.search(&q))
}
async fn project_meta_glyph(
Query(params): Query<HashMap<String, String>>,
) -> Json<Option<GlyphDefinition>> {
if let Some(id) = params.get("id") {
if let Some(meta) = META_GLYPH_REGISTRY.get(id) {
let projected = project_meta_to_runtime(&meta);
return Json(Some(projected));
}
}
Json(None)
}
#[tokio::main]
async fn main() {
// Load runtime glyphs
if let Err(e) = loader::load_all_glyphs() {
eprintln!("Failed to load glyphs at startup: {e}");
} else {
let stats = GLYPH_REGISTRY.stats();
println!(
"Loaded {} glyphs (hash collisions: {})",
stats.total_loaded, stats.hash_collisions
);
}
// Load meta-glyph archive
match load_all_meta_glyphs() {
Ok(count) => {
println!("Meta-glyph archive loaded: {} entries", count);
}
Err(e) => {
eprintln!("Failed to load meta-glyph archive: {e}");
}
}
let app = Router::new()
// health
.route("/health", get(health_check))
// runtime glyphs
.route("/glyph/sample", get(get_sample_glyph))
.route("/glyph/list", get(list_glyphs))
.route("/glyph/search", get(search_glyphs))
.route("/glyph/reload", get(reload_glyphs))
.route("/glyph/stats", get(glyph_stats))
.route("/glyph/upload", post(upload_glyph))
.route("/glyph/:id", get(get_glyph_by_id))
// meta-glyph archive
.route("/meta-glyph/list", get(list_meta_glyphs))
.route("/meta-glyph/search", get(search_meta_glyphs))
.route("/meta-glyph/project", get(project_meta_glyph))
.route("/meta-glyph/:id", get(get_meta_glyph))
.layer(CorsLayer::permissive());
let listener = TcpListener::bind("0.0.0.0:3000")
.await
.expect("Failed to bind to port 3000");
println!("GlyphOS backend running at:");
println!(" GET http://localhost:3000/health");
println!(" GET http://localhost:3000/glyph/sample");
println!(" GET http://localhost:3000/glyph/list");
println!(" GET http://localhost:3000/glyph/GLYPH-TEST-0001");
println!(" GET http://localhost:3000/glyph/search?q=test");
println!(" GET http://localhost:3000/glyph/reload");
println!(" GET http://localhost:3000/glyph/stats");
println!(" POST http://localhost:3000/glyph/upload");
println!(" GET http://localhost:3000/meta-glyph/list");
println!(" GET http://localhost:3000/meta-glyph/G001");
println!(" GET http://localhost:3000/meta-glyph/search?q=neural");
println!(" GET http://localhost:3000/meta-glyph/project?id=G001");
axum::serve(listener, app)
.await
.expect("Server failed");
}
Executable
+174
View File
@@ -0,0 +1,174 @@
use std::collections::HashMap;
use std::fs;
use std::path::Path;
use std::sync::RwLock;
use anyhow::{anyhow, Result};
use lazy_static::lazy_static;
use serde_json::Value;
use crate::glyph::{GlyphCanonical, GlyphDefinition, GlyphSemantic};
pub struct MetaGlyphRegistry {
map: RwLock<HashMap<String, Value>>,
}
impl MetaGlyphRegistry {
pub fn new() -> Self {
Self {
map: RwLock::new(HashMap::new()),
}
}
pub fn insert(&self, id: String, glyph: Value) {
self.map.write().unwrap().insert(id, glyph);
}
pub fn get(&self, id: &str) -> Option<Value> {
self.map.read().unwrap().get(id).cloned()
}
pub fn list_ids(&self) -> Vec<String> {
self.map
.read()
.unwrap()
.keys()
.cloned()
.collect()
}
pub fn search(&self, query: &str) -> Vec<Value> {
let q = query.to_lowercase();
self.map
.read()
.unwrap()
.values()
.filter(|v| {
let name = v
.get("name")
.and_then(|x| x.as_str())
.unwrap_or("")
.to_lowercase();
let category = v
.get("category")
.and_then(|x| x.as_str())
.unwrap_or("")
.to_lowercase();
name.contains(&q) || category.contains(&q)
})
.cloned()
.collect()
}
}
lazy_static! {
pub static ref META_GLYPH_REGISTRY: MetaGlyphRegistry = MetaGlyphRegistry::new();
}
/// Load meta-glyphs from the GDM-2.0 archive file
pub fn load_all_meta_glyphs() -> Result<usize> {
let path = Path::new("glyph-complete-600.json");
if !path.exists() {
println!(
"No meta-glyph file found at {:?}, skipping meta-glyph load.",
path
);
return Ok(0);
}
let data = fs::read_to_string(path)?;
let root: Value = serde_json::from_str(&data)?;
// Your file structure:
// {
// "version": "2.0",
// "glyphs": [ ...600 glyphs... ]
// }
let arr = root
.get("glyphs")
.and_then(|v| v.as_array())
.ok_or_else(|| anyhow!("Expected `glyphs` array in meta-glyph file"))?;
let mut count = 0usize;
for item in arr {
if let Some(id) = item.get("id").and_then(|v| v.as_str()) {
META_GLYPH_REGISTRY.insert(id.to_string(), item.clone());
count += 1;
}
}
println!(
"Loaded {} meta-glyphs from {:?}",
count,
path
);
Ok(count)
}
/// Convert a full meta-glyph into a lightweight runtime glyph
pub fn project_meta_to_runtime(meta: &Value) -> GlyphDefinition {
let id = meta
.get("id")
.and_then(|v| v.as_str())
.unwrap_or("UNKNOWN")
.to_string();
let name = meta
.get("name")
.and_then(|v| v.as_str())
.unwrap_or(&id)
.to_string();
let category = meta
.get("category")
.and_then(|v| v.as_str())
.unwrap_or("meta");
let band = meta
.get("band")
.and_then(|v| v.as_i64())
.unwrap_or(0);
let period = meta
.get("period")
.and_then(|v| v.as_i64())
.unwrap_or(0);
let mut short_code: String = name
.chars()
.filter(|c| c.is_ascii_alphabetic())
.take(3)
.collect();
if short_code.is_empty() {
short_code = id.chars().take(3).collect();
}
short_code = short_code.to_uppercase();
let core_meaning = format!(
"{} glyph (band {}, period {}) projected from meta-glyph archive",
category, band, period
);
let tags = vec![
category.to_string(),
format!("band-{}", band),
format!("period-{}", period),
];
GlyphDefinition {
canonical: GlyphCanonical {
id,
name,
short_code,
tier: 1,
epoch: 1,
},
semantic: GlyphSemantic {
core_meaning,
tags,
},
}
}