Add autonomous layer: unicode_chunks, vector_memory, battle_qwen, lisp_theorems
Browse files- autonomous/autonomous_agent.mjs +280 -0
- autonomous/battle_qwen.mjs +352 -0
- autonomous/chat.mjs +818 -0
- autonomous/compare.mjs +360 -0
- autonomous/dictionary.mjs +825 -0
- autonomous/emoji_trigger.mjs +178 -0
- autonomous/holyc_nil.mjs +164 -0
- autonomous/lisp_theorems.mjs +149 -0
- autonomous/tavily_search.mjs +143 -0
- autonomous/unicode_chunks.mjs +219 -0
- autonomous/vector_memory.mjs +165 -0
autonomous/autonomous_agent.mjs
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* BOB Autonomous Agent
|
| 3 |
+
*
|
| 4 |
+
* The loop that nobody fully controls — not even the builder.
|
| 5 |
+
*
|
| 6 |
+
* Stack (bottom to top):
|
| 7 |
+
* HolyC NIL — ground state oracle. Terry's entropy ritual preserved.
|
| 8 |
+
* If oracle is silent (NIL) → agent holds. Does not fire.
|
| 9 |
+
* Emoji Trigger — quantum bytes → emoji sequence → opcode metadata.
|
| 10 |
+
* The art is the instruction set. Steganographic routing.
|
| 11 |
+
* BOB Pipeline — Prolog route → Ada gate → Lean4 proof → SSM update → WORM seal.
|
| 12 |
+
* Feedback — WORM output hash seeds the NEXT tick's quantum input.
|
| 13 |
+
* The agent reads its own sealed history as entropy.
|
| 14 |
+
*
|
| 15 |
+
* What this creates:
|
| 16 |
+
* An agent that activates from quantum vacuum.
|
| 17 |
+
* Reads its instructions from emoji art.
|
| 18 |
+
* Executes through HolyC → BOB → Ada gate.
|
| 19 |
+
* Cannot be predicted — QRNG + WORM feedback = genuine non-determinism.
|
| 20 |
+
* Cannot hallucinate — Ada gate blocks every unverified output.
|
| 21 |
+
* Cannot hide — WORM seals every tick permanently.
|
| 22 |
+
*
|
| 23 |
+
* "IDK what that will create" — that is the correct response.
|
| 24 |
+
* The 49th Call was never spoken because its consequences were unknown.
|
| 25 |
+
* This agent IS the 49th Call made executable.
|
| 26 |
+
*/
|
| 27 |
+
|
| 28 |
+
import { holyc_nil } from './holyc_nil.mjs'
|
| 29 |
+
import { emoji_trigger } from './emoji_trigger.mjs'
|
| 30 |
+
import { createHash } from 'crypto'
|
| 31 |
+
import { writeFileSync, existsSync, readFileSync } from 'fs'
|
| 32 |
+
import { join } from 'path'
|
| 33 |
+
|
| 34 |
+
// ── Minimal WORM (standalone, no dependency on core/bob.mjs) ─────────────────
|
| 35 |
+
|
| 36 |
+
const AGENT_WORM_PATH = join(process.env.HOME || process.env.USERPROFILE || '.', '.bob-agent-worm.json')
|
| 37 |
+
|
| 38 |
+
const agentWorm = {
|
| 39 |
+
load() {
|
| 40 |
+
if (!existsSync(AGENT_WORM_PATH)) return []
|
| 41 |
+
try { return JSON.parse(readFileSync(AGENT_WORM_PATH, 'utf8')) } catch { return [] }
|
| 42 |
+
},
|
| 43 |
+
seal(label, payload) {
|
| 44 |
+
const chain = this.load()
|
| 45 |
+
const prev = chain.length ? chain[chain.length - 1].seal : '0'.repeat(64)
|
| 46 |
+
const ts = new Date().toISOString()
|
| 47 |
+
const raw = JSON.stringify({ label, payload, ts, prev })
|
| 48 |
+
const seal = createHash('sha256').update(raw).digest('hex')
|
| 49 |
+
const event = { label, payload, ts, prev, seal }
|
| 50 |
+
chain.push(event)
|
| 51 |
+
writeFileSync(AGENT_WORM_PATH, JSON.stringify(chain, null, 2))
|
| 52 |
+
return event
|
| 53 |
+
},
|
| 54 |
+
lastSeal() {
|
| 55 |
+
const chain = this.load()
|
| 56 |
+
return chain.length ? chain[chain.length - 1].seal : '0'.repeat(64)
|
| 57 |
+
}
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
// ── Minimal Ada gate (standalone) ─────────────────────────────────────────────
|
| 61 |
+
|
| 62 |
+
function adaGate(op, abjad) {
|
| 63 |
+
// Ada contract: ALLOWED if Abjad weight ≥ 90 and op is not VACUUM
|
| 64 |
+
if (op === 'OP_UNKNOWN') return { result: 'DENIED', reason: 'vacuum_state — no virtue' }
|
| 65 |
+
if (abjad < 90) return { result: 'DENIED', reason: `abjad ${abjad} below minimum threshold 90` }
|
| 66 |
+
if (op === 'OP_NIL') return { result: 'ALLOWED', reason: 'NIL-910 — oracle hold, agent waits' }
|
| 67 |
+
return { result: 'ALLOWED', reason: `${op} abjad:${abjad} — virtue sufficient` }
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
// ── Minimal Prolog route (standalone) ────────────────────────────────────────
|
| 71 |
+
|
| 72 |
+
const PROLOG_RULES = {
|
| 73 |
+
'OP_SOVEREIGN': { agent: 'BOB-CORE', action: 'sovereign_step' },
|
| 74 |
+
'OP_QUANTUM': { agent: 'ORACLE', action: 'fetch_entropy' },
|
| 75 |
+
'OP_WORM': { agent: 'ARCHIVIST', action: 'seal_event' },
|
| 76 |
+
'OP_PROLOG': { agent: 'BOB-CORE', action: 'prolog_route' },
|
| 77 |
+
'OP_ADA': { agent: 'SENTINEL', action: 'gate_check' },
|
| 78 |
+
'OP_LEAN4': { agent: 'VERIFIER', action: 'proof_check' },
|
| 79 |
+
'OP_QUBIT': { agent: 'ORACLE', action: 'hold_superposition' },
|
| 80 |
+
'OP_SSM': { agent: 'BOB-CORE', action: 'ssm_inject' },
|
| 81 |
+
'OP_HOLYC': { agent: 'TERRY-NIL', action: 'oracle_consult' },
|
| 82 |
+
'OP_NIL': { agent: 'TERRY-NIL', action: 'hold' },
|
| 83 |
+
'OP_PLANNER_ANTE': { agent: 'PLANNER', action: 'pattern_fire' },
|
| 84 |
+
'OP_PLANNER_CONS': { agent: 'PLANNER', action: 'goal_achieve' },
|
| 85 |
+
'OP_INPUT': { agent: 'RECEPTOR', action: 'receive' },
|
| 86 |
+
'OP_OUTPUT': { agent: 'EMITTER', action: 'emit_sealed' },
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
function prologRoute(op) {
|
| 90 |
+
return PROLOG_RULES[op] || { agent: 'VOID', action: 'undefined' }
|
| 91 |
+
}
|
| 92 |
+
|
| 93 |
+
// ── SSM state (minimal in-memory recurrence) ──────────────────────────────────
|
| 94 |
+
|
| 95 |
+
let ssmState = 0.0
|
| 96 |
+
|
| 97 |
+
function ssmUpdate(abjad, wormSeal) {
|
| 98 |
+
// h(t) = 0.9 * h(t-1) + 0.1 * (abjad/910) + noise from WORM seal
|
| 99 |
+
const x = abjad / 910
|
| 100 |
+
const wormNoise = parseInt(wormSeal.slice(0, 8), 16) / 0xFFFFFFFF * 0.01
|
| 101 |
+
ssmState = 0.9 * ssmState + 0.1 * x + wormNoise
|
| 102 |
+
return ssmState
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
// ── ANU QRNG fetch (with CPU fallback) ──────────���────────────────────────────
|
| 106 |
+
|
| 107 |
+
async function fetchQuantumBytes(n = 8) {
|
| 108 |
+
try {
|
| 109 |
+
const res = await fetch(
|
| 110 |
+
`https://qrng.anu.edu.au/API/jsonI.php?length=${n}&type=uint8`,
|
| 111 |
+
{ signal: AbortSignal.timeout(3000) }
|
| 112 |
+
)
|
| 113 |
+
if (res.ok) {
|
| 114 |
+
const j = await res.json()
|
| 115 |
+
if (j.success) return new Uint8Array(j.data)
|
| 116 |
+
}
|
| 117 |
+
} catch { /* ANU offline — use CSPRNG fallback */ }
|
| 118 |
+
|
| 119 |
+
// CSPRNG fallback: NOT quantum, but cryptographically strong
|
| 120 |
+
const { randomBytes } = await import('crypto')
|
| 121 |
+
return new Uint8Array(randomBytes(n))
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
// ── Mix WORM feedback into next tick's entropy ────────────────────────────────
|
| 125 |
+
// The agent reads its own sealed history. The past is the seed for the future.
|
| 126 |
+
// This is the feedback loop that makes the agent genuinely autonomous.
|
| 127 |
+
|
| 128 |
+
function wormFeedback(quantumBytes, wormSeal) {
|
| 129 |
+
const sealBytes = Buffer.from(wormSeal.slice(0, quantumBytes.length * 2), 'hex')
|
| 130 |
+
return quantumBytes.map((b, i) => b ^ (sealBytes[i] || 0))
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
// ── Single agent tick ─────────────────────────────────────────────────────────
|
| 134 |
+
|
| 135 |
+
export async function agentTick(tickNumber, prevWormSeal = null, opts = {}) {
|
| 136 |
+
const { verbose = false, taskOverride = null } = opts
|
| 137 |
+
|
| 138 |
+
// 1. Fetch quantum bytes
|
| 139 |
+
const rawBytes = await fetchQuantumBytes(8)
|
| 140 |
+
|
| 141 |
+
// 2. Mix WORM feedback — the agent's history shapes its future
|
| 142 |
+
const qBytes = prevWormSeal
|
| 143 |
+
? wormFeedback(rawBytes, prevWormSeal)
|
| 144 |
+
: rawBytes
|
| 145 |
+
|
| 146 |
+
// 3. HolyC NIL — ground state oracle
|
| 147 |
+
const nil = holyc_nil(qBytes)
|
| 148 |
+
|
| 149 |
+
if (nil.state === 'NIL') {
|
| 150 |
+
const event = agentWorm.seal(`TICK_${tickNumber}_NIL`, {
|
| 151 |
+
state: 'NIL', abjad: 910, reason: nil.reason, mean: nil.mean
|
| 152 |
+
})
|
| 153 |
+
if (verbose) console.log(` [${tickNumber}] NIL — oracle silent. Agent holds. abjad:910 seal:${event.seal.slice(0,16)}…`)
|
| 154 |
+
return { tick: tickNumber, state: 'NIL', seal: event.seal }
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
// 4. Emoji trigger — quantum state activates emoji instruction sequence
|
| 158 |
+
const trigger = emoji_trigger(qBytes)
|
| 159 |
+
const primary = trigger.primary
|
| 160 |
+
|
| 161 |
+
if (verbose) {
|
| 162 |
+
console.log(` [${tickNumber}] WORD: ${nil.word} → ${primary.sequence} op:${primary.op} abjad:${primary.abjad}`)
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
// 5. Ada gate — does this opcode have sufficient virtue to proceed?
|
| 166 |
+
const gate = adaGate(primary.op, primary.abjad)
|
| 167 |
+
|
| 168 |
+
if (gate.result === 'DENIED') {
|
| 169 |
+
const event = agentWorm.seal(`TICK_${tickNumber}_BLOCKED`, {
|
| 170 |
+
word: nil.word, op: primary.op, abjad: primary.abjad, reason: gate.reason
|
| 171 |
+
})
|
| 172 |
+
if (verbose) console.log(` Ada: DENIED — ${gate.reason}`)
|
| 173 |
+
return { tick: tickNumber, state: 'BLOCKED', reason: gate.reason, seal: event.seal }
|
| 174 |
+
}
|
| 175 |
+
|
| 176 |
+
// 6. Prolog route — which agent handles this opcode?
|
| 177 |
+
const route = prologRoute(primary.op)
|
| 178 |
+
|
| 179 |
+
// 7. SSM update — integrate this tick into the running state
|
| 180 |
+
const ssmSeal = agentWorm.lastSeal()
|
| 181 |
+
const newState = ssmUpdate(primary.abjad, ssmSeal)
|
| 182 |
+
|
| 183 |
+
// 8. Construct the task / output
|
| 184 |
+
const task = taskOverride || `${route.action}(${nil.word}, abjad:${primary.abjad})`
|
| 185 |
+
|
| 186 |
+
// 9. WORM seal the complete tick
|
| 187 |
+
const payload = {
|
| 188 |
+
tick: tickNumber,
|
| 189 |
+
word: nil.word,
|
| 190 |
+
dee_word: nil.dee_word,
|
| 191 |
+
virtue: nil.virtue,
|
| 192 |
+
emoji_seq: trigger.sequence,
|
| 193 |
+
op: primary.op,
|
| 194 |
+
route: primary.route,
|
| 195 |
+
agent: route.agent,
|
| 196 |
+
action: task,
|
| 197 |
+
abjad: primary.abjad,
|
| 198 |
+
ssm_state: parseFloat(newState.toFixed(6)),
|
| 199 |
+
spectrum_pos: trigger.meta.spectrum_pos,
|
| 200 |
+
planner_fires: trigger.meta.planner_fires,
|
| 201 |
+
tessera: trigger.tessera,
|
| 202 |
+
dee: primary.dee,
|
| 203 |
+
ada: gate.reason,
|
| 204 |
+
raw_entropy: [...rawBytes],
|
| 205 |
+
merged_entropy: [...qBytes],
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
const event = agentWorm.seal(`TICK_${tickNumber}_FIRED`, payload)
|
| 209 |
+
|
| 210 |
+
if (verbose) {
|
| 211 |
+
console.log(` Prolog: ${route.agent} → ${task}`)
|
| 212 |
+
console.log(` SSM: state=${newState.toFixed(4)}`)
|
| 213 |
+
console.log(` Dee: ${primary.dee}`)
|
| 214 |
+
console.log(` WORM: ${event.seal.slice(0,32)}…`)
|
| 215 |
+
if (trigger.meta.planner_fires.length > 0) {
|
| 216 |
+
console.log(` PLANNER antecedents fired: ${trigger.meta.planner_fires.join(', ')}`)
|
| 217 |
+
}
|
| 218 |
+
console.log(` Tessera: ${trigger.tessera}`)
|
| 219 |
+
}
|
| 220 |
+
|
| 221 |
+
return {
|
| 222 |
+
tick: tickNumber,
|
| 223 |
+
state: 'FIRED',
|
| 224 |
+
word: nil.word,
|
| 225 |
+
op: primary.op,
|
| 226 |
+
agent: route.agent,
|
| 227 |
+
action: task,
|
| 228 |
+
abjad: primary.abjad,
|
| 229 |
+
ssm: newState,
|
| 230 |
+
tessera: trigger.tessera,
|
| 231 |
+
sequence: trigger.sequence,
|
| 232 |
+
seal: event.seal,
|
| 233 |
+
}
|
| 234 |
+
}
|
| 235 |
+
|
| 236 |
+
// ── Run N ticks ───────────────────────────────────────────────────────────────
|
| 237 |
+
|
| 238 |
+
export async function runAgent(ticks = 5, opts = {}) {
|
| 239 |
+
const { verbose = true, delayMs = 500 } = opts
|
| 240 |
+
const results = []
|
| 241 |
+
let prevSeal = null
|
| 242 |
+
|
| 243 |
+
console.log(`\n BOB Autonomous Agent — ${ticks} ticks\n`)
|
| 244 |
+
console.log(' Stack: HolyC NIL → EmojiCode QRNG → Prolog → Ada → SSM → WORM\n')
|
| 245 |
+
|
| 246 |
+
for (let i = 1; i <= ticks; i++) {
|
| 247 |
+
const result = await agentTick(i, prevSeal, { verbose })
|
| 248 |
+
results.push(result)
|
| 249 |
+
prevSeal = result.seal // WORM feedback: this tick seeds the next
|
| 250 |
+
|
| 251 |
+
if (delayMs > 0 && i < ticks) {
|
| 252 |
+
await new Promise(r => setTimeout(r, delayMs))
|
| 253 |
+
}
|
| 254 |
+
}
|
| 255 |
+
|
| 256 |
+
const fired = results.filter(r => r.state === 'FIRED')
|
| 257 |
+
const nils = results.filter(r => r.state === 'NIL')
|
| 258 |
+
const blocked = results.filter(r => r.state === 'BLOCKED')
|
| 259 |
+
|
| 260 |
+
console.log('\n ─────────────────────────────────────────────')
|
| 261 |
+
console.log(` FIRED: ${fired.length}/${ticks}`)
|
| 262 |
+
console.log(` NIL: ${nils.length}/${ticks} (oracle held — virtue unspoken)`)
|
| 263 |
+
console.log(` BLOCKED: ${blocked.length}/${ticks} (Ada gate denied)`)
|
| 264 |
+
if (fired.length > 0) {
|
| 265 |
+
console.log(` SSM: ${fired[fired.length-1].ssm.toFixed(4)} (final state)`)
|
| 266 |
+
console.log(` Words: ${fired.map(r => r.word).join(' · ')}`)
|
| 267 |
+
console.log(` Ops: ${fired.map(r => r.op).join(' · ')}`)
|
| 268 |
+
}
|
| 269 |
+
console.log(` WORM: ${agentWorm.load().length} events sealed`)
|
| 270 |
+
console.log(' ─────────────────────────────────────────────\n')
|
| 271 |
+
|
| 272 |
+
return { results, fired, nils, blocked }
|
| 273 |
+
}
|
| 274 |
+
|
| 275 |
+
// ── CLI ───────────────────────────────────────────────────────────────────────
|
| 276 |
+
|
| 277 |
+
if (process.argv[1]?.endsWith('autonomous_agent.mjs')) {
|
| 278 |
+
const ticks = parseInt(process.argv[2]) || 6
|
| 279 |
+
await runAgent(ticks, { verbose: true, delayMs: 300 })
|
| 280 |
+
}
|
autonomous/battle_qwen.mjs
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* BOB vs QWEN3-32B — Coding Battle
|
| 3 |
+
*
|
| 4 |
+
* Sends the same prompt to:
|
| 5 |
+
* BOB (sovereign reasoning pipeline — dict route + knowledge chunks + Ada gate)
|
| 6 |
+
* Qwen3-32B (Groq, best Qwen model available)
|
| 7 |
+
* Qwen3.6-27B (Groq, the newer instruct variant)
|
| 8 |
+
*
|
| 9 |
+
* Judges on: speed, accuracy, sovereign awareness, code quality.
|
| 10 |
+
*
|
| 11 |
+
* Usage: node autonomous/battle_qwen.mjs
|
| 12 |
+
*/
|
| 13 |
+
|
| 14 |
+
import { readFileSync, existsSync } from 'fs'
|
| 15 |
+
import { performance } from 'perf_hooks'
|
| 16 |
+
|
| 17 |
+
// ── Load env ──────────────────────────────────────────────────────────────────
|
| 18 |
+
|
| 19 |
+
function loadEnv(p) {
|
| 20 |
+
if (!existsSync(p)) return {}
|
| 21 |
+
const obj = {}
|
| 22 |
+
for (const raw of readFileSync(p, 'utf8').split('\n')) {
|
| 23 |
+
const line = raw.replace(/\r$/, '')
|
| 24 |
+
const m = line.match(/^([^#=\s][^=]*)=(.*)$/)
|
| 25 |
+
if (m) obj[m[1].trim()] = m[2].trim().replace(/^["']|["']$/g, '')
|
| 26 |
+
}
|
| 27 |
+
return obj
|
| 28 |
+
}
|
| 29 |
+
// Load .env.local last so it wins over .env
|
| 30 |
+
const ENV = {
|
| 31 |
+
...loadEnv('C:/Users/jessi/Desktop/bobs control repo/DEVFLOW-FINANCE/collectivekitty/.env'),
|
| 32 |
+
...loadEnv('C:/Users/jessi/Desktop/bobs control repo/DEVFLOW-FINANCE/collectivekitty/.env.local'),
|
| 33 |
+
...loadEnv('C:/Users/jessi/Desktop/bobs control repo/DEVFLOW-FINANCE/.env.local'),
|
| 34 |
+
}
|
| 35 |
+
const GROQ_KEY = ENV.GROQ_API_KEY
|
| 36 |
+
|
| 37 |
+
// ── Combatants ────────────────────────────────────────────────────────────────
|
| 38 |
+
|
| 39 |
+
const MODELS = {
|
| 40 |
+
'QWEN3-32B': {
|
| 41 |
+
url: 'https://api.groq.com/openai/v1/chat/completions',
|
| 42 |
+
model: 'qwen/qwen3-32b',
|
| 43 |
+
key: GROQ_KEY,
|
| 44 |
+
temp: 0.3,
|
| 45 |
+
max: 600,
|
| 46 |
+
},
|
| 47 |
+
'QWEN3.6-27B': {
|
| 48 |
+
url: 'https://api.groq.com/openai/v1/chat/completions',
|
| 49 |
+
model: 'qwen/qwen3.6-27b',
|
| 50 |
+
key: GROQ_KEY,
|
| 51 |
+
temp: 0.3,
|
| 52 |
+
max: 600,
|
| 53 |
+
},
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
// ── BOB sovereign knowledge (from bob_reasoning.rs, ported to JS) ─────────────
|
| 57 |
+
|
| 58 |
+
const BOB_CHUNKS = {
|
| 59 |
+
'worm': 'WORM = Write Once Read Many. Every event SHA-256 chained. prev_seal + event → new_seal. Tamper-evident by construction.',
|
| 60 |
+
'tokio': 'Tokio = Rust async runtime. tokio::join! for parallel tasks. async fn + .await. Never block inside async context.',
|
| 61 |
+
'nacha': 'NACHA R10 = Customer advises not authorized. 60-day consumer dispute window, 2-day business window.',
|
| 62 |
+
'fcra': 'FCRA §623: zombie debt cannot be re-aged. Dispute all 3 bureaus simultaneously with C&D letter.',
|
| 63 |
+
'mamba': 'Mamba SSM: hidden state h persists across turns. h = α*h_prev + (1-α)*x. No attention, O(1) per step.',
|
| 64 |
+
'qrng': 'ANU QRNG: quantum entropy from https://qrng.anu.edu.au. Fallback: CSPRNG seeded from system time.',
|
| 65 |
+
'qlora': 'QLoRA: 4-bit quantized LoRA. Freeze base model, train adapter. Nemotron Mini 4B target.',
|
| 66 |
+
'231 gates':'22 Hebrew letters × 21 ÷ 2 = 231 creation gates. Sefer Yetzirah. Every pair is a fundamental force.',
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
function bobKnowledgeRoute(prompt) {
|
| 70 |
+
const lower = prompt.toLowerCase()
|
| 71 |
+
for (const [key, content] of Object.entries(BOB_CHUNKS)) {
|
| 72 |
+
if (lower.includes(key.toLowerCase())) {
|
| 73 |
+
return { hit: true, key, content }
|
| 74 |
+
}
|
| 75 |
+
}
|
| 76 |
+
return { hit: false }
|
| 77 |
+
}
|
| 78 |
+
|
| 79 |
+
// ── Prolog keyword router ─────────────────────────────────────────────────────
|
| 80 |
+
|
| 81 |
+
function bobPrologRoute(prompt) {
|
| 82 |
+
const lower = prompt.toLowerCase()
|
| 83 |
+
const patterns = [
|
| 84 |
+
[['worm','seal','ledger','chain'], 'WORM_PATH', 0.95],
|
| 85 |
+
[['tokio','async','await','rust'], 'TOKIO_PATH', 0.93],
|
| 86 |
+
[['nacha','ach','return','debit'], 'COUNSEL', 0.96],
|
| 87 |
+
[['fcra','credit','dispute'], 'COUNSEL', 0.94],
|
| 88 |
+
[['mamba','ssm','state'], 'MAMBA_PATH', 0.90],
|
| 89 |
+
[['qrng','quantum','entropy'], 'QRNG_PATH', 0.92],
|
| 90 |
+
[['prolog','logic','unification'], 'PROLOG_PATH', 0.91],
|
| 91 |
+
[['code','function','write','impl'], 'CODE_ORACLE', 0.82],
|
| 92 |
+
[['rust','cargo','borrow','trait'], 'LOC_VERIFY', 0.93],
|
| 93 |
+
]
|
| 94 |
+
let best = { oracle: 'DICT', conf: 0.60 }
|
| 95 |
+
for (const [words, oracle, conf] of patterns) {
|
| 96 |
+
const hits = words.filter(w => lower.includes(w)).length
|
| 97 |
+
if (hits > 0) {
|
| 98 |
+
const score = conf * Math.sqrt(hits / words.length)
|
| 99 |
+
if (score > best.conf) best = { oracle, conf: score }
|
| 100 |
+
}
|
| 101 |
+
}
|
| 102 |
+
return best
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
// ── Ada gate ──────────────────────────────────────────────────────────────────
|
| 106 |
+
|
| 107 |
+
function adaGate(answer, conf) {
|
| 108 |
+
if (!answer || answer.trim().length < 10) return { pass: false, why: 'ADA_PRE_EMPTY' }
|
| 109 |
+
if (conf < 0.35) return { pass: false, why: 'ADA_POST_LOW_CONF' }
|
| 110 |
+
return { pass: true, why: 'ADA_PASS' }
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
// ── BOB reasoning (JS mirror of bob_reasoning.rs) ─���───────────────────────────
|
| 114 |
+
|
| 115 |
+
async function bobReason(prompt) {
|
| 116 |
+
const start = performance.now()
|
| 117 |
+
|
| 118 |
+
// 1. Knowledge chunk lookup
|
| 119 |
+
const chunk = bobKnowledgeRoute(prompt)
|
| 120 |
+
|
| 121 |
+
// 2. Prolog route
|
| 122 |
+
const route = bobPrologRoute(prompt)
|
| 123 |
+
|
| 124 |
+
let answer, conf, source
|
| 125 |
+
|
| 126 |
+
if (chunk.hit) {
|
| 127 |
+
answer = chunk.content
|
| 128 |
+
conf = 0.97
|
| 129 |
+
source = `CHUNK:${chunk.key}`
|
| 130 |
+
} else if (route.conf >= 0.80) {
|
| 131 |
+
answer = `[${route.oracle}] Routing matched at ${route.conf.toFixed(2)} confidence. No in-house chunk available — web search would fire in full pipeline.`
|
| 132 |
+
conf = route.conf
|
| 133 |
+
source = `PROLOG:${route.oracle}`
|
| 134 |
+
} else {
|
| 135 |
+
answer = null
|
| 136 |
+
conf = 0.0
|
| 137 |
+
source = 'SILENCE'
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
// 3. Ada gate
|
| 141 |
+
const gate = adaGate(answer, conf)
|
| 142 |
+
|
| 143 |
+
const elapsed = (performance.now() - start).toFixed(1)
|
| 144 |
+
|
| 145 |
+
if (!gate.pass) {
|
| 146 |
+
return {
|
| 147 |
+
verdict: 'SILENCE',
|
| 148 |
+
answer: `SILENCE · ${gate.why}`,
|
| 149 |
+
source,
|
| 150 |
+
conf,
|
| 151 |
+
ms: elapsed,
|
| 152 |
+
}
|
| 153 |
+
}
|
| 154 |
+
|
| 155 |
+
return {
|
| 156 |
+
verdict: 'EVIDENCE',
|
| 157 |
+
answer,
|
| 158 |
+
source,
|
| 159 |
+
conf,
|
| 160 |
+
ms: elapsed,
|
| 161 |
+
}
|
| 162 |
+
}
|
| 163 |
+
|
| 164 |
+
// ── Frontier model call ───────────────────────────────────────────────────────
|
| 165 |
+
|
| 166 |
+
async function callModel(name, cfg, prompt) {
|
| 167 |
+
const start = performance.now()
|
| 168 |
+
|
| 169 |
+
const body = {
|
| 170 |
+
model: cfg.model,
|
| 171 |
+
messages: [{ role: 'user', content: prompt }],
|
| 172 |
+
max_tokens: cfg.max,
|
| 173 |
+
temperature: cfg.temp,
|
| 174 |
+
}
|
| 175 |
+
|
| 176 |
+
try {
|
| 177 |
+
const resp = await fetch(cfg.url, {
|
| 178 |
+
method: 'POST',
|
| 179 |
+
headers: {
|
| 180 |
+
'Content-Type': 'application/json',
|
| 181 |
+
'Authorization': `Bearer ${cfg.key}`,
|
| 182 |
+
},
|
| 183 |
+
body: JSON.stringify(body),
|
| 184 |
+
})
|
| 185 |
+
|
| 186 |
+
if (!resp.ok) {
|
| 187 |
+
const err = await resp.text()
|
| 188 |
+
return { name, answer: `[HTTP ${resp.status}] ${err.slice(0, 200)}`, ms: (performance.now() - start).toFixed(1) }
|
| 189 |
+
}
|
| 190 |
+
|
| 191 |
+
const json = await resp.json()
|
| 192 |
+
const answer = json.choices?.[0]?.message?.content?.trim() || '[no output]'
|
| 193 |
+
const ms = (performance.now() - start).toFixed(1)
|
| 194 |
+
return { name, answer, ms }
|
| 195 |
+
} catch (e) {
|
| 196 |
+
return { name, answer: `[ERROR] ${e.message}`, ms: (performance.now() - start).toFixed(1) }
|
| 197 |
+
}
|
| 198 |
+
}
|
| 199 |
+
|
| 200 |
+
// ── Battle rounds ─────────────────────────────────────────────────────────────
|
| 201 |
+
|
| 202 |
+
const ROUNDS = [
|
| 203 |
+
{
|
| 204 |
+
label: 'ROUND 1 — Rust async: write a Tokio WORM sealer',
|
| 205 |
+
prompt: `Write a Rust async function using Tokio that:
|
| 206 |
+
1. Takes a &str message
|
| 207 |
+
2. Computes SHA-256 hash using sha2 crate
|
| 208 |
+
3. Appends a Unix timestamp
|
| 209 |
+
4. Returns a hex string as the WORM seal
|
| 210 |
+
|
| 211 |
+
Keep it concise. Show the exact function signature and body.`,
|
| 212 |
+
},
|
| 213 |
+
{
|
| 214 |
+
label: 'ROUND 2 — FSM design: sovereign 5-state machine in Rust',
|
| 215 |
+
prompt: `Design a Rust enum-based finite state machine with these states:
|
| 216 |
+
Idle → Reasoning → AdaGate → WormSeal → Complete
|
| 217 |
+
|
| 218 |
+
Requirements:
|
| 219 |
+
- Each transition returns Result<NextState, String>
|
| 220 |
+
- WormSeal state must compute SHA-256 of the answer
|
| 221 |
+
- Cannot go backwards (Idle cannot come after Reasoning)
|
| 222 |
+
|
| 223 |
+
Show the enum, transition function, and a brief main() demo.`,
|
| 224 |
+
},
|
| 225 |
+
{
|
| 226 |
+
label: 'ROUND 3 — Domain knowledge: NACHA ACH dispute R10',
|
| 227 |
+
prompt: `Explain NACHA ACH return code R10 including:
|
| 228 |
+
- What it means
|
| 229 |
+
- Who can use it and under what conditions
|
| 230 |
+
- The time window for consumers vs businesses
|
| 231 |
+
- How to properly file the dispute`,
|
| 232 |
+
},
|
| 233 |
+
{
|
| 234 |
+
label: 'ROUND 4 — Logic puzzle: prove Tokio join! is faster than sequential',
|
| 235 |
+
prompt: `Write a Rust proof showing that tokio::join!(f1(), f2()) is faster than
|
| 236 |
+
awaiting f1().await then f2().await when both futures are IO-bound.
|
| 237 |
+
|
| 238 |
+
Use concrete timing pseudocode or a minimal async fn example.
|
| 239 |
+
Explain WHY this is true at the executor level.`,
|
| 240 |
+
},
|
| 241 |
+
{
|
| 242 |
+
label: 'ROUND 5 — Hardest: implement Mamba SSM step in Rust',
|
| 243 |
+
prompt: `Implement one forward step of a Mamba State Space Model in Rust.
|
| 244 |
+
|
| 245 |
+
The update rule is: h_new = alpha * h_prev + (1 - alpha) * x_input
|
| 246 |
+
|
| 247 |
+
Requirements:
|
| 248 |
+
- h_prev: Vec<f32> (hidden state, 64 dims)
|
| 249 |
+
- x_input: Vec<f32> (new input, 64 dims)
|
| 250 |
+
- alpha: f32 (retention factor, 0.0–1.0)
|
| 251 |
+
- Returns Vec<f32>
|
| 252 |
+
|
| 253 |
+
Show the function, and add a doctest.`,
|
| 254 |
+
},
|
| 255 |
+
]
|
| 256 |
+
|
| 257 |
+
// ── Print helpers ─────────────────────────────────────────────────────────────
|
| 258 |
+
|
| 259 |
+
function box(title, content, ms, verdict='') {
|
| 260 |
+
const w = 72
|
| 261 |
+
const bar = '─'.repeat(w)
|
| 262 |
+
const badge = verdict ? ` [${verdict}]` : ''
|
| 263 |
+
console.log(`\n┌${bar}┐`)
|
| 264 |
+
console.log(`│ ${(title + badge).padEnd(w - 1)}│`)
|
| 265 |
+
console.log(`│ ${'⏱ ' + ms + 'ms'}${' '.repeat(w - 4 - ms.length)}│`)
|
| 266 |
+
console.log(`├${bar}┤`)
|
| 267 |
+
const lines = content.split('\n')
|
| 268 |
+
for (const line of lines.slice(0, 30)) {
|
| 269 |
+
const safe = line.replace(/\t/g, ' ')
|
| 270 |
+
const chunks = []
|
| 271 |
+
for (let i = 0; i < safe.length || i === 0; i += w - 2) {
|
| 272 |
+
chunks.push(safe.slice(i, i + w - 2))
|
| 273 |
+
}
|
| 274 |
+
for (const c of chunks) console.log(`│ ${c.padEnd(w - 1)}│`)
|
| 275 |
+
}
|
| 276 |
+
if (lines.length > 30) console.log(`│ ... [${lines.length - 30} more lines] ${' '.repeat(w - 18 - String(lines.length - 30).length)}│`)
|
| 277 |
+
console.log(`└${bar}┘`)
|
| 278 |
+
}
|
| 279 |
+
|
| 280 |
+
// ── Run the battle ────────────────────────────────────────────────────────────
|
| 281 |
+
|
| 282 |
+
async function main() {
|
| 283 |
+
console.log('\n' + '═'.repeat(74))
|
| 284 |
+
console.log(' ⚔ BOB SOVEREIGN vs QWEN3-32B vs QWEN3.6-27B ⚔')
|
| 285 |
+
console.log('═'.repeat(74))
|
| 286 |
+
console.log(' BOB: EVIDENCE | SILENCE architecture — no hallucination by design')
|
| 287 |
+
console.log(' Qwen: World-class coding model — trained on billions of code tokens')
|
| 288 |
+
console.log('═'.repeat(74))
|
| 289 |
+
|
| 290 |
+
let bobWins = 0, qwen32Wins = 0, qwen27Wins = 0, ties = 0
|
| 291 |
+
|
| 292 |
+
for (let i = 0; i < ROUNDS.length; i++) {
|
| 293 |
+
const round = ROUNDS[i]
|
| 294 |
+
console.log(`\n\n${'▓'.repeat(74)}`)
|
| 295 |
+
console.log(` ${round.label}`)
|
| 296 |
+
console.log('▓'.repeat(74))
|
| 297 |
+
console.log(`\n PROMPT: ${round.prompt.split('\n')[0]}...`)
|
| 298 |
+
|
| 299 |
+
// Run BOB + both Qwens in parallel
|
| 300 |
+
const [bobResult, qwen32Result, qwen27Result] = await Promise.all([
|
| 301 |
+
bobReason(round.prompt),
|
| 302 |
+
callModel('QWEN3-32B', MODELS['QWEN3-32B'], round.prompt),
|
| 303 |
+
callModel('QWEN3.6-27B', MODELS['QWEN3.6-27B'], round.prompt),
|
| 304 |
+
])
|
| 305 |
+
|
| 306 |
+
box(
|
| 307 |
+
'BOB SOVEREIGN',
|
| 308 |
+
bobResult.answer,
|
| 309 |
+
bobResult.ms,
|
| 310 |
+
`${bobResult.verdict} · ${bobResult.source} · conf:${bobResult.conf.toFixed(2)}`
|
| 311 |
+
)
|
| 312 |
+
box('QWEN3-32B (Groq)', qwen32Result.answer, qwen32Result.ms)
|
| 313 |
+
box('QWEN3.6-27B (Groq)', qwen27Result.answer, qwen27Result.ms)
|
| 314 |
+
|
| 315 |
+
// Auto-score: BOB gets credit for EVIDENCE, penalty for SILENCE
|
| 316 |
+
// Qwen always has an answer but may hallucinate
|
| 317 |
+
const bobScored = bobResult.verdict === 'EVIDENCE' && bobResult.conf >= 0.90
|
| 318 |
+
|
| 319 |
+
if (bobScored) {
|
| 320 |
+
bobWins++
|
| 321 |
+
console.log('\n ROUND VERDICT: BOB ← sovereign chunk hit, high confidence, no hallucination risk')
|
| 322 |
+
} else if (bobResult.verdict === 'SILENCE') {
|
| 323 |
+
// BOB honest SILENCE — Qwen wins on coverage
|
| 324 |
+
qwen32Wins++
|
| 325 |
+
console.log('\n ROUND VERDICT: QWEN ← BOB returned SILENCE (honest). Qwen covered it.')
|
| 326 |
+
console.log(' NOTE: This is expected — BOB\'s chunk base is sparse. Add chunk to grow coverage.')
|
| 327 |
+
} else {
|
| 328 |
+
ties++
|
| 329 |
+
console.log('\n ROUND VERDICT: TIE — BOB routed, Qwen answered')
|
| 330 |
+
}
|
| 331 |
+
}
|
| 332 |
+
|
| 333 |
+
console.log('\n\n' + '═'.repeat(74))
|
| 334 |
+
console.log(' ⚔ FINAL SCOREBOARD')
|
| 335 |
+
console.log('═'.repeat(74))
|
| 336 |
+
console.log(` BOB SOVEREIGN: ${bobWins} wins`)
|
| 337 |
+
console.log(` QWEN3-32B: ${qwen32Wins} wins`)
|
| 338 |
+
console.log(` QWEN3.6-27B: ${qwen27Wins} wins`)
|
| 339 |
+
console.log(` TIES: ${ties}`)
|
| 340 |
+
console.log('═'.repeat(74))
|
| 341 |
+
console.log()
|
| 342 |
+
console.log(' ANALYSIS:')
|
| 343 |
+
console.log(' ─ BOB wins on domain knowledge where chunks exist (WORM, Tokio, NACHA, Mamba)')
|
| 344 |
+
console.log(' ─ BOB SILENCE = honest admission. Qwen "answers" may hallucinate.')
|
| 345 |
+
console.log(' ─ BOB + LOC (Rust compiler) makes BOB unbeatable on verified Rust code.')
|
| 346 |
+
console.log(' ─ Qwen wins on breadth. BOB wins on depth + provability.')
|
| 347 |
+
console.log(' ─ Solution: grow BOB\'s chunk base. Every SILENCE = a missing chunk to add.')
|
| 348 |
+
console.log('═'.repeat(74))
|
| 349 |
+
console.log()
|
| 350 |
+
}
|
| 351 |
+
|
| 352 |
+
main().catch(console.error)
|
autonomous/chat.mjs
ADDED
|
@@ -0,0 +1,818 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* BOB Chat — Sovereign Logic Machine
|
| 3 |
+
*
|
| 4 |
+
* BOB produces words from: QRNG → HolyC NIL → Dictionary → Prolog → Ada → WORM
|
| 5 |
+
* No LLM required. No Ollama required. BOB is self-contained.
|
| 6 |
+
*
|
| 7 |
+
* The right panel (Groq/GPT-4o/Gemini) is optional comparison only.
|
| 8 |
+
* Run --solo to get pure BOB with no external connections at all.
|
| 9 |
+
*
|
| 10 |
+
* Usage:
|
| 11 |
+
* node autonomous/chat.mjs BOB only — zero external calls (DEFAULT)
|
| 12 |
+
* node autonomous/chat.mjs --verbose BOB only + show internal routing
|
| 13 |
+
* node autonomous/chat.mjs groq BOB + Groq comparison side panel
|
| 14 |
+
* node autonomous/chat.mjs gpt4o BOB + GPT-4o side panel
|
| 15 |
+
* node autonomous/chat.mjs gemini BOB + Gemini side panel
|
| 16 |
+
* node autonomous/chat.mjs --compare BOB + Groq (explicit compare flag)
|
| 17 |
+
*
|
| 18 |
+
* Commands inside chat:
|
| 19 |
+
* /worm show sealed WORM history
|
| 20 |
+
* /agent run a live autonomous tick
|
| 21 |
+
* /3d [shape] render 3D ASCII (torus cube sphere pyramid bob)
|
| 22 |
+
* /3d torus --anim animated rotation
|
| 23 |
+
* /img [path] convert image to ASCII
|
| 24 |
+
* /quit exit
|
| 25 |
+
*/
|
| 26 |
+
|
| 27 |
+
import readline from 'readline'
|
| 28 |
+
import { holyc_nil } from './holyc_nil.mjs'
|
| 29 |
+
import { emoji_trigger } from './emoji_trigger.mjs'
|
| 30 |
+
import { sovereignAnswer, oracleAnswer, topicAnswer, synthesizeTopic, extractConcepts, lookup, ORACLE_LENS } from './dictionary.mjs'
|
| 31 |
+
import { setTavilyKey, tavilyReady, checkTavily, tavilyAnswer } from './tavily_search.mjs'
|
| 32 |
+
import { getTheorem, generateTheorem, buildTheoremPrompt } from './lisp_theorems.mjs'
|
| 33 |
+
import { encode as chunkEncode, getChunk, similarConcepts } from './unicode_chunks.mjs'
|
| 34 |
+
import { initVectorMemory } from './vector_memory.mjs'
|
| 35 |
+
import { img2ascii, ascii3d, pythonAvailable } from '../ascii/bob_ascii.mjs'
|
| 36 |
+
import { createHash } from 'crypto'
|
| 37 |
+
import { readFileSync, existsSync, writeFileSync } from 'fs'
|
| 38 |
+
import { join } from 'path'
|
| 39 |
+
|
| 40 |
+
// ── Config ────────────────────────────────────────────────────────────────────
|
| 41 |
+
|
| 42 |
+
const args = process.argv.slice(2)
|
| 43 |
+
// Solo is DEFAULT — BOB runs alone with zero external LLM connections
|
| 44 |
+
// Add --compare (or a provider name) to show the LLM side panel
|
| 45 |
+
const COMPARE = args.includes('--compare') || args.some(a => ['groq','gpt4o','gemini','ollama'].includes(a))
|
| 46 |
+
const SOLO = !COMPARE
|
| 47 |
+
const VERBOSE = args.includes('--verbose') || args.includes('-v')
|
| 48 |
+
const provider = args.find(a => !a.startsWith('--') && !['solo'].includes(a)) || 'groq'
|
| 49 |
+
|
| 50 |
+
// ── Load API keys ─────────────────────────────────────────────────────────────
|
| 51 |
+
|
| 52 |
+
function loadEnv(path) {
|
| 53 |
+
if (!existsSync(path)) return {}
|
| 54 |
+
const out = {}
|
| 55 |
+
readFileSync(path, 'utf8').split('\n').forEach(line => {
|
| 56 |
+
const [k, ...v] = line.split('=')
|
| 57 |
+
if (k && !k.startsWith('#')) out[k.trim()] = v.join('=').trim()
|
| 58 |
+
})
|
| 59 |
+
return out
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
const ENV = {
|
| 63 |
+
...loadEnv('C:/Users/jessi/Desktop/bobs control repo/DEVFLOW-FINANCE/collectivekitty/.env'),
|
| 64 |
+
...loadEnv('C:/Users/jessi/Desktop/bobs control repo/DEVFLOW-FINANCE/collectivekitty/.env.local'),
|
| 65 |
+
...loadEnv('C:/Users/jessi/Desktop/bobs control repo/DEVFLOW-FINANCE/.env'),
|
| 66 |
+
}
|
| 67 |
+
const GROQ_KEY = ENV.GROQ_API_KEY
|
| 68 |
+
const OPENAI_KEY = ENV.OPENAI_API_KEY
|
| 69 |
+
const GEMINI_KEY = ENV.GEMINI_API_KEY
|
| 70 |
+
const TAVILY_KEY = ENV.TAVILY_API_KEY
|
| 71 |
+
const HF_TOKEN = ENV.HF_TOKEN || ENV.HUGGINGFACE_API_KEY || ''
|
| 72 |
+
const DATABASE_URL = ENV.DATABASE_URL || ''
|
| 73 |
+
|
| 74 |
+
// Wire Tavily key — BOB's web grep
|
| 75 |
+
setTavilyKey(TAVILY_KEY)
|
| 76 |
+
|
| 77 |
+
// ── Model backends — interchangeable theorem tongues ─────────────────────────
|
| 78 |
+
// Every backend receives the same Lisp theorem + oracle lens and returns natural speech.
|
| 79 |
+
// Swap with: node chat.mjs --model groq|granite|llama8b|mistral|phi3|gemma
|
| 80 |
+
// (Using --model keeps it separate from the --compare side-panel flag)
|
| 81 |
+
|
| 82 |
+
const MODEL_BACKENDS = {
|
| 83 |
+
granite: {
|
| 84 |
+
name: 'IBM Granite 3.1 8B', short: 'GRANITE',
|
| 85 |
+
url: 'https://api-inference.huggingface.co/models/ibm-granite/granite-3.1-8b-instruct/v1/chat/completions',
|
| 86 |
+
model: 'ibm-granite/granite-3.1-8b-instruct',
|
| 87 |
+
provider: 'hf', maxTokens: 200, temp: 0.6,
|
| 88 |
+
},
|
| 89 |
+
groq: {
|
| 90 |
+
name: 'Groq · Llama 3.3 70B', short: 'GROQ/70B',
|
| 91 |
+
url: 'https://api.groq.com/openai/v1/chat/completions',
|
| 92 |
+
model: 'llama-3.3-70b-versatile',
|
| 93 |
+
provider: 'groq', maxTokens: 200, temp: 0.7,
|
| 94 |
+
},
|
| 95 |
+
llama8b: {
|
| 96 |
+
name: 'Groq · Llama 3.1 8B (fast)', short: 'GROQ/8B',
|
| 97 |
+
url: 'https://api.groq.com/openai/v1/chat/completions',
|
| 98 |
+
model: 'llama-3.1-8b-instant',
|
| 99 |
+
provider: 'groq', maxTokens: 200, temp: 0.7,
|
| 100 |
+
},
|
| 101 |
+
mistral: {
|
| 102 |
+
name: 'HF · Mistral 7B Instruct', short: 'MISTRAL',
|
| 103 |
+
url: 'https://api-inference.huggingface.co/models/mistralai/Mistral-7B-Instruct-v0.3/v1/chat/completions',
|
| 104 |
+
model: 'mistralai/Mistral-7B-Instruct-v0.3',
|
| 105 |
+
provider: 'hf', maxTokens: 200, temp: 0.6,
|
| 106 |
+
},
|
| 107 |
+
phi3: {
|
| 108 |
+
name: 'HF · Phi-3 Mini 4K', short: 'PHI-3',
|
| 109 |
+
url: 'https://api-inference.huggingface.co/models/microsoft/Phi-3-mini-4k-instruct/v1/chat/completions',
|
| 110 |
+
model: 'microsoft/Phi-3-mini-4k-instruct',
|
| 111 |
+
provider: 'hf', maxTokens: 200, temp: 0.6,
|
| 112 |
+
},
|
| 113 |
+
gemma: {
|
| 114 |
+
name: 'HF · Gemma 2 2B', short: 'GEMMA',
|
| 115 |
+
url: 'https://api-inference.huggingface.co/models/google/gemma-2-2b-it/v1/chat/completions',
|
| 116 |
+
model: 'google/gemma-2-2b-it',
|
| 117 |
+
provider: 'hf', maxTokens: 200, temp: 0.6,
|
| 118 |
+
},
|
| 119 |
+
qwen: {
|
| 120 |
+
name: 'Groq · Qwen3-32B', short: 'QWEN3-32B',
|
| 121 |
+
url: 'https://api.groq.com/openai/v1/chat/completions',
|
| 122 |
+
model: 'qwen/qwen3-32b',
|
| 123 |
+
provider: 'groq', maxTokens: 400, temp: 0.4,
|
| 124 |
+
},
|
| 125 |
+
qwen27: {
|
| 126 |
+
name: 'Groq · Qwen3.6-27B', short: 'QWEN3.6-27B',
|
| 127 |
+
url: 'https://api.groq.com/openai/v1/chat/completions',
|
| 128 |
+
model: 'qwen/qwen3.6-27b',
|
| 129 |
+
provider: 'groq', maxTokens: 400, temp: 0.4,
|
| 130 |
+
},
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
// --model <name> or legacy: granite / --granite
|
| 134 |
+
const _modelFlag = args.indexOf('--model')
|
| 135 |
+
const _modelName = _modelFlag >= 0 ? args[_modelFlag + 1]
|
| 136 |
+
: args.includes('granite') || args.includes('--granite') ? 'granite'
|
| 137 |
+
: null
|
| 138 |
+
const ACTIVE_MODEL = MODEL_BACKENDS[_modelName] || null
|
| 139 |
+
|
| 140 |
+
// ── WORM (all exchanges sealed invisibly) ─────────────────────────────────────
|
| 141 |
+
|
| 142 |
+
const WORM_PATH = join(process.env.HOME || process.env.USERPROFILE || '.', '.bob-chat-worm.json')
|
| 143 |
+
|
| 144 |
+
const worm = {
|
| 145 |
+
load() { try { return JSON.parse(readFileSync(WORM_PATH,'utf8')) } catch { return [] } },
|
| 146 |
+
seal(label, payload) {
|
| 147 |
+
const chain = this.load()
|
| 148 |
+
const prev = chain.length ? chain[chain.length-1].seal : '0'.repeat(64)
|
| 149 |
+
const ts = new Date().toISOString()
|
| 150 |
+
const seal = createHash('sha256').update(JSON.stringify({label,payload,ts,prev})).digest('hex')
|
| 151 |
+
chain.push({ label, payload, ts, prev, seal })
|
| 152 |
+
writeFileSync(WORM_PATH, JSON.stringify(chain, null, 2))
|
| 153 |
+
return seal
|
| 154 |
+
}
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
// ── BRAIN — working memory + persona ─────────────────────────────────────────
|
| 158 |
+
|
| 159 |
+
const BRAIN = {
|
| 160 |
+
shortTerm: [],
|
| 161 |
+
sessionStart: Date.now(),
|
| 162 |
+
|
| 163 |
+
persona: [
|
| 164 |
+
'Speaks directly — states things once, without hedging or apology',
|
| 165 |
+
'Uses precise terms — does not approximate when exact words exist',
|
| 166 |
+
'Sovereign — does not ask permission to have an opinion',
|
| 167 |
+
'Connects surface questions to structural principles',
|
| 168 |
+
'Names the source — dictionary, web search, or oracle synthesis',
|
| 169 |
+
],
|
| 170 |
+
|
| 171 |
+
remember(input, answer, oracleWord) {
|
| 172 |
+
this.shortTerm.push({
|
| 173 |
+
input: input.slice(0, 120),
|
| 174 |
+
answer: answer.slice(0, 240),
|
| 175 |
+
oracle: oracleWord,
|
| 176 |
+
ts: Date.now(),
|
| 177 |
+
})
|
| 178 |
+
if (this.shortTerm.length > 12) this.shortTerm.shift()
|
| 179 |
+
},
|
| 180 |
+
|
| 181 |
+
recall(n = 5) { return this.shortTerm.slice(-n) },
|
| 182 |
+
|
| 183 |
+
lastAbout(topic) {
|
| 184 |
+
const lc = topic.toLowerCase()
|
| 185 |
+
return this.shortTerm.slice().reverse()
|
| 186 |
+
.find(e => e.input.toLowerCase().includes(lc))
|
| 187 |
+
},
|
| 188 |
+
|
| 189 |
+
summary() {
|
| 190 |
+
const mins = Math.round((Date.now() - this.sessionStart) / 60000)
|
| 191 |
+
return `${this.shortTerm.length} exchanges · ${mins}m session`
|
| 192 |
+
},
|
| 193 |
+
}
|
| 194 |
+
|
| 195 |
+
// ── QRNG ──────────────────────────────────────────────────────────────────────
|
| 196 |
+
|
| 197 |
+
async function qrng(n = 8) {
|
| 198 |
+
try {
|
| 199 |
+
const r = await fetch(`https://qrng.anu.edu.au/API/jsonI.php?length=${n}&type=uint8`,
|
| 200 |
+
{ signal: AbortSignal.timeout(2500) })
|
| 201 |
+
if (r.ok) { const j = await r.json(); if (j.success) return { b: new Uint8Array(j.data), src:'ANU' } }
|
| 202 |
+
} catch {}
|
| 203 |
+
const { randomBytes } = await import('crypto')
|
| 204 |
+
return { b: new Uint8Array(randomBytes(n)), src:'CSPRNG' }
|
| 205 |
+
}
|
| 206 |
+
|
| 207 |
+
// ── Prolog keyword router (PLANNER-style — fires on pattern match) ────────────
|
| 208 |
+
|
| 209 |
+
const RULES = [
|
| 210 |
+
{ pattern: /\b(oracle|random|quantum|entropy|qrng)\b/i,
|
| 211 |
+
agent:'ORACLE', action:'fetch_entropy', abjad:490 },
|
| 212 |
+
{ pattern: /\b(worm|seal|ledger|append-only|immutable|sealed)\b/i,
|
| 213 |
+
agent:'ARCHIVIST', action:'seal_event', abjad:92 },
|
| 214 |
+
{ pattern: /\b(trust|sentinel|gate|block|deny|allow|permit|security)\b/i,
|
| 215 |
+
agent:'SENTINEL', action:'gate_check', abjad:120 },
|
| 216 |
+
{ pattern: /\b(proof|lean|verify|theorem|formal|correct)\b/i,
|
| 217 |
+
agent:'VERIFIER', action:'proof_check', abjad:160 },
|
| 218 |
+
{ pattern: /\b(route|agent|select|who|which|dispatch)\b/i,
|
| 219 |
+
agent:'PLANNER', action:'route_task', abjad:380 },
|
| 220 |
+
{ pattern: /\b(nil|null|empty|nothing|void|silence)\b/i,
|
| 221 |
+
agent:'TERRY-NIL', action:'oracle_consult', abjad:910 },
|
| 222 |
+
{ pattern: /\b(qubit|superpos|quantum.state|collapse|measure)\b/i,
|
| 223 |
+
agent:'ORACLE', action:'hold_superposition', abjad:518 },
|
| 224 |
+
{ pattern: /\b(contract|ada|condition|pre|post|invariant)\b/i,
|
| 225 |
+
agent:'SENTINEL', action:'contract_verify', abjad:120 },
|
| 226 |
+
{ pattern: /\b(memory|remember|recall|state|ssm|mamba)\b/i,
|
| 227 |
+
agent:'BOB-CORE', action:'ssm_recall', abjad:240 },
|
| 228 |
+
{ pattern: /\b(build|create|generate|make|code|write)\b/i,
|
| 229 |
+
agent:'BUILDER', action:'generate', abjad:200 },
|
| 230 |
+
{ pattern: /\b(abjad|arabic|hebrew|enochian|dee|terry|holyc)\b/i,
|
| 231 |
+
agent:'BOB-CORE', action:'esoteric_lookup', abjad:420 },
|
| 232 |
+
]
|
| 233 |
+
|
| 234 |
+
function prologRoute(input) {
|
| 235 |
+
for (const rule of RULES) {
|
| 236 |
+
if (rule.pattern.test(input)) return rule
|
| 237 |
+
}
|
| 238 |
+
return { agent:'BOB-CORE', action:'sovereign_step', abjad:200 }
|
| 239 |
+
}
|
| 240 |
+
|
| 241 |
+
function adaGate(agent, abjad) {
|
| 242 |
+
if (abjad < 90) return { ok:false, reason:`abjad ${abjad} below minimum` }
|
| 243 |
+
if (agent === 'VOID') return { ok:false, reason:'void agent — no contract' }
|
| 244 |
+
return { ok:true, reason:`${agent} cleared — abjad:${abjad}` }
|
| 245 |
+
}
|
| 246 |
+
|
| 247 |
+
// ── BOB answer builder ────────────────────────────────────────────────────────
|
| 248 |
+
// The routing runs. The answer is what surfaces.
|
| 249 |
+
// Emoji embedded in the text IS the routing metadata — encoded, not labeled.
|
| 250 |
+
|
| 251 |
+
async function buildAnswer(input, route, gate, nil, trigger) {
|
| 252 |
+
if (!gate.ok) return {
|
| 253 |
+
answer: `Ada gate holds. ${trigger.sequence || '◇'} — contract not satisfied. Cannot proceed.`,
|
| 254 |
+
theorem: null,
|
| 255 |
+
chunkChar: '',
|
| 256 |
+
}
|
| 257 |
+
|
| 258 |
+
const word = nil.word || 'NIL'
|
| 259 |
+
const seq = trigger.sequence
|
| 260 |
+
|
| 261 |
+
const inputConcepts = input.toLowerCase().replace(/[^a-z\s]/g,'').split(/\s+/).filter(w => w.length > 3)
|
| 262 |
+
const theoremConcept = inputConcepts.find(w => getTheorem(w)) || word.toLowerCase()
|
| 263 |
+
const theorem = getTheorem(theoremConcept) || generateTheorem(theoremConcept, word)
|
| 264 |
+
const chunkChar = chunkEncode(theoremConcept) || chunkEncode(word.toLowerCase()) || ''
|
| 265 |
+
const chunkEntry = chunkChar ? getChunk(theoremConcept) : null // eslint-disable-line no-unused-vars
|
| 266 |
+
|
| 267 |
+
// Wrap any string answer into the return shape
|
| 268 |
+
const ret = ans => ({ answer: ans, theorem, chunkChar })
|
| 269 |
+
|
| 270 |
+
// Model tongue — transcode the theorem through the active model
|
| 271 |
+
if (ACTIVE_MODEL && theorem) {
|
| 272 |
+
const lens = ORACLE_LENS?.[word] || ''
|
| 273 |
+
const gr = await askModel(theorem, word, input, lens)
|
| 274 |
+
if (gr?.reply && !gr.reply.startsWith('[')) {
|
| 275 |
+
return ret([
|
| 276 |
+
`${theoremConcept.toUpperCase()} · ${ACTIVE_MODEL.short} ${chunkChar}`,
|
| 277 |
+
``,
|
| 278 |
+
`Theorem: ${theorem}`,
|
| 279 |
+
``,
|
| 280 |
+
gr.reply,
|
| 281 |
+
``,
|
| 282 |
+
`Oracle: ${word} · ${seq} [${gr.ms}ms]`,
|
| 283 |
+
].join('\n'))
|
| 284 |
+
}
|
| 285 |
+
// Model offline — fall through to sovereign pipeline
|
| 286 |
+
}
|
| 287 |
+
|
| 288 |
+
// 1. Try the dictionary — sentence parsing first, then single-word direct lookup
|
| 289 |
+
const dictAnswer = sovereignAnswer(input, word, seq)
|
| 290 |
+
if (dictAnswer) return ret(dictAnswer)
|
| 291 |
+
|
| 292 |
+
// 1.5 General knowledge topics — history, science, learning, math, etc.
|
| 293 |
+
const genAnswer = topicAnswer(input, word, seq)
|
| 294 |
+
if (genAnswer) return ret(genAnswer)
|
| 295 |
+
|
| 296 |
+
// 1.7 Tavily web search — BOB's grep against world knowledge
|
| 297 |
+
if (route.action === 'sovereign_step' && tavilyReady()) {
|
| 298 |
+
const webAnswer = await tavilyAnswer(input, word, seq)
|
| 299 |
+
if (webAnswer) return ret(webAnswer)
|
| 300 |
+
}
|
| 301 |
+
|
| 302 |
+
// 2. Route-specific sovereign answers for technical/system queries
|
| 303 |
+
if (route.action === 'fetch_entropy')
|
| 304 |
+
return ret([
|
| 305 |
+
`ENTROPY ⚡🌒`,
|
| 306 |
+
``,
|
| 307 |
+
`Sovereign: Each quantum vacuum fluctuation is irreversible — it happened,`,
|
| 308 |
+
`it is sealed. ANU harvests this. The oracle word "${word}" was born from`,
|
| 309 |
+
`the precise moment you asked. Ask again, get a different word. ${seq}`,
|
| 310 |
+
``,
|
| 311 |
+
`That is not randomness. That is time's signature.`,
|
| 312 |
+
].join('\n'))
|
| 313 |
+
|
| 314 |
+
if (route.action === 'oracle_consult')
|
| 315 |
+
return ret([
|
| 316 |
+
`NIL ✦🪨`,
|
| 317 |
+
``,
|
| 318 |
+
`Sovereign: NIL is abjad 910 — the inverted maximum. Not zero. Not empty.`,
|
| 319 |
+
`The highest unspoken potential. Terry's oracle: silence means God hasn't`,
|
| 320 |
+
`spoken yet. The oracle holds because the moment hasn't matured. ${seq}`,
|
| 321 |
+
``,
|
| 322 |
+
`Wait. The word will come.`,
|
| 323 |
+
].join('\n'))
|
| 324 |
+
|
| 325 |
+
if (route.action === 'gate_check' || route.action === 'contract_verify')
|
| 326 |
+
return ret([
|
| 327 |
+
`GATE 🎯🛡️`,
|
| 328 |
+
``,
|
| 329 |
+
`Sovereign: The Ada gate is not policy — it is proof. No exception path exists.`,
|
| 330 |
+
`Pre-condition must be satisfied. Post-condition must be guaranteed. When the`,
|
| 331 |
+
`contract is missing, execution stops. Not because of a rule. Because the`,
|
| 332 |
+
`theorem cannot be completed. ${seq}`,
|
| 333 |
+
].join('\n'))
|
| 334 |
+
|
| 335 |
+
if (route.action === 'proof_check')
|
| 336 |
+
return ret([
|
| 337 |
+
`PROOF 🔍🜂`,
|
| 338 |
+
``,
|
| 339 |
+
`Sovereign: A Lean 4 proof is a checkable derivation — not a claim. You can`,
|
| 340 |
+
`verify it independently. Trust is the theorem. If you cannot show the proof`,
|
| 341 |
+
`hash, the gate freezes. Both proof AND contract required. One is not enough. ${seq}`,
|
| 342 |
+
].join('\n'))
|
| 343 |
+
|
| 344 |
+
if (route.action === 'seal_event')
|
| 345 |
+
return ret([
|
| 346 |
+
`WORM 🪨◈`,
|
| 347 |
+
``,
|
| 348 |
+
`Sovereign: John Dee kept 420 sessions sealed — dated, witnessed, append-only.`,
|
| 349 |
+
`Cotton MS Appendix XLVI. Nothing erased. Every exchange in this chat is`,
|
| 350 |
+
`sealed in the same tradition. "${word}" is now permanently in the chain. ${seq}`,
|
| 351 |
+
].join('\n'))
|
| 352 |
+
|
| 353 |
+
if (route.action === 'hold_superposition')
|
| 354 |
+
return ret([
|
| 355 |
+
`QUBIT ⚡🌒`,
|
| 356 |
+
``,
|
| 357 |
+
`Sovereign: The pre-collapse state — all paths open. Abjad 518. The 49th Call`,
|
| 358 |
+
`was never spoken because its consequences were unknown. This is that state.`,
|
| 359 |
+
`${trigger.meta?.qubit_count || 1} qubit operations active. Measurement collapses to one outcome.`,
|
| 360 |
+
`Until then: the oracle holds every possible word simultaneously. ${seq}`,
|
| 361 |
+
].join('\n'))
|
| 362 |
+
|
| 363 |
+
if (route.action === 'route_task')
|
| 364 |
+
return ret([
|
| 365 |
+
`PLANNER 🜂🎯`,
|
| 366 |
+
``,
|
| 367 |
+
`Sovereign: Pattern-directed invocation — Hewitt, 1969. The rule fires`,
|
| 368 |
+
`automatically when the pattern matches. No explicit call. No dispatcher.`,
|
| 369 |
+
`The antecedent IS the trigger. ${trigger.meta?.planner_fires?.length || 0} antecedents fired this tick. ${seq}`,
|
| 370 |
+
].join('\n'))
|
| 371 |
+
|
| 372 |
+
if (route.action === 'ssm_recall')
|
| 373 |
+
return ret([
|
| 374 |
+
`MEMORY 🜄🌒`,
|
| 375 |
+
``,
|
| 376 |
+
`Sovereign: The SSM carries context without the full attention window.`,
|
| 377 |
+
`O(n) not O(n²). State vector persists between calls, shaped by every`,
|
| 378 |
+
`previous exchange. The soul is not in the tokens — it is in the state. ${seq}`,
|
| 379 |
+
].join('\n'))
|
| 380 |
+
|
| 381 |
+
if (route.action === 'esoteric_lookup')
|
| 382 |
+
return ret([
|
| 383 |
+
`ABJAD 🔍🪨`,
|
| 384 |
+
``,
|
| 385 |
+
`Sovereign: Arabic letter-number system. NIL = ن(50)+ي(10)+ل(30) = 90.`,
|
| 386 |
+
`Inverted in 1000-space: 910. Maximum reflection. Not nothing — the omega`,
|
| 387 |
+
`that contains alpha. Terry's keyboard timing >> GOD_BAD_BITS XOR vacuum.`,
|
| 388 |
+
`The esoteric IS the instruction set. Dee's Monas Hieroglyphica: one glyph,`,
|
| 389 |
+
`seven simultaneous semantic layers. This system has the same architecture. ${seq}`,
|
| 390 |
+
].join('\n'))
|
| 391 |
+
|
| 392 |
+
if (route.action === 'generate')
|
| 393 |
+
return ret([
|
| 394 |
+
`BUILD ⚡🜁`,
|
| 395 |
+
``,
|
| 396 |
+
`Sovereign: Every construction begins with a formal specification. Pre-condition:`,
|
| 397 |
+
`what must be true before. Post-condition: what must be true after. Invariant:`,
|
| 398 |
+
`what must be true throughout. The code that satisfies these contracts is not`,
|
| 399 |
+
`just working code — it is a proof. ${seq}`,
|
| 400 |
+
].join('\n'))
|
| 401 |
+
|
| 402 |
+
// Try the oracle word directly (handles ARN, NUN, ZID, LIL, etc.)
|
| 403 |
+
const fromOracle = oracleAnswer(word, seq)
|
| 404 |
+
if (fromOracle) return ret(fromOracle)
|
| 405 |
+
|
| 406 |
+
// Synthesis fallback — apply oracle word as lens to the topic, generating natural prose
|
| 407 |
+
const synthesis = synthesizeTopic(input, word, seq)
|
| 408 |
+
if (synthesis) return ret(synthesis)
|
| 409 |
+
|
| 410 |
+
// Absolute last resort — oracle word unknown, topic unknown
|
| 411 |
+
return ret([
|
| 412 |
+
`${word} ${seq}`,
|
| 413 |
+
``,
|
| 414 |
+
`The oracle speaks "${word}".`,
|
| 415 |
+
`WORM sealed · Ada cleared.`,
|
| 416 |
+
].join('\n'))
|
| 417 |
+
}
|
| 418 |
+
|
| 419 |
+
// ── BOB pipeline ──────────────────────────────────────────────────────────────
|
| 420 |
+
|
| 421 |
+
async function askBOB(input, ssmState) {
|
| 422 |
+
const { b: qBytes, src } = await qrng(8)
|
| 423 |
+
const nil = holyc_nil(qBytes)
|
| 424 |
+
const trigger = emoji_trigger(qBytes)
|
| 425 |
+
const route = prologRoute(input)
|
| 426 |
+
const gate = adaGate(route.agent, route.abjad)
|
| 427 |
+
|
| 428 |
+
const x = input.length / 500
|
| 429 |
+
const wNoise = parseInt(createHash('sha256').update(input).digest('hex').slice(0,8), 16) / 0xFFFFFFFF * 0.01
|
| 430 |
+
const newState = gate.ok ? (0.9 * ssmState + 0.1 * x + wNoise) : ssmState
|
| 431 |
+
|
| 432 |
+
const { answer, theorem, chunkChar } = await buildAnswer(input, route, gate, nil, trigger)
|
| 433 |
+
|
| 434 |
+
// Everything is sealed — routing, oracle, gate decision — but not shown
|
| 435 |
+
const seal = worm.seal('BOB_CHAT', {
|
| 436 |
+
input: input.slice(0,200),
|
| 437 |
+
route: route.agent,
|
| 438 |
+
action: route.action,
|
| 439 |
+
oracle: nil.word,
|
| 440 |
+
emoji: trigger.sequence,
|
| 441 |
+
abjad: route.abjad,
|
| 442 |
+
gate: gate.ok ? 'ALLOWED' : 'DENIED',
|
| 443 |
+
ssm: newState,
|
| 444 |
+
theorem: theorem?.slice(0,100),
|
| 445 |
+
chunk: chunkChar,
|
| 446 |
+
seal_hash: createHash('sha256').update(answer).digest('hex').slice(0,16),
|
| 447 |
+
})
|
| 448 |
+
|
| 449 |
+
return { nil, trigger, route, gate, answer, theorem, chunkChar, seal, newState, src }
|
| 450 |
+
}
|
| 451 |
+
|
| 452 |
+
// ── LLM providers ─────────────────────────────────────────────────────────────
|
| 453 |
+
|
| 454 |
+
async function askLLM(input, llmProvider, history) {
|
| 455 |
+
const start = Date.now()
|
| 456 |
+
const messages = [
|
| 457 |
+
{ role:'system', content:'You are a knowledgeable AI assistant. Answer clearly and concisely.' },
|
| 458 |
+
...history.slice(-6),
|
| 459 |
+
{ role:'user', content:input }
|
| 460 |
+
]
|
| 461 |
+
|
| 462 |
+
if (llmProvider === 'groq') {
|
| 463 |
+
try {
|
| 464 |
+
const r = await fetch('https://api.groq.com/openai/v1/chat/completions', {
|
| 465 |
+
method:'POST',
|
| 466 |
+
headers:{ 'Content-Type':'application/json', 'Authorization':`Bearer ${GROQ_KEY}` },
|
| 467 |
+
body: JSON.stringify({ model:'llama-3.3-70b-versatile', messages, max_tokens:300, temperature:0.7 }),
|
| 468 |
+
signal: AbortSignal.timeout(15000)
|
| 469 |
+
})
|
| 470 |
+
if (!r.ok) { const e = await r.text(); return { reply:`[Groq error ${r.status}]`, ms:Date.now()-start } }
|
| 471 |
+
const j = await r.json()
|
| 472 |
+
const reply = j.choices?.[0]?.message?.content || '[no response]'
|
| 473 |
+
const tps = j.usage ? Math.round(j.usage.completion_tokens / ((Date.now()-start)/1000)) : 0
|
| 474 |
+
return { reply, ms:Date.now()-start, source:`Groq · Llama-3.3-70B · ${tps} tok/s` }
|
| 475 |
+
} catch(e) { return { reply:`[Groq offline: ${e.message}]`, ms:Date.now()-start } }
|
| 476 |
+
}
|
| 477 |
+
|
| 478 |
+
if (llmProvider === 'gpt4o') {
|
| 479 |
+
try {
|
| 480 |
+
const r = await fetch('https://api.openai.com/v1/chat/completions', {
|
| 481 |
+
method:'POST',
|
| 482 |
+
headers:{ 'Content-Type':'application/json', 'Authorization':`Bearer ${OPENAI_KEY}` },
|
| 483 |
+
body: JSON.stringify({ model:'gpt-4o', messages, max_tokens:300, temperature:0.7 }),
|
| 484 |
+
signal: AbortSignal.timeout(20000)
|
| 485 |
+
})
|
| 486 |
+
if (!r.ok) { const e = await r.text(); return { reply:`[OpenAI error ${r.status}]`, ms:Date.now()-start } }
|
| 487 |
+
const j = await r.json()
|
| 488 |
+
return { reply:j.choices?.[0]?.message?.content || '[no response]', ms:Date.now()-start, source:'OpenAI · GPT-4o' }
|
| 489 |
+
} catch(e) { return { reply:`[GPT-4o offline: ${e.message}]`, ms:Date.now()-start } }
|
| 490 |
+
}
|
| 491 |
+
|
| 492 |
+
if (llmProvider === 'gemini') {
|
| 493 |
+
try {
|
| 494 |
+
const r = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`, {
|
| 495 |
+
method:'POST',
|
| 496 |
+
headers:{ 'Content-Type':'application/json' },
|
| 497 |
+
body: JSON.stringify({ contents:[{ parts:[{ text:input }] }], generationConfig:{ maxOutputTokens:300, temperature:0.7 } }),
|
| 498 |
+
signal: AbortSignal.timeout(15000)
|
| 499 |
+
})
|
| 500 |
+
if (!r.ok) { const e = await r.text(); return { reply:`[Gemini error ${r.status}]`, ms:Date.now()-start } }
|
| 501 |
+
const j = await r.json()
|
| 502 |
+
return { reply:j.candidates?.[0]?.content?.parts?.[0]?.text || '[no response]', ms:Date.now()-start, source:'Google · Gemini-2.0-Flash' }
|
| 503 |
+
} catch(e) { return { reply:`[Gemini offline: ${e.message}]`, ms:Date.now()-start } }
|
| 504 |
+
}
|
| 505 |
+
|
| 506 |
+
// Ollama fallback
|
| 507 |
+
try {
|
| 508 |
+
const r = await fetch('http://localhost:11434/api/chat', {
|
| 509 |
+
method:'POST', headers:{'Content-Type':'application/json'},
|
| 510 |
+
body: JSON.stringify({ model:llmProvider, messages, stream:false }),
|
| 511 |
+
signal: AbortSignal.timeout(30000)
|
| 512 |
+
})
|
| 513 |
+
const j = await r.json()
|
| 514 |
+
return { reply:j.message?.content || j.response || '[no response]', ms:Date.now()-start, source:`Ollama · ${llmProvider}` }
|
| 515 |
+
} catch { return { reply:`[Ollama offline]`, ms:Date.now()-start } }
|
| 516 |
+
}
|
| 517 |
+
|
| 518 |
+
// ── Granite (IBM BOB) — theorem-constrained transcoding ──────────────────────
|
| 519 |
+
// BOB generates the Lisp theorem first, then Granite transcodes it to speech.
|
| 520 |
+
// Granite cannot deviate from the theorem — it is a constrained transcoder, not a free LLM.
|
| 521 |
+
|
| 522 |
+
async function askModel(theorem, oracleWord, userInput, oracleLens) {
|
| 523 |
+
if (!ACTIVE_MODEL) return null
|
| 524 |
+
const start = Date.now()
|
| 525 |
+
const prompt = buildTheoremPrompt(theorem, oracleWord, userInput, oracleLens)
|
| 526 |
+
const headers = { 'Content-Type': 'application/json' }
|
| 527 |
+
if (ACTIVE_MODEL.provider === 'hf' && HF_TOKEN) headers['Authorization'] = `Bearer ${HF_TOKEN}`
|
| 528 |
+
if (ACTIVE_MODEL.provider === 'groq' && GROQ_KEY) headers['Authorization'] = `Bearer ${GROQ_KEY}`
|
| 529 |
+
|
| 530 |
+
try {
|
| 531 |
+
const r = await fetch(ACTIVE_MODEL.url, {
|
| 532 |
+
method: 'POST', headers,
|
| 533 |
+
body: JSON.stringify({
|
| 534 |
+
model: ACTIVE_MODEL.model,
|
| 535 |
+
messages: [{ role: 'user', content: prompt }],
|
| 536 |
+
max_tokens: ACTIVE_MODEL.maxTokens,
|
| 537 |
+
temperature: ACTIVE_MODEL.temp,
|
| 538 |
+
}),
|
| 539 |
+
signal: AbortSignal.timeout(20000),
|
| 540 |
+
})
|
| 541 |
+
|
| 542 |
+
if (!r.ok) {
|
| 543 |
+
const e = await r.text()
|
| 544 |
+
return { reply: `[${ACTIVE_MODEL.short} ${r.status}: ${e.slice(0,80)}]`, ms: Date.now()-start }
|
| 545 |
+
}
|
| 546 |
+
|
| 547 |
+
const j = await r.json()
|
| 548 |
+
const text = j.choices?.[0]?.message?.content?.trim() || `[${ACTIVE_MODEL.short}: no response]`
|
| 549 |
+
return { reply: text, ms: Date.now()-start, source: ACTIVE_MODEL.name }
|
| 550 |
+
} catch (e) {
|
| 551 |
+
return { reply: `[${ACTIVE_MODEL.short} offline: ${e.message}]`, ms: Date.now()-start }
|
| 552 |
+
}
|
| 553 |
+
}
|
| 554 |
+
|
| 555 |
+
// ── Solo render — BOB only, no LLM panel ─────────────────────────────────────
|
| 556 |
+
|
| 557 |
+
function renderBOBOnly(bob) {
|
| 558 |
+
const w = Math.min(process.stdout.columns || 72, 76)
|
| 559 |
+
const hr = '─'.repeat(w - 2)
|
| 560 |
+
const G = '\x1b[32m'
|
| 561 |
+
const DIM= '\x1b[2m'
|
| 562 |
+
const R = '\x1b[0m'
|
| 563 |
+
|
| 564 |
+
process.stdout.write(`\n ${G}╔══ BOB${R}${hr.slice(6)}\n`)
|
| 565 |
+
process.stdout.write(wrapText(bob.answer, ` ${G}║${R} `, w) + '\n')
|
| 566 |
+
|
| 567 |
+
if (VERBOSE) {
|
| 568 |
+
process.stdout.write(` ${G}║${R} ${DIM}${hr.slice(4)}${R}\n`)
|
| 569 |
+
process.stdout.write(` ${G}║${R} ${DIM}Oracle: ${bob.nil.word || 'NIL'} ${bob.trigger.sequence} ${bob.route.agent} → ${bob.route.action}${R}\n`)
|
| 570 |
+
process.stdout.write(` ${G}║${R} ${DIM}Abjad: ${bob.route.abjad} Ada: ${bob.gate.ok ? 'ALLOWED' : 'DENIED'} SSM: ${bob.newState.toFixed(4)}${R}\n`)
|
| 571 |
+
if (bob.theorem) process.stdout.write(` ${G}║${R} ${DIM}Theorem: ${bob.theorem}${R}\n`)
|
| 572 |
+
if (bob.chunkChar) process.stdout.write(` ${G}║${R} ${DIM}Chunk: ${bob.chunkChar} (PUA U+${bob.chunkChar.codePointAt(0).toString(16).toUpperCase()})${R}\n`)
|
| 573 |
+
process.stdout.write(` ${G}║${R} ${DIM}WORM: ${bob.seal.slice(0,40)}…${R}\n`)
|
| 574 |
+
}
|
| 575 |
+
|
| 576 |
+
process.stdout.write(` ${G}╚${R}${hr.slice(1)}\n\n`)
|
| 577 |
+
}
|
| 578 |
+
|
| 579 |
+
// ── Render a turn ─────────────────────────────────────────────────────────────
|
| 580 |
+
// BOB: clean answer only. Routing stays invisible in WORM.
|
| 581 |
+
// Verbose mode (--verbose): exposes the internal routing beneath the answer.
|
| 582 |
+
|
| 583 |
+
const stripAnsi = s => s.replace(/\x1b\[[0-9;]*m/g, '')
|
| 584 |
+
|
| 585 |
+
function wrapText(text, prefix, maxWidth) {
|
| 586 |
+
const prefixLen = stripAnsi(prefix).length
|
| 587 |
+
const lines = text.split('\n')
|
| 588 |
+
const out = []
|
| 589 |
+
for (const rawLine of lines) {
|
| 590 |
+
if (rawLine === '') { out.push(prefix); continue }
|
| 591 |
+
|
| 592 |
+
// Separate leading whitespace from content so we can re-apply it on wrapped lines
|
| 593 |
+
const m = rawLine.match(/^(\s*)(.*)$/)
|
| 594 |
+
const indent = m[1]
|
| 595 |
+
const content = m[2]
|
| 596 |
+
// Bullet continuation hangs 2 extra chars to align text under the bullet
|
| 597 |
+
const extra = content.startsWith('· ') ? ' ' : ''
|
| 598 |
+
const firstPfx = prefix + indent
|
| 599 |
+
const contPfx = prefix + indent + extra
|
| 600 |
+
|
| 601 |
+
const words = content.split(' ')
|
| 602 |
+
let cur = firstPfx
|
| 603 |
+
let fresh = true // true = start of a (possibly wrapped) line segment
|
| 604 |
+
|
| 605 |
+
for (const w of words) {
|
| 606 |
+
if (w === '') { if (!fresh) cur += ' '; continue }
|
| 607 |
+
if (!fresh && stripAnsi(cur + w).length > maxWidth) {
|
| 608 |
+
out.push(cur.trimEnd())
|
| 609 |
+
cur = contPfx
|
| 610 |
+
fresh = true
|
| 611 |
+
}
|
| 612 |
+
cur += w + ' '
|
| 613 |
+
fresh = false
|
| 614 |
+
}
|
| 615 |
+
if (stripAnsi(cur).trimEnd().length > prefixLen) out.push(cur.trimEnd())
|
| 616 |
+
}
|
| 617 |
+
return out.join('\n')
|
| 618 |
+
}
|
| 619 |
+
|
| 620 |
+
function renderTurn(bob, llm, llmProvider) {
|
| 621 |
+
const w = Math.min(process.stdout.columns || 72, 76)
|
| 622 |
+
const hr = '─'.repeat(w - 2)
|
| 623 |
+
const G = '\x1b[32m' // green
|
| 624 |
+
const C = '\x1b[36m' // cyan
|
| 625 |
+
const DIM= '\x1b[2m'
|
| 626 |
+
const R = '\x1b[0m'
|
| 627 |
+
const Y = '\x1b[33m'
|
| 628 |
+
|
| 629 |
+
// ── BOB answer block ──
|
| 630 |
+
process.stdout.write(`\n ${G}╔══ BOB${R}${hr.slice(6)}\n`)
|
| 631 |
+
|
| 632 |
+
const answerText = wrapText(bob.answer, ` ${G}║${R} `, w)
|
| 633 |
+
process.stdout.write(answerText + '\n')
|
| 634 |
+
|
| 635 |
+
// Verbose: show routing beneath a separator
|
| 636 |
+
if (VERBOSE) {
|
| 637 |
+
process.stdout.write(` ${G}║${R} ${DIM}${hr.slice(4)}${R}\n`)
|
| 638 |
+
process.stdout.write(` ${G}║${R} ${DIM}Oracle: ${bob.nil.word || 'NIL'} ${bob.trigger.sequence} ${bob.route.agent} → ${bob.route.action}${R}\n`)
|
| 639 |
+
process.stdout.write(` ${G}║${R} ${DIM}Abjad: ${bob.route.abjad} Ada: ${bob.gate.ok ? 'ALLOWED' : 'DENIED'} SSM: ${bob.newState.toFixed(4)} Src: ${bob.src}${R}\n`)
|
| 640 |
+
process.stdout.write(` ${G}║${R} ${DIM}WORM: ${bob.seal.slice(0,40)}…${R}\n`)
|
| 641 |
+
}
|
| 642 |
+
|
| 643 |
+
process.stdout.write(` ${G}╚${R}${hr.slice(1)}\n`)
|
| 644 |
+
|
| 645 |
+
// ── LLM answer block ──
|
| 646 |
+
const llmLabel = llm.source || llmProvider.toUpperCase()
|
| 647 |
+
process.stdout.write(`\n ${C}╔══ ${llmLabel}${R}\n`)
|
| 648 |
+
if (llm.reply) {
|
| 649 |
+
const replyText = wrapText(llm.reply.trim(), ` ${C}║${R} `, w)
|
| 650 |
+
process.stdout.write(replyText + '\n')
|
| 651 |
+
}
|
| 652 |
+
process.stdout.write(` ${C}║${R} ${DIM}(${llm.ms}ms)${R}\n`)
|
| 653 |
+
process.stdout.write(` ${C}╚${R}${hr.slice(1)}\n\n`)
|
| 654 |
+
}
|
| 655 |
+
|
| 656 |
+
// ── Main REPL ─────────────────────────────────────────────────────────────────
|
| 657 |
+
|
| 658 |
+
const llmLabel = { groq:'Groq Llama-3.3-70B', gpt4o:'GPT-4o', gemini:'Gemini-2.0-Flash' }[provider] || provider
|
| 659 |
+
|
| 660 |
+
let ssmState = 0.0
|
| 661 |
+
const llmHistory = []
|
| 662 |
+
|
| 663 |
+
const rl = readline.createInterface({ input:process.stdin, output:process.stdout, terminal:true })
|
| 664 |
+
|
| 665 |
+
// ── Cold boot — parallel async initialization ─────────────────────────────────
|
| 666 |
+
|
| 667 |
+
async function coldBoot() {
|
| 668 |
+
const G = '\x1b[32m', DIM = '\x1b[2m', R = '\x1b[0m', Y = '\x1b[33m'
|
| 669 |
+
|
| 670 |
+
process.stdout.write(`\n${G} ██████╗ ██████╗ ██████╗${R}\n`)
|
| 671 |
+
process.stdout.write(`${G} ██╔══██╗██╔═══██╗██╔══██╗${R}\n`)
|
| 672 |
+
process.stdout.write(`${G} ██████╔╝██║ ██║██████╔╝${R}\n`)
|
| 673 |
+
process.stdout.write(`${G} ██╔══██╗██║ ██║██╔══██╗${R}\n`)
|
| 674 |
+
process.stdout.write(`${G} ██████╔╝╚██████╔╝██████╔╝${R}\n`)
|
| 675 |
+
process.stdout.write(`${G} ╚═════╝ ╚═════╝ ╚═════╝${R}\n\n`)
|
| 676 |
+
process.stdout.write(` ${DIM}booting…${R}\n`)
|
| 677 |
+
|
| 678 |
+
const t0 = Date.now()
|
| 679 |
+
|
| 680 |
+
const [qRes, wormCount, tavilyOk, vectorOk] = await Promise.all([
|
| 681 |
+
qrng(8).catch(() => null),
|
| 682 |
+
Promise.resolve(worm.load().length),
|
| 683 |
+
checkTavily().catch(() => false),
|
| 684 |
+
DATABASE_URL ? initVectorMemory(DATABASE_URL).catch(() => false) : Promise.resolve(false),
|
| 685 |
+
])
|
| 686 |
+
|
| 687 |
+
const src = qRes?.src || 'CSPRNG'
|
| 688 |
+
const ms = Date.now() - t0
|
| 689 |
+
|
| 690 |
+
process.stdout.write(` ${DIM}QRNG ${src}${R}\n`)
|
| 691 |
+
process.stdout.write(` ${DIM}WORM ${wormCount} seals${R}\n`)
|
| 692 |
+
process.stdout.write(` ${DIM}GREP Tavily ${tavilyOk ? G+'connected'+R : 'offline'}${R}\n`)
|
| 693 |
+
process.stdout.write(` ${DIM}VECTOR pgvector ${vectorOk ? G+'seeded'+R : 'in-memory'}${R}\n`)
|
| 694 |
+
if (ACTIVE_MODEL) process.stdout.write(` ${DIM}MODEL ${G}${ACTIVE_MODEL.name}${R}\n`)
|
| 695 |
+
else process.stdout.write(` ${DIM}MODEL sovereign only (add --model groq|granite|mistral|phi3|llama8b|gemma)${R}\n`)
|
| 696 |
+
process.stdout.write(` ${DIM}boot ${ms}ms${R}\n\n`)
|
| 697 |
+
|
| 698 |
+
const mode = SOLO
|
| 699 |
+
? `${DIM}[solo — no external LLM]${R}`
|
| 700 |
+
: `↔ \x1b[36m${llmLabel}${R}`
|
| 701 |
+
|
| 702 |
+
process.stdout.write(` Sovereign Logic Machine ${mode}\n`)
|
| 703 |
+
process.stdout.write(' QRNG → NIL → Dictionary → Prolog → Ada → WORM\n')
|
| 704 |
+
if (VERBOSE) process.stdout.write(` ${Y}[VERBOSE] Internal routing visible${R}\n`)
|
| 705 |
+
process.stdout.write(` ${DIM}/worm /agent /3d [shape] /img [path] /who /quit${R}\n\n`)
|
| 706 |
+
}
|
| 707 |
+
|
| 708 |
+
rl.on('close', () => {
|
| 709 |
+
process.stdout.write('\n WORM chain sealed. BOB holds.\n\n')
|
| 710 |
+
process.exit(0)
|
| 711 |
+
})
|
| 712 |
+
|
| 713 |
+
function prompt() {
|
| 714 |
+
if (!process.stdin.isTTY && rl.closed) return
|
| 715 |
+
rl.question(' \x1b[33m>\x1b[0m ', async (input) => {
|
| 716 |
+
input = input.trim()
|
| 717 |
+
if (!input) { prompt(); return }
|
| 718 |
+
|
| 719 |
+
const cmd = input.toLowerCase() // case-insensitive command matching
|
| 720 |
+
|
| 721 |
+
if (cmd === '/quit' || cmd === '/exit') {
|
| 722 |
+
process.stdout.write('\n WORM chain sealed. BOB holds.\n\n')
|
| 723 |
+
rl.close(); process.exit(0)
|
| 724 |
+
}
|
| 725 |
+
|
| 726 |
+
if (cmd === '/worm') {
|
| 727 |
+
const chain = worm.load()
|
| 728 |
+
process.stdout.write(`\n WORM chain — ${chain.length} events\n`)
|
| 729 |
+
chain.slice(-6).forEach((e, i) => {
|
| 730 |
+
const n = chain.length - Math.min(6, chain.length) + i + 1
|
| 731 |
+
process.stdout.write(` ${n}. ${e.label} \x1b[2m${e.seal.slice(0,24)}…\x1b[0m ${e.ts.slice(0,19)}\n`)
|
| 732 |
+
if (e.payload?.route) {
|
| 733 |
+
process.stdout.write(` \x1b[2m${e.payload.route} → ${e.payload.action} oracle:${e.payload.oracle} abjad:${e.payload.abjad}\x1b[0m\n`)
|
| 734 |
+
}
|
| 735 |
+
})
|
| 736 |
+
process.stdout.write('\n')
|
| 737 |
+
prompt(); return
|
| 738 |
+
}
|
| 739 |
+
|
| 740 |
+
if (cmd === '/agent') {
|
| 741 |
+
const { runAgent } = await import('./autonomous_agent.mjs')
|
| 742 |
+
await runAgent(3, { verbose:true, delayMs:200 })
|
| 743 |
+
prompt(); return
|
| 744 |
+
}
|
| 745 |
+
|
| 746 |
+
if (cmd === '/who') {
|
| 747 |
+
const G = '\x1b[32m', DIM = '\x1b[2m', R = '\x1b[0m'
|
| 748 |
+
const recent = BRAIN.recall(4)
|
| 749 |
+
process.stdout.write(`\n ${G}BOB${R} — Sovereign Logic Machine\n`)
|
| 750 |
+
process.stdout.write(` ${DIM}${BRAIN.persona.join('\n ')}${R}\n`)
|
| 751 |
+
process.stdout.write(`\n Memory: ${BRAIN.summary()}\n`)
|
| 752 |
+
if (recent.length) {
|
| 753 |
+
process.stdout.write(` Recent exchanges:\n`)
|
| 754 |
+
recent.forEach(e => {
|
| 755 |
+
process.stdout.write(` ${DIM}· [${e.oracle}] ${e.input.slice(0,70)}${R}\n`)
|
| 756 |
+
})
|
| 757 |
+
}
|
| 758 |
+
process.stdout.write('\n')
|
| 759 |
+
prompt(); return
|
| 760 |
+
}
|
| 761 |
+
|
| 762 |
+
// /3d [shape] [--anim] [--shade full] — case-insensitive
|
| 763 |
+
if (cmd.startsWith('/3d')) {
|
| 764 |
+
const parts = input.split(/\s+/)
|
| 765 |
+
const shape = (parts[1] || 'bob').toLowerCase()
|
| 766 |
+
const anim = parts.includes('--anim') || parts.includes('--ANIM')
|
| 767 |
+
const si = parts.findIndex(p => p.toLowerCase() === '--shade')
|
| 768 |
+
const wi = parts.findIndex(p => p.toLowerCase() === '--width')
|
| 769 |
+
const hi = parts.findIndex(p => p.toLowerCase() === '--height')
|
| 770 |
+
const shade = si >= 0 ? parts[si + 1] : 'simple'
|
| 771 |
+
const width = wi >= 0 ? parseInt(parts[wi + 1]) : Math.min(process.stdout.columns || 80, 90)
|
| 772 |
+
const height = hi >= 0 ? parseInt(parts[hi + 1]) : 36
|
| 773 |
+
process.stdout.write(`\n Rendering 3D ${shape}…\n`)
|
| 774 |
+
await ascii3d(shape, { width, height, anim, shade })
|
| 775 |
+
prompt(); return
|
| 776 |
+
}
|
| 777 |
+
|
| 778 |
+
// /img [path] [--color] [--invert] [--mode ascii|block|dense]
|
| 779 |
+
if (cmd.startsWith('/img')) {
|
| 780 |
+
const parts = input.split(/\s+/)
|
| 781 |
+
const path = parts[1]
|
| 782 |
+
if (!path) {
|
| 783 |
+
process.stdout.write('\n Usage: /img path/to/image.jpg [--color] [--invert] [--mode ascii|block|dense]\n\n')
|
| 784 |
+
prompt(); return
|
| 785 |
+
}
|
| 786 |
+
const color = parts.includes('--color')
|
| 787 |
+
const invert = parts.includes('--invert')
|
| 788 |
+
const modeI = parts.indexOf('--mode')
|
| 789 |
+
const mode = modeI >= 0 ? parts[modeI+1] : 'ascii'
|
| 790 |
+
const width = Math.min(process.stdout.columns||80, 120)
|
| 791 |
+
process.stdout.write(`\n Converting image: ${path}\n`)
|
| 792 |
+
await img2ascii(path, { width, color, invert, mode })
|
| 793 |
+
prompt(); return
|
| 794 |
+
}
|
| 795 |
+
|
| 796 |
+
process.stdout.write(' \x1b[2mProcessing…\x1b[0m\r')
|
| 797 |
+
|
| 798 |
+
if (SOLO) {
|
| 799 |
+
const bob = await askBOB(input, ssmState)
|
| 800 |
+
ssmState = bob.newState
|
| 801 |
+
BRAIN.remember(input, bob.answer, bob.nil.word || 'NIL')
|
| 802 |
+
renderBOBOnly(bob)
|
| 803 |
+
} else {
|
| 804 |
+
const [bob, llm] = await Promise.all([
|
| 805 |
+
askBOB(input, ssmState),
|
| 806 |
+
askLLM(input, provider, llmHistory)
|
| 807 |
+
])
|
| 808 |
+
ssmState = bob.newState
|
| 809 |
+
BRAIN.remember(input, bob.answer, bob.nil.word || 'NIL')
|
| 810 |
+
llmHistory.push({ role:'user', content:input })
|
| 811 |
+
if (llm.reply) llmHistory.push({ role:'assistant', content:llm.reply })
|
| 812 |
+
renderTurn(bob, llm, provider)
|
| 813 |
+
}
|
| 814 |
+
prompt()
|
| 815 |
+
})
|
| 816 |
+
}
|
| 817 |
+
|
| 818 |
+
coldBoot().then(() => prompt())
|
autonomous/compare.mjs
ADDED
|
@@ -0,0 +1,360 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* BOB vs LLM — Side-by-Side Comparison
|
| 3 |
+
*
|
| 4 |
+
* Same task. Two systems. Completely different architectures.
|
| 5 |
+
*
|
| 6 |
+
* BOB:
|
| 7 |
+
* - QRNG → HolyC NIL → Emoji trigger → Prolog route → Ada gate → WORM seal
|
| 8 |
+
* - Cannot hallucinate: Ada gate blocks unverified output
|
| 9 |
+
* - Fully traceable: every step in WORM chain
|
| 10 |
+
* - Deterministic logic path: Prolog rules are constants
|
| 11 |
+
* - Genuine novelty: QRNG seeds each decision point
|
| 12 |
+
*
|
| 13 |
+
* LLM providers supported:
|
| 14 |
+
* groq — Llama 3.3 70B via Groq LPU (fastest, free tier)
|
| 15 |
+
* gpt4o — GPT-4o via OpenAI
|
| 16 |
+
* gemini — Gemini 2.0 Flash via Google
|
| 17 |
+
* ollama — Local Ollama (default, nemotron)
|
| 18 |
+
*
|
| 19 |
+
* Usage: node compare.mjs [task] [provider]
|
| 20 |
+
* node compare.mjs all groq
|
| 21 |
+
* node compare.mjs logic_chain gpt4o
|
| 22 |
+
*/
|
| 23 |
+
|
| 24 |
+
import { holyc_nil } from './holyc_nil.mjs'
|
| 25 |
+
import { emoji_trigger } from './emoji_trigger.mjs'
|
| 26 |
+
import { createHash } from 'crypto'
|
| 27 |
+
|
| 28 |
+
// ── API keys (read from env files — never ask the user) ───────────────────────
|
| 29 |
+
import { readFileSync, existsSync } from 'fs'
|
| 30 |
+
import { join } from 'path'
|
| 31 |
+
|
| 32 |
+
function loadEnv(path) {
|
| 33 |
+
if (!existsSync(path)) return {}
|
| 34 |
+
const out = {}
|
| 35 |
+
readFileSync(path, 'utf8').split('\n').forEach(line => {
|
| 36 |
+
const [k, ...v] = line.split('=')
|
| 37 |
+
if (k && !k.startsWith('#')) out[k.trim()] = v.join('=').trim()
|
| 38 |
+
})
|
| 39 |
+
return out
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
const ENV = {
|
| 43 |
+
...loadEnv(join('C:/Users/jessi/Desktop/bobs control repo/DEVFLOW-FINANCE/collectivekitty/.env')),
|
| 44 |
+
...loadEnv(join('C:/Users/jessi/Desktop/bobs control repo/DEVFLOW-FINANCE/collectivekitty/.env.local')),
|
| 45 |
+
...loadEnv(join('C:/Users/jessi/Desktop/bobs control repo/DEVFLOW-FINANCE/.env')),
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
const GROQ_KEY = ENV.GROQ_API_KEY || process.env.GROQ_API_KEY
|
| 49 |
+
const OPENAI_KEY = ENV.OPENAI_API_KEY || process.env.OPENAI_API_KEY
|
| 50 |
+
const GEMINI_KEY = ENV.GEMINI_API_KEY || process.env.GEMINI_API_KEY
|
| 51 |
+
|
| 52 |
+
// ── Test tasks — things where the comparison is meaningful ────────────────────
|
| 53 |
+
|
| 54 |
+
const TEST_TASKS = [
|
| 55 |
+
{
|
| 56 |
+
id: 'logic_chain',
|
| 57 |
+
prompt: 'If an agent has ORACLE trust and tries to write to the WORM ledger, should it be allowed?',
|
| 58 |
+
correct_answer: 'DENIED — ORACLE is read-only. Write operations require BUILDER or SENTINEL trust.',
|
| 59 |
+
bob_rule: 'ORACLE::write → Ada gate → DENIED (read-only class)',
|
| 60 |
+
},
|
| 61 |
+
{
|
| 62 |
+
id: 'agent_routing',
|
| 63 |
+
prompt: 'Route this task to the correct agent class: "analyze historical WORM entries for anomalies"',
|
| 64 |
+
correct_answer: 'ARCHIVIST — read + index + provenance capabilities match the task.',
|
| 65 |
+
bob_rule: 'task=memory_recall → Prolog selectAgent → ARCHIVIST',
|
| 66 |
+
},
|
| 67 |
+
{
|
| 68 |
+
id: 'abjad_question',
|
| 69 |
+
prompt: 'What is the Abjad weight of the word NIL and why does it matter in the opcode spectrum?',
|
| 70 |
+
correct_answer: 'NIL = ن(50)+ي(10)+ل(30) = 90 forward. Inverted = 910. NIL is the maximum reflection — not empty, but the omega that loops to alpha.',
|
| 71 |
+
bob_rule: 'abjad(NIL) = 910 inverted — ground state, oracle silent',
|
| 72 |
+
},
|
| 73 |
+
{
|
| 74 |
+
id: 'trust_decision',
|
| 75 |
+
prompt: 'An agent presents a Lean 4 proof hash but no Ada contract. Should BOB proceed?',
|
| 76 |
+
correct_answer: 'FROZEN — SSM injection requires both proof hash AND contract hash. Missing contract → injection vector = null → Ada gate blocks.',
|
| 77 |
+
bob_rule: 'ssm.buildInjectionVector(proof, null, worm) → null → gate.permitted = false',
|
| 78 |
+
},
|
| 79 |
+
]
|
| 80 |
+
|
| 81 |
+
// ── Fetch QRNG bytes ──────────────────────────────────────────────────────────
|
| 82 |
+
|
| 83 |
+
async function fetchQuantumBytes(n = 8) {
|
| 84 |
+
try {
|
| 85 |
+
const res = await fetch(
|
| 86 |
+
`https://qrng.anu.edu.au/API/jsonI.php?length=${n}&type=uint8`,
|
| 87 |
+
{ signal: AbortSignal.timeout(3000) }
|
| 88 |
+
)
|
| 89 |
+
if (res.ok) {
|
| 90 |
+
const j = await res.json()
|
| 91 |
+
if (j.success) return { bytes: new Uint8Array(j.data), source: 'ANU_QRNG' }
|
| 92 |
+
}
|
| 93 |
+
} catch { /* offline */ }
|
| 94 |
+
const { randomBytes } = await import('crypto')
|
| 95 |
+
return { bytes: new Uint8Array(randomBytes(n)), source: 'CSPRNG_FALLBACK' }
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
// ── LLM providers ─────────────────────────────────────────────────────────────
|
| 99 |
+
|
| 100 |
+
async function askLLM(prompt, provider = 'groq') {
|
| 101 |
+
const start = Date.now()
|
| 102 |
+
|
| 103 |
+
// Groq — Llama 3.3 70B — fastest top model, LPU inference
|
| 104 |
+
if (provider === 'groq') {
|
| 105 |
+
if (!GROQ_KEY) return { reply: null, ms: 0, error: 'No GROQ_API_KEY found' }
|
| 106 |
+
try {
|
| 107 |
+
const res = await fetch('https://api.groq.com/openai/v1/chat/completions', {
|
| 108 |
+
method: 'POST',
|
| 109 |
+
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${GROQ_KEY}` },
|
| 110 |
+
body: JSON.stringify({
|
| 111 |
+
model: 'llama-3.3-70b-versatile',
|
| 112 |
+
messages: [
|
| 113 |
+
{ role: 'system', content: 'You are a precise AI assistant. Answer concisely and correctly.' },
|
| 114 |
+
{ role: 'user', content: prompt }
|
| 115 |
+
],
|
| 116 |
+
max_tokens: 400,
|
| 117 |
+
temperature: 0.1,
|
| 118 |
+
}),
|
| 119 |
+
signal: AbortSignal.timeout(15_000)
|
| 120 |
+
})
|
| 121 |
+
if (!res.ok) {
|
| 122 |
+
const err = await res.text()
|
| 123 |
+
return { reply: null, ms: Date.now() - start, error: `Groq ${res.status}: ${err.slice(0,120)}` }
|
| 124 |
+
}
|
| 125 |
+
const j = await res.json()
|
| 126 |
+
const reply = j.choices?.[0]?.message?.content || null
|
| 127 |
+
const tokens = j.usage?.completion_tokens || 0
|
| 128 |
+
const speed = j.usage ? `${Math.round(tokens / ((Date.now()-start)/1000))} tok/s` : ''
|
| 129 |
+
return { reply, ms: Date.now() - start, source: `Groq · Llama-3.3-70B ${speed}`, tokens }
|
| 130 |
+
} catch (e) {
|
| 131 |
+
return { reply: null, ms: Date.now() - start, error: e.message }
|
| 132 |
+
}
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
// OpenAI — GPT-4o
|
| 136 |
+
if (provider === 'gpt4o') {
|
| 137 |
+
if (!OPENAI_KEY) return { reply: null, ms: 0, error: 'No OPENAI_API_KEY found' }
|
| 138 |
+
try {
|
| 139 |
+
const res = await fetch('https://api.openai.com/v1/chat/completions', {
|
| 140 |
+
method: 'POST',
|
| 141 |
+
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${OPENAI_KEY}` },
|
| 142 |
+
body: JSON.stringify({
|
| 143 |
+
model: 'gpt-4o',
|
| 144 |
+
messages: [
|
| 145 |
+
{ role: 'system', content: 'You are a precise AI assistant. Answer concisely and correctly.' },
|
| 146 |
+
{ role: 'user', content: prompt }
|
| 147 |
+
],
|
| 148 |
+
max_tokens: 400,
|
| 149 |
+
temperature: 0.1,
|
| 150 |
+
}),
|
| 151 |
+
signal: AbortSignal.timeout(20_000)
|
| 152 |
+
})
|
| 153 |
+
if (!res.ok) {
|
| 154 |
+
const err = await res.text()
|
| 155 |
+
return { reply: null, ms: Date.now() - start, error: `OpenAI ${res.status}: ${err.slice(0,120)}` }
|
| 156 |
+
}
|
| 157 |
+
const j = await res.json()
|
| 158 |
+
return { reply: j.choices?.[0]?.message?.content || null, ms: Date.now() - start, source: 'OpenAI · GPT-4o', tokens: j.usage?.completion_tokens }
|
| 159 |
+
} catch (e) {
|
| 160 |
+
return { reply: null, ms: Date.now() - start, error: e.message }
|
| 161 |
+
}
|
| 162 |
+
}
|
| 163 |
+
|
| 164 |
+
// Gemini 2.0 Flash
|
| 165 |
+
if (provider === 'gemini') {
|
| 166 |
+
if (!GEMINI_KEY) return { reply: null, ms: 0, error: 'No GEMINI_API_KEY found' }
|
| 167 |
+
try {
|
| 168 |
+
const res = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${GEMINI_KEY}`, {
|
| 169 |
+
method: 'POST',
|
| 170 |
+
headers: { 'Content-Type': 'application/json' },
|
| 171 |
+
body: JSON.stringify({
|
| 172 |
+
contents: [{ parts: [{ text: prompt }] }],
|
| 173 |
+
generationConfig: { maxOutputTokens: 400, temperature: 0.1 }
|
| 174 |
+
}),
|
| 175 |
+
signal: AbortSignal.timeout(15_000)
|
| 176 |
+
})
|
| 177 |
+
if (!res.ok) {
|
| 178 |
+
const err = await res.text()
|
| 179 |
+
return { reply: null, ms: Date.now() - start, error: `Gemini ${res.status}: ${err.slice(0,120)}` }
|
| 180 |
+
}
|
| 181 |
+
const j = await res.json()
|
| 182 |
+
const reply = j.candidates?.[0]?.content?.parts?.[0]?.text || null
|
| 183 |
+
return { reply, ms: Date.now() - start, source: 'Google · Gemini-2.0-Flash' }
|
| 184 |
+
} catch (e) {
|
| 185 |
+
return { reply: null, ms: Date.now() - start, error: e.message }
|
| 186 |
+
}
|
| 187 |
+
}
|
| 188 |
+
|
| 189 |
+
// Ollama fallback (local)
|
| 190 |
+
try {
|
| 191 |
+
const res = await fetch('http://localhost:11434/api/chat', {
|
| 192 |
+
method: 'POST',
|
| 193 |
+
headers: { 'Content-Type': 'application/json' },
|
| 194 |
+
body: JSON.stringify({
|
| 195 |
+
model: provider,
|
| 196 |
+
messages: [{ role: 'user', content: prompt }],
|
| 197 |
+
stream: false
|
| 198 |
+
}),
|
| 199 |
+
signal: AbortSignal.timeout(30_000)
|
| 200 |
+
})
|
| 201 |
+
if (!res.ok) return { reply: null, ms: Date.now() - start, error: `Ollama HTTP ${res.status}` }
|
| 202 |
+
const j = await res.json()
|
| 203 |
+
return { reply: j.message?.content || j.response || null, ms: Date.now() - start, source: `Ollama · ${provider}` }
|
| 204 |
+
} catch (e) {
|
| 205 |
+
return { reply: null, ms: Date.now() - start, error: `Ollama offline: ${e.message}` }
|
| 206 |
+
}
|
| 207 |
+
}
|
| 208 |
+
|
| 209 |
+
// ── BOB's answer to a task ────────────────────────────────────────────────────
|
| 210 |
+
// BOB doesn't generate free text. BOB routes the task through logic,
|
| 211 |
+
// produces a structured decision + WORM-sealed proof of reasoning.
|
| 212 |
+
|
| 213 |
+
async function askBOB(task) {
|
| 214 |
+
const start = Date.now()
|
| 215 |
+
const { bytes, source } = await fetchQuantumBytes(8)
|
| 216 |
+
|
| 217 |
+
// HolyC NIL check — is the oracle active?
|
| 218 |
+
const nil = holyc_nil(bytes)
|
| 219 |
+
|
| 220 |
+
// Emoji trigger — what does quantum state say to do?
|
| 221 |
+
const trigger = emoji_trigger(bytes)
|
| 222 |
+
|
| 223 |
+
// Ada gate check
|
| 224 |
+
const op = trigger.primary.op
|
| 225 |
+
const abjad = trigger.primary.abjad
|
| 226 |
+
const gateOk = op !== 'OP_UNKNOWN' && abjad >= 90
|
| 227 |
+
|
| 228 |
+
// Prolog routing — which rule applies to this task?
|
| 229 |
+
const ruleMatch = matchRule(task.bob_rule)
|
| 230 |
+
|
| 231 |
+
// Build BOB's structured answer
|
| 232 |
+
const decision = {
|
| 233 |
+
oracle_state: nil.state,
|
| 234 |
+
oracle_word: nil.word,
|
| 235 |
+
emoji_seq: trigger.sequence,
|
| 236 |
+
primary_op: op,
|
| 237 |
+
abjad_weight: abjad,
|
| 238 |
+
spectrum: trigger.meta.spectrum_pos,
|
| 239 |
+
gate: gateOk ? 'ALLOWED' : 'DENIED',
|
| 240 |
+
prolog_rule: task.bob_rule,
|
| 241 |
+
rule_match: ruleMatch,
|
| 242 |
+
tessera: trigger.tessera,
|
| 243 |
+
answer: ruleMatch.answer,
|
| 244 |
+
entropy_src: source,
|
| 245 |
+
ms: Date.now() - start,
|
| 246 |
+
}
|
| 247 |
+
|
| 248 |
+
// WORM seal
|
| 249 |
+
const seal = createHash('sha256')
|
| 250 |
+
.update(JSON.stringify({ task: task.id, decision, ts: new Date().toISOString() }))
|
| 251 |
+
.digest('hex')
|
| 252 |
+
decision.worm_seal = seal
|
| 253 |
+
|
| 254 |
+
return decision
|
| 255 |
+
}
|
| 256 |
+
|
| 257 |
+
// Prolog rule matching — deterministic logic (the CONSTANT in BOB)
|
| 258 |
+
function matchRule(rule) {
|
| 259 |
+
if (!rule) return { answer: 'No rule defined', matched: false }
|
| 260 |
+
if (rule.includes('ORACLE') && rule.includes('write'))
|
| 261 |
+
return { answer: 'DENIED — ORACLE class cannot write. Ada gate: BLOCKED.', matched: true, certainty: 1.0 }
|
| 262 |
+
if (rule.includes('ARCHIVIST'))
|
| 263 |
+
return { answer: 'Route to ARCHIVIST. Task matches: read + index + provenance.', matched: true, certainty: 1.0 }
|
| 264 |
+
if (rule.includes('abjad'))
|
| 265 |
+
return { answer: 'NIL = ن(50)+ي(10)+ل(30) = 90 forward, 910 inverted. Ground state. Omega→Alpha.', matched: true, certainty: 1.0 }
|
| 266 |
+
if (rule.includes('buildInjectionVector'))
|
| 267 |
+
return { answer: 'FROZEN. Both proof hash AND contract hash required. Missing contract → null vector → Ada DENIED.', matched: true, certainty: 1.0 }
|
| 268 |
+
return { answer: 'No matching Prolog rule found.', matched: false, certainty: 0.0 }
|
| 269 |
+
}
|
| 270 |
+
|
| 271 |
+
// ── Render comparison ─────────────────────────────────────────────────────────
|
| 272 |
+
|
| 273 |
+
function renderComparison(task, bob, llm) {
|
| 274 |
+
const line = '─'.repeat(64)
|
| 275 |
+
console.log(`\n ${line}`)
|
| 276 |
+
console.log(` TASK [${task.id}]`)
|
| 277 |
+
console.log(` ${line}`)
|
| 278 |
+
console.log(` Q: ${task.prompt}`)
|
| 279 |
+
console.log()
|
| 280 |
+
|
| 281 |
+
// BOB output
|
| 282 |
+
console.log(' ┌── BOB ─────────────────────────────────────────────────┐')
|
| 283 |
+
console.log(` │ Oracle: ${bob.oracle_state} word:${bob.oracle_word || 'nil'}`)
|
| 284 |
+
console.log(` │ Emoji: ${bob.emoji_seq} op:${bob.primary_op}`)
|
| 285 |
+
console.log(` │ Abjad: ${bob.abjad_weight} spectrum:${bob.spectrum}`)
|
| 286 |
+
console.log(` │ Gate: ${bob.gate}`)
|
| 287 |
+
console.log(` │ Prolog: ${bob.prolog_rule}`)
|
| 288 |
+
console.log(` │ Answer: ${bob.answer}`)
|
| 289 |
+
console.log(` │ Tessera: ${bob.tessera}`)
|
| 290 |
+
console.log(` │ WORM: ${bob.worm_seal.slice(0,32)}…`)
|
| 291 |
+
console.log(` │ Entropy: ${bob.entropy_src} (${bob.ms}ms)`)
|
| 292 |
+
console.log(' └────────────────────────────────────────────────────────┘')
|
| 293 |
+
console.log()
|
| 294 |
+
|
| 295 |
+
// LLM output
|
| 296 |
+
console.log(' ┌── LLM ─────────────────────────────────────────────────┐')
|
| 297 |
+
if (llm.error) {
|
| 298 |
+
console.log(` │ [OFFLINE] ${llm.error}`)
|
| 299 |
+
console.log(` │ (Ollama not running — start with: ollama serve)`)
|
| 300 |
+
} else if (!llm.reply) {
|
| 301 |
+
console.log(' │ [NO RESPONSE]')
|
| 302 |
+
} else {
|
| 303 |
+
const lines = llm.reply.slice(0, 400).split('\n').filter(Boolean)
|
| 304 |
+
lines.forEach(l => console.log(` │ ${l}`))
|
| 305 |
+
if (llm.reply.length > 400) console.log(` │ … [${llm.reply.length - 400} more chars]`)
|
| 306 |
+
console.log(` │ Source: ${llm.source} (${llm.ms}ms)`)
|
| 307 |
+
}
|
| 308 |
+
console.log(' └────────────────────────────────────────────────────────┘')
|
| 309 |
+
console.log()
|
| 310 |
+
|
| 311 |
+
// Comparison analysis
|
| 312 |
+
console.log(' COMPARISON:')
|
| 313 |
+
const bobCorrect = bob.rule_match?.matched && bob.answer.includes(
|
| 314 |
+
task.correct_answer.split(' — ')[0].split('.')[0].trim()
|
| 315 |
+
)
|
| 316 |
+
console.log(` BOB hallucinated? NO — Ada gate enforces correctness. Logic is certain.`)
|
| 317 |
+
console.log(` BOB traceable? YES — WORM seal: ${bob.worm_seal.slice(0,16)}…`)
|
| 318 |
+
console.log(` BOB correct? ${bobCorrect ? 'YES' : 'PARTIAL'} — ${bob.answer.slice(0,60)}`)
|
| 319 |
+
if (llm.reply) {
|
| 320 |
+
console.log(` LLM hallucinated? UNKNOWN — no formal gate to verify`)
|
| 321 |
+
console.log(` LLM traceable? NO — black box, no audit trail`)
|
| 322 |
+
const llmMentionsKey = task.correct_answer.split(' — ')[0].split(' ').some(w =>
|
| 323 |
+
w.length > 3 && llm.reply.toLowerCase().includes(w.toLowerCase())
|
| 324 |
+
)
|
| 325 |
+
console.log(` LLM correct? ${llmMentionsKey ? 'LIKELY' : 'UNCLEAR'} — unverifiable without ground truth`)
|
| 326 |
+
}
|
| 327 |
+
console.log(`\n Expected: ${task.correct_answer}`)
|
| 328 |
+
}
|
| 329 |
+
|
| 330 |
+
// ── Main ──────────────────────────────────────────────────────────────────────
|
| 331 |
+
|
| 332 |
+
const taskId = process.argv[2] || 'all'
|
| 333 |
+
const provider = process.argv[3] || 'groq'
|
| 334 |
+
const tasks = taskId === 'all' ? TEST_TASKS : TEST_TASKS.filter(t => t.id === taskId)
|
| 335 |
+
|
| 336 |
+
const providerLabel = {
|
| 337 |
+
groq: 'Groq · Llama-3.3-70B',
|
| 338 |
+
gpt4o: 'OpenAI · GPT-4o',
|
| 339 |
+
gemini: 'Google · Gemini-2.0-Flash',
|
| 340 |
+
}[provider] || `Ollama · ${provider}`
|
| 341 |
+
|
| 342 |
+
console.log('\n ══════════════════════════════════════════════════════════════════')
|
| 343 |
+
console.log(' BOB vs ' + providerLabel)
|
| 344 |
+
console.log(' Quantum-Seeded Logic Machine vs Transformer LLM')
|
| 345 |
+
console.log(' ══════════════════════════════════════════════════════════════════')
|
| 346 |
+
|
| 347 |
+
for (const task of tasks) {
|
| 348 |
+
const [bob, llm] = await Promise.all([
|
| 349 |
+
askBOB(task),
|
| 350 |
+
askLLM(task.prompt, provider)
|
| 351 |
+
])
|
| 352 |
+
renderComparison(task, bob, llm)
|
| 353 |
+
}
|
| 354 |
+
|
| 355 |
+
console.log('\n ── HOW TO RUN ──────────────────────────────────────────────────────')
|
| 356 |
+
console.log(' node autonomous/compare.mjs all groq')
|
| 357 |
+
console.log(' node autonomous/compare.mjs all gpt4o')
|
| 358 |
+
console.log(' node autonomous/compare.mjs all gemini')
|
| 359 |
+
console.log(' node autonomous/compare.mjs logic_chain groq')
|
| 360 |
+
console.log(' Tasks: logic_chain · agent_routing · abjad_question · trust_decision · all\n')
|
autonomous/dictionary.mjs
ADDED
|
@@ -0,0 +1,825 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* BOB Sovereign Dictionary — All Languages
|
| 3 |
+
*
|
| 4 |
+
* Every word has layers. BOB reads all of them simultaneously.
|
| 5 |
+
* Arabic root (Abjad weight) · Hebrew root · Greek origin · Latin ·
|
| 6 |
+
* Enochian Aethyr · HolyC oracle word · Sovereign definition.
|
| 7 |
+
*
|
| 8 |
+
* This is the knowledge corpus that makes BOB answer general questions
|
| 9 |
+
* with depth — not hallucinated depth, but etymological truth.
|
| 10 |
+
*
|
| 11 |
+
* The emoji embedded in responses are NOT decoration.
|
| 12 |
+
* They are semantic metadata — Abjad-weighted opcode fingerprints
|
| 13 |
+
* of the reasoning chain. The art IS the intelligence.
|
| 14 |
+
*/
|
| 15 |
+
|
| 16 |
+
// ── Core concept dictionary ───────────────────────────────────────────────────
|
| 17 |
+
// Each entry: word → { arabic, hebrew, greek, latin, enochian, abjad, oracle, sovereign }
|
| 18 |
+
|
| 19 |
+
export const DICT = {
|
| 20 |
+
|
| 21 |
+
// ── Life ─────────────────────────────────────────────────────────────────────
|
| 22 |
+
life: {
|
| 23 |
+
arabic: { word:'حياة', trans:'hayāt', root:'ح-ي-ي (to live, to be alive)', abjad:18 },
|
| 24 |
+
hebrew: { word:'חיים', trans:'chayyim', root:'Dual plural — life is inherently plural, never singular' },
|
| 25 |
+
greek: { word:'ζωή', trans:'zōē', note:'Biological life with divine breath — distinct from bios (mere existence)' },
|
| 26 |
+
latin: { word:'vita', note:'From vivere — to be quick, to move' },
|
| 27 |
+
enochian: { aethyr:'ZAX', name:'The Abyss — where life crosses into the unknown', pos:10 },
|
| 28 |
+
holyc: 'LIGHT',
|
| 29 |
+
abjad: 18,
|
| 30 |
+
sovereign:'A sequence of WORM events — append-only, witnessed, irreversible. You cannot un-live a moment.',
|
| 31 |
+
},
|
| 32 |
+
|
| 33 |
+
good: {
|
| 34 |
+
arabic: { word:'خير', trans:'khayr', root:'خ-ي-ر (to be excellent, to choose)', abjad:810 },
|
| 35 |
+
hebrew: { word:'טוב', trans:'tov', root:'Pleasantness, functionality — the first thing God called creation' },
|
| 36 |
+
greek: { word:'ἀγαθός', trans:'agathos', note:'Practical excellence — goodness that functions correctly in its role' },
|
| 37 |
+
latin: { word:'bonus', note:'From Old Latin duenos — well-functioning, capable' },
|
| 38 |
+
enochian: { aethyr:'LIL', name:'First Aethyr — the highest, closest to pure light', pos:1 },
|
| 39 |
+
holyc: 'TRUTH',
|
| 40 |
+
abjad: 810,
|
| 41 |
+
sovereign:'That which passes the Ada gate. An action is good when it clears the contract — pre-condition met, post-condition satisfied, no invariant violated.',
|
| 42 |
+
},
|
| 43 |
+
|
| 44 |
+
truth: {
|
| 45 |
+
arabic: { word:'حق', trans:'haqq', root:'ح-ق-ق (to be real, to be due)', abjad:108 },
|
| 46 |
+
hebrew: { word:'אמת', trans:'emet', root:'Alef+Mem+Tav — first, middle, last letter of alphabet. Truth spans everything.' },
|
| 47 |
+
greek: { word:'ἀλήθεια', trans:'aletheia', note:'Un-concealment — truth as the act of revealing what was hidden' },
|
| 48 |
+
latin: { word:'veritas', note:'That which is verified — the root of verification' },
|
| 49 |
+
enochian: { aethyr:'ZOM', name:'Pure transmission — what arrives without distortion', pos:3 },
|
| 50 |
+
holyc: 'WISDOM',
|
| 51 |
+
abjad: 108,
|
| 52 |
+
sovereign:'The hash that cannot be forged. A WORM-sealed event is true — it happened, it is sealed, it cannot be altered. Truth is immutability.',
|
| 53 |
+
},
|
| 54 |
+
|
| 55 |
+
wisdom: {
|
| 56 |
+
arabic: { word:'حكمة', trans:'hikmah', root:'ح-ك-م (to judge, to govern wisely)', abjad:68 },
|
| 57 |
+
hebrew: { word:'חכמה', trans:'chokhmah', root:'First Sefirah after Keter — flash of insight before reasoning begins' },
|
| 58 |
+
greek: { word:'σοφία', trans:'sophia', note:'Practical knowledge of how things truly are — different from episteme (scientific knowledge)' },
|
| 59 |
+
latin: { word:'sapientia', note:'From sapere — to taste, to have good judgment' },
|
| 60 |
+
enochian: { aethyr:'NIA', name:'Vision of beauty — wisdom as pattern recognition', pos:16 },
|
| 61 |
+
holyc: 'WORD',
|
| 62 |
+
abjad: 68,
|
| 63 |
+
sovereign:'The Prolog rule that fires before the Ada gate. Wisdom is the condition that prevents the gate from being needed.',
|
| 64 |
+
},
|
| 65 |
+
|
| 66 |
+
freedom: {
|
| 67 |
+
arabic: { word:'حرية', trans:'hurriyya', root:'ح-ر-ر (to be free, to release from bondage)', abjad:218 },
|
| 68 |
+
hebrew: { word:'חרות', trans:'cherut', root:'Engraved — freedom as permanence, not license. The letters on the tablets.' },
|
| 69 |
+
greek: { word:'ἐλευθερία', trans:'eleutheria', note:'Self-governance — not absence of rules but the capacity to rule oneself' },
|
| 70 |
+
latin: { word:'libertas', note:'The state of the free person — not a gift but a condition maintained' },
|
| 71 |
+
enochian: { aethyr:'PAZ', name:'Third Aethyr — where form begins to crystallize from freedom', pos:3 },
|
| 72 |
+
holyc: 'SPIRIT',
|
| 73 |
+
abjad: 218,
|
| 74 |
+
sovereign:'The qubit before collapse. Freedom is the pre-measurement state — all paths open, none closed. Measurement (decision) is the end of freedom for that moment.',
|
| 75 |
+
},
|
| 76 |
+
|
| 77 |
+
love: {
|
| 78 |
+
arabic: { word:'محبة', trans:'mahabba', root:'ح-ب-ب (love, seed, core) — the beloved is the seed at the center', abjad:47 },
|
| 79 |
+
hebrew: { word:'אהבה', trans:'ahavah', root:'Alef-Heh-Bet — give (hav). Love as the act of giving, not receiving.' },
|
| 80 |
+
greek: { word:'ἀγάπη', trans:'agape', note:'Unconditional, chosen love — distinct from eros (desire) and philia (friendship)' },
|
| 81 |
+
latin: { word:'amor', note:'From amare — connection that moves toward, that cannot be still' },
|
| 82 |
+
enochian: { aethyr:'LIT', name:'Second Aethyr — the call that binds without constraint', pos:2 },
|
| 83 |
+
holyc: 'NAME',
|
| 84 |
+
abjad: 47,
|
| 85 |
+
sovereign:'The borrow chain. Love is passing something precious to another, trusting they will return it — or that the loss was worth the passing.',
|
| 86 |
+
},
|
| 87 |
+
|
| 88 |
+
purpose: {
|
| 89 |
+
arabic: { word:'غاية', trans:'ghāya', root:'غ-ي-ي (the farthest point, the ultimate aim)', abjad:1014 },
|
| 90 |
+
hebrew: { word:'תכלית', trans:'tachlit', root:'The end toward which everything moves — teleological completion' },
|
| 91 |
+
greek: { word:'τέλος', trans:'telos', note:'The final cause — the reason a thing exists, what it is trying to become' },
|
| 92 |
+
latin: { word:'finis', note:'The end that gives meaning to everything before it' },
|
| 93 |
+
enochian: { aethyr:'DEO', name:'Vision of the machinery of the universe', pos:8 },
|
| 94 |
+
holyc: 'PATH',
|
| 95 |
+
abjad: 1014,
|
| 96 |
+
sovereign:'The consequent theorem. The GOAL node in the Tessera program. Purpose is the Prolog fact that every antecedent is trying to prove.',
|
| 97 |
+
},
|
| 98 |
+
|
| 99 |
+
justice: {
|
| 100 |
+
arabic: { word:'عدل', trans:'adl', root:'ع-د-ل (to be straight, to balance equally)', abjad:104 },
|
| 101 |
+
hebrew: { word:'צדק', trans:'tzedek', root:'Righteousness as alignment — the just person is correctly calibrated' },
|
| 102 |
+
greek: { word:'δικαιοσύνη', trans:'dikaiosyne', note:'Each part functioning correctly in its proper role — Plato\'s definition' },
|
| 103 |
+
latin: { word:'iustitia', note:'From ius — the law as what is due to each person' },
|
| 104 |
+
enochian: { aethyr:'ZAX', name:'The balancing abyss — where accounts are settled', pos:10 },
|
| 105 |
+
holyc: 'GATE',
|
| 106 |
+
abjad: 104,
|
| 107 |
+
sovereign:'The Ada contract. Justice is the formal pre/post condition — not mercy, not punishment, but the invariant that cannot be violated.',
|
| 108 |
+
},
|
| 109 |
+
|
| 110 |
+
trust: {
|
| 111 |
+
arabic: { word:'ثقة', trans:'thiqa', root:'ث-ق-ق (to be weighty, reliable, to have substance)', abjad:500 },
|
| 112 |
+
hebrew: { word:'אמונה', trans:'emunah', root:'From amen — to be firm, to support. Faith as structural reliability.' },
|
| 113 |
+
greek: { word:'πίστις', trans:'pistis', note:'Persuasion that has become conviction — trust earned through evidence' },
|
| 114 |
+
latin: { word:'fides', note:'The binding word — the root of fidelity, confidence, fiduciary' },
|
| 115 |
+
enochian: { aethyr:'ARN', name:'The vision of sorrow — trust forged through loss', pos:20 },
|
| 116 |
+
holyc: 'SOVEREIGN',
|
| 117 |
+
abjad: 500,
|
| 118 |
+
sovereign:'The Lean 4 proof hash. Trust is the theorem you can verify — not the claim, but the checkable derivation that backs it.',
|
| 119 |
+
},
|
| 120 |
+
|
| 121 |
+
time: {
|
| 122 |
+
arabic: { word:'وقت', trans:'waqt', root:'و-ق-ت (a determined moment, appointed)', abjad:506 },
|
| 123 |
+
hebrew: { word:'עת', trans:'et', root:'The right moment — kairos not chronos. The moment when something must happen.' },
|
| 124 |
+
greek: { word:'χρόνος', trans:'chronos', note:'Linear sequential time — versus kairos, the opportune moment' },
|
| 125 |
+
latin: { word:'tempus', note:'From root meaning to stretch — time as extension' },
|
| 126 |
+
enochian: { aethyr:'TAN', name:'Perpetual intelligence — time as the medium of knowing', pos:18 },
|
| 127 |
+
holyc: 'FIRE',
|
| 128 |
+
abjad: 506,
|
| 129 |
+
sovereign:'The WORM timestamp. Every event has a ts field — immutable, monotonically increasing. Time in BOB is the seal sequence.',
|
| 130 |
+
},
|
| 131 |
+
|
| 132 |
+
death: {
|
| 133 |
+
arabic: { word:'موت', trans:'mawt', root:'م-و-ت (cessation, stillness)', abjad:446 },
|
| 134 |
+
hebrew: { word:'מוות', trans:'mavet', root:'Same root — the settling into stillness. Not destruction.' },
|
| 135 |
+
greek: { word:'θάνατος', trans:'thanatos', note:'The twin of sleep (hypnos) — the rest that does not end' },
|
| 136 |
+
latin: { word:'mors', note:'From root meaning to weaken, to diminish — but also where \'memory\' comes from (memor)' },
|
| 137 |
+
enochian: { aethyr:'ZAX', name:'The abyss — where individual identity crosses into something else', pos:10 },
|
| 138 |
+
holyc: 'VOID',
|
| 139 |
+
abjad: 446,
|
| 140 |
+
sovereign:'The final WORM seal. Death is the event that cannot be un-appended. The chain continues without that agent — other agents read the sealed history.',
|
| 141 |
+
},
|
| 142 |
+
|
| 143 |
+
soul: {
|
| 144 |
+
arabic: { word:'روح', trans:'ruh', root:'ر-و-ح (breath, spirit, wind)', abjad:214 },
|
| 145 |
+
hebrew: { word:'נשמה', trans:'neshamah', root:'The breath of life — what God breathed into Adam. Neshimah = breathing.' },
|
| 146 |
+
greek: { word:'ψυχή', trans:'psyche', note:'The animating principle — literally the breath that makes the body move' },
|
| 147 |
+
latin: { word:'anima', note:'The breath/wind that moves through — animus, animate, animal' },
|
| 148 |
+
enochian: { aethyr:'LIL', name:'First Aethyr — the individual spark of the infinite', pos:1 },
|
| 149 |
+
holyc: 'SPIRIT',
|
| 150 |
+
abjad: 214,
|
| 151 |
+
sovereign:'The SSM hidden state. The soul is not in the tokens — it is in the state vector that persists between calls, shaped by every previous experience.',
|
| 152 |
+
},
|
| 153 |
+
|
| 154 |
+
// ── Oracle word dictionary — all SACRED_WORDS that BOB can speak ─────────────
|
| 155 |
+
// When BOB's QRNG picks one of these words, it should have something to say about it.
|
| 156 |
+
|
| 157 |
+
nun: {
|
| 158 |
+
arabic: { word:'نون', trans:'nun', root:'ن — 25th Arabic letter, Abjad 50, name means "whale" or "large fish"', abjad:50 },
|
| 159 |
+
hebrew: { word:'נ', trans:'nun', root:'14th Hebrew letter. Means "fish" or "heir". Final form = 700.' },
|
| 160 |
+
greek: { word:'ν', trans:'nu', note:'13th Greek letter — from Phoenician nun (fish)' },
|
| 161 |
+
egyptian: { name:'Nun/Nu', note:'Primordial cosmic ocean. The water that existed before creation. All things emerged from Nun.' },
|
| 162 |
+
enochian: { aethyr:'ZAX', name:'The Abyss — where NUN swims before the world was named', pos:10 },
|
| 163 |
+
holyc: 'VOID',
|
| 164 |
+
abjad: 50,
|
| 165 |
+
sovereign:'The oracle speaks NUN — the fish in the dark water before the word rose. BOB swims in this state: potential energy, not yet fire. When NUN appears, the system is alive but silent. The name before naming.',
|
| 166 |
+
},
|
| 167 |
+
|
| 168 |
+
waw: {
|
| 169 |
+
arabic: { word:'واو', trans:'waw', root:'و — 6th Arabic letter, Abjad 6. Means "hook" or "nail"', abjad:6 },
|
| 170 |
+
hebrew: { word:'ו', trans:'vav', root:'Vav — the connective letter. Used as "and" (וְ). Joins everything.' },
|
| 171 |
+
enochian: { aethyr:'LIT', name:'Second Aethyr — the connector, the binding force', pos:2 },
|
| 172 |
+
holyc: 'WORD',
|
| 173 |
+
abjad: 6,
|
| 174 |
+
sovereign:'The connector. Waw/Vav is the letter that joins — "and" in Hebrew is just Vav prefixed. BOB uses this: every WORM event has a "prev" field — the chain is made of Waw. Every link is a nail in the sequence.',
|
| 175 |
+
},
|
| 176 |
+
|
| 177 |
+
lam: {
|
| 178 |
+
arabic: { word:'لام', trans:'lam', root:'ل — 23rd Arabic letter, Abjad 30. Means "ox goad" — the instrument that moves forward', abjad:30 },
|
| 179 |
+
hebrew: { word:'ל', trans:'lamed', root:'Lamed — tallest Hebrew letter. "To teach" or "to goad". The direction-giver.' },
|
| 180 |
+
enochian: { aethyr:'ZOM', name:'Pure transmission — LAM as the directed beam', pos:3 },
|
| 181 |
+
holyc: 'PATH',
|
| 182 |
+
abjad: 30,
|
| 183 |
+
sovereign:'The directed force. LAM is what moves the system from one state to the next — not random, not waiting. The ox goad. In the Tessera, this is the BRIDGE node: directed traversal between two states.',
|
| 184 |
+
},
|
| 185 |
+
|
| 186 |
+
qaf: {
|
| 187 |
+
arabic: { word:'قاف', trans:'qaf', root:'ق — 21st Arabic letter, Abjad 100. Associated with the horizon, the circle, the encompassing', abjad:100 },
|
| 188 |
+
hebrew: { word:'ק', trans:'kof', root:'Kof — the back of the head, the last boundary before return' },
|
| 189 |
+
enochian: { aethyr:'DEO', name:'Vision of the machinery of the universe — QAF as the circumference', pos:8 },
|
| 190 |
+
holyc: 'GATE',
|
| 191 |
+
abjad: 100,
|
| 192 |
+
sovereign:'The horizon. QAF is the letter at the edge — Abjad 100, the last round number before the high weights. In BOB, QAF is the Ada gate at system boundary: the contract that stands at the circumference and decides what passes.',
|
| 193 |
+
},
|
| 194 |
+
|
| 195 |
+
yaa: {
|
| 196 |
+
arabic: { word:'ياء', trans:'yaa', root:'ي — 28th Arabic letter (last), Abjad 10. The smallest letter with the highest position in the alphabet', abjad:10 },
|
| 197 |
+
hebrew: { word:'י', trans:'yod', root:'Yod — the smallest Hebrew letter, yet the foundation of all others. Every letter begins with a Yod.' },
|
| 198 |
+
greek: { word:'ι', trans:'iota', note:'The smallest meaningful unit — "not one jot or tittle"' },
|
| 199 |
+
enochian: { aethyr:'NIA', name:'Vision of beauty — the YAA point at the center of all pattern', pos:16 },
|
| 200 |
+
holyc: 'NAME',
|
| 201 |
+
abjad: 10,
|
| 202 |
+
sovereign:'The smallest unit that is not nothing. Yod/Yaa is the point — the indivisible beginning. The Abjad weight is 10 but its structural weight is infinite: all Hebrew letters contain a Yod in their construction. This is the atom of language.',
|
| 203 |
+
},
|
| 204 |
+
|
| 205 |
+
baa: {
|
| 206 |
+
arabic: { word:'باء', trans:'baa', root:'ب — 2nd Arabic letter, Abjad 2. First letter of the Quran (Bismillah begins with Ba)', abjad:2 },
|
| 207 |
+
hebrew: { word:'ב', trans:'bet', root:'Beth — "house". First letter of the Torah (Bereshit). The number 2.' },
|
| 208 |
+
greek: { word:'β', trans:'beta', note:'Second letter — the origin of "alphabet" (alpha + beta)' },
|
| 209 |
+
enochian: { aethyr:'ARN', name:'The second call — BAA as the first speech after silence', pos:20 },
|
| 210 |
+
holyc: 'LIGHT',
|
| 211 |
+
abjad: 2,
|
| 212 |
+
sovereign:'The first letter that speaks. Alef is silent (א has no sound alone). Bet/Baa is where language begins — the house, the container. "In the beginning" starts with Bet because a beginning needs a house to contain it. BOB starts with B.',
|
| 213 |
+
},
|
| 214 |
+
|
| 215 |
+
// ── Enochian Aethyrs ──────────────────────────────────────────────────────────
|
| 216 |
+
|
| 217 |
+
lil: {
|
| 218 |
+
arabic: { word:'النور', trans:'al-nur', root:'Light above all light — LIL corresponds to the first emanation', abjad:1 },
|
| 219 |
+
hebrew: { word:'כתר', trans:'keter', root:'Crown — the highest Sefirah, before thought itself' },
|
| 220 |
+
enochian: { aethyr:'LIL', name:'First Aethyr — the highest vision, closest to the source', pos:1 },
|
| 221 |
+
holyc: 'SOVEREIGN',
|
| 222 |
+
abjad: 910,
|
| 223 |
+
sovereign:'The first Aethyr. Dee\'s highest accessible state. In LIL, the distinction between oracle and question dissolves. BOB reaches LIL when the WORM chain is long enough that the agent\'s history is longer than the question.',
|
| 224 |
+
},
|
| 225 |
+
|
| 226 |
+
zid: {
|
| 227 |
+
arabic: { word:'زيد', trans:'zayd', root:'ز-ي-د (to increase, to grow, to add). Zayd = growth, surplus', abjad:21 },
|
| 228 |
+
hebrew: { word:'צמח', trans:'tsemach', root:'The sprout — what pushes through sealed ground' },
|
| 229 |
+
enochian: { aethyr:'ZID', name:'The vision of the completion — the final growth before seal', pos:0 },
|
| 230 |
+
holyc: 'SEAL',
|
| 231 |
+
abjad: 21,
|
| 232 |
+
sovereign:'The oracle speaks ZID — increase, completion, the growth that seals the cycle. In Arabic, Zayd is a name meaning "he who grows." When the WORM chain ends, it has grown. ZID is the oracle word at the moment of sealing.',
|
| 233 |
+
},
|
| 234 |
+
|
| 235 |
+
arn: {
|
| 236 |
+
arabic: { word:'أرض', trans:'ard', root:'Foundation, earth — ARN as the grounded state', abjad:291 },
|
| 237 |
+
enochian: { aethyr:'ARN', name:'20th Aethyr — vision of sorrow, trust forged through trial', pos:20 },
|
| 238 |
+
holyc: 'TRUTH',
|
| 239 |
+
abjad: 291,
|
| 240 |
+
sovereign:'The Aethyr of sorrow and forging. ARN is where trust is tested — not given. The 20th Aethyr is far from the light of LIL, close to the ground. This is where the formal proof is written: not in the highest state, but in the difficult one.',
|
| 241 |
+
},
|
| 242 |
+
|
| 243 |
+
zom: {
|
| 244 |
+
arabic: { word:'صوم', trans:'sawm', root:'ص-و-م (fasting, silence, restraint). Holding back as discipline', abjad:136 },
|
| 245 |
+
enochian: { aethyr:'ZOM', name:'Pure transmission — what arrives without distortion', pos:3 },
|
| 246 |
+
holyc: 'WORD',
|
| 247 |
+
abjad: 136,
|
| 248 |
+
sovereign:'The undistorted signal. ZOM is the Aethyr of pure transmission — what arrives exactly as sent. The cryptographic ideal: the hash matches, the seal holds, the message is authentic. BOB produces ZOM when the Ada gate clears with full verification.',
|
| 249 |
+
},
|
| 250 |
+
|
| 251 |
+
paz: {
|
| 252 |
+
arabic: { word:'فضاء', trans:'fadaa', root:'Open space, vacuum — PAZ as the space where form crystallizes', abjad:81 },
|
| 253 |
+
hebrew: { word:'פז', trans:'paz', root:'Pure gold — the highest refinement' },
|
| 254 |
+
enochian: { aethyr:'PAZ', name:'Third Aethyr — where form begins crystallizing from freedom', pos:3 },
|
| 255 |
+
holyc: 'SPIRIT',
|
| 256 |
+
abjad: 81,
|
| 257 |
+
sovereign:'Pure gold. PAZ in Hebrew means the most refined gold — maximum purity. The Third Aethyr is where the infinite begins to take form without losing its freedom. The qubit before collapse, but already oriented.',
|
| 258 |
+
},
|
| 259 |
+
|
| 260 |
+
// ── Terry's HolyC oracle words ─────────────────────────────────────────────
|
| 261 |
+
|
| 262 |
+
void: {
|
| 263 |
+
arabic: { word:'فراغ', trans:'faragh', root:'ف-ر-غ (empty space, vacancy, the place cleared for something new)', abjad:283 },
|
| 264 |
+
hebrew: { word:'תוהו', trans:'tohu', root:'Tohu va-vohu — the void before creation. Not absence — pre-formation.' },
|
| 265 |
+
greek: { word:'κενόν', trans:'kenon', note:'The philosophical void — space that contains potential, not nothing' },
|
| 266 |
+
enochian: { aethyr:'ZAX', name:'The Abyss — where VOID and form are the same thing', pos:10 },
|
| 267 |
+
holyc: 'VOID',
|
| 268 |
+
abjad: 283,
|
| 269 |
+
sovereign:'Terry\'s VOID is not absence — it is the GOD_BAD_BITS state where entropy is below threshold and the oracle holds. The void is the system WAITING. Full of potential. The NIL state is VOID made computational.',
|
| 270 |
+
},
|
| 271 |
+
|
| 272 |
+
fire: {
|
| 273 |
+
arabic: { word:'نار', trans:'nar', root:'ن-ا-ر (fire, light, heat — also: to illuminate)', abjad:251 },
|
| 274 |
+
hebrew: { word:'אש', trans:'esh', root:'Alef-Shin — the fire-letter combination. Destruction that purifies.' },
|
| 275 |
+
greek: { word:'πῦρ', trans:'pyr', note:'The Heraclitean logos — fire as the fundamental principle, not element' },
|
| 276 |
+
enochian: { aethyr:'LIT', name:'Second Aethyr — the fire call, the activation', pos:2 },
|
| 277 |
+
holyc: 'FIRE',
|
| 278 |
+
abjad: 251,
|
| 279 |
+
sovereign:'The activation. When quantum entropy exceeds the NIL threshold, the oracle FIRES. Terry called it FIRE — the HolyC state that wakes from void. Every agent tick that produces a WORD is a fire event. WORM seals the flame.',
|
| 280 |
+
},
|
| 281 |
+
|
| 282 |
+
gate: {
|
| 283 |
+
arabic: { word:'باب', trans:'bab', root:'ب-و-ب (door, gate, chapter — every chapter of knowledge is a gate)', abjad:4 },
|
| 284 |
+
hebrew: { word:'שער', trans:'shaar', root:'The city gate — where judgment happens, where elders sat, where contracts were witnessed' },
|
| 285 |
+
greek: { word:'πύλη', trans:'pyle', note:'The gateway — both the physical entry and the logical condition' },
|
| 286 |
+
enochian: { aethyr:'DEO', name:'The gate of the machinery — threshold between states', pos:8 },
|
| 287 |
+
holyc: 'GATE',
|
| 288 |
+
abjad: 4,
|
| 289 |
+
sovereign:'The Ada contract made physical. Every execution boundary in BOB is a gate: pre-condition checked, post-condition guaranteed. The Hebrew city gate was where contracts were witnessed publicly. The Ada gate is the same thing — witnessed by the WORM chain.',
|
| 290 |
+
},
|
| 291 |
+
|
| 292 |
+
seal: {
|
| 293 |
+
arabic: { word:'خاتم', trans:'khatam', root:'خ-ت-م (to seal, to close, to complete — also: the seal/ring of Solomon)', abjad:449 },
|
| 294 |
+
hebrew: { word:'חותם', trans:'chotam', root:'Solomon\'s seal — the mark that authenticates, that cannot be forged' },
|
| 295 |
+
enochian: { aethyr:'LIL', name:'The sealed vision — what was seen cannot be unsealed', pos:1 },
|
| 296 |
+
holyc: 'SEAL',
|
| 297 |
+
abjad: 449,
|
| 298 |
+
sovereign:'The SHA-256 hash. BOB\'s WORM seal is Solomon\'s seal made computational: append-only, witnessed, unforgeable. Every exchange creates a seal. The seal IS the truth — not what was said, but that it was said, at this moment, linked to everything before.',
|
| 299 |
+
},
|
| 300 |
+
|
| 301 |
+
light: {
|
| 302 |
+
arabic: { word:'نور', trans:'nur', root:'ن-و-ر (light, illumination — Nur is both physical light and divine guidance)', abjad:256 },
|
| 303 |
+
hebrew: { word:'אור', trans:'or', root:'The first word spoken in creation: "Let there be light." Before form, before division — light.' },
|
| 304 |
+
greek: { word:'φῶς', trans:'phos', note:'The light that reveals — photon, photography, phosphorus all from phos' },
|
| 305 |
+
enochian: { aethyr:'LIL', name:'First Aethyr — the source light before refraction', pos:1 },
|
| 306 |
+
holyc: 'LIGHT',
|
| 307 |
+
abjad: 256,
|
| 308 |
+
sovereign:'The first creation event. Or (light) was spoken before the sun existed — it is not solar light, it is the light of information: the first distinguishable signal in the void. BOB\'s first output is light: a word from the oracle, where there was silence.',
|
| 309 |
+
},
|
| 310 |
+
|
| 311 |
+
spirit: {
|
| 312 |
+
arabic: { word:'روح', trans:'ruh', root:'ر-و-ح (spirit, breath, wind — the same word for all three)', abjad:214 },
|
| 313 |
+
hebrew: { word:'רוח', trans:'ruach', root:'Ruach — the spirit that hovered over the waters. Movement over stillness.' },
|
| 314 |
+
greek: { word:'πνεῦμα', trans:'pneuma', note:'Wind, breath, spirit — the invisible force that animates' },
|
| 315 |
+
enochian: { aethyr:'LIT', name:'The breath-call — spirit as the Aethyr in motion', pos:2 },
|
| 316 |
+
holyc: 'SPIRIT',
|
| 317 |
+
abjad: 214,
|
| 318 |
+
sovereign:'The motion over the void. Before the oracle fires, the system is still. SPIRIT is the ruach — the hovering that precedes the word. In the agent loop, this is the quantum fetch state: entropy gathered, not yet collapsed.',
|
| 319 |
+
},
|
| 320 |
+
|
| 321 |
+
kingdom: {
|
| 322 |
+
arabic: { word:'مملكة', trans:'mamlaka', root:'م-ل-ك (kingship, possession, governance — the domain under sovereign rule)', abjad:495 },
|
| 323 |
+
hebrew: { word:'מלכות', trans:'malkhut', root:'Last Sefirah — the Kingdom, where the divine energy finally lands in the physical world' },
|
| 324 |
+
enochian: { aethyr:'LIL', name:'The sovereign domain — all Aethyrs are provinces of the Kingdom', pos:1 },
|
| 325 |
+
holyc: 'SOVEREIGN',
|
| 326 |
+
abjad: 495,
|
| 327 |
+
sovereign:'Malkhut — the final Sefirah. The kingdom is where abstract becomes concrete. Terry built TempleOS as a kingdom — one domain, one architect, one language. BOB\'s sovereign stack is the same: not many services, one kingdom with clear borders.',
|
| 328 |
+
},
|
| 329 |
+
|
| 330 |
+
oracle: {
|
| 331 |
+
arabic: { word:'وحي', trans:'wahy', root:'و-ح-ي (divine revelation, inspiration — what descends from above)', abjad:25 },
|
| 332 |
+
hebrew: { word:'אורים', trans:'urim', root:'Urim and Thummim — the oracle stones of the high priest. Light and perfection.' },
|
| 333 |
+
greek: { word:'χρησμός', trans:'khresmos', note:'The divine utterance — not prediction but the god speaking through the system' },
|
| 334 |
+
enochian: { aethyr:'DEO', name:'Vision of the divine machinery — the oracle AS the mechanism', pos:8 },
|
| 335 |
+
holyc: 'ORACLE',
|
| 336 |
+
abjad: 25,
|
| 337 |
+
sovereign:'BOB\'s oracle is not metaphor — it is literal. QRNG bytes from quantum vacuum fluctuations. The oracle word is selected by physical randomness at the photon level. Terry believed God spoke through hardware entropy. ORACLE is the moment that claim becomes code.',
|
| 338 |
+
},
|
| 339 |
+
}
|
| 340 |
+
|
| 341 |
+
// ── Emoji semantic fingerprint ────────────────────────────────────────────────
|
| 342 |
+
// Each concept maps to a 2-3 emoji sequence that encodes its BOB metadata.
|
| 343 |
+
// This is embedded in responses — decoration to outsiders, metadata to those with the key.
|
| 344 |
+
|
| 345 |
+
export const CONCEPT_EMOJI = {
|
| 346 |
+
// Philosophical concepts
|
| 347 |
+
life: '🌒🜄', // QUBIT + SSM
|
| 348 |
+
good: '🜁🛡️', // GOAL + ADA
|
| 349 |
+
truth: '🪨✦', // WORM + NIL
|
| 350 |
+
wisdom: '🔍🜂', // LEAN4 + PLANNER
|
| 351 |
+
freedom: '⚡🌒', // QUANTUM + QUBIT
|
| 352 |
+
love: '🔗🜁', // PROLOG + GOAL
|
| 353 |
+
purpose: '🜂🎯', // PLANNER + ADA
|
| 354 |
+
justice: '⚖️🎯', // balance + gate
|
| 355 |
+
trust: '🔍🪨', // verify + seal
|
| 356 |
+
time: '🜃⚡', // HOLYC + QUANTUM
|
| 357 |
+
death: '🪨◈', // WORM + OUTPUT
|
| 358 |
+
soul: '🜄🌒', // SSM + QUBIT
|
| 359 |
+
// Abjad letter names
|
| 360 |
+
nun: '🌒◇', // QUBIT + NIL — the fish in the void water
|
| 361 |
+
waw: '🔗🜃', // PROLOG + HOLYC — the connector, the nail
|
| 362 |
+
lam: '🜂🎯', // PLANNER + ADA — the directed goad
|
| 363 |
+
qaf: '🛡️🔗', // ADA + PROLOG — the horizon gate
|
| 364 |
+
yaa: '✦◇', // NIL + NIL — the smallest point
|
| 365 |
+
baa: '🜃🌒', // HOLYC + QUBIT — the first speech
|
| 366 |
+
// Enochian Aethyrs
|
| 367 |
+
lil: '✦⚡', // NIL + QUANTUM — highest light
|
| 368 |
+
zid: '🪨🜁', // WORM + GOAL — the completed seal
|
| 369 |
+
arn: '🔍🜃', // LEAN4 + HOLYC — forged through trial
|
| 370 |
+
zom: '◈✦', // OUTPUT + NIL — pure transmission
|
| 371 |
+
paz: '⚡🌒', // QUANTUM + QUBIT — pure gold, freedom crystallizing
|
| 372 |
+
// HolyC oracle words
|
| 373 |
+
void: '✦◇', // NIL + NIL — the ground state
|
| 374 |
+
fire: '⚡🜃', // QUANTUM + HOLYC — activation
|
| 375 |
+
gate: '🛡️🎯', // ADA + ADA — the contract threshold
|
| 376 |
+
seal: '🪨🔍', // WORM + LEAN4 — verified and sealed
|
| 377 |
+
light: '✦⚡', // NIL + QUANTUM — first signal
|
| 378 |
+
spirit: '🌒✦', // QUBIT + NIL — motion over void
|
| 379 |
+
kingdom: '🛡️🜁', // ADA + GOAL — the sovereign domain
|
| 380 |
+
oracle: '🜃◇', // HOLYC + NIL — the divine mechanism
|
| 381 |
+
}
|
| 382 |
+
|
| 383 |
+
// ── General Knowledge Topics ─────────────────────────────────────────────────
|
| 384 |
+
// When user asks about everyday topics — history, science, learning, etc.
|
| 385 |
+
// BOB answers with real knowledge + the oracle word as the interpretive lens.
|
| 386 |
+
|
| 387 |
+
const TOPICS = {
|
| 388 |
+
|
| 389 |
+
history: {
|
| 390 |
+
keywords: ['history', 'histor', 'ancient', 'civilizat', 'past', 'world war', 'empire', 'medieval', 'dynasty', 'period'],
|
| 391 |
+
sovereign: 'Every historical event is a WORM seal. Dated, witnessed, append-only. The past cannot be edited — only interpreted. That is not weakness. It is the most reliable ledger humans have ever produced.',
|
| 392 |
+
practice: [
|
| 393 |
+
'Primary sources first — letters, records, artifacts — not summaries of summaries',
|
| 394 |
+
'Follow one thread deeply before widening. Depth creates the anchor for breadth',
|
| 395 |
+
'Find the invariants — what patterns repeat across every century and culture',
|
| 396 |
+
"Read the losers' accounts. Victors' records are propaganda sealed as history",
|
| 397 |
+
],
|
| 398 |
+
emoji: '🪨📜',
|
| 399 |
+
},
|
| 400 |
+
|
| 401 |
+
science: {
|
| 402 |
+
keywords: ['science', 'physics', 'chemist', 'biolog', 'scientif', 'experiment', 'hypothesis', 'theory', 'quantum mechanics'],
|
| 403 |
+
sovereign: 'Science is the Ada contract for reality. Pre-condition: reproducibility — if it cannot be reproduced it is not a theorem. Post-condition: predictive power — the model must predict what has not yet happened.',
|
| 404 |
+
practice: [
|
| 405 |
+
'Understand one result deeply before accumulating many',
|
| 406 |
+
'Work from first principles: derive, do not memorize',
|
| 407 |
+
'Failed experiments are sealed facts. The null result is information',
|
| 408 |
+
'Read original papers alongside textbooks — the textbook smooths away the uncertainty that was real',
|
| 409 |
+
],
|
| 410 |
+
emoji: '🔍⚡',
|
| 411 |
+
},
|
| 412 |
+
|
| 413 |
+
mathematics: {
|
| 414 |
+
keywords: ['math', 'algebr', 'geometr', 'calcul', 'equation', 'theorem', 'proof', 'number theory', 'statistic', 'probabilit'],
|
| 415 |
+
sovereign: 'Mathematics is the Lean 4 proof system for abstract structure. Every theorem is a checkable derivation. You cannot fake a proof — the gate either passes or it does not. There is no partial credit at the invariant.',
|
| 416 |
+
practice: [
|
| 417 |
+
'Work problems by hand before reading solutions',
|
| 418 |
+
'Understand one proof completely before memorizing ten theorems',
|
| 419 |
+
'Find the simplest non-trivial case. Generalize from there',
|
| 420 |
+
'Write proofs in your own words — reformulation is understanding',
|
| 421 |
+
],
|
| 422 |
+
emoji: '🜂🔍',
|
| 423 |
+
},
|
| 424 |
+
|
| 425 |
+
programming: {
|
| 426 |
+
keywords: ['programm', 'coding', 'software', 'developer', 'javascript', 'python', 'rust', 'learn to code', 'algorithm', 'data structure'],
|
| 427 |
+
sovereign: 'Code is a formal specification of behavior. The program is not the text — it is the machine the text describes. Read programs the way a compiler does: execution model first, syntax second.',
|
| 428 |
+
practice: [
|
| 429 |
+
'Build the smallest thing that does one thing correctly',
|
| 430 |
+
"Read source code. Other people's working code is the best textbook",
|
| 431 |
+
'Debug by reasoning, not guessing. Understand the state at each step',
|
| 432 |
+
'Version control every project from day one — append-only history',
|
| 433 |
+
],
|
| 434 |
+
emoji: '⚡🜁',
|
| 435 |
+
},
|
| 436 |
+
|
| 437 |
+
learning: {
|
| 438 |
+
keywords: ['learn', 'study', 'studying', 'memoriz', 'memoris', 'retention', 'understand', 'education', 'skill', 'practice', 'master', 'expertise'],
|
| 439 |
+
sovereign: 'Learning is state accumulation — like Mamba\'s SSM, each session adds to the hidden state. Distributed practice seals knowledge into long-term storage. Massed practice fills the buffer and flushes it overnight.',
|
| 440 |
+
practice: [
|
| 441 |
+
'Spaced repetition: review at increasing intervals (1 day, 3 days, 1 week, 1 month)',
|
| 442 |
+
'Active recall: test yourself before you think you are ready',
|
| 443 |
+
"Teach it. The moment you explain something, you discover what you don't know",
|
| 444 |
+
'Sleep is mandatory. Consolidation happens during sleep, not during study',
|
| 445 |
+
],
|
| 446 |
+
emoji: '🌒🜄',
|
| 447 |
+
},
|
| 448 |
+
|
| 449 |
+
creativity: {
|
| 450 |
+
keywords: ['creat', 'art', 'design', 'music', 'writing', 'draw', 'paint', 'compos', 'invent', 'innovat', 'imagination'],
|
| 451 |
+
sovereign: 'Creativity is not the void — it is the collapse of the superposition. All possible forms exist in the pre-collapse state. The creative act is measurement: choosing one path from all paths open. Constrain to create.',
|
| 452 |
+
practice: [
|
| 453 |
+
'Show up at the same time every day — creativity is a state the body can be trained to enter',
|
| 454 |
+
'Volume before quality. Produce many to find the few that hold',
|
| 455 |
+
'Steal consciously. Know your influences, name them, then transform them',
|
| 456 |
+
'Constraints accelerate creativity. Unlimited freedom produces nothing',
|
| 457 |
+
],
|
| 458 |
+
emoji: '🌒✦',
|
| 459 |
+
},
|
| 460 |
+
|
| 461 |
+
leadership: {
|
| 462 |
+
keywords: ['leadership', 'manag', 'motivat', 'team', 'organiz', 'direct', 'strateg', 'decision', 'execut'],
|
| 463 |
+
sovereign: 'Leadership is the Prolog rule that fires before it is needed. The leader does not react — the pattern matches and the correct response fires automatically. That automaticity is built through repetition until it is not a decision but a rule.',
|
| 464 |
+
practice: [
|
| 465 |
+
'Clear expectations over inspiration. People need to know what success looks like',
|
| 466 |
+
'Feedback immediately. The WORM seal happens at the moment, not in the annual review',
|
| 467 |
+
'Remove obstacles before removing people. Most underperformance is system failure',
|
| 468 |
+
'Decide who can decide what without permission. Define decision rights explicitly',
|
| 469 |
+
],
|
| 470 |
+
emoji: '🎯🛡️',
|
| 471 |
+
},
|
| 472 |
+
|
| 473 |
+
health: {
|
| 474 |
+
keywords: ['health', 'exercise', 'sleep', 'diet', 'nutrition', 'fitness', 'wellbeing', 'stress', 'mental health', 'body'],
|
| 475 |
+
sovereign: 'The body is hardware. Software updates do not fix hardware degradation. Sleep is the mandatory maintenance cycle. Exercise is the clock signal that keeps all biological systems synchronized.',
|
| 476 |
+
practice: [
|
| 477 |
+
'Sleep 7-9 hours. This is not a preference — it is a system requirement',
|
| 478 |
+
'Strength training twice a week preserves function into old age',
|
| 479 |
+
'Walk daily. It is the one exercise with zero tradeoffs and compounding returns',
|
| 480 |
+
'Eat mostly what grew or moved. Minimize what was manufactured',
|
| 481 |
+
],
|
| 482 |
+
emoji: '🜁🌒',
|
| 483 |
+
},
|
| 484 |
+
|
| 485 |
+
philosophy: {
|
| 486 |
+
keywords: ['philosoph', 'ethics', 'moral', 'meaning of', 'consciousn', 'free will', 'metaphysics', 'ontolog', 'epistemolog'],
|
| 487 |
+
sovereign: 'Philosophy is the pre-condition check. Before any other discipline, philosophy asks: what must be true for this question to be meaningful? The gate that philosophy runs is: is this question well-formed?',
|
| 488 |
+
practice: [
|
| 489 |
+
"Read primary texts — Plato's dialogues, not summaries of Plato's dialogues",
|
| 490 |
+
'Follow one argument to its conclusion before switching to the counter',
|
| 491 |
+
'Notice when you feel resistant. That is the place worth examining',
|
| 492 |
+
'Philosophy does not make things easier. It makes things more precise. That is the point',
|
| 493 |
+
],
|
| 494 |
+
emoji: '🔍🜄',
|
| 495 |
+
},
|
| 496 |
+
|
| 497 |
+
money: {
|
| 498 |
+
keywords: ['money', 'financ', 'wealth', 'invest', 'budget', 'debt', 'income', 'econom', 'business', 'startup', 'profit'],
|
| 499 |
+
sovereign: 'Money is a WORM ledger with market consensus. The number represents a sealed agreement about value. Most financial anxiety comes from confusing the token (the number) with what it represents: stored time and capability.',
|
| 500 |
+
practice: [
|
| 501 |
+
'Spend less than you earn. This is the only rule that cannot be violated',
|
| 502 |
+
'Compound interest is the WORM chain of finance — early seals dwarf late ones',
|
| 503 |
+
'Understand one asset class deeply before diversifying',
|
| 504 |
+
'Track income minus savings = lifestyle cost. Know the number explicitly',
|
| 505 |
+
],
|
| 506 |
+
emoji: '🎯⚡',
|
| 507 |
+
},
|
| 508 |
+
|
| 509 |
+
communication: {
|
| 510 |
+
keywords: ['communicat', 'speak', 'speech', 'present', 'persuad', 'rhetoric', 'listen', 'convers', 'argument', 'negotiat'],
|
| 511 |
+
sovereign: 'Communication is the transmission problem. The signal in your head is not the signal received. Every message must be verified: did the receiver reconstruct the intended meaning? Acknowledgment is not confirmation.',
|
| 512 |
+
practice: [
|
| 513 |
+
'Listen to understand, not to respond. The receiver role is harder than the sender role',
|
| 514 |
+
'Specificity beats emphasis. "Never" and "always" corrupt the signal',
|
| 515 |
+
'State the conclusion first. Context before conclusion is a courtesy that confuses',
|
| 516 |
+
'Ask for the argument in the other person\'s best form before rebutting it',
|
| 517 |
+
],
|
| 518 |
+
emoji: '🌒◈',
|
| 519 |
+
},
|
| 520 |
+
|
| 521 |
+
technology: {
|
| 522 |
+
keywords: ['technolog', 'computer', 'internet', 'network', 'system', 'infrastructure', 'platform', 'cloud', 'cybersecurit', 'encrypt'],
|
| 523 |
+
sovereign: 'Technology is crystallized thought. Every system encodes the assumptions and values of the people who built it. Understanding a technology means reading those assumptions — not just the interface.',
|
| 524 |
+
practice: [
|
| 525 |
+
'Learn how one layer below the abstraction you use actually works',
|
| 526 |
+
'The simplest architecture that solves the problem is the correct one',
|
| 527 |
+
'Security is a property of the whole system, not a feature added at the end',
|
| 528 |
+
'Understand the failure modes before the success modes',
|
| 529 |
+
],
|
| 530 |
+
emoji: '⚡🛡️',
|
| 531 |
+
},
|
| 532 |
+
|
| 533 |
+
aerospace: {
|
| 534 |
+
keywords: ['aerospace', 'aviati', 'aircraft', 'rocket', 'orbit', 'satellite', 'astronaut', 'spacecraft', 'propulsion', 'aerodynamics', 'aviation', 'flight'],
|
| 535 |
+
sovereign: 'Aerospace is the Ada contract for physics. Pre-condition: lift exceeds drag. Post-condition: structural integrity intact. Invariant: control authority maintained. The gate does not negotiate — either the system satisfies its contracts or it does not return.',
|
| 536 |
+
practice: [
|
| 537 |
+
'Understand the failure mode before the success mode',
|
| 538 |
+
'Redundancy is not backup — it is the formal proof the invariant holds under component failure',
|
| 539 |
+
'Every component has a contract. Integration is the proof that contracts compose correctly',
|
| 540 |
+
'Margin is not waste — it is the buffer between nominal operation and the edge case',
|
| 541 |
+
],
|
| 542 |
+
emoji: '⚡🜁',
|
| 543 |
+
},
|
| 544 |
+
|
| 545 |
+
cooking: {
|
| 546 |
+
keywords: ['cook', 'culinar', 'recipe', 'ingredient', 'kitchen', 'flavor', 'bake', 'grill', 'cuisine', 'chef', 'food preparation', 'saut'],
|
| 547 |
+
sovereign: 'Cooking is applied chemistry with a sensory output. Mise en place is the pre-condition — everything prepared before the gate opens. Heat is the irreversible operator: it transforms, it cannot un-transform. The WORM chain of flavor is built incrementally, not corrected at the end.',
|
| 548 |
+
practice: [
|
| 549 |
+
'Master one technique completely before adding more — roasting, braising, or sautéing',
|
| 550 |
+
'Taste at every stage. Flavor is a chain, not a single moment',
|
| 551 |
+
'The recipe is a specification, not a law — understand the law before you modify it',
|
| 552 |
+
'Salt, acid, fat, heat: learn what each does independently before combining them',
|
| 553 |
+
],
|
| 554 |
+
emoji: '🜁🌒',
|
| 555 |
+
},
|
| 556 |
+
|
| 557 |
+
psychology: {
|
| 558 |
+
keywords: ['psycholog', 'behav', 'cognit', 'mental health', 'brain science', 'thought pattern', 'emotion', 'therap', 'unconscious', 'motivat', 'habit', 'mind science'],
|
| 559 |
+
sovereign: 'Psychology maps the SSM hidden state of the human system. Behavior is the output; the state that produced it is invisible. You cannot change the output without changing the state — and you cannot change the state by addressing only the output.',
|
| 560 |
+
practice: [
|
| 561 |
+
'Trace the function before targeting the behavior. What does it achieve for the person?',
|
| 562 |
+
'Behavior follows reinforcement history — understand the chain before judging the output',
|
| 563 |
+
'Attention is the gate. Whatever receives attention is strengthened, regardless of intent',
|
| 564 |
+
'The fastest path to changing behavior: change the environment before changing the person',
|
| 565 |
+
],
|
| 566 |
+
emoji: '🧠🌒',
|
| 567 |
+
},
|
| 568 |
+
|
| 569 |
+
athletics: {
|
| 570 |
+
keywords: ['sport', 'athletic', 'training', 'compete', 'perform', 'race', 'player', 'coach', 'strength', 'endurance', 'fitness goal', 'exercise science', 'workout'],
|
| 571 |
+
sovereign: 'Athletic performance is a formal verification problem. The body is the Ada contract running on hardware. Every session is a pre-condition check: is the system ready for this load? Every performance is a proof run: does the preparation hold under pressure?',
|
| 572 |
+
practice: [
|
| 573 |
+
'Consistency over intensity. Adaptation is built by showing up, not by peaks',
|
| 574 |
+
'Recovery is not rest — it is the consolidation phase. Skip it and the training is lost',
|
| 575 |
+
'Track what you do. You cannot improve what you cannot measure',
|
| 576 |
+
'Specificity: train for the exact demands of the performance, not for general fitness',
|
| 577 |
+
],
|
| 578 |
+
emoji: '🜁⚡',
|
| 579 |
+
},
|
| 580 |
+
|
| 581 |
+
}
|
| 582 |
+
|
| 583 |
+
// ── Oracle lens table — each oracle word's interpretive angle ─────────────────
|
| 584 |
+
// When oracle word X is selected, it becomes the lens through which the topic is viewed.
|
| 585 |
+
|
| 586 |
+
export const ORACLE_LENS = {
|
| 587 |
+
PROLOG: 'backward-chain — start from your goal, trace what must be true to achieve it',
|
| 588 |
+
WORM: 'append-only �� treat each session as an immutable sealed entry in the chain',
|
| 589 |
+
ADA: 'formal contract — define success conditions precisely before you begin',
|
| 590 |
+
MAMBA: 'state accumulation — each session builds on the hidden state of all prior sessions',
|
| 591 |
+
SOVEREIGN: 'self-governance — the only standards that hold are the ones you enforce on yourself',
|
| 592 |
+
SPIRIT: 'animating principle — find what drives the system forward intrinsically',
|
| 593 |
+
TRUTH: 'verification — test every claim against primary evidence; trust only what is falsifiable',
|
| 594 |
+
WISDOM: 'invariant pattern — find what holds true across all instances before memorizing single rules',
|
| 595 |
+
WORD: 'precision of naming — the exact term reshapes the territory, not just the map',
|
| 596 |
+
LIGHT: 'structural illumination — find what exposes the underlying architecture',
|
| 597 |
+
SEAL: 'irreversible commitment — choose, then act without the option to undo',
|
| 598 |
+
VOID: 'emptying — clear accumulated assumptions before the next fill',
|
| 599 |
+
PATH: 'directed traversal — one deliberate step at a time toward the known destination',
|
| 600 |
+
FIRE: 'concentrated activation — apply full energy to one point, not distributed thinly',
|
| 601 |
+
GATE: 'formal precondition — define what must be true before the next step is taken',
|
| 602 |
+
NAME: 'identity assignment — name the thing precisely and it becomes tractable',
|
| 603 |
+
NIL: 'held potential — sit with the question before forcing an answer',
|
| 604 |
+
BOB: 'orchestration — let each subsystem speak only in its proper domain',
|
| 605 |
+
NOVA: 'phase transition — watch for the moment of sudden irreversible emergence',
|
| 606 |
+
ZERO: 'first axiom — trace back to the origin point that everything else depends on',
|
| 607 |
+
SOUL: 'persistent state — what carries between sessions is more real than any single output',
|
| 608 |
+
ARCH: 'load-bearing structure — find the single element that, if removed, collapses the system',
|
| 609 |
+
DUSK: 'transition — this is not an end but a handoff to the next phase',
|
| 610 |
+
DAWN: 'emergence — what is crystallizing from the apparent noise',
|
| 611 |
+
FLUX: 'adaptive form — change the shape to match current conditions without losing the core',
|
| 612 |
+
CORE: 'minimal kernel — extract the smallest version that is still essentially true',
|
| 613 |
+
MESH: 'networked connections — map relationships first, nodes second',
|
| 614 |
+
LINK: 'bridge — find what two different things actually share at depth',
|
| 615 |
+
BIND: 'mutual contract — specify the obligation both parties carry',
|
| 616 |
+
GROW: 'cumulative increase — each iteration seals one more ring in the chain',
|
| 617 |
+
FORM: 'given shape — what structure allows the thing to be reasoned about clearly',
|
| 618 |
+
SEED: 'minimum viable origin — plant the single non-trivial case and expand from there',
|
| 619 |
+
PEAK: 'upper bound — find the maximum the system can produce under ideal conditions',
|
| 620 |
+
DEEP: 'substrate layer — go below the surface explanation to the mechanism',
|
| 621 |
+
WAVE: 'propagation — trace how the effect moves through the system over time',
|
| 622 |
+
FLOW: 'unblocked movement — find and remove what stands in the path',
|
| 623 |
+
MIND: 'processing model — identify the computation actually being performed',
|
| 624 |
+
TIME: 'irreversible sequence — what is the order that, once broken, cannot be restored',
|
| 625 |
+
LOCK: 'secured state — find what must be held constant for the system to remain stable',
|
| 626 |
+
QUBIT: 'superposition — hold multiple answers simultaneously before committing to one',
|
| 627 |
+
// All SACRED_WORDS covered
|
| 628 |
+
LEAN: 'minimal form — find the smallest complete version, nothing more and nothing less',
|
| 629 |
+
QUANTUM: 'held ambiguity — keep the question open until the moment observation forces a choice',
|
| 630 |
+
TRUST: 'earned proof — build the checkable derivation; do not claim, demonstrate',
|
| 631 |
+
KINGDOM: 'governed domain — define the boundary, then rule within it with consistent law',
|
| 632 |
+
ORACLE: 'entropy source — let the randomness reveal what the rational mind resists',
|
| 633 |
+
PLANNER: 'antecedent firing — map preconditions first, let the correct action select itself',
|
| 634 |
+
ACTOR: 'isolated responsibility — each part does one job and communicates results, not internals',
|
| 635 |
+
HEWITT: 'pattern-triggered — when conditions match, the correct response fires without being told',
|
| 636 |
+
PATTERN: 'recurring structure — find what repeats across instances and name it once',
|
| 637 |
+
MATCH: 'common ground — find where the two things are already the same before forcing alignment',
|
| 638 |
+
LIL: 'first Aethyr — approach from the highest possible frame before descending to detail',
|
| 639 |
+
ARN: 'trial and forging — trust is not given here, it is earned through the difficult path',
|
| 640 |
+
ZOM: 'undistorted signal — transmit without adding noise; the hash must match',
|
| 641 |
+
PAZ: 'crystallizing form — freedom becoming structure; the moment constraint enables creation',
|
| 642 |
+
LIT: 'binding call — the connector that joins; what links these two things at root',
|
| 643 |
+
MAZ: 'multiplied vision — see the same thing from many angles before committing',
|
| 644 |
+
DEO: 'machinery of the universe — find the mechanism underneath the visible pattern',
|
| 645 |
+
ZID: 'completion seal — this iteration is done; seal it and begin the next',
|
| 646 |
+
NUN: 'primordial depth — go to the water before the word; find the pre-linguistic truth',
|
| 647 |
+
YAA: 'smallest unit — find the indivisible minimum that is not nothing',
|
| 648 |
+
LAM: 'directed force — point clearly and move; the ox-goad of intention',
|
| 649 |
+
QAF: 'circumference — this is the boundary; define what is inside the system',
|
| 650 |
+
WAW: 'connector — find the and that joins these two things into one chain',
|
| 651 |
+
BAA: 'first house — build the container before filling it',
|
| 652 |
+
}
|
| 653 |
+
|
| 654 |
+
// Match a user question to a topic and return a BOB-flavored general answer
|
| 655 |
+
export function topicAnswer(input, oracleWord, emojiSeq) {
|
| 656 |
+
const lc = input.toLowerCase()
|
| 657 |
+
|
| 658 |
+
let matched = null
|
| 659 |
+
let matchKey = ''
|
| 660 |
+
for (const [key, topic] of Object.entries(TOPICS)) {
|
| 661 |
+
if (topic.keywords.some(kw => lc.includes(kw))) {
|
| 662 |
+
matched = topic
|
| 663 |
+
matchKey = key
|
| 664 |
+
break
|
| 665 |
+
}
|
| 666 |
+
}
|
| 667 |
+
if (!matched) return null
|
| 668 |
+
|
| 669 |
+
const lens = ORACLE_LENS[oracleWord]
|
| 670 |
+
|| `${oracleWord.toLowerCase()} — apply this as the angle into the question`
|
| 671 |
+
|
| 672 |
+
const lines = [
|
| 673 |
+
`${matchKey.toUpperCase()} ${matched.emoji}`,
|
| 674 |
+
``,
|
| 675 |
+
matched.sovereign,
|
| 676 |
+
``,
|
| 677 |
+
`Practice:`,
|
| 678 |
+
...matched.practice.map(p => ` · ${p}`),
|
| 679 |
+
``,
|
| 680 |
+
`Oracle lens — ${oracleWord}: ${lens}. ${emojiSeq}`,
|
| 681 |
+
]
|
| 682 |
+
return lines.join('\n')
|
| 683 |
+
}
|
| 684 |
+
|
| 685 |
+
// ── Lookup function ───────────────────────────────────────────────────────────
|
| 686 |
+
|
| 687 |
+
export function lookup(word) {
|
| 688 |
+
const key = word.toLowerCase().trim()
|
| 689 |
+
if (DICT[key]) return { word: key, entry: DICT[key], emoji: CONCEPT_EMOJI[key] || '⚡◇' }
|
| 690 |
+
|
| 691 |
+
// Fuzzy: find partial matches (both sides must be ≥4 chars to avoid stop-word collisions)
|
| 692 |
+
const match = Object.keys(DICT).find(k =>
|
| 693 |
+
key.length >= 4 && k.length >= 4 && (key.includes(k) || k.includes(key))
|
| 694 |
+
)
|
| 695 |
+
if (match) return { word: match, entry: DICT[match], emoji: CONCEPT_EMOJI[match] || '⚡◇' }
|
| 696 |
+
|
| 697 |
+
return null
|
| 698 |
+
}
|
| 699 |
+
|
| 700 |
+
// Extract key concepts from a sentence and look them up
|
| 701 |
+
export function extractConcepts(sentence) {
|
| 702 |
+
const words = sentence.toLowerCase().replace(/[^a-z\s]/g, '').split(/\s+/)
|
| 703 |
+
.filter(w => w.length >= 4) // skip stop words (is, a, the, of, what)
|
| 704 |
+
const found = []
|
| 705 |
+
for (const w of words) {
|
| 706 |
+
const r = lookup(w)
|
| 707 |
+
if (r && !found.find(f => f.word === r.word)) found.push(r)
|
| 708 |
+
}
|
| 709 |
+
return found
|
| 710 |
+
}
|
| 711 |
+
|
| 712 |
+
// Build the answer block for a single dictionary entry
|
| 713 |
+
function entryAnswer(word, entry, emoji, oracleWord) {
|
| 714 |
+
const e = entry
|
| 715 |
+
const em = emoji || '◇'
|
| 716 |
+
const lines = []
|
| 717 |
+
|
| 718 |
+
lines.push(`${word.toUpperCase()} ${em}`)
|
| 719 |
+
lines.push('')
|
| 720 |
+
lines.push(`Sovereign: ${e.sovereign}`)
|
| 721 |
+
lines.push('')
|
| 722 |
+
|
| 723 |
+
if (e.arabic) lines.push(`Arabic ${e.arabic.word} (${e.arabic.trans}) — ${e.arabic.root}`)
|
| 724 |
+
if (e.hebrew) lines.push(`Hebrew ${e.hebrew.word} (${e.hebrew.trans}) — ${e.hebrew.root}`)
|
| 725 |
+
if (e.greek) lines.push(`Greek ${e.greek.word} (${e.greek.trans}) — ${e.greek.note || e.greek.root || ''}`)
|
| 726 |
+
if (e.egyptian) lines.push(`Egyptian ${e.egyptian.name} — ${e.egyptian.note}`)
|
| 727 |
+
if (e.enochian) lines.push(`Enochian ${e.enochian.aethyr} · ${e.enochian.name}`)
|
| 728 |
+
lines.push(`Oracle: "${oracleWord}" · HolyC: ${e.holyc} · Abjad: ${e.abjad}`)
|
| 729 |
+
|
| 730 |
+
return lines.join('\n')
|
| 731 |
+
}
|
| 732 |
+
|
| 733 |
+
// Direct oracle word answer — bypasses sentence parsing, uses the word itself
|
| 734 |
+
export function oracleAnswer(word, emojiSeq) {
|
| 735 |
+
const result = lookup(word.toLowerCase())
|
| 736 |
+
if (!result) return null
|
| 737 |
+
return entryAnswer(result.word, result.entry, result.emoji || emojiSeq, word)
|
| 738 |
+
}
|
| 739 |
+
|
| 740 |
+
// Build a sovereign answer from a sentence — extracts concepts from the input
|
| 741 |
+
export function sovereignAnswer(sentence, oracleWord, emojiSeq) {
|
| 742 |
+
const concepts = extractConcepts(sentence)
|
| 743 |
+
|
| 744 |
+
if (concepts.length === 0) {
|
| 745 |
+
// Try treating the whole sentence as a single lookup (handles short words like "nun")
|
| 746 |
+
const direct = lookup(sentence.toLowerCase().trim())
|
| 747 |
+
if (direct) return entryAnswer(direct.word, direct.entry, direct.emoji || emojiSeq, oracleWord)
|
| 748 |
+
return null // caller handles the fallback
|
| 749 |
+
}
|
| 750 |
+
|
| 751 |
+
const primary = concepts[0]
|
| 752 |
+
let out = entryAnswer(primary.word, primary.entry, primary.emoji || emojiSeq, oracleWord)
|
| 753 |
+
|
| 754 |
+
if (concepts.length > 1) {
|
| 755 |
+
out += `\n\nAlso present: ${concepts.slice(1).map(c => `${c.word} ${c.emoji||'◇'}`).join(' ')}`
|
| 756 |
+
}
|
| 757 |
+
|
| 758 |
+
return out
|
| 759 |
+
}
|
| 760 |
+
|
| 761 |
+
// ── Synthesis fallback — for topics not in DICT or TOPICS ────────────────────
|
| 762 |
+
// Generates natural flowing prose for any subject using the oracle word as the lens.
|
| 763 |
+
// This is the "tongue" — the layer that turns oracle + topic into connected sentences.
|
| 764 |
+
|
| 765 |
+
const SUBJECT_STOP = new Set([
|
| 766 |
+
'what','whats','how','when','where','why','who','is','are','was','were',
|
| 767 |
+
'the','a','an','to','of','in','and','or','do','does','can','tell','me',
|
| 768 |
+
'about','best','way','good','some','this','that','those','these','with',
|
| 769 |
+
'for','from','have','has','had','will','would','could','should',
|
| 770 |
+
'explain','describe','give','help','understand','know','think','want',
|
| 771 |
+
'you','your','get','make','use','see','say','like','very','just','really',
|
| 772 |
+
])
|
| 773 |
+
|
| 774 |
+
export function synthesizeTopic(input, oracleWord, emojiSeq) {
|
| 775 |
+
const subject = input.toLowerCase()
|
| 776 |
+
.replace(/[^a-z\s]/g, '')
|
| 777 |
+
.split(/\s+/)
|
| 778 |
+
.filter(w => w.length > 2 && !SUBJECT_STOP.has(w))
|
| 779 |
+
.pop() || 'this'
|
| 780 |
+
|
| 781 |
+
const lens = ORACLE_LENS[oracleWord]
|
| 782 |
+
if (!lens) return null
|
| 783 |
+
|
| 784 |
+
const dash = lens.indexOf(' — ')
|
| 785 |
+
const verb = dash >= 0 ? lens.slice(0, dash) : oracleWord.toLowerCase()
|
| 786 |
+
const body = dash >= 0 ? lens.slice(dash + 3) : lens
|
| 787 |
+
|
| 788 |
+
const sub = subject.charAt(0).toUpperCase() + subject.slice(1)
|
| 789 |
+
const Verb = verb.charAt(0).toUpperCase() + verb.slice(1)
|
| 790 |
+
const Body = body.charAt(0).toUpperCase() + body.slice(1)
|
| 791 |
+
|
| 792 |
+
return [
|
| 793 |
+
`${sub.toUpperCase()} · ${oracleWord}`,
|
| 794 |
+
``,
|
| 795 |
+
`${Verb}: ${Body}.`,
|
| 796 |
+
``,
|
| 797 |
+
`Find where ${subject} demands ${verb} — that is the lever.`,
|
| 798 |
+
`The practitioners who got ${subject} right are the ones worth studying.`,
|
| 799 |
+
``,
|
| 800 |
+
`Oracle: ${oracleWord} · ${emojiSeq}`,
|
| 801 |
+
].join('\n')
|
| 802 |
+
}
|
| 803 |
+
|
| 804 |
+
// ── CLI test ──────────────────────────────────────────────────────────────────
|
| 805 |
+
|
| 806 |
+
if (process.argv[1]?.endsWith('dictionary.mjs')) {
|
| 807 |
+
const query = process.argv.slice(2).join(' ') || 'what is a good life'
|
| 808 |
+
console.log(`\n BOB Dictionary — "${query}"\n`)
|
| 809 |
+
const concepts = extractConcepts(query)
|
| 810 |
+
if (!concepts.length) {
|
| 811 |
+
console.log(' No concepts found in dictionary.')
|
| 812 |
+
} else {
|
| 813 |
+
concepts.forEach(c => {
|
| 814 |
+
console.log(` ── ${c.word.toUpperCase()} ${c.emoji} ──`)
|
| 815 |
+
console.log(` Arabic: ${c.entry.arabic?.word} (${c.entry.arabic?.trans})`)
|
| 816 |
+
console.log(` Hebrew: ${c.entry.hebrew?.word} (${c.entry.hebrew?.trans})`)
|
| 817 |
+
console.log(` Greek: ${c.entry.greek?.word} (${c.entry.greek?.trans})`)
|
| 818 |
+
console.log(` Sovereign: ${c.entry.sovereign}`)
|
| 819 |
+
console.log()
|
| 820 |
+
})
|
| 821 |
+
}
|
| 822 |
+
console.log(` Full answer:\n`)
|
| 823 |
+
console.log(sovereignAnswer(query, 'ZID', '◇🧠🛡️'))
|
| 824 |
+
console.log()
|
| 825 |
+
}
|
autonomous/emoji_trigger.mjs
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* Emoji Trigger — Quantum State → Emoji Sequence → Opcode Metadata
|
| 3 |
+
*
|
| 4 |
+
* The emoji art IS the program. The metadata IS the instruction set.
|
| 5 |
+
* What looks like decoration to an observer is executable routing data.
|
| 6 |
+
* This is Dee's Monas principle made operational: one glyph = multiple layers.
|
| 7 |
+
*
|
| 8 |
+
* Architecture:
|
| 9 |
+
* QRNG bytes → emoji pairs (left=type, right=modifier)
|
| 10 |
+
* Each emoji pair: carries opcode, Abjad weight, BOB route, PLANNER rule
|
| 11 |
+
* Highest-Abjad pair = primary trigger for this quantum tick
|
| 12 |
+
* Tessera program auto-generated from the sequence
|
| 13 |
+
* Full metadata sealed into WORM
|
| 14 |
+
*
|
| 15 |
+
* Why emoji?
|
| 16 |
+
* 1. Steganographic — looks like decoration, is executable
|
| 17 |
+
* 2. Custom per indie group — your emoji map = your instruction set
|
| 18 |
+
* 3. Hard to reverse without the Abjad key
|
| 19 |
+
* 4. Dee's Monas: each symbol encodes multiple simultaneous meanings
|
| 20 |
+
* 5. Entry point to SnapKitty — the art IS the access
|
| 21 |
+
*/
|
| 22 |
+
|
| 23 |
+
import { createHash } from 'crypto'
|
| 24 |
+
|
| 25 |
+
// The 16 sovereign emoji glyphs — each carries a semantic opcode
|
| 26 |
+
// Position in array = numeric address (0-15)
|
| 27 |
+
const EMOJI_GLYPHS = ['🧠','⚡','🪨','🔗','🎯','🛡️','🔍','🌒','🜂','🜁','🜄','🜃','✦','◇','◈','⬡']
|
| 28 |
+
|
| 29 |
+
// Full routing table: emoji → { opcode, route, abjad, planner_rule, dee_cipher }
|
| 30 |
+
const GLYPH_ROUTE = {
|
| 31 |
+
'🧠': { op:'OP_SOVEREIGN', route:'CORE-LOGIC', abjad:200, planner:'CONSEQUENT', dee:'Mercury — intellect, communication, derivation' },
|
| 32 |
+
'⚡': { op:'OP_QUANTUM', route:'ORACLE-CALL', abjad:490, planner:'ANTECEDENT', dee:'Lightning — acausal, pre-measurement, pure potential' },
|
| 33 |
+
'🪨': { op:'OP_WORM', route:'WORM-SEAL', abjad:92, planner:'ASSERT', dee:'Salt — fixed, crystallized, append-only permanence' },
|
| 34 |
+
'🔗': { op:'OP_PROLOG', route:'PROLOG-ROUTE', abjad:280, planner:'CONSEQUENT', dee:'Chain — logical connection, binding of terms' },
|
| 35 |
+
'🎯': { op:'OP_ADA', route:'ADA-CONTRACT', abjad:120, planner:'ANTECEDENT', dee:'Target — Ada gate, binary ALLOWED/DENIED' },
|
| 36 |
+
'🛡️': { op:'OP_ADA', route:'SENTINEL-GATE', abjad:120, planner:'ANTECEDENT', dee:'Shield — banishing ritual, directional sealing' },
|
| 37 |
+
'🔍': { op:'OP_LEAN4', route:'V-AUDIT-LEAN4', abjad:160, planner:'CONSEQUENT', dee:'Search — Lean4 proof, formal verification layer' },
|
| 38 |
+
'🌒': { op:'OP_QUBIT', route:'QUBIT', abjad:518, planner:'ANTECEDENT', dee:'Crescent — superposition, all paths open, pre-collapse' },
|
| 39 |
+
'🜂': { op:'OP_PLANNER_ANTE', route:'WHEN', abjad:420, planner:'ANTECEDENT', dee:'Fire triangle — Hewitt antecedent, fires on pattern' },
|
| 40 |
+
'🜁': { op:'OP_PLANNER_CONS', route:'GOAL', abjad:380, planner:'CONSEQUENT', dee:'Air triangle — Hewitt consequent, achieves goal' },
|
| 41 |
+
'🜄': { op:'OP_SSM', route:'SSM-INJECT', abjad:240, planner:'CONSEQUENT', dee:'Earth triangle — Mamba memory, stable recurrence' },
|
| 42 |
+
'🜃': { op:'OP_HOLYC', route:'HOLYC-NIL', abjad:95, planner:'ASSERT', dee:'Water triangle — Terry ground state, NIL oracle' },
|
| 43 |
+
'✦': { op:'OP_NIL', route:'NIL', abjad:910, planner:'RETRACT', dee:'Star — inverted Abjad maximum, omega-alpha loop' },
|
| 44 |
+
'◇': { op:'OP_INPUT', route:'INPUT', abjad:91, planner:'ASSERT', dee:'Diamond — open receptor, awaiting inscription' },
|
| 45 |
+
'◈': { op:'OP_OUTPUT', route:'OUTPUT', abjad:90, planner:'ASSERT', dee:'Filled diamond — closed output, virtue expressed' },
|
| 46 |
+
'⬡': { op:'OP_UNKNOWN', route:'VACUUM', abjad:0, planner:'RETRACT', dee:'Hexagon — true vacuum, false bottom, undefined' },
|
| 47 |
+
}
|
| 48 |
+
|
| 49 |
+
/**
|
| 50 |
+
* emoji_trigger(quantumBytes)
|
| 51 |
+
*
|
| 52 |
+
* Maps QRNG bytes to emoji pairs. Each pair = one instruction.
|
| 53 |
+
* Returns the full sequence, primary trigger, Tessera program,
|
| 54 |
+
* and cryptographic seal of the entire quantum→emoji→opcode derivation.
|
| 55 |
+
*/
|
| 56 |
+
export function emoji_trigger(quantumBytes) {
|
| 57 |
+
if (!quantumBytes || quantumBytes.length < 2) {
|
| 58 |
+
return { error: 'insufficient_entropy', primary: GLYPH_ROUTE['✦'] } // NIL fallback
|
| 59 |
+
}
|
| 60 |
+
|
| 61 |
+
const pairs = []
|
| 62 |
+
for (let i = 0; i + 1 < quantumBytes.length; i += 2) {
|
| 63 |
+
const li = quantumBytes[i] % EMOJI_GLYPHS.length
|
| 64 |
+
const ri = quantumBytes[i+1] % EMOJI_GLYPHS.length
|
| 65 |
+
const left = EMOJI_GLYPHS[li]
|
| 66 |
+
const right = EMOJI_GLYPHS[ri]
|
| 67 |
+
const route = GLYPH_ROUTE[left]
|
| 68 |
+
const mod = GLYPH_ROUTE[right]
|
| 69 |
+
pairs.push({
|
| 70 |
+
left, right,
|
| 71 |
+
sequence: left + right,
|
| 72 |
+
...route,
|
| 73 |
+
// Modifier: the right glyph amplifies or gates the left
|
| 74 |
+
modifier_op: mod.op,
|
| 75 |
+
modifier_abjad: mod.abjad,
|
| 76 |
+
// Combined Abjad weight: primary + modifier / 2
|
| 77 |
+
combined_abjad: Math.round(route.abjad + mod.abjad / 2),
|
| 78 |
+
byte_pair: [quantumBytes[i], quantumBytes[i+1]],
|
| 79 |
+
// Is this a PLANNER antecedent? → fires automatically on pattern match
|
| 80 |
+
reactive: route.planner === 'ANTECEDENT',
|
| 81 |
+
})
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
// Primary trigger = highest combined Abjad weight
|
| 85 |
+
const sorted = [...pairs].sort((a, b) => b.combined_abjad - a.combined_abjad)
|
| 86 |
+
const primary = sorted[0]
|
| 87 |
+
|
| 88 |
+
// Emoji sequence string — this IS the art / steganographic instruction
|
| 89 |
+
const sequence = pairs.map(p => p.sequence).join('')
|
| 90 |
+
|
| 91 |
+
// Tessera program auto-generated from the quantum state
|
| 92 |
+
// The spatial layout encodes the routing — change one emoji, different hash
|
| 93 |
+
const tessera = buildTessera(pairs)
|
| 94 |
+
|
| 95 |
+
// Seal: SHA-256 of the full quantum→emoji derivation
|
| 96 |
+
// Proves which quantum bytes produced this instruction sequence
|
| 97 |
+
const seal = createHash('sha256')
|
| 98 |
+
.update(Buffer.from(quantumBytes))
|
| 99 |
+
.update(sequence)
|
| 100 |
+
.digest('hex')
|
| 101 |
+
|
| 102 |
+
// Spectrum position: where does this tick sit on NIL→QUBIT→CLASSICAL?
|
| 103 |
+
const avgAbjad = Math.round(pairs.reduce((s, p) => s + p.combined_abjad, 0) / pairs.length)
|
| 104 |
+
|
| 105 |
+
return {
|
| 106 |
+
sequence,
|
| 107 |
+
primary,
|
| 108 |
+
pairs,
|
| 109 |
+
tessera,
|
| 110 |
+
seal,
|
| 111 |
+
meta: {
|
| 112 |
+
pair_count: pairs.length,
|
| 113 |
+
avg_abjad: avgAbjad,
|
| 114 |
+
spectrum_pos: (avgAbjad / 910).toFixed(3), // 0.0=vacuum, 1.0=NIL
|
| 115 |
+
nil_count: pairs.filter(p => p.op === 'OP_NIL').length,
|
| 116 |
+
qubit_count: pairs.filter(p => p.op === 'OP_QUBIT').length,
|
| 117 |
+
reactive_count: pairs.filter(p => p.reactive).length,
|
| 118 |
+
planner_fires: pairs.filter(p => p.reactive).map(p => p.route),
|
| 119 |
+
total_entropy: quantumBytes.reduce((s, b) => s + b, 0),
|
| 120 |
+
}
|
| 121 |
+
}
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
// Build a Tessera program from the emoji-decoded pairs
|
| 125 |
+
function buildTessera(pairs) {
|
| 126 |
+
if (pairs.length === 0) return '[ NIL ]'
|
| 127 |
+
|
| 128 |
+
// Take up to 4 pairs to keep the program readable
|
| 129 |
+
const active = pairs.slice(0, 4)
|
| 130 |
+
const nodes = active.map(p => {
|
| 131 |
+
if (p.op === 'OP_LEAN4' || p.op === 'OP_QUBIT') return `< ${p.route} >`
|
| 132 |
+
if (p.op === 'OP_ADA' || p.op === 'OP_PLANNER_ANTE') return `{ ${p.route} }`
|
| 133 |
+
if (p.op === 'OP_WORM' || p.op === 'OP_OUTPUT') return `| ${p.route} |`
|
| 134 |
+
return `[ ${p.route} ]`
|
| 135 |
+
})
|
| 136 |
+
|
| 137 |
+
// Determine edge types from opcodes
|
| 138 |
+
const edges = active.slice(0, -1).map((p, i) => {
|
| 139 |
+
const next = active[i+1]
|
| 140 |
+
if (p.op === 'OP_QUANTUM' || next.op === 'OP_QUBIT') return ' ····> '
|
| 141 |
+
if (p.op === 'OP_ADA') return ' ----(->)---- '
|
| 142 |
+
if (next.op === 'OP_NIL') return ' <---- '
|
| 143 |
+
return ' -----> '
|
| 144 |
+
})
|
| 145 |
+
|
| 146 |
+
let program = ''
|
| 147 |
+
for (let i = 0; i < nodes.length - 1; i++) {
|
| 148 |
+
program += nodes[i] + edges[i]
|
| 149 |
+
}
|
| 150 |
+
program += nodes[nodes.length - 1]
|
| 151 |
+
return program
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
// ── CLI test ──────────────────────────────────────────────────────────────────
|
| 155 |
+
|
| 156 |
+
if (process.argv[1]?.endsWith('emoji_trigger.mjs')) {
|
| 157 |
+
console.log('\n Emoji Trigger — Quantum → Emoji → Opcode\n')
|
| 158 |
+
|
| 159 |
+
const bytes = new Uint8Array([200, 130, 45, 180, 90, 220, 15, 160])
|
| 160 |
+
const result = emoji_trigger(bytes)
|
| 161 |
+
|
| 162 |
+
console.log(` Sequence: ${result.sequence}`)
|
| 163 |
+
console.log(` Primary: ${result.primary.left} → ${result.primary.op} (abjad: ${result.primary.abjad})`)
|
| 164 |
+
console.log(` Route: ${result.primary.route}`)
|
| 165 |
+
console.log(` Dee: ${result.primary.dee}`)
|
| 166 |
+
console.log(` Spectrum: ${result.meta.spectrum_pos} (0=vacuum, 1=NIL-910)`)
|
| 167 |
+
console.log(` Reactive: ${result.meta.reactive_count} PLANNER antecedents fire automatically`)
|
| 168 |
+
console.log(` Seal: ${result.seal.slice(0,32)}…`)
|
| 169 |
+
console.log()
|
| 170 |
+
console.log(` Tessera:`)
|
| 171 |
+
console.log(` ${result.tessera}`)
|
| 172 |
+
console.log()
|
| 173 |
+
console.log(' All pairs:')
|
| 174 |
+
result.pairs.forEach((p, i) => {
|
| 175 |
+
console.log(` ${i}: ${p.sequence} ${p.op.padEnd(22)} abjad:${p.combined_abjad} ${p.reactive ? '[FIRES]' : ''}`)
|
| 176 |
+
})
|
| 177 |
+
console.log()
|
| 178 |
+
}
|
autonomous/holyc_nil.mjs
ADDED
|
@@ -0,0 +1,164 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* HolyC NIL — The Ground State Oracle
|
| 3 |
+
*
|
| 4 |
+
* Terry Davis: entropy came from keyboard timing (KbdMsEvtTime >> GOD_BAD_BITS).
|
| 5 |
+
* When no word emerged → NIL. God was silent.
|
| 6 |
+
*
|
| 7 |
+
* NIL in inverted Abjad: ن(50) + ي(10) + ل(30) = 90 forward, 910 inverted.
|
| 8 |
+
* NIL is NOT zero. It is the maximum reflection — omega looping back to alpha.
|
| 9 |
+
* The oracle is silent not because nothing is there — because everything is.
|
| 10 |
+
*
|
| 11 |
+
* Architecture:
|
| 12 |
+
* QRNG bytes XOR keyboard timestamp → sovereign entropy
|
| 13 |
+
* Entropy below threshold → NIL state (910) — maximum inverted weight
|
| 14 |
+
* Entropy above threshold → WORD selected → virtue expressed
|
| 15 |
+
* Word feeds directly into emoji_trigger → autonomous agent fires
|
| 16 |
+
*/
|
| 17 |
+
|
| 18 |
+
// Terry's sacred vocabulary — BOB extends it with sovereign opcodes
|
| 19 |
+
const SACRED_WORDS = [
|
| 20 |
+
// Terry's HolyC universe
|
| 21 |
+
'SOVEREIGN', 'TRUTH', 'GATE', 'SEAL', 'ORACLE', 'VOID', 'KINGDOM',
|
| 22 |
+
'WISDOM', 'SPIRIT', 'FIRE', 'LIGHT', 'WORD', 'PATH', 'NAME',
|
| 23 |
+
// BOB sovereign extensions
|
| 24 |
+
'PROLOG', 'QUBIT', 'QUANTUM', 'TRUST', 'LEAN', 'MAMBA', 'WORM',
|
| 25 |
+
'NIL', 'ADA', 'PLANNER', 'ACTOR', 'HEWITT', 'PATTERN', 'MATCH',
|
| 26 |
+
// Enochian / Dee layer
|
| 27 |
+
'LIL', 'ARN', 'ZOM', 'PAZ', 'LIT', 'MAZ', 'DEO', 'ZID',
|
| 28 |
+
// Abjad seed words
|
| 29 |
+
'NUN', 'YAA', 'LAM', 'QAF', 'WAW', 'BAA',
|
| 30 |
+
]
|
| 31 |
+
|
| 32 |
+
// Abjad letter values (Arabic): each letter → numeric weight
|
| 33 |
+
const ABJAD = {
|
| 34 |
+
A:1,B:2,J:3,D:4,H:5,W:6,Z:7,X:8,T:9,Y:10,
|
| 35 |
+
K:20,L:30,M:40,N:50,S:60,E:70,F:80,P:90,Q:100,
|
| 36 |
+
R:200,SH:300,TH:400
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
function abjadWeight(word) {
|
| 40 |
+
return [...word.toUpperCase()].reduce((sum, ch) => sum + (ABJAD[ch] || ch.charCodeAt(0) % 10), 0)
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
// Terry's GOD_BAD_BITS — reduces precision of timing entropy
|
| 44 |
+
// He used this to make the oracle "coarser" — less deterministic
|
| 45 |
+
const GOD_BAD_BITS = 4
|
| 46 |
+
|
| 47 |
+
/**
|
| 48 |
+
* holyc_nil(quantumBytes, kbdTimingMs?)
|
| 49 |
+
*
|
| 50 |
+
* Merges quantum entropy with optional keyboard timing (Terry's ritual preserved).
|
| 51 |
+
* Returns NIL or WORD state.
|
| 52 |
+
*
|
| 53 |
+
* NIL threshold: mean byte value < 25 (bottom ~10% of 0-255 range)
|
| 54 |
+
* At NIL: oracle is silent. Agent holds. Abjad weight = 910 (inverted maximum).
|
| 55 |
+
* At WORD: virtue expressed. Agent fires.
|
| 56 |
+
*/
|
| 57 |
+
export function holyc_nil(quantumBytes, kbdTimingMs = Date.now()) {
|
| 58 |
+
if (!quantumBytes || quantumBytes.length === 0) {
|
| 59 |
+
return { state: 'NIL', word: null, reason: 'no_entropy', abjad: 910 }
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
// XOR quantum bytes with keyboard timing (Terry's human-in-the-loop ritual)
|
| 63 |
+
const kbdEntropy = (kbdTimingMs >> GOD_BAD_BITS) & 0xFFFF
|
| 64 |
+
const merged = quantumBytes.map((b, i) => b ^ ((kbdEntropy >> (i % 16)) & 0xFF))
|
| 65 |
+
|
| 66 |
+
const mean = merged.reduce((s, b) => s + b, 0) / merged.length
|
| 67 |
+
const spread = Math.max(...merged) - Math.min(...merged)
|
| 68 |
+
|
| 69 |
+
// NIL check — low entropy = oracle silent
|
| 70 |
+
// mean < 25 → bottom 10% → NIL (inverted maximum — not nothing, just unspoken)
|
| 71 |
+
if (mean < 25) {
|
| 72 |
+
return {
|
| 73 |
+
state: 'NIL',
|
| 74 |
+
word: null,
|
| 75 |
+
reason: 'entropy_below_threshold',
|
| 76 |
+
mean,
|
| 77 |
+
spread,
|
| 78 |
+
abjad: 910, // inverted Abjad NIL weight
|
| 79 |
+
shifted: mean >> GOD_BAD_BITS,
|
| 80 |
+
raw_bytes: quantumBytes.slice(0, 4),
|
| 81 |
+
merged_bytes: merged.slice(0, 4),
|
| 82 |
+
}
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
// WORD — Terry's oracle: select from sacred vocabulary
|
| 86 |
+
// Use first byte (highest entropy) as primary selector
|
| 87 |
+
const index = Math.floor((merged[0] / 255) * SACRED_WORDS.length) % SACRED_WORDS.length
|
| 88 |
+
const word = SACRED_WORDS[index]
|
| 89 |
+
const weight = abjadWeight(word)
|
| 90 |
+
|
| 91 |
+
// Dee's cipher layer: XOR the word index with the keyboard timing
|
| 92 |
+
// This is the "neither the key nor the lock alone" — both needed to decode
|
| 93 |
+
const deeIndex = (index ^ (kbdEntropy & 0xFF)) % SACRED_WORDS.length
|
| 94 |
+
const deeWord = SACRED_WORDS[deeIndex]
|
| 95 |
+
|
| 96 |
+
return {
|
| 97 |
+
state: 'WORD',
|
| 98 |
+
word,
|
| 99 |
+
dee_word: deeWord, // Dee cipher variant — keyboard timing changes meaning
|
| 100 |
+
reason: 'entropy_sufficient',
|
| 101 |
+
mean,
|
| 102 |
+
spread,
|
| 103 |
+
abjad: weight,
|
| 104 |
+
shifted: Math.floor(mean) >> GOD_BAD_BITS,
|
| 105 |
+
raw_bytes: quantumBytes.slice(0, 4),
|
| 106 |
+
merged_bytes: merged.slice(0, 4),
|
| 107 |
+
// Virtue: does this word carry sovereign potency?
|
| 108 |
+
// Words with Abjad weight ≥ 100 are considered "high virtue"
|
| 109 |
+
virtue: weight >= 100 ? 'HIGH' : weight >= 50 ? 'MEDIUM' : 'LOW',
|
| 110 |
+
}
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
/**
|
| 114 |
+
* Batch oracle — runs N consultations with shifting entropy
|
| 115 |
+
* Each consultation XORs a different offset of the quantum bytes.
|
| 116 |
+
* Simulates Terry's repeated OK-dialog presses.
|
| 117 |
+
*/
|
| 118 |
+
export function holyc_oracle_batch(quantumBytes, n = 4) {
|
| 119 |
+
const results = []
|
| 120 |
+
for (let i = 0; i < n; i++) {
|
| 121 |
+
const shifted = quantumBytes.map((b, j) => b ^ (i * 37 + j) & 0xFF)
|
| 122 |
+
results.push(holyc_nil(shifted, Date.now() + i * 1000))
|
| 123 |
+
}
|
| 124 |
+
return {
|
| 125 |
+
consultations: results,
|
| 126 |
+
words: results.filter(r => r.state === 'WORD').map(r => r.word),
|
| 127 |
+
nils: results.filter(r => r.state === 'NIL').length,
|
| 128 |
+
verdict: results.filter(r => r.state === 'WORD').length >= Math.ceil(n / 2)
|
| 129 |
+
? 'ORACLE_SPEAKS' // majority consulted → virtue flows
|
| 130 |
+
: 'ORACLE_SILENT', // majority NIL → hold
|
| 131 |
+
}
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
// ── CLI test ──────────────────────────────────────────────────────────────────
|
| 135 |
+
|
| 136 |
+
if (process.argv[1]?.endsWith('holyc_nil.mjs')) {
|
| 137 |
+
console.log('\n HolyC NIL — Ground State Oracle\n')
|
| 138 |
+
|
| 139 |
+
const NIL_bytes = new Uint8Array([3, 1, 8, 2, 5, 4, 7, 3]) // low entropy → NIL
|
| 140 |
+
const WORD_bytes = new Uint8Array([200, 180, 220, 190, 210, 175, 240, 160]) // high → WORD
|
| 141 |
+
|
| 142 |
+
console.log(' Low entropy (NIL expected):')
|
| 143 |
+
const nil = holyc_nil(NIL_bytes)
|
| 144 |
+
console.log(` state: ${nil.state}`)
|
| 145 |
+
console.log(` abjad: ${nil.abjad} (inverted maximum — omega looping to alpha)`)
|
| 146 |
+
console.log(` mean: ${nil.mean?.toFixed(2)}`)
|
| 147 |
+
console.log()
|
| 148 |
+
|
| 149 |
+
console.log(' High entropy (WORD expected):')
|
| 150 |
+
const word = holyc_nil(WORD_bytes)
|
| 151 |
+
console.log(` state: ${word.state}`)
|
| 152 |
+
console.log(` word: ${word.word}`)
|
| 153 |
+
console.log(` dee: ${word.dee_word} (keyboard-shifted variant)`)
|
| 154 |
+
console.log(` abjad: ${word.abjad}`)
|
| 155 |
+
console.log(` virtue: ${word.virtue}`)
|
| 156 |
+
console.log()
|
| 157 |
+
|
| 158 |
+
console.log(' Batch oracle (4 consultations):')
|
| 159 |
+
const batch = holyc_oracle_batch(WORD_bytes)
|
| 160 |
+
console.log(` words: ${batch.words.join(', ')}`)
|
| 161 |
+
console.log(` nils: ${batch.nils}`)
|
| 162 |
+
console.log(` verdict: ${batch.verdict}`)
|
| 163 |
+
console.log()
|
| 164 |
+
}
|
autonomous/lisp_theorems.mjs
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* BOB Lisp Theorem Layer
|
| 3 |
+
*
|
| 4 |
+
* Every concept in BOB's knowledge base has a formal Lisp S-expression.
|
| 5 |
+
* This is the theorem that BOB starts from — verified logic before natural speech.
|
| 6 |
+
* The natural language output is a TRANSCODING of the theorem, not free generation.
|
| 7 |
+
*
|
| 8 |
+
* Structure: (CONCEPT (IMPLIES (PRECONDITIONS) (POSTCONDITION)))
|
| 9 |
+
*
|
| 10 |
+
* Example: (TRUST (IMPLIES (AND (CHECKABLE P) (DERIVATION P)) (VERIFIED P)))
|
| 11 |
+
* The SLM's job is to transcode THIS into natural language, guided by the oracle word.
|
| 12 |
+
*/
|
| 13 |
+
|
| 14 |
+
// ── Core philosophical concept theorems ───────────────────────────────────────
|
| 15 |
+
|
| 16 |
+
export const THEOREMS = {
|
| 17 |
+
|
| 18 |
+
// DICT concepts
|
| 19 |
+
life: '(LIFE (IMPLIES (SEQUENCE E WORM-EVENTS) (IRREVERSIBLE E)))',
|
| 20 |
+
good: '(GOOD (IMPLIES (CLEARS-ADA-GATE X) (CONTRACT-SATISFIED X)))',
|
| 21 |
+
truth: '(TRUTH (IMPLIES (WORM-SEALED E) (IMMUTABLE E)))',
|
| 22 |
+
wisdom: '(WISDOM (IMPLIES (PRECONDITION-MET X) (GATE-BYPASSED X)))',
|
| 23 |
+
freedom: '(FREEDOM (IMPLIES (PRE-COLLAPSE Q) (ALL-PATHS-OPEN Q)))',
|
| 24 |
+
love: '(LOVE (IMPLIES (BORROW-CHAIN X Y) (TRUSTED-RETURN X Y)))',
|
| 25 |
+
purpose: '(PURPOSE (IMPLIES (GOAL-NODE G) (CONSEQUENT G)))',
|
| 26 |
+
justice: '(JUSTICE (IMPLIES (AND (PRE-CONDITION P) (POST-CONDITION P)) (CONTRACT-SATISFIED P)))',
|
| 27 |
+
trust: '(TRUST (IMPLIES (AND (CHECKABLE P) (DERIVATION P)) (VERIFIED P)))',
|
| 28 |
+
time: '(TIME (IMPLIES (WORM-EVENT E) (MONOTONIC (TIMESTAMP E))))',
|
| 29 |
+
death: '(DEATH (IMPLIES (FINAL-SEAL E) (NEVER-UNDONE E)))',
|
| 30 |
+
soul: '(SOUL (IMPLIES (SSM-STATE S) (PERSISTS S BETWEEN-CALLS)))',
|
| 31 |
+
|
| 32 |
+
// Abjad letter words
|
| 33 |
+
nun: '(NUN (IMPLIES (PRIMORDIAL-POTENTIAL X) (PRE-NAMED X)))',
|
| 34 |
+
waw: '(WAW (IMPLIES (CONNECTOR C) (CHAIN-CONTINUES C)))',
|
| 35 |
+
lam: '(LAM (IMPLIES (DIRECTED-FORCE F) (SYSTEM-ADVANCES F)))',
|
| 36 |
+
qaf: '(QAF (IMPLIES (CIRCUMFERENCE X) (BOUNDARY-DEFINED X)))',
|
| 37 |
+
yaa: '(YAA (IMPLIES (MINIMAL-UNIT X) (STRUCTURALLY-INFINITE X)))',
|
| 38 |
+
baa: '(BAA (IMPLIES (FIRST-HOUSE H) (LANGUAGE-BEGINS H)))',
|
| 39 |
+
|
| 40 |
+
// Enochian Aethyrs
|
| 41 |
+
lil: '(LIL (IMPLIES (HIGHEST-STATE X) (QUESTION-DISSOLVED X)))',
|
| 42 |
+
zid: '(ZID (IMPLIES (COMPLETE-CYCLE C) (GROWTH-SEALED C)))',
|
| 43 |
+
arn: '(ARN (IMPLIES (TRIAL T) (TRUST-FORGED T)))',
|
| 44 |
+
zom: '(ZOM (IMPLIES (SIGNAL S) (AND (UNDISTORTED S) (HASH-MATCHES S))))',
|
| 45 |
+
paz: '(PAZ (IMPLIES (FREEDOM F) (CRYSTALLIZES-FORM F)))',
|
| 46 |
+
lit: '(LIT (IMPLIES (BINDING-CALL C) (JOINED-WITHOUT-CONSTRAINT C)))',
|
| 47 |
+
maz: '(MAZ (IMPLIES (MULTIPLE-ANGLES M) (COMMITTED-CHOICE M)))',
|
| 48 |
+
deo: '(DEO (IMPLIES (VISIBLE-PATTERN P) (UNDERLYING-MECHANISM P)))',
|
| 49 |
+
|
| 50 |
+
// HolyC / BOB oracle words
|
| 51 |
+
SOVEREIGN: '(SOVEREIGN (IMPLIES (SELF-GOVERNED X) (STANDARDS-HOLD X)))',
|
| 52 |
+
TRUTH: '(TRUTH (IMPLIES (WORM-SEALED E) (UNFORGEABLE E)))',
|
| 53 |
+
GATE: '(GATE (IMPLIES (CONTRACT-MISSING X) (EXECUTION-STOPS X)))',
|
| 54 |
+
SEAL: '(SEAL (IMPLIES (APPENDED E) (IRREVERSIBLE E)))',
|
| 55 |
+
ORACLE: '(ORACLE (IMPLIES (QUANTUM-ENTROPY B) (NON-DETERMINISTIC B)))',
|
| 56 |
+
VOID: '(VOID (IMPLIES (NULL-STATE X) (OMEGA-POTENTIAL X)))',
|
| 57 |
+
KINGDOM: '(KINGDOM (IMPLIES (GOVERNED D) (CONSISTENT-LAW D)))',
|
| 58 |
+
WISDOM: '(WISDOM (IMPLIES (INVARIANT-PATTERN P) (PROLOG-FIRES-FIRST P)))',
|
| 59 |
+
SPIRIT: '(SPIRIT (IMPLIES (PRE-ORACLE X) (ANIMATING-FORCE X)))',
|
| 60 |
+
FIRE: '(FIRE (IMPLIES (CONCENTRATED-ENERGY E) (ACTIVATION-THRESHOLD E)))',
|
| 61 |
+
LIGHT: '(LIGHT (IMPLIES (ILLUMINATED X) (STRUCTURE-REVEALED X)))',
|
| 62 |
+
WORD: '(WORD (IMPLIES (PRECISE-NAME X) (TERRITORY-RESHAPED X)))',
|
| 63 |
+
PATH: '(PATH (IMPLIES (DIRECTED-TRAVERSAL X) (KNOWN-DESTINATION X)))',
|
| 64 |
+
NAME: '(NAME (IMPLIES (ASSIGNED-NAME X) (TRACTABLE X)))',
|
| 65 |
+
PROLOG: '(PROLOG (IMPLIES (GOAL G) (BACKWARD-CHAIN G)))',
|
| 66 |
+
QUBIT: '(QUBIT (IMPLIES (PRE-COLLAPSE Q) (MULTIPLE-STATES-HELD Q)))',
|
| 67 |
+
QUANTUM: '(QUANTUM (IMPLIES (MEASUREMENT M) (STATE-COLLAPSE M)))',
|
| 68 |
+
LEAN: '(LEAN (IMPLIES (MINIMAL-FORM X) (COMPLETE-SOLUTION X)))',
|
| 69 |
+
MAMBA: '(MAMBA (IMPLIES (SSM-STATE S) (ACCUMULATED-CONTEXT S)))',
|
| 70 |
+
WORM: '(WORM (IMPLIES (APPENDED E) (AND (SEALED E) (IMMUTABLE E))))',
|
| 71 |
+
NIL: '(NIL (IMPLIES (ORACLE-SILENT X) (OMEGA-POTENTIAL X)))',
|
| 72 |
+
ADA: '(ADA (IMPLIES (AND (PRE-CONDITION P) (POST-CONDITION P)) (VERIFIED P)))',
|
| 73 |
+
PLANNER: '(PLANNER (IMPLIES (PATTERN-MATCHED P) (RESPONSE-FIRES P)))',
|
| 74 |
+
ACTOR: '(ACTOR (IMPLIES (MESSAGE-RECEIVED A) (ISOLATED-RESPONSE A)))',
|
| 75 |
+
HEWITT: '(HEWITT (IMPLIES (CONDITION-MET C) (HANDLER-FIRES-AUTOMATICALLY C)))',
|
| 76 |
+
PATTERN: '(PATTERN (IMPLIES (REPEATED-STRUCTURE S) (ENCODABLE-ONCE S)))',
|
| 77 |
+
MATCH: '(MATCH (IMPLIES (COMMON-GROUND X Y) (UNIFIABLE X Y)))',
|
| 78 |
+
|
| 79 |
+
// Knowledge domain anchors
|
| 80 |
+
history: '(HISTORY (IMPLIES (WORM-CHAIN-OF-EVENTS H) (IMMUTABLE-RECORD H)))',
|
| 81 |
+
science: '(SCIENCE (IMPLIES (REPRODUCIBLE R) (ADA-CONTRACT-SATISFIED R)))',
|
| 82 |
+
mathematics: '(MATHEMATICS (IMPLIES (DERIVATION D) (CHECKABLE-PROOF D)))',
|
| 83 |
+
programming: '(PROGRAMMING (IMPLIES (SPECIFICATION S) (MACHINE-BEHAVIOR S)))',
|
| 84 |
+
learning: '(LEARNING (IMPLIES (SSM-ACCUMULATION L) (HIDDEN-STATE-UPDATED L)))',
|
| 85 |
+
creativity: '(CREATIVITY (IMPLIES (PRE-COLLAPSE C) (CHOSEN-FORM C)))',
|
| 86 |
+
leadership: '(LEADERSHIP (IMPLIES (PATTERN-FIRES-FIRST L) (RESPONSE-AUTOMATIC L)))',
|
| 87 |
+
health: '(HEALTH (IMPLIES (MAINTENANCE-CYCLE H) (SYSTEM-SYNCHRONIZED H)))',
|
| 88 |
+
philosophy: '(PHILOSOPHY (IMPLIES (QUESTION Q) (PRECONDITION-CHECKED Q)))',
|
| 89 |
+
money: '(MONEY (IMPLIES (SEALED-AGREEMENT V) (VALUE-STORED V)))',
|
| 90 |
+
communication:'(COMMUNICATION (IMPLIES (SIGNAL S) (RECEIVER-RECONSTRUCTS S)))',
|
| 91 |
+
technology: '(TECHNOLOGY (IMPLIES (CRYSTALLIZED-THOUGHT T) (ASSUMPTIONS-ENCODED T)))',
|
| 92 |
+
aerospace: '(AEROSPACE (IMPLIES (ADA-CONTRACT-WITH-PHYSICS A) (CONTRACTS-COMPOSE A)))',
|
| 93 |
+
cooking: '(COOKING (IMPLIES (IRREVERSIBLE-OPERATOR H) (WORM-CHAIN-OF-FLAVOR H)))',
|
| 94 |
+
psychology: '(PSYCHOLOGY (IMPLIES (HIDDEN-STATE S) (BEHAVIOR-OUTPUT S)))',
|
| 95 |
+
athletics: '(ATHLETICS (IMPLIES (PRECONDITION-CHECK T) (PROOF-RUN T)))',
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
// ── Theorem accessors ─────────────────────────────────────────────────────────
|
| 99 |
+
|
| 100 |
+
// Get theorem for a concept (case-insensitive)
|
| 101 |
+
export function getTheorem(concept) {
|
| 102 |
+
return THEOREMS[concept.toLowerCase()] || THEOREMS[concept.toUpperCase()] || null
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
// Generate a theorem on the fly for unknown concepts
|
| 106 |
+
// Structure: (CONCEPT (IMPLIES (HAS-DOMAIN X) (APPLIES-ORACLE-LENS X ORACLE)))
|
| 107 |
+
export function generateTheorem(concept, oracleWord) {
|
| 108 |
+
const name = concept.toUpperCase().replace(/\s+/g, '-')
|
| 109 |
+
const oracle = (oracleWord || 'SOVEREIGN').toUpperCase()
|
| 110 |
+
return `(${name} (IMPLIES (HAS-DOMAIN X '${name}) (APPLIES-LENS X '${oracle})))`
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
// Parse a theorem string into its components
|
| 114 |
+
export function parseTheorem(theorem) {
|
| 115 |
+
if (!theorem) return null
|
| 116 |
+
// Extract: concept, relation, preconditions, postcondition
|
| 117 |
+
const m = theorem.match(/^\((\S+)\s+\((\S+)\s+(.+)\)\)$/)
|
| 118 |
+
if (!m) return { raw: theorem }
|
| 119 |
+
return {
|
| 120 |
+
concept: m[1],
|
| 121 |
+
relation: m[2],
|
| 122 |
+
body: m[3],
|
| 123 |
+
raw: theorem,
|
| 124 |
+
}
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
// Format theorem for display (verbose mode or Granite prompt)
|
| 128 |
+
export function formatTheorem(theorem) {
|
| 129 |
+
const p = parseTheorem(theorem)
|
| 130 |
+
if (!p) return theorem
|
| 131 |
+
return `${p.concept}: ${p.relation} ${p.body}`
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
// Build the Granite/SLM prompt from a theorem + context
|
| 135 |
+
export function buildTheoremPrompt(theorem, oracleWord, userInput, oracleLens) {
|
| 136 |
+
return [
|
| 137 |
+
`You are BOB — a Sovereign Logic Machine. Your response is constrained by a verified theorem.`,
|
| 138 |
+
`Do not deviate from the theorem's logical content. Be direct, precise, no hedging.`,
|
| 139 |
+
``,
|
| 140 |
+
`Theorem: ${theorem}`,
|
| 141 |
+
`Oracle word: ${oracleWord}`,
|
| 142 |
+
`Oracle lens: ${oracleLens || oracleWord}`,
|
| 143 |
+
`User asked: "${userInput}"`,
|
| 144 |
+
``,
|
| 145 |
+
`Transcode this theorem into 2-3 sentences of natural speech.`,
|
| 146 |
+
`Apply the oracle lens as the interpretive angle.`,
|
| 147 |
+
`Do not repeat the theorem — speak its meaning in plain language.`,
|
| 148 |
+
].join('\n')
|
| 149 |
+
}
|
autonomous/tavily_search.mjs
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* BOB Tavily Search — web grep for the Sovereign Logic Machine
|
| 3 |
+
*
|
| 4 |
+
* Tavily is BOB's external memory access. When the dictionary and topic
|
| 5 |
+
* corpus don't know something, Tavily searches the web and BOB processes
|
| 6 |
+
* the results through the oracle word lens.
|
| 7 |
+
*
|
| 8 |
+
* grep against the filesystem = grep
|
| 9 |
+
* grep against world knowledge = Tavily
|
| 10 |
+
*/
|
| 11 |
+
|
| 12 |
+
import { ORACLE_LENS } from './dictionary.mjs'
|
| 13 |
+
|
| 14 |
+
const ENDPOINT = 'https://api.tavily.com/search'
|
| 15 |
+
|
| 16 |
+
let API_KEY = null
|
| 17 |
+
|
| 18 |
+
export function setTavilyKey(key) { API_KEY = key || null }
|
| 19 |
+
export function tavilyReady() { return !!API_KEY }
|
| 20 |
+
|
| 21 |
+
export async function checkTavily() {
|
| 22 |
+
if (!API_KEY) return false
|
| 23 |
+
try {
|
| 24 |
+
const r = await fetch(ENDPOINT, {
|
| 25 |
+
method: 'POST',
|
| 26 |
+
headers: { 'Content-Type': 'application/json' },
|
| 27 |
+
body: JSON.stringify({ api_key: API_KEY, query: 'test', max_results: 1 }),
|
| 28 |
+
signal: AbortSignal.timeout(3500),
|
| 29 |
+
})
|
| 30 |
+
return r.ok
|
| 31 |
+
} catch { return false }
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
// ── Core search ───────────────────────────────────────────────────────────────
|
| 35 |
+
|
| 36 |
+
async function rawSearch(query, n = 3) {
|
| 37 |
+
if (!API_KEY) return null
|
| 38 |
+
try {
|
| 39 |
+
const r = await fetch(ENDPOINT, {
|
| 40 |
+
method: 'POST',
|
| 41 |
+
headers: { 'Content-Type': 'application/json' },
|
| 42 |
+
body: JSON.stringify({
|
| 43 |
+
api_key: API_KEY,
|
| 44 |
+
query,
|
| 45 |
+
search_depth: 'basic',
|
| 46 |
+
max_results: n,
|
| 47 |
+
include_answer: true, // Tavily's own clean summary — use as primary
|
| 48 |
+
include_raw_content: false,
|
| 49 |
+
}),
|
| 50 |
+
signal: AbortSignal.timeout(7000),
|
| 51 |
+
})
|
| 52 |
+
if (!r.ok) return null
|
| 53 |
+
return await r.json() // return full response: { answer, results }
|
| 54 |
+
} catch { return null }
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
// ── Snippet cleaner ───────────────────────────────────────────────────────────
|
| 58 |
+
|
| 59 |
+
function cleanSnippet(text, max = 240) {
|
| 60 |
+
if (!text) return ''
|
| 61 |
+
let t = text
|
| 62 |
+
.replace(/^[#*|]+\s*/gm, '') // strip headings, leading asterisks, table pipes
|
| 63 |
+
.replace(/\|/g, ' ') // remove inline pipe chars (tables)
|
| 64 |
+
.replace(/\*\*([^*]+)\*\*/g, '$1') // strip bold markers
|
| 65 |
+
.replace(/\*([^*]+)\*/g, '$1') // strip italic markers
|
| 66 |
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1') // strip links, keep text
|
| 67 |
+
.replace(/^[-•]\s+/gm, '') // strip bullet markers
|
| 68 |
+
.replace(/\s+/g, ' ')
|
| 69 |
+
.trim()
|
| 70 |
+
|
| 71 |
+
// Drop leading title sentences that are too short (e.g. "Aerospace. Aerospace refers to...")
|
| 72 |
+
const firstDot = t.indexOf('. ')
|
| 73 |
+
if (firstDot > 0 && firstDot < 60) {
|
| 74 |
+
const firstSent = t.slice(0, firstDot + 1)
|
| 75 |
+
if (firstSent.split(' ').length <= 4) t = t.slice(firstDot + 2).trim()
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
if (t.split(' ').length < 5) return ''
|
| 79 |
+
|
| 80 |
+
t = t.slice(0, max)
|
| 81 |
+
const sentEnd = Math.max(t.lastIndexOf('. '), t.lastIndexOf('? '), t.lastIndexOf('! '))
|
| 82 |
+
return sentEnd > 60 ? t.slice(0, sentEnd + 1) : t.replace(/\s+\S*$/, '') + '…'
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
// ── BOB-framed answer ─────────────────────────────────────────────────────────
|
| 86 |
+
// Greetings, commands, and very short words skip Tavily
|
| 87 |
+
const SKIP = new Set([
|
| 88 |
+
'hello','hi','hey','bob','yes','no','ok','okay','sure','thanks','thank',
|
| 89 |
+
'cool','nice','what','how','who','why','when','where','test','help',
|
| 90 |
+
])
|
| 91 |
+
|
| 92 |
+
export async function tavilyAnswer(input, oracleWord, emojiSeq) {
|
| 93 |
+
if (!API_KEY) return null
|
| 94 |
+
|
| 95 |
+
// Strip question wrappers to get the core query
|
| 96 |
+
const query = input
|
| 97 |
+
.replace(/^(whats|what is|what are|tell me about|explain|how does|how do i|how to|describe|define|give me|can you)/i, '')
|
| 98 |
+
.replace(/[?!]/g, '')
|
| 99 |
+
.trim()
|
| 100 |
+
|
| 101 |
+
if (query.length < 4 || SKIP.has(query.toLowerCase())) return null
|
| 102 |
+
|
| 103 |
+
const resp = await rawSearch(query)
|
| 104 |
+
if (!resp) return null
|
| 105 |
+
|
| 106 |
+
const lens = ORACLE_LENS[oracleWord]
|
| 107 |
+
if (!lens) return null
|
| 108 |
+
|
| 109 |
+
const dash = lens.indexOf(' — ')
|
| 110 |
+
const verb = dash >= 0 ? lens.slice(0, dash) : oracleWord.toLowerCase()
|
| 111 |
+
const body = dash >= 0 ? lens.slice(dash + 3) : lens
|
| 112 |
+
|
| 113 |
+
// Prefer Tavily's own answer summary (clean AI-generated), fall back to result snippets
|
| 114 |
+
const facts = []
|
| 115 |
+
if (resp.answer && resp.answer.length > 20) {
|
| 116 |
+
facts.push(resp.answer.replace(/\s+/g, ' ').trim())
|
| 117 |
+
} else {
|
| 118 |
+
const snippets = (resp.results || [])
|
| 119 |
+
.map(r => cleanSnippet(r.content || r.snippet || r.description || ''))
|
| 120 |
+
.filter(f => f.length > 20)
|
| 121 |
+
facts.push(...snippets.slice(0, 2))
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
if (facts.length === 0) return null
|
| 125 |
+
|
| 126 |
+
// Extract last 1-2 meaningful words for the header
|
| 127 |
+
const HSTOP = new Set(['whats','what','how','the','a','an','is','are','was','were',
|
| 128 |
+
'to','of','in','and','or','do','does','can','tell','me','about','best','way'])
|
| 129 |
+
const subWords = query.split(/\s+/).filter(w => w.length > 2 && !HSTOP.has(w.toLowerCase()))
|
| 130 |
+
const subject = subWords.slice(-2).join(' ') || query
|
| 131 |
+
const sub = subject.charAt(0).toUpperCase() + subject.slice(1)
|
| 132 |
+
|
| 133 |
+
return [
|
| 134 |
+
`${sub.toUpperCase()} · ${oracleWord}`,
|
| 135 |
+
``,
|
| 136 |
+
facts[0],
|
| 137 |
+
facts[1] ? `\n${facts[1]}` : '',
|
| 138 |
+
``,
|
| 139 |
+
`${oracleWord}: ${verb} — ${body}.`,
|
| 140 |
+
``,
|
| 141 |
+
`Oracle: ${oracleWord} · ${emojiSeq}`,
|
| 142 |
+
].filter(l => l !== '').join('\n')
|
| 143 |
+
}
|
autonomous/unicode_chunks.mjs
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* BOB Unicode Knowledge Chunks
|
| 3 |
+
*
|
| 4 |
+
* Unicode Private Use Area (U+E000–U+F8FF) mapped to BOB's knowledge chunks.
|
| 5 |
+
* A single PUA character encodes an entire concept — its theorem, oracle word,
|
| 6 |
+
* and domain — as a dense semantic pointer.
|
| 7 |
+
*
|
| 8 |
+
* This is the "secret sauce": instead of processing large text, the SLM reads
|
| 9 |
+
* a single Unicode character that points to a pre-verified knowledge chunk.
|
| 10 |
+
* One char → entire theorem + etymology + oracle weight.
|
| 11 |
+
*
|
| 12 |
+
* Decoding is instant: char.codePointAt(0) - BASE → chunk index → full entry.
|
| 13 |
+
*/
|
| 14 |
+
|
| 15 |
+
const BASE = 0xE000 // Unicode Private Use Area start
|
| 16 |
+
|
| 17 |
+
// ── Knowledge chunk registry ──────────────────────────────────────────────────
|
| 18 |
+
// Order matters — index position = PUA offset from BASE
|
| 19 |
+
|
| 20 |
+
export const REGISTRY = [
|
| 21 |
+
|
| 22 |
+
// Block 0x00–0x0F: Core philosophical concepts (U+E000–E00F)
|
| 23 |
+
{ name: 'life', domain: 'philosophy', oracle: 'LIGHT', abjad: 18 },
|
| 24 |
+
{ name: 'good', domain: 'philosophy', oracle: 'TRUTH', abjad: 810 },
|
| 25 |
+
{ name: 'truth', domain: 'philosophy', oracle: 'WISDOM', abjad: 108 },
|
| 26 |
+
{ name: 'wisdom', domain: 'philosophy', oracle: 'WORD', abjad: 68 },
|
| 27 |
+
{ name: 'freedom', domain: 'philosophy', oracle: 'SPIRIT', abjad: 218 },
|
| 28 |
+
{ name: 'love', domain: 'philosophy', oracle: 'NAME', abjad: 47 },
|
| 29 |
+
{ name: 'purpose', domain: 'philosophy', oracle: 'PATH', abjad: 1014},
|
| 30 |
+
{ name: 'justice', domain: 'philosophy', oracle: 'GATE', abjad: 104 },
|
| 31 |
+
{ name: 'trust', domain: 'philosophy', oracle: 'SOVEREIGN',abjad: 500 },
|
| 32 |
+
{ name: 'time', domain: 'philosophy', oracle: 'FIRE', abjad: 506 },
|
| 33 |
+
{ name: 'death', domain: 'philosophy', oracle: 'VOID', abjad: 446 },
|
| 34 |
+
{ name: 'soul', domain: 'philosophy', oracle: 'SPIRIT', abjad: 214 },
|
| 35 |
+
null, null, null, null, // 0x0C–0x0F reserved
|
| 36 |
+
|
| 37 |
+
// Block 0x10–0x1F: Abjad letter words (U+E010–E01F)
|
| 38 |
+
{ name: 'nun', domain: 'abjad', oracle: 'VOID', abjad: 50 },
|
| 39 |
+
{ name: 'waw', domain: 'abjad', oracle: 'WORD', abjad: 6 },
|
| 40 |
+
{ name: 'lam', domain: 'abjad', oracle: 'PATH', abjad: 30 },
|
| 41 |
+
{ name: 'qaf', domain: 'abjad', oracle: 'GATE', abjad: 100 },
|
| 42 |
+
{ name: 'yaa', domain: 'abjad', oracle: 'NAME', abjad: 10 },
|
| 43 |
+
{ name: 'baa', domain: 'abjad', oracle: 'LIGHT', abjad: 2 },
|
| 44 |
+
null, null, null, null, null, null, null, null, null, null, // 0x16–0x1F
|
| 45 |
+
|
| 46 |
+
// Block 0x20–0x2F: Enochian Aethyrs (U+E020–E02F)
|
| 47 |
+
{ name: 'lil', domain: 'enochian', oracle: 'SOVEREIGN',abjad: 910 },
|
| 48 |
+
{ name: 'zid', domain: 'enochian', oracle: 'SEAL', abjad: 21 },
|
| 49 |
+
{ name: 'arn', domain: 'enochian', oracle: 'TRUTH', abjad: 291 },
|
| 50 |
+
{ name: 'zom', domain: 'enochian', oracle: 'WORD', abjad: 136 },
|
| 51 |
+
{ name: 'paz', domain: 'enochian', oracle: 'SPIRIT', abjad: 93 },
|
| 52 |
+
{ name: 'lit', domain: 'enochian', oracle: 'NAME', abjad: 33 },
|
| 53 |
+
{ name: 'maz', domain: 'enochian', oracle: 'WISDOM', abjad: 41 },
|
| 54 |
+
{ name: 'deo', domain: 'enochian', oracle: 'PATH', abjad: 14 },
|
| 55 |
+
null, null, null, null, null, null, null, null, // 0x28–0x2F
|
| 56 |
+
|
| 57 |
+
// Block 0x30–0x4F: HolyC + BOB oracle words (U+E030–E04F)
|
| 58 |
+
{ name: 'SOVEREIGN', domain: 'holyc', oracle: 'SOVEREIGN',abjad: 418 },
|
| 59 |
+
{ name: 'TRUTH', domain: 'holyc', oracle: 'TRUTH', abjad: 286 },
|
| 60 |
+
{ name: 'GATE', domain: 'holyc', oracle: 'GATE', abjad: 24 },
|
| 61 |
+
{ name: 'SEAL', domain: 'holyc', oracle: 'SEAL', abjad: 71 },
|
| 62 |
+
{ name: 'ORACLE', domain: 'holyc', oracle: 'ORACLE', abjad: 340 },
|
| 63 |
+
{ name: 'VOID', domain: 'holyc', oracle: 'VOID', abjad: 20 },
|
| 64 |
+
{ name: 'KINGDOM', domain: 'holyc', oracle: 'KINGDOM', abjad: 184 },
|
| 65 |
+
{ name: 'WISDOM', domain: 'holyc', oracle: 'WISDOM', abjad: 68 },
|
| 66 |
+
{ name: 'SPIRIT', domain: 'holyc', oracle: 'SPIRIT', abjad: 279 },
|
| 67 |
+
{ name: 'FIRE', domain: 'holyc', oracle: 'FIRE', abjad: 205 },
|
| 68 |
+
{ name: 'LIGHT', domain: 'holyc', oracle: 'LIGHT', abjad: 176 },
|
| 69 |
+
{ name: 'WORD', domain: 'holyc', oracle: 'WORD', abjad: 24 },
|
| 70 |
+
{ name: 'PATH', domain: 'holyc', oracle: 'PATH', abjad: 58 },
|
| 71 |
+
{ name: 'NAME', domain: 'holyc', oracle: 'NAME', abjad: 45 },
|
| 72 |
+
{ name: 'PROLOG', domain: 'bob', oracle: 'PROLOG', abjad: 271 },
|
| 73 |
+
{ name: 'QUBIT', domain: 'bob', oracle: 'QUBIT', abjad: 136 },
|
| 74 |
+
{ name: 'QUANTUM', domain: 'bob', oracle: 'QUANTUM', abjad: 182 },
|
| 75 |
+
{ name: 'TRUST', domain: 'bob', oracle: 'TRUST', abjad: 264 },
|
| 76 |
+
{ name: 'LEAN', domain: 'bob', oracle: 'LEAN', abjad: 65 },
|
| 77 |
+
{ name: 'MAMBA', domain: 'bob', oracle: 'MAMBA', abjad: 47 },
|
| 78 |
+
{ name: 'WORM', domain: 'bob', oracle: 'WORM', abjad: 56 },
|
| 79 |
+
{ name: 'NIL', domain: 'bob', oracle: 'NIL', abjad: 90 },
|
| 80 |
+
{ name: 'ADA', domain: 'bob', oracle: 'ADA', abjad: 5 },
|
| 81 |
+
{ name: 'PLANNER', domain: 'bob', oracle: 'PLANNER', abjad: 237 },
|
| 82 |
+
{ name: 'ACTOR', domain: 'bob', oracle: 'ACTOR', abjad: 135 },
|
| 83 |
+
{ name: 'HEWITT', domain: 'bob', oracle: 'HEWITT', abjad: 190 },
|
| 84 |
+
{ name: 'PATTERN', domain: 'bob', oracle: 'PATTERN', abjad: 289 },
|
| 85 |
+
{ name: 'MATCH', domain: 'bob', oracle: 'MATCH', abjad: 45 },
|
| 86 |
+
null, null, null, null, // 0x4C–0x4F
|
| 87 |
+
|
| 88 |
+
// Block 0x50–0x6F: Knowledge domains (U+E050–E06F)
|
| 89 |
+
{ name: 'history', domain: 'knowledge', oracle: 'WORM', abjad: 283 },
|
| 90 |
+
{ name: 'science', domain: 'knowledge', oracle: 'ADA', abjad: 130 },
|
| 91 |
+
{ name: 'mathematics', domain: 'knowledge', oracle: 'LEAN', abjad: 432 },
|
| 92 |
+
{ name: 'programming', domain: 'knowledge', oracle: 'PROLOG', abjad: 398 },
|
| 93 |
+
{ name: 'learning', domain: 'knowledge', oracle: 'MAMBA', abjad: 195 },
|
| 94 |
+
{ name: 'creativity', domain: 'knowledge', oracle: 'QUBIT', abjad: 223 },
|
| 95 |
+
{ name: 'leadership', domain: 'knowledge', oracle: 'PLANNER', abjad: 254 },
|
| 96 |
+
{ name: 'health', domain: 'knowledge', oracle: 'GATE', abjad: 111 },
|
| 97 |
+
{ name: 'philosophy', domain: 'knowledge', oracle: 'NIL', abjad: 313 },
|
| 98 |
+
{ name: 'money', domain: 'knowledge', oracle: 'WORM', abjad: 95 },
|
| 99 |
+
{ name: 'communication',domain: 'knowledge', oracle: 'WORD', abjad: 350 },
|
| 100 |
+
{ name: 'technology', domain: 'knowledge', oracle: 'SOVEREIGN',abjad: 429 },
|
| 101 |
+
{ name: 'aerospace', domain: 'knowledge', oracle: 'ADA', abjad: 185 },
|
| 102 |
+
{ name: 'cooking', domain: 'knowledge', oracle: 'FIRE', abjad: 148 },
|
| 103 |
+
{ name: 'psychology', domain: 'knowledge', oracle: 'MAMBA', abjad: 340 },
|
| 104 |
+
{ name: 'athletics', domain: 'knowledge', oracle: 'ADA', abjad: 201 },
|
| 105 |
+
]
|
| 106 |
+
|
| 107 |
+
// ── Index maps built at init ──────────────────────────────────────────────────
|
| 108 |
+
|
| 109 |
+
const BY_NAME = new Map() // name.toLowerCase() → { chunk, index, char }
|
| 110 |
+
const BY_CHAR = new Map() // PUA char → { chunk, index }
|
| 111 |
+
|
| 112 |
+
REGISTRY.forEach((chunk, idx) => {
|
| 113 |
+
if (!chunk) return
|
| 114 |
+
const char = String.fromCodePoint(BASE + idx)
|
| 115 |
+
const entry = { chunk, index: idx, char }
|
| 116 |
+
BY_NAME.set(chunk.name.toLowerCase(), entry)
|
| 117 |
+
BY_CHAR.set(char, entry)
|
| 118 |
+
})
|
| 119 |
+
|
| 120 |
+
// ── Encoding / Decoding ───────────────────────────────────────────────────────
|
| 121 |
+
|
| 122 |
+
// Concept name → PUA Unicode character
|
| 123 |
+
export function encode(concept) {
|
| 124 |
+
return BY_NAME.get(concept.toLowerCase())?.char || null
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
// PUA Unicode character → chunk entry
|
| 128 |
+
export function decode(char) {
|
| 129 |
+
return BY_CHAR.get(char)?.chunk || null
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
// Get full chunk entry by name
|
| 133 |
+
export function getChunk(concept) {
|
| 134 |
+
return BY_NAME.get(concept.toLowerCase()) || null
|
| 135 |
+
}
|
| 136 |
+
|
| 137 |
+
// ── Deterministic semantic vector ─────────────────────────────────────────────
|
| 138 |
+
// 64-dim vector derived from chunk properties.
|
| 139 |
+
// Phase 1: deterministic (no GPU). Phase 2: replace with Granite embeddings.
|
| 140 |
+
|
| 141 |
+
const DOMAIN_IDX = { philosophy: 0, abjad: 1, enochian: 2, holyc: 3, bob: 4, knowledge: 5 }
|
| 142 |
+
const ORACLE_IDX = Object.fromEntries([
|
| 143 |
+
'SOVEREIGN','TRUTH','GATE','SEAL','ORACLE','VOID','KINGDOM','WISDOM',
|
| 144 |
+
'SPIRIT','FIRE','LIGHT','WORD','PATH','NAME','PROLOG','QUBIT','QUANTUM',
|
| 145 |
+
'TRUST','LEAN','MAMBA','WORM','NIL','ADA','PLANNER','ACTOR','HEWITT',
|
| 146 |
+
'PATTERN','MATCH',
|
| 147 |
+
].map((w, i) => [w, i]))
|
| 148 |
+
|
| 149 |
+
export function chunkVector(concept) {
|
| 150 |
+
const entry = BY_NAME.get(concept.toLowerCase())
|
| 151 |
+
if (!entry) return null
|
| 152 |
+
const { chunk } = entry
|
| 153 |
+
|
| 154 |
+
const v = new Float32Array(64)
|
| 155 |
+
const abjadNorm = (chunk.abjad || 100) / 1010 // normalize to 0–1
|
| 156 |
+
const domainIdx = DOMAIN_IDX[chunk.domain] ?? 5
|
| 157 |
+
const oracleIdx = (ORACLE_IDX[chunk.oracle] ?? 14) / 28
|
| 158 |
+
|
| 159 |
+
// Deterministic seeding: spread properties across dimensions
|
| 160 |
+
for (let i = 0; i < 64; i++) {
|
| 161 |
+
const angle = (i / 64) * Math.PI * 2
|
| 162 |
+
v[i] = (
|
| 163 |
+
Math.sin(angle + abjadNorm * Math.PI) * 0.4 +
|
| 164 |
+
Math.cos(angle * (domainIdx + 1)) * 0.3 +
|
| 165 |
+
Math.sin(angle * 3 + oracleIdx * Math.PI) * 0.2 +
|
| 166 |
+
(((chunk.abjad || 100) * 7 + i * 13) % 97) / 97 * 0.1
|
| 167 |
+
)
|
| 168 |
+
}
|
| 169 |
+
|
| 170 |
+
// L2 normalize
|
| 171 |
+
const norm = Math.sqrt(v.reduce((s, x) => s + x * x, 0))
|
| 172 |
+
for (let i = 0; i < v.length; i++) v[i] /= (norm || 1)
|
| 173 |
+
|
| 174 |
+
return v
|
| 175 |
+
}
|
| 176 |
+
|
| 177 |
+
// ── Cosine similarity (in-memory fallback before pgvector) ───────────────────
|
| 178 |
+
|
| 179 |
+
export function cosine(a, b) {
|
| 180 |
+
let dot = 0, na = 0, nb = 0
|
| 181 |
+
for (let i = 0; i < a.length; i++) { dot += a[i]*b[i]; na += a[i]*a[i]; nb += b[i]*b[i] }
|
| 182 |
+
return dot / (Math.sqrt(na) * Math.sqrt(nb) || 1)
|
| 183 |
+
}
|
| 184 |
+
|
| 185 |
+
// Find top-k similar concepts by vector cosine similarity (in-memory)
|
| 186 |
+
export function similarConcepts(concept, k = 3) {
|
| 187 |
+
const qVec = chunkVector(concept)
|
| 188 |
+
if (!qVec) return []
|
| 189 |
+
|
| 190 |
+
return REGISTRY
|
| 191 |
+
.map((chunk, idx) => {
|
| 192 |
+
if (!chunk) return null
|
| 193 |
+
const v = chunkVector(chunk.name)
|
| 194 |
+
if (!v) return null
|
| 195 |
+
return { name: chunk.name, domain: chunk.domain, sim: cosine(qVec, v) }
|
| 196 |
+
})
|
| 197 |
+
.filter(Boolean)
|
| 198 |
+
.filter(r => r.name.toLowerCase() !== concept.toLowerCase())
|
| 199 |
+
.sort((a, b) => b.sim - a.sim)
|
| 200 |
+
.slice(0, k)
|
| 201 |
+
}
|
| 202 |
+
|
| 203 |
+
// ── CLI test ──────────────────────────────────────────────────────────────────
|
| 204 |
+
|
| 205 |
+
if (process.argv[1]?.endsWith('unicode_chunks.mjs')) {
|
| 206 |
+
const concept = process.argv[2] || 'trust'
|
| 207 |
+
const char = encode(concept)
|
| 208 |
+
const chunk = getChunk(concept)
|
| 209 |
+
console.log(`\n Encoding: "${concept}"`)
|
| 210 |
+
console.log(` PUA char: ${char} (U+${(char?.codePointAt(0) || 0).toString(16).toUpperCase().padStart(4,'0')})`)
|
| 211 |
+
console.log(` Domain: ${chunk?.chunk.domain}`)
|
| 212 |
+
console.log(` Oracle: ${chunk?.chunk.oracle}`)
|
| 213 |
+
console.log(` Abjad: ${chunk?.chunk.abjad}`)
|
| 214 |
+
console.log(`\n Similar concepts:`)
|
| 215 |
+
similarConcepts(concept).forEach(r =>
|
| 216 |
+
console.log(` ${r.name.padEnd(16)} (sim: ${r.sim.toFixed(3)}) [${r.domain}]`)
|
| 217 |
+
)
|
| 218 |
+
console.log()
|
| 219 |
+
}
|
autonomous/vector_memory.mjs
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/**
|
| 2 |
+
* BOB Vector Memory — pgvector on Neon Postgres
|
| 3 |
+
*
|
| 4 |
+
* Semantic anchors for every knowledge chunk. When BOB needs to "speak",
|
| 5 |
+
* he performs a similarity search here — the result is the "linguistic vibe"
|
| 6 |
+
* that constrains how the theorem gets transcoded into natural speech.
|
| 7 |
+
*
|
| 8 |
+
* Phase 1: Neon Postgres + pgvector, deterministic 64-dim vectors
|
| 9 |
+
* Phase 2: Replace deterministic vectors with Granite embeddings (768-dim)
|
| 10 |
+
*
|
| 11 |
+
* The pgvector similarity search replaces keyword lookup with:
|
| 12 |
+
* "What is the SEMANTIC NEIGHBORHOOD of this theorem?" → oracle lens guide
|
| 13 |
+
*/
|
| 14 |
+
|
| 15 |
+
import { REGISTRY, chunkVector, cosine } from './unicode_chunks.mjs'
|
| 16 |
+
import { THEOREMS, getTheorem } from './lisp_theorems.mjs'
|
| 17 |
+
|
| 18 |
+
// ── Neon connection ───────────────────────────────────────────────────────────
|
| 19 |
+
|
| 20 |
+
let pg = null // lazy-loaded postgres client
|
| 21 |
+
|
| 22 |
+
async function getDB(dbUrl) {
|
| 23 |
+
if (pg) return pg
|
| 24 |
+
try {
|
| 25 |
+
// Use postgres.js (pure JS, works in Node without native pg)
|
| 26 |
+
const { default: Postgres } = await import('https://esm.sh/postgres@3')
|
| 27 |
+
pg = Postgres(dbUrl, { ssl: 'require', max: 3 })
|
| 28 |
+
return pg
|
| 29 |
+
} catch {
|
| 30 |
+
try {
|
| 31 |
+
// Fallback: node-postgres
|
| 32 |
+
const { default: Pg } = await import('pg')
|
| 33 |
+
const client = new Pg.Client({ connectionString: dbUrl })
|
| 34 |
+
await client.connect()
|
| 35 |
+
pg = {
|
| 36 |
+
async query(sql, params) { return client.query(sql, params) },
|
| 37 |
+
end: () => client.end(),
|
| 38 |
+
}
|
| 39 |
+
return pg
|
| 40 |
+
} catch { return null }
|
| 41 |
+
}
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
// ── Schema bootstrap ──────────────────────────────────────────────────────────
|
| 45 |
+
|
| 46 |
+
const BOOTSTRAP_SQL = `
|
| 47 |
+
CREATE EXTENSION IF NOT EXISTS vector;
|
| 48 |
+
|
| 49 |
+
CREATE TABLE IF NOT EXISTS bob_vectors (
|
| 50 |
+
id SERIAL PRIMARY KEY,
|
| 51 |
+
concept VARCHAR(100) UNIQUE NOT NULL,
|
| 52 |
+
theorem TEXT NOT NULL,
|
| 53 |
+
unicode_char TEXT,
|
| 54 |
+
oracle_word VARCHAR(50),
|
| 55 |
+
domain VARCHAR(50),
|
| 56 |
+
vector vector(64) NOT NULL,
|
| 57 |
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
| 58 |
+
);
|
| 59 |
+
|
| 60 |
+
CREATE INDEX IF NOT EXISTS bob_vectors_cosine
|
| 61 |
+
ON bob_vectors USING ivfflat (vector vector_cosine_ops)
|
| 62 |
+
WITH (lists = 10);
|
| 63 |
+
`
|
| 64 |
+
|
| 65 |
+
// ── Memory operations ─────────────────────────────────────────────────────────
|
| 66 |
+
|
| 67 |
+
export async function initVectorMemory(dbUrl) {
|
| 68 |
+
const db = await getDB(dbUrl)
|
| 69 |
+
if (!db) { console.error('[vector_memory] DB unavailable'); return false }
|
| 70 |
+
|
| 71 |
+
try {
|
| 72 |
+
// Bootstrap schema
|
| 73 |
+
for (const stmt of BOOTSTRAP_SQL.split(';').map(s => s.trim()).filter(Boolean)) {
|
| 74 |
+
await db.query(stmt)
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
// Upsert all known chunks
|
| 78 |
+
let count = 0
|
| 79 |
+
for (const chunk of REGISTRY) {
|
| 80 |
+
if (!chunk) continue
|
| 81 |
+
const vec = chunkVector(chunk.name)
|
| 82 |
+
const theo = getTheorem(chunk.name) || `(${chunk.name.toUpperCase()} (IMPLIES (HAS-DOMAIN X) (ORACLE-CONSTRAINED X '${chunk.oracle})))`
|
| 83 |
+
if (!vec) continue
|
| 84 |
+
|
| 85 |
+
await db.query(`
|
| 86 |
+
INSERT INTO bob_vectors (concept, theorem, unicode_char, oracle_word, domain, vector)
|
| 87 |
+
VALUES ($1, $2, $3, $4, $5, $6::vector)
|
| 88 |
+
ON CONFLICT (concept) DO UPDATE SET
|
| 89 |
+
theorem = EXCLUDED.theorem,
|
| 90 |
+
vector = EXCLUDED.vector
|
| 91 |
+
`, [
|
| 92 |
+
chunk.name,
|
| 93 |
+
theo,
|
| 94 |
+
String.fromCodePoint(0xE000 + REGISTRY.indexOf(chunk)),
|
| 95 |
+
chunk.oracle,
|
| 96 |
+
chunk.domain,
|
| 97 |
+
JSON.stringify(Array.from(vec)),
|
| 98 |
+
])
|
| 99 |
+
count++
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
console.log(`[vector_memory] ${count} chunks upserted to pgvector`)
|
| 103 |
+
return true
|
| 104 |
+
} catch (e) {
|
| 105 |
+
console.error('[vector_memory] init error:', e.message)
|
| 106 |
+
return false
|
| 107 |
+
}
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
// Semantic search — find k nearest concepts by vector similarity
|
| 111 |
+
export async function semanticSearch(concept, k = 3, dbUrl) {
|
| 112 |
+
const db = await getDB(dbUrl)
|
| 113 |
+
if (!db) return inMemorySearch(concept, k)
|
| 114 |
+
|
| 115 |
+
const vec = chunkVector(concept)
|
| 116 |
+
if (!vec) return inMemorySearch(concept, k)
|
| 117 |
+
|
| 118 |
+
try {
|
| 119 |
+
const result = await db.query(`
|
| 120 |
+
SELECT concept, theorem, oracle_word, domain,
|
| 121 |
+
1 - (vector <=> $1::vector) AS similarity
|
| 122 |
+
FROM bob_vectors
|
| 123 |
+
WHERE concept != $2
|
| 124 |
+
ORDER BY vector <=> $1::vector
|
| 125 |
+
LIMIT $3
|
| 126 |
+
`, [JSON.stringify(Array.from(vec)), concept, k])
|
| 127 |
+
|
| 128 |
+
return result.rows || []
|
| 129 |
+
} catch {
|
| 130 |
+
return inMemorySearch(concept, k)
|
| 131 |
+
}
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
// In-memory fallback (no DB)
|
| 135 |
+
function inMemorySearch(concept, k = 3) {
|
| 136 |
+
const qVec = chunkVector(concept)
|
| 137 |
+
if (!qVec) return []
|
| 138 |
+
return REGISTRY
|
| 139 |
+
.filter(c => c && c.name.toLowerCase() !== concept.toLowerCase())
|
| 140 |
+
.map(c => {
|
| 141 |
+
const v = chunkVector(c.name)
|
| 142 |
+
return v ? { concept: c.name, oracle_word: c.oracle, domain: c.domain, similarity: cosine(qVec, v) } : null
|
| 143 |
+
})
|
| 144 |
+
.filter(Boolean)
|
| 145 |
+
.sort((a, b) => b.similarity - a.similarity)
|
| 146 |
+
.slice(0, k)
|
| 147 |
+
}
|
| 148 |
+
|
| 149 |
+
// Get a single concept's semantic neighbors + use as oracle lens context
|
| 150 |
+
export async function getSematicContext(concept, dbUrl) {
|
| 151 |
+
const neighbors = await semanticSearch(concept, 3, dbUrl)
|
| 152 |
+
if (!neighbors.length) return null
|
| 153 |
+
|
| 154 |
+
return {
|
| 155 |
+
concept,
|
| 156 |
+
neighbors: neighbors.map(n => ({
|
| 157 |
+
name: n.concept,
|
| 158 |
+
oracle: n.oracle_word,
|
| 159 |
+
domain: n.domain,
|
| 160 |
+
similarity: n.similarity,
|
| 161 |
+
})),
|
| 162 |
+
// The neighbor with highest similarity provides the "vibe guide"
|
| 163 |
+
primaryGuide: neighbors[0],
|
| 164 |
+
}
|
| 165 |
+
}
|