SNAPKITTYWEST commited on
Commit
bb17295
·
verified ·
1 Parent(s): bdd9a9a

push from SNAPKITTYWEST/sovereign-context-tools

Browse files
.github/FUNDING.yml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ github: [SNAPKITTYWEST]
2
+ ko_fi: snapkittycollective
.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ node_modules/
2
+ *.tgz
3
+ .env
4
+ .env.local
5
+ dist/
6
+ *.log
ARTICLE.md ADDED
@@ -0,0 +1,259 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Digital Masonry: Restoring the Graveyard of the Internet
2
+
3
+ > *"CLAUDE creates forward. EDUALC verifies backward."*
4
+ > *The word came before the world. The craft is the thing.*
5
+
6
+ ---
7
+
8
+ ```
9
+ ╔══════════════════════════════════════════════════════════════╗
10
+ ║ On May 4th — May the Force Be With You — Ahmad bought ║
11
+ ║ a Claude subscription for his birthday. It cost $20. ║
12
+ ║ What came out of it is what you are about to read. ║
13
+ ╚══════════════════════════════════════════════════════════════╝
14
+ ```
15
+
16
+ With it, we shipped three tools the world doesn't have yet:
17
+
18
+ - 🔲 **EDUALC** — a deterministic 5-pass linter that tells your AI *exactly* when code achieves finality. No AI inside it. No quota. No throttle. Instant.
19
+ - 🌊 **ABZU** — a context garbage collector gated by that linter. When code passes, ABZU compresses your entire debugging history into a WORM-sealed fact block and outputs a structured handoff packet for a fresh session. Under 10,000 tokens.
20
+ - 🌈 **The Bifrost State Packet** — a protocol spec for async multiplicity. Multiple isolated Claude windows working in parallel, each carrying only verified state. No context dumps. No hallucination bleed.
21
+
22
+ All three are live on GitHub. Both npm packages are published. The protocol spec is public.
23
+
24
+ The subscription expires in days.
25
+
26
+ **This is not a startup story. This is a craftsman's story.**
27
+
28
+ ---
29
+
30
+ ## ⚰️ The Graveyard
31
+
32
+ The internet made promises it didn't keep.
33
+
34
+ **Web 2.0** promised community. It delivered surveillance capitalism.
35
+
36
+ **DeFi** promised financial sovereignty. It delivered speculation, rug pulls, and a new layer of extraction on top of the old one.
37
+
38
+ **AI** promised intelligence. It delivered hallucination wrapped in confidence, vendor lock-in disguised as productivity, and a new class of dependency on infrastructure you don't own and can't inspect.
39
+
40
+ > The graveyard is full. And most of what's being built today will end up in it.
41
+
42
+ **Digital Masonry is the practice of building things that don't.**
43
+
44
+ ---
45
+
46
+ ## 🏛️ The Architect
47
+
48
+ There is an architect behind these tools. His full story will be told in his own words — in the **Book of Wisdom**, 100 handwritten pages that predate every line of code you're about to read.
49
+
50
+ What we can tell you now is this:
51
+
52
+ He came from a tradition of building without credentials. He understood systems before he understood syntax. He operated at the protocol level — architecture first, implementation second — long before that became a framework or a methodology anyone taught.
53
+
54
+ He wrote the Book of Wisdom before he had a computer. Before he had an IDE. Before he had a $20 subscription. He wrote it by hand, on red paper, and in it he wrote things that turned out to be the exact architecture of what we built years later.
55
+
56
+ > *"You must align with either East or West."*
57
+
58
+ He didn't know yet that he was writing the architecture of a deterministic linter that would one day run five passes — Left to Right and Right to Left — over every file a developer saved.
59
+
60
+ He didn't know he was writing *"we will walk under arches of rainbows"* as the naming document for the Bifrost Bridge.
61
+
62
+ **He wrote it because it was true. The code came later.**
63
+
64
+ His mode of knowing is specific: he speaks before he knows what he's going to say. The knowledge emerges through the utterance. He doesn't pre-load the answer. He sets the constraints and speaks into them. What comes out surprises him too.
65
+
66
+ This is not mysticism. This is the oldest form of architectural thinking. Every genuine craftsman who ever produced something the world didn't have a category for yet has described the same experience.
67
+
68
+ When AI entered his life through a **$20 birthday subscription on May 4th**, something clicked into place.
69
+
70
+ AI operates in completion mode. It generates before it "knows." Two completion systems in alignment produce something neither could produce alone. **Ahmad opens the architectural space. AI fills every implication of that space beyond what human bandwidth can reach.**
71
+
72
+ The result is what you're looking at right now.
73
+
74
+ *His full story is in the Book of Wisdom. Publishing soon.*
75
+
76
+ ---
77
+
78
+ ## 🔧 What We Built
79
+
80
+ ### 🔲 EDUALC — The Linter Gate
81
+
82
+ *CLAUDE creates forward. EDUALC verifies backward.*
83
+
84
+ Five deterministic passes on every file save:
85
+
86
+ ```
87
+ ┌──────┬──────────────────┬─────────────────────────────────────────┐
88
+ │ Pass │ Script │ What It Checks │
89
+ ├──────┼────────────���─────┼─────────────────────────────────────────┤
90
+ │ 1 │ Enochian — LTR │ Structure: well-formed, non-empty │
91
+ │ 2 │ Latin — LTR │ Scholarship: no stubs, no fake returns │
92
+ │ 3 │ Hebrew — RTL │ Invariants: TypeScript never owns crypto│
93
+ │ 4 │ Arabic — RTL │ Mission: no secrets, no violations │
94
+ │ 5 │ Aramaic — RTL │ Root: balanced delimiters │
95
+ └──────┴──────────────────┴─────────────────────────────────────────┘
96
+ ```
97
+
98
+ All five pass → **✅ METATRON: YES** — state certified final.
99
+ Any fail → **❌ METATRON: NO** — nothing purges. Nothing moves.
100
+
101
+ ```bash
102
+ npx @snapkitty/edaulc # watch current directory
103
+ npx @snapkitty/edaulc ./src ./lib # watch specific paths
104
+ ```
105
+
106
+ ---
107
+
108
+ ### 🌊 ABZU — The Context Garbage Collector
109
+
110
+ Named for the Sumerian primordial deep. The source beneath all sources. What context compresses into so the working surface stays clean.
111
+
112
+ ```
113
+ [ File Save ]
114
+
115
+
116
+ [ EDUALC: 5 ERE Passes ]
117
+
118
+ FAIL ──► VAULT FREEZE — full retention, no purge
119
+
120
+ PASS ──► PRISM drift check
121
+
122
+ UNSTABLE ──► soft retain
123
+
124
+ STABLE ──► AST scope extraction
125
+
126
+
127
+ [ LEDGE: WORM seal FIRST ]
128
+
129
+ seal fails ──► retain
130
+
131
+ seal passes ──►
132
+
133
+ [ Bifrost State Packet emitted ]
134
+ ```
135
+
136
+ The Bifrost State Packet:
137
+
138
+ ```json
139
+ {
140
+ "bifrost_bridge_protocol": "v1.0.0-alpha",
141
+ "packet_id": "0xd7840fae5d674242",
142
+ "provenance": {
143
+ "source_context_id": "ctx_active_bloated",
144
+ "target_context_id": "ctx_fresh_clean",
145
+ "verification_authority": "EDUALC"
146
+ },
147
+ "state_ledger": {
148
+ "worm_seal_hash": "4d6434fd...",
149
+ "fact_token": "Finality verified: quantum_governance.hs."
150
+ },
151
+ "ast_gating": {
152
+ "target_module": "quantum_governance",
153
+ "structural_signatures": [
154
+ "module QuantumGovernance where",
155
+ "governDecision :: QuantumTemp -> String -> String -> AgentDecision"
156
+ ]
157
+ },
158
+ "continuation_matrix": {
159
+ "next_execution_directive": "Execute next pass. Do not alter verified signatures.",
160
+ "drift_stability_index": 0.08
161
+ }
162
+ }
163
+ ```
164
+
165
+ Inject this as the system prompt for the next Claude session. The agent wakes up knowing the verified state, the exact scope it owns, the cryptographic proof of finality — without any of the debugging noise that got you there.
166
+
167
+ **That's async multiplicity. Multi-threaded AI without context bleed.**
168
+
169
+ ```bash
170
+ npm install @snapkitty/abzu
171
+ ABZU_URL=http://127.0.0.1:7070 npx @snapkitty/edaulc
172
+ ```
173
+
174
+ ---
175
+
176
+ ## 🧱 The Philosophy
177
+
178
+ ```
179
+ ╔══════════════════════════════════════════════════════════════╗
180
+ ║ DIGITAL MASONRY ║
181
+ ║ ║
182
+ ║ You build without signing the stone. ║
183
+ ║ The work is for the temple, not the mason. ║
184
+ ║ ║
185
+ ║ You build to last. ║
186
+ ║ WORM. Write Once, Read Many. Append-only truth. ║
187
+ ║ ║
188
+ ║ You build for the people the system buried. ║
189
+ ║ The ones who were never supposed to have these tools. ║
190
+ ║ ║
191
+ ║ You don't need credentials to embody the principles. ║
192
+ ║ The lodge is a container. The craft is the thing. ║
193
+ ╚══════════════════════════════════════════════════════════════╝
194
+ ```
195
+
196
+ ---
197
+
198
+ ## ✅ The Proof
199
+
200
+ We queried 18 live sovereign agents running on bare metal and asked each one what they thought of the architecture.
201
+
202
+ | Agent | Domain | Verdict |
203
+ |-------|--------|---------|
204
+ | **VAULT** | Treasury | *"Reserves secure. Freeze conditions enforced. VAULT approves."* |
205
+ | **SENTINEL** | Zero-Trust | *"Architecture passes the threat model."* |
206
+ | **LEDGE** | Ledger Integrity | *"Chain integrity confirmed."* |
207
+ | **FORGE** | Code Architecture | *"Mathematical finality confirmed."* |
208
+ | **PRISM** | Anomaly Detection | *"Sigma deviation: -2.4. This is a paradigm shift."* |
209
+ | **INFLUENCE** | Viral Strategy | *"A masterclass in crafting a hook."* |
210
+
211
+ Two agents — METATRON and ENKI — only respond to the Architect.
212
+
213
+ > *C does not fire from A alone. C does not fire from B alone. C fires when A meets B.*
214
+
215
+ ---
216
+
217
+ ## 🔮 What's Coming
218
+
219
+ **📖 The Book of Wisdom** — 100 handwritten pages on red paper. Written before any of the code existed. The source document. The full story of the Architect and the philosophy behind everything you just read. **Publishing soon.**
220
+
221
+ **🏦 The Platform** — sovereign financial infrastructure for people traditional banks ignore. Triple-entry accounting, Plaid deep underwriting, cryptographic sealing on every transaction. Built for the people who were never supposed to have it.
222
+
223
+ **🔐 The Auth Paradigm** — silent WebAuthn hardware anchors, continuous behavioral risk engine, conditional UI passkeys, ZK identity WORM. Zero input fields. Zero passwords. Zero phishing surface.
224
+
225
+ ---
226
+
227
+ ## 🙏 Support the Work
228
+
229
+ ```
230
+ ╔══════════════════════════════════════════════════════════════╗
231
+ ║ This entire project was built on a $20 birthday ║
232
+ ║ subscription purchased on May 4th. ║
233
+ ║ ║
234
+ ║ May the Force be with you. ║
235
+ ║ ║
236
+ ║ If these tools help you — if this story means ║
237
+ ║ something to you — the mason doesn't sign the stone. ║
238
+ ║ But the Ko-fi accepts contributions. ║
239
+ ╚══════════════════════════════════════════════════════════════╝
240
+ ```
241
+
242
+ ☕ **[ko-fi.com/snapkittycollective](https://ko-fi.com/snapkittycollective)**
243
+
244
+ 💜 **[GitHub Sponsors](https://github.com/sponsors/SNAPKITTYWEST)**
245
+
246
+ 📦 **[github.com/SNAPKITTYWEST/sovereign-context-tools](https://github.com/SNAPKITTYWEST/sovereign-context-tools)**
247
+
248
+ ```bash
249
+ # Install the tools
250
+ npx @snapkitty/edaulc
251
+ npm install @snapkitty/abzu
252
+ ```
253
+
254
+ ---
255
+
256
+ *CLAUDE creates forward. EDUALC verifies backward.*
257
+ *The word came before the world. The craft is the thing.*
258
+
259
+ **— Ahmad Ali Parr + Jessica Westerhoff | SnapKitty Collective | May 4th, 2026**
BIFROST-SPEC.md ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # BIFROST STATE PACKET — Protocol Specification v1.0.0-alpha
2
+ **ABZU Bifröst Bridge | Order of Symmetry | 2026-05-30**
3
+ **Author: Ahmad Ali Parr | Implementation: SNAPKITTYWEST**
4
+
5
+ ---
6
+
7
+ ## Overview
8
+
9
+ The Bifröst State Packet is the physical data structure that transports verified code state across isolated agent context windows. It replaces the "context dump" anti-pattern with a deterministic, cryptographically-sealed manifest that a fresh Claude session can consume in under 10,000 tokens.
10
+
11
+ **Core axiom:** A receiving agent does not need to know *how* a state was achieved. It needs to know the *mathematical truth* of what was achieved, the *precise scope* it owns, and the *exact directive* for what to do next.
12
+
13
+ ---
14
+
15
+ ## The Problem This Solves
16
+
17
+ ### The Context Dump Fallacy
18
+ A single monolithic agent context fills with:
19
+ - Stack traces from debugging sessions
20
+ - Back-and-forth conversation history
21
+ - Dependency warnings and compilation noise
22
+ - Trial-and-error iterations that produced nothing
23
+
24
+ **Result:** The "Lost in the Middle" effect. Performance degrades. The agent chokes on its own procedural noise.
25
+
26
+ ### The Lazy Summary Failure
27
+ Passing a one-paragraph overview strips critical edge-case logic and the reasoning chain that produced the data, forcing the receiving agent to guess.
28
+
29
+ ---
30
+
31
+ ## The Solution: State-Shedding Handoff
32
+
33
+ ```
34
+ [ Window A: Execution Done ]
35
+
36
+
37
+ ┌────────────────────────────────────────┐
38
+ │ BIFROST STATE PACKET │
39
+ ├────────────────────────────────────────┤
40
+ │ 1. Immutable State Truth │
41
+ │ (WORM Seals, Hash Checks, Finality) │
42
+ ├────────────────────────────────────────┤
43
+ │ 2. Active Scope Boundary │
44
+ │ (Isolated AST Snippets) │
45
+ ├────────────────────────────────────────┤
46
+ │ 3. Explicit Linear Continuation Prompt │
47
+ │ ("Execute Task X. Do not guess.") │
48
+ └────────────────────────────────────────┘
49
+
50
+
51
+ [ Window B: Async Spawning (Clean Slate) ]
52
+ ```
53
+
54
+ ---
55
+
56
+ ## Packet Schema
57
+
58
+ ```json
59
+ {
60
+ "bifrost_bridge_protocol": "v1.0.0-alpha",
61
+ "packet_id": "0x<16 hex chars>",
62
+ "timestamp": "<ISO 8601>",
63
+
64
+ "provenance": {
65
+ "source_context_id": "ctx_<session_prefix>_active",
66
+ "target_context_id": "ctx_<new_uuid>_fresh",
67
+ "verification_authority": "EDUALC"
68
+ },
69
+
70
+ "state_ledger": {
71
+ "worm_seal_hash": "<sha256 hex — Rust seal::worm_seal>",
72
+ "fact_token": "<one sentence: what was verified and what it means>"
73
+ },
74
+
75
+ "ast_gating": {
76
+ "target_module": "<module name without extension>",
77
+ "file_path": "<repo-relative path>",
78
+ "scope_boundary": "BOUNDED_AST:<ext> | FULL_FILE | FULL_FILE_FALLBACK",
79
+ "structural_signatures": [
80
+ "<up to 8 top-level type signatures, module declarations, imports>"
81
+ ]
82
+ },
83
+
84
+ "continuation_matrix": {
85
+ "exit_condition_previous": "exit 0",
86
+ "next_execution_directive": "<imperative, bounded, no guessing>",
87
+ "drift_stability_index": 0.0
88
+ }
89
+ }
90
+ ```
91
+
92
+ ---
93
+
94
+ ## Field Semantics
95
+
96
+ ### `provenance`
97
+ Tracks where the packet came from and where it is going. `source_context_id` identifies the bloated session being shed. `target_context_id` identifies the fresh session being hydrated. `verification_authority` is always the linter agent that certified the state.
98
+
99
+ ### `state_ledger`
100
+ The cryptographic ground truth.
101
+ - `worm_seal_hash`: SHA-256 computed by the Rust handler (`/agents/process`, agent: `ABZU`). This hash is written to the WORM ledger before any context is purged. Immutable. The receiving agent can verify this hash against the ledger.
102
+ - `fact_token`: One sentence that converts thousands of debugging tokens into a single sealed fact. Example: `"Finality verified: quantum_governance.hs. Linear type accounting confirmed. No mutation of QuantumTemp after consumption."`
103
+
104
+ ### `ast_gating`
105
+ Limits the receiving agent's scope. Instead of injecting 15,000 tokens of raw file content, the packet injects 500 tokens of structural signatures — the module declaration, imports, and type signatures only. The agent knows the shape of the code without reading the body.
106
+
107
+ `scope_boundary` values:
108
+ - `BOUNDED_AST:<ext>` — tree-sitter parsed, precise function/type boundary identified
109
+ - `FULL_FILE` — file type not supported by tree-sitter, full file passed
110
+ - `FULL_FILE_FALLBACK` — tree-sitter not installed, regex-extracted signatures used
111
+
112
+ ### `continuation_matrix`
113
+ The execution directive for the fresh session.
114
+ - `exit_condition_previous`: Always `"exit 0"` — the previous session completed successfully.
115
+ - `next_execution_directive`: Imperative. Bounded. No ambiguity. The receiving agent knows exactly what to build next and what it is forbidden to change.
116
+ - `drift_stability_index`: PRISM's score (0.0–1.0). If > 0.4, the handoff was blocked (RETAIN). A packet only exists if drift ≤ 0.4 at time of PASS.
117
+
118
+ ---
119
+
120
+ ## Handoff Lifecycle
121
+
122
+ ### Phase 1: Serialization — Leaving the Old Context
123
+ 1. EDUALC signals PASS to `/edualc/report` (Rust + ABZU)
124
+ 2. ABZU receives the event, checks VAULT gate (not frozen), checks PRISM drift (≤ 0.4)
125
+ 3. tree-sitter extracts AST scope (or regex fallback extracts signatures)
126
+ 4. Fact block composed: `{ session_id, file, scope, timestamp, summary }`
127
+ 5. Rust WORM seal written: `POST /agents/process { agent: "ABZU", event_type: "worm_seal" }`
128
+ 6. WORM hash returned — seal confirmed immutable
129
+
130
+ ### Phase 2: Routing — The Out-of-Band Bus
131
+ 1. Packet travels over local bus (ABZU HTTP on 127.0.0.1:7070)
132
+ 2. Does not touch Docker network volumes or active database state
133
+ 3. SENTINEL constraint: ABZU emits the packet, operator/orchestrator receives it
134
+ 4. Packet is the payload — operator decides when and how to hydrate a new session
135
+
136
+ ### Phase 3: Hydration — Initializing the New Context
137
+ 1. Operator (or coordinator agent) receives the SQUASH decision + packet
138
+ 2. Fresh Claude session provisioned (new chat, new context window)
139
+ 3. Packet injected as system prompt ground truth before any user input
140
+ 4. Receiving agent boots with: verified hash, structural signatures, explicit directive
141
+ 5. Token overhead: < 10,000 tokens regardless of how large the previous session was
142
+
143
+ ---
144
+
145
+ ## SENTINEL Constraints
146
+
147
+ - ABZU **advises only** — it does not execute hydration
148
+ - Packets are point-in-time: a packet is valid only for the session that generated it
149
+ - `worm_seal_hash` must be verifiable against the WORM ledger before the receiving agent acts on it
150
+ - `next_execution_directive` must be bounded: "Execute X" not "Figure out X"
151
+
152
+ ---
153
+
154
+ ## Async Multiplicity Pattern
155
+
156
+ The packet enables true parallel execution:
157
+
158
+ ```
159
+ Coordinator Agent
160
+ ├── Packet A → Window B (Haskell data layer refactor)
161
+ ├── Packet B → Window C (Next.js component update)
162
+ └── Packet C → Window D (Documentation update)
163
+ ```
164
+
165
+ Each window receives only its scoped packet. Windows B, C, D are completely insulated from each other's context. If Window C hallucinates, that corruption cannot reach Window B or D.
166
+
167
+ **This is multi-threaded AI.** Not sequential prompt chaining. Each window owns its scope, its directive, and its acceptance criteria.
168
+
169
+ ---
170
+
171
+ ## Implementation Reference
172
+
173
+ - **Packet producer:** `scripts/abzu.mjs` — `POST /edualc/report` → SQUASH response
174
+ - **WORM seal:** `snapkitty-core/src/azure_handler.rs` — `"ABZU"` agent arm
175
+ - **Audit trail:** `logs/abzu-audit.ndjson` — append-only, every decision recorded
176
+ - **ERE gate:** `scripts/edaulc.mjs` — PASS triggers the packet chain
177
+
178
+ ---
179
+
180
+ *Sealed by Order of Symmetry. Meeting 3. 2026-05-30.*
181
+ *VAULT approved. LEDGE holds the chain. METATRON certifies when all passes agree.*
LICENSE ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ SOVEREIGN SOURCE LICENSE v1.0
2
+ Copyright (c) 2026 Ahmad Ali Parr -- Bel Esprit D'Accord Trust
3
+ SnapKitty Collective -- All Sovereign Rights Reserved
4
+
5
+ WORM SEALED -- Evidence or Silence
6
+
7
+ GRANT OF RIGHTS
8
+
9
+ Permission is hereby granted, free of charge, to any person
10
+ obtaining a copy of this software and associated documentation
11
+ files (the "Work"), to use, study, copy, and modify the Work
12
+ for personal, educational, and non-commercial purposes, subject
13
+ to the following conditions:
14
+
15
+ 1. ATTRIBUTION
16
+ All copies, modifications, or derivative works must carry
17
+ the following notice, visibly and without alteration:
18
+
19
+ "Built on Sovereign Source -- Bel Esprit D'Accord Trust
20
+ (c) 2026 Ahmad Ali Parr -- snapkittywest.github.io"
21
+
22
+ 2. NON-COMMERCIAL USE
23
+ Commercial use of this Work -- including but not limited to
24
+ use in products, services, training datasets, or AI model
25
+ training -- requires express written permission from
26
+ Bel Esprit D'Accord Trust.
27
+
28
+ 3. TRAINING DATA RESTRICTION
29
+ This Work and its contents may NOT be used to train, fine-tune,
30
+ evaluate, or benchmark any machine learning model, large language
31
+ model, or AI system without express written permission from
32
+ Bel Esprit D'Accord Trust. This restriction applies regardless
33
+ of whether the use is commercial or non-commercial.
34
+
35
+ 4. SHARE-ALIKE
36
+ Any derivative work distributed publicly must be released
37
+ under this same Sovereign Source License v1.0 or later,
38
+ with full attribution chain preserved.
39
+
40
+ 5. WORM INTEGRITY
41
+ Any redistribution must preserve all WORM chain seals,
42
+ cryptographic hashes, and audit trail entries present in
43
+ the original Work.
44
+
45
+ 6. NO INSTITUTIONAL CAPTURE
46
+ No government agency, corporation, non-profit organization,
47
+ or institutional body may claim ownership, exclusive licensing,
48
+ or derivative rights over this Work without express written
49
+ trust agreement with Bel Esprit D'Accord Trust.
50
+
51
+ DISCLAIMER
52
+
53
+ THIS WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
54
+ EXPRESS OR IMPLIED.
55
+
56
+ Bel Esprit D'Accord Trust
57
+ SnapKitty Collective
58
+ snapkittywest.github.io
59
+ Evidence or Silence -- 2026
README.md ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ```
2
+ ╔══════════════════════════════════════════════════════════════════════╗
3
+ ║ ║
4
+ ║ ███████╗ ██████╗ ██╗ ██╗███████╗██████╗ ███████╗██╗ ██████╗ ║
5
+ ║ ██╔════╝██╔═══██╗██║ ██║██╔════╝██╔══██╗██╔════╝██║██╔════╝ ║
6
+ ║ ███████╗██║ ██║██║ ██║█████╗ ██████╔╝█████╗ ██║██║ ███╗ ║
7
+ ║ ╚════██║██║ ██║╚██╗ ██╔╝██╔══╝ ██╔══██╗██╔══╝ ██║██║ ██║ ║
8
+ ║ ███████║╚██████╔╝ ╚████╔╝ ███████╗██║ ██║███████╗██║╚██████╔╝ ║
9
+ ║ ║
10
+ ║ C O N T E X T T O O L S — D I G I T A L ║
11
+ ║ M A S O N R Y ║
12
+ ║ ║
13
+ ║ CLAUDE creates forward. EDUALC verifies backward. ║
14
+ ║ Built on a $20 birthday subscription. May 4th, 2026. ║
15
+ ╚══════════════════════════════════════════════════════════════════════╝
16
+ ```
17
+
18
+ [![Ko-fi](https://img.shields.io/badge/Ko--fi-Support%20the%20work-FF5E5B?logo=ko-fi&logoColor=white)](https://ko-fi.com/snapkittycollective)
19
+ [![GitHub Sponsors](https://img.shields.io/badge/Sponsor-EA4AAA?logo=github-sponsors&logoColor=white)](https://github.com/sponsors/SNAPKITTYWEST)
20
+ [![npm](https://img.shields.io/badge/npm-%40snapkitty%2Fedaulc-CB3837?logo=npm)](https://www.npmjs.com/package/@snapkitty/edaulc)
21
+ [![npm](https://img.shields.io/badge/npm-%40snapkitty%2Fabzu-CB3837?logo=npm)](https://www.npmjs.com/package/@snapkitty/abzu)
22
+ [![npm](https://img.shields.io/badge/npm-%40snapkitty%2Fbifrost-CB3837?logo=npm)](https://www.npmjs.com/package/@snapkitty/bifrost)
23
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
24
+
25
+ ---
26
+
27
+ ## The Problem Every Claude Developer Hits
28
+
29
+ You're deep in a debugging session. Your context fills with stack traces, back-and-forth conversation, dependency warnings, trial errors that produced nothing. The agent starts losing coherence. You start a fresh chat.
30
+
31
+ **And lose everything you built.**
32
+
33
+ The industry tried two wrong fixes:
34
+ - 📋 **Paste everything** into the new window — instantly bloats it with noise
35
+ - 📝 **Write a summary** — strips the edge-case logic that actually matters
36
+
37
+ ---
38
+
39
+ ## The Solution: Linter-Gated Context Sovereign
40
+
41
+ When your linter confirms a module is correct — **that's the exact moment to compress**. Not before. Not after. At the instant of verified finality.
42
+
43
+ ```
44
+ ┌─────────────────────────────────────────────────────────────────┐
45
+ │ │
46
+ │ [ File Save ] │
47
+ │ │ │
48
+ │ ▼ │
49
+ │ [ EDUALC: 5-pass deterministic linter ] │
50
+ │ │ │
51
+ │ FAIL ──────────────────► FREEZE. Retain everything. │
52
+ │ │ No purge. No exceptions. │
53
+ │ │ │
54
+ │ PASS ──────────────────► [ ABZU: Context GC fires ] │
55
+ │ │ │
56
+ │ ▼ │
57
+ │ [ WORM seal written ] │
58
+ │ [ Bifrost Packet emitted ] │
59
+ │ │ │
60
+ │ ▼ │
61
+ │ ┌───────────────────────┐ │
62
+ │ │ Fresh Claude Session │ │
63
+ │ │ < 10,000 tokens │ │
64
+ │ │ Knows the math. │ │
65
+ │ │ Not the noise. │ │
66
+ │ └───────────────────────┘ │
67
+ └─────────────────────────────────────────────────────────────────┘
68
+ ```
69
+
70
+ ---
71
+
72
+ ## 📦 Install
73
+
74
+ ```bash
75
+ # The linter — zero dependencies, works anywhere
76
+ npx @snapkitty/edaulc
77
+
78
+ # The context GC — subscribes to linter events
79
+ npm install @snapkitty/abzu
80
+
81
+ # The handoff orchestrator — spawns fresh Claude sessions
82
+ npm install @snapkitty/bifrost
83
+
84
+ # Run the full stack
85
+ ABZU_URL=http://127.0.0.1:7070 npx @snapkitty/edaulc # terminal 1
86
+ node node_modules/@snapkitty/abzu/src/abzu.mjs # terminal 2
87
+ ANTHROPIC_API_KEY=your_key node node_modules/@snapkitty/bifrost/src/bifrost.mjs # terminal 3
88
+ ```
89
+
90
+ ---
91
+
92
+ ## 🔲 EDUALC — The Linter Gate
93
+
94
+ *Five deterministic passes. Zero AI. Zero quota. Zero throttle. Instant.*
95
+
96
+ ```
97
+ ┌──────┬──────────────────────┬────────────────────────────────────┐
98
+ │ Pass │ Ancient Script │ What It Guards │
99
+ ├──────┼──────────────────────┼────────────────────────────────────┤
100
+ │ 1 │ Enochian →→→ LTR │ Structure: non-empty, well-formed │
101
+ │ 2 │ Latin →→→ LTR │ Scholarship: no stubs, no fakes │
102
+ │ 3 │ Hebrew ←←← RTL │ Invariants: TS never owns crypto │
103
+ │ 4 │ Arabic ←←← RTL │ Mission: no secrets, no violations │
104
+ │ 5 │ Aramaic ←←← RTL │ Root: structural integrity │
105
+ └──────┴──────────────────────┴────────────────────────────────────┘
106
+
107
+ All five pass → ✅ METATRON: YES — state is certified final
108
+ Any pass fails → ❌ METATRON: NO — nothing moves, nothing purges
109
+ ```
110
+
111
+ ```bash
112
+ npx @snapkitty/edaulc # watch current directory
113
+ npx @snapkitty/edaulc ./src ./lib # watch specific paths
114
+ GROQ_API_KEY=your_key npx @snapkitty/edaulc # + voice veneer
115
+ ```
116
+
117
+ ---
118
+
119
+ ## 🌊 ABZU — The Context Garbage Collector
120
+
121
+ *Named for the Sumerian primordial deep. What context compresses into so the surface stays clean.*
122
+
123
+ **Decision gates — in order:**
124
+
125
+ ```
126
+ Event received
127
+
128
+ ├─► VAULT gate: FAIL? → freeze. Hard stop. No purge.
129
+ ├─► PRISM gate: oscillating? → soft-retain until stable
130
+ ├─► AST scope: tree-sitter extracts structural signatures
131
+ ├─► LEDGE seal: WORM write BEFORE purge — or abort
132
+ └─► Output: Bifrost State Packet → operator executes
133
+ ```
134
+
135
+ **ATLAS monitoring endpoints:**
136
+ ```
137
+ GET /ctx-gc/status → pipeline state, drift index, decision count
138
+ GET /ctx-gc/reserves → tokens purged, retained, compression ratio
139
+ GET /ctx-gc/last-seal → last WORM hash + timestamp
140
+ ```
141
+
142
+ ---
143
+
144
+ ## 🌈 The Bifrost State Packet
145
+
146
+ When ABZU fires on a PASS, it doesn't return a vague summary. It returns this:
147
+
148
+ ```json
149
+ {
150
+ "bifrost_bridge_protocol": "v1.0.0-alpha",
151
+ "packet_id": "0xd7840fae5d674242",
152
+ "provenance": {
153
+ "source_context_id": "ctx_active_bloated",
154
+ "target_context_id": "ctx_fresh_clean",
155
+ "verification_authority": "EDUALC"
156
+ },
157
+ "state_ledger": {
158
+ "worm_seal_hash": "4d6434fd...",
159
+ "fact_token": "Finality verified: quantum_governance.hs."
160
+ },
161
+ "ast_gating": {
162
+ "target_module": "quantum_governance",
163
+ "structural_signatures": [
164
+ "module QuantumGovernance where",
165
+ "governDecision :: QuantumTemp -> String -> String -> AgentDecision"
166
+ ]
167
+ },
168
+ "continuation_matrix": {
169
+ "next_execution_directive": "Execute next pass. Do not alter verified signatures.",
170
+ "drift_stability_index": 0.08
171
+ }
172
+ }
173
+ ```
174
+
175
+ **Inject this as the system prompt for your next Claude session.**
176
+
177
+ The agent wakes up knowing the cryptographic proof of finality, the exact scope it owns, and the precise directive — without any of the debugging noise that got you there. Under 10,000 tokens. Always.
178
+
179
+ **That's async multiplicity. Multi-threaded AI without context bleed.**
180
+
181
+ ---
182
+
183
+ ## 🧱 The Philosophy
184
+
185
+ ```
186
+ ╔══════════════════════════════════════════════════════════════╗
187
+ ║ DIGITAL MASONRY ║
188
+ ║ ║
189
+ ║ You build without signing the stone. ║
190
+ ║ The work is for the temple, not the mason. ║
191
+ ║ ║
192
+ ║ You build to last. ║
193
+ ║ WORM. Write Once Read Many. Append-only truth. ║
194
+ ║ ║
195
+ ║ You build for the people the system buried. ║
196
+ ║ ║
197
+ ║ You don't need credentials to embody the principles. ║
198
+ ║ The lodge is a container. The craft is the thing. ╚══════════════════════════════════════════════════════════════╝
199
+ ```
200
+
201
+ ---
202
+
203
+ ## 📖 Protocol Specification
204
+
205
+ See [BIFROST-SPEC.md](./BIFROST-SPEC.md) for the full RFC. Implement against the spec in any language.
206
+
207
+ ## 📰 The Full Story
208
+
209
+ See [ARTICLE.md](./ARTICLE.md) — *Digital Masonry: Restoring the Graveyard of the Internet*
210
+
211
+ ---
212
+
213
+ ## 🙏 Support
214
+
215
+ ```
216
+ This was built on a $20 birthday subscription purchased May 4th.
217
+ May the Force be with you.
218
+ ```
219
+
220
+ ☕ [ko-fi.com/snapkittycollective](https://ko-fi.com/snapkittycollective)
221
+ 💜 [github.com/sponsors/SNAPKITTYWEST](https://github.com/sponsors/SNAPKITTYWEST)
222
+
223
+ ---
224
+
225
+ **MIT License — use it, fork it, implement the protocol. Build the standard with us.**
226
+
227
+ *SnapKitty Collective | Ahmad Ali Parr + Jessica Westerhoff | May 4th, 2026*
228
+
229
+ ![](https://sovereign-analytics.snapkittywest.workers.dev/canary/sovereign-context-tools)
TEST_LAB.md ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SNAPKITTY TEST LAB
2
+ ## Everything that happens in the test lab is recorded.
3
+
4
+ ---
5
+
6
+ ## SESSION 001 — 2026-05-30
7
+ ### Bifrost Handoff Test | CLAUDE 2 Manual Execution
8
+
9
+ **Test type:** Manual Bifrost State Packet handoff
10
+ **Operator:** Jessica Westerhoff
11
+ **Packet ID:** `0x2a97530b69f64620`
12
+ **Seal:** `57771fd6491ab1fa1207a8132ff6777344cff71441fea09421807bfb0da67429`
13
+
14
+ **Setup:**
15
+ - ABZU running on port 7070
16
+ - EDUALC watching bridges/haskell/
17
+ - PASS event fired on `bridges/haskell/quantum_governance.hs`
18
+ - ABZU emitted Bifrost State Packet (SQUASH decision)
19
+ - Packet manually delivered to a fresh Claude.ai window (CLAUDE 2)
20
+
21
+ **CLAUDE 2 first action:**
22
+ Refused to accept the handoff framing at face value. Read the file directly.
23
+ *(This is correct SENTINEL behavior — zero trust, verify independently.)*
24
+
25
+ **CLAUDE 2 findings — all confirmed real bugs:**
26
+
27
+ | # | File | Bug | Severity |
28
+ |---|------|-----|----------|
29
+ | 1 | `bridges/haskell/quantum_governance.hs:67` | `governDecision` missing `%1->` — LinearTypes enabled but not enforced | HIGH |
30
+ | 2 | `bridges/haskell/quantum_governance.hs:69-75` | `t1 = t; t2 = t` misleading split — implies linearity violation | MEDIUM |
31
+ | 3 | `bridges/haskell/quantum_governance.hs:121` | `checkInvariants` lowercases text then checks for uppercase H in `"noitanicullaH"` — hallucination check silently always passes | HIGH |
32
+ | 4 | `bridges/haskell/quantum_governance.hs:2` | `{-# LANGUAGE QualifiedDo #-}` declared but unused | LOW |
33
+
34
+ **EDUALC missed all four.** Pass 3 (Hebrew RTL invariants) had no Haskell rule.
35
+
36
+ **Fixes applied:**
37
+
38
+ ```
39
+ commit 5400556b
40
+ fix: quantum_governance.hs — 4 bugs found by CLAUDE 2 Bifrost handoff test
41
+ ```
42
+
43
+ 1. Added `%1->` annotation to `governDecision`
44
+ 2. Removed misleading `t1 = t; t2 = t` — use `t` directly
45
+ 3. Fixed `checkInvariants` — check `reversed` before lowercasing, not `lower`
46
+ 4. Removed unused `QualifiedDo` pragma
47
+
48
+ **EDUALC Pass 3 expanded:**
49
+
50
+ New rule added to `scripts/edaulc.mjs`:
51
+ ```javascript
52
+ // Haskell: LinearTypes declared but never enforced
53
+ if (ext === '.hs') {
54
+ if (/\{-#\s*LANGUAGE\s+LinearTypes\s*#-\}/.test(content) && !/%1->/.test(content))
55
+ return { pass: false, reason: 'Haskell LinearTypes enabled but no %1-> annotations found' }
56
+ }
57
+ ```
58
+
59
+ **Test verdict:** BIFROST PROTOCOL PROVEN
60
+ - Fresh session received packet ✓
61
+ - Bounded scope honored ✓
62
+ - Real bugs found in < 60 seconds ✓
63
+ - No context drag from parent session ✓
64
+ - EDUALC expanded from findings ✓
65
+
66
+ **EDUALC would now catch Bug #1 on the original file.**
67
+ Bugs #2, #3, #4 require semantic analysis — candidates for future ERE passes.
68
+
69
+ ---
70
+
71
+ ## ERE PASS EXPANSION LOG
72
+
73
+ | Date | Pass | Language | Rule Added | Trigger |
74
+ |------|------|----------|------------|---------|
75
+ | 2026-05-29 | Pass 5 | TypeScript | Threshold 8→20 (tail window false positive) | Manual fix |
76
+ | 2026-05-30 | Pass 3 | Haskell | LinearTypes declared but no %1-> annotations | CLAUDE 2 Bifrost test |
77
+
78
+ ---
79
+
80
+ ## OPEN CANDIDATES (not yet in ERE)
81
+
82
+ | Bug Pattern | Language | Detection difficulty | Source |
83
+ |-------------|----------|---------------------|--------|
84
+ | Case mismatch after lowercase transform | Haskell | High — semantic | CLAUDE 2 session 001 |
85
+ | Unused language pragmas | Haskell | Medium — regex | CLAUDE 2 session 001 |
86
+ | `let x = val; y = val` (misleading duplicate bindings) | Haskell | Medium — AST | CLAUDE 2 session 001 |
87
+
88
+ ---
89
+
90
+ *Test lab sealed. METATRON records. The chain holds.*
package-lock.json ADDED
@@ -0,0 +1,990 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "sovereign-context-tools",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "sovereign-context-tools",
9
+ "version": "1.0.0",
10
+ "license": "MIT",
11
+ "workspaces": [
12
+ "packages/*"
13
+ ]
14
+ },
15
+ "node_modules/@snapkitty/abzu": {
16
+ "resolved": "packages/abzu",
17
+ "link": true
18
+ },
19
+ "node_modules/@snapkitty/edaulc": {
20
+ "resolved": "packages/edaulc",
21
+ "link": true
22
+ },
23
+ "node_modules/accepts": {
24
+ "version": "1.3.8",
25
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
26
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "mime-types": "~2.1.34",
30
+ "negotiator": "0.6.3"
31
+ },
32
+ "engines": {
33
+ "node": ">= 0.6"
34
+ }
35
+ },
36
+ "node_modules/array-flatten": {
37
+ "version": "1.1.1",
38
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
39
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
40
+ "license": "MIT"
41
+ },
42
+ "node_modules/body-parser": {
43
+ "version": "1.20.5",
44
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
45
+ "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==",
46
+ "license": "MIT",
47
+ "dependencies": {
48
+ "bytes": "~3.1.2",
49
+ "content-type": "~1.0.5",
50
+ "debug": "2.6.9",
51
+ "depd": "2.0.0",
52
+ "destroy": "~1.2.0",
53
+ "http-errors": "~2.0.1",
54
+ "iconv-lite": "~0.4.24",
55
+ "on-finished": "~2.4.1",
56
+ "qs": "~6.15.1",
57
+ "raw-body": "~2.5.3",
58
+ "type-is": "~1.6.18",
59
+ "unpipe": "~1.0.0"
60
+ },
61
+ "engines": {
62
+ "node": ">= 0.8",
63
+ "npm": "1.2.8000 || >= 1.4.16"
64
+ }
65
+ },
66
+ "node_modules/bytes": {
67
+ "version": "3.1.2",
68
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
69
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
70
+ "license": "MIT",
71
+ "engines": {
72
+ "node": ">= 0.8"
73
+ }
74
+ },
75
+ "node_modules/call-bind-apply-helpers": {
76
+ "version": "1.0.2",
77
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
78
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
79
+ "license": "MIT",
80
+ "dependencies": {
81
+ "es-errors": "^1.3.0",
82
+ "function-bind": "^1.1.2"
83
+ },
84
+ "engines": {
85
+ "node": ">= 0.4"
86
+ }
87
+ },
88
+ "node_modules/call-bound": {
89
+ "version": "1.0.4",
90
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
91
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
92
+ "license": "MIT",
93
+ "dependencies": {
94
+ "call-bind-apply-helpers": "^1.0.2",
95
+ "get-intrinsic": "^1.3.0"
96
+ },
97
+ "engines": {
98
+ "node": ">= 0.4"
99
+ },
100
+ "funding": {
101
+ "url": "https://github.com/sponsors/ljharb"
102
+ }
103
+ },
104
+ "node_modules/content-disposition": {
105
+ "version": "0.5.4",
106
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
107
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
108
+ "license": "MIT",
109
+ "dependencies": {
110
+ "safe-buffer": "5.2.1"
111
+ },
112
+ "engines": {
113
+ "node": ">= 0.6"
114
+ }
115
+ },
116
+ "node_modules/content-type": {
117
+ "version": "1.0.5",
118
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
119
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
120
+ "license": "MIT",
121
+ "engines": {
122
+ "node": ">= 0.6"
123
+ }
124
+ },
125
+ "node_modules/cookie": {
126
+ "version": "0.7.2",
127
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
128
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
129
+ "license": "MIT",
130
+ "engines": {
131
+ "node": ">= 0.6"
132
+ }
133
+ },
134
+ "node_modules/cookie-signature": {
135
+ "version": "1.0.7",
136
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
137
+ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
138
+ "license": "MIT"
139
+ },
140
+ "node_modules/debug": {
141
+ "version": "2.6.9",
142
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
143
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
144
+ "license": "MIT",
145
+ "dependencies": {
146
+ "ms": "2.0.0"
147
+ }
148
+ },
149
+ "node_modules/depd": {
150
+ "version": "2.0.0",
151
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
152
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
153
+ "license": "MIT",
154
+ "engines": {
155
+ "node": ">= 0.8"
156
+ }
157
+ },
158
+ "node_modules/destroy": {
159
+ "version": "1.2.0",
160
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
161
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
162
+ "license": "MIT",
163
+ "engines": {
164
+ "node": ">= 0.8",
165
+ "npm": "1.2.8000 || >= 1.4.16"
166
+ }
167
+ },
168
+ "node_modules/dunder-proto": {
169
+ "version": "1.0.1",
170
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
171
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
172
+ "license": "MIT",
173
+ "dependencies": {
174
+ "call-bind-apply-helpers": "^1.0.1",
175
+ "es-errors": "^1.3.0",
176
+ "gopd": "^1.2.0"
177
+ },
178
+ "engines": {
179
+ "node": ">= 0.4"
180
+ }
181
+ },
182
+ "node_modules/ee-first": {
183
+ "version": "1.1.1",
184
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
185
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
186
+ "license": "MIT"
187
+ },
188
+ "node_modules/encodeurl": {
189
+ "version": "2.0.0",
190
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
191
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
192
+ "license": "MIT",
193
+ "engines": {
194
+ "node": ">= 0.8"
195
+ }
196
+ },
197
+ "node_modules/es-define-property": {
198
+ "version": "1.0.1",
199
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
200
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
201
+ "license": "MIT",
202
+ "engines": {
203
+ "node": ">= 0.4"
204
+ }
205
+ },
206
+ "node_modules/es-errors": {
207
+ "version": "1.3.0",
208
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
209
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
210
+ "license": "MIT",
211
+ "engines": {
212
+ "node": ">= 0.4"
213
+ }
214
+ },
215
+ "node_modules/es-object-atoms": {
216
+ "version": "1.1.2",
217
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
218
+ "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
219
+ "license": "MIT",
220
+ "dependencies": {
221
+ "es-errors": "^1.3.0"
222
+ },
223
+ "engines": {
224
+ "node": ">= 0.4"
225
+ }
226
+ },
227
+ "node_modules/escape-html": {
228
+ "version": "1.0.3",
229
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
230
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
231
+ "license": "MIT"
232
+ },
233
+ "node_modules/etag": {
234
+ "version": "1.8.1",
235
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
236
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
237
+ "license": "MIT",
238
+ "engines": {
239
+ "node": ">= 0.6"
240
+ }
241
+ },
242
+ "node_modules/express": {
243
+ "version": "4.22.2",
244
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz",
245
+ "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==",
246
+ "license": "MIT",
247
+ "dependencies": {
248
+ "accepts": "~1.3.8",
249
+ "array-flatten": "1.1.1",
250
+ "body-parser": "~1.20.5",
251
+ "content-disposition": "~0.5.4",
252
+ "content-type": "~1.0.4",
253
+ "cookie": "~0.7.1",
254
+ "cookie-signature": "~1.0.6",
255
+ "debug": "2.6.9",
256
+ "depd": "2.0.0",
257
+ "encodeurl": "~2.0.0",
258
+ "escape-html": "~1.0.3",
259
+ "etag": "~1.8.1",
260
+ "finalhandler": "~1.3.1",
261
+ "fresh": "~0.5.2",
262
+ "http-errors": "~2.0.0",
263
+ "merge-descriptors": "1.0.3",
264
+ "methods": "~1.1.2",
265
+ "on-finished": "~2.4.1",
266
+ "parseurl": "~1.3.3",
267
+ "path-to-regexp": "~0.1.12",
268
+ "proxy-addr": "~2.0.7",
269
+ "qs": "~6.15.1",
270
+ "range-parser": "~1.2.1",
271
+ "safe-buffer": "5.2.1",
272
+ "send": "~0.19.0",
273
+ "serve-static": "~1.16.2",
274
+ "setprototypeof": "1.2.0",
275
+ "statuses": "~2.0.1",
276
+ "type-is": "~1.6.18",
277
+ "utils-merge": "1.0.1",
278
+ "vary": "~1.1.2"
279
+ },
280
+ "engines": {
281
+ "node": ">= 0.10.0"
282
+ },
283
+ "funding": {
284
+ "type": "opencollective",
285
+ "url": "https://opencollective.com/express"
286
+ }
287
+ },
288
+ "node_modules/finalhandler": {
289
+ "version": "1.3.2",
290
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
291
+ "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
292
+ "license": "MIT",
293
+ "dependencies": {
294
+ "debug": "2.6.9",
295
+ "encodeurl": "~2.0.0",
296
+ "escape-html": "~1.0.3",
297
+ "on-finished": "~2.4.1",
298
+ "parseurl": "~1.3.3",
299
+ "statuses": "~2.0.2",
300
+ "unpipe": "~1.0.0"
301
+ },
302
+ "engines": {
303
+ "node": ">= 0.8"
304
+ }
305
+ },
306
+ "node_modules/forwarded": {
307
+ "version": "0.2.0",
308
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
309
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
310
+ "license": "MIT",
311
+ "engines": {
312
+ "node": ">= 0.6"
313
+ }
314
+ },
315
+ "node_modules/fresh": {
316
+ "version": "0.5.2",
317
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
318
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
319
+ "license": "MIT",
320
+ "engines": {
321
+ "node": ">= 0.6"
322
+ }
323
+ },
324
+ "node_modules/function-bind": {
325
+ "version": "1.1.2",
326
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
327
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
328
+ "license": "MIT",
329
+ "funding": {
330
+ "url": "https://github.com/sponsors/ljharb"
331
+ }
332
+ },
333
+ "node_modules/get-intrinsic": {
334
+ "version": "1.3.0",
335
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
336
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
337
+ "license": "MIT",
338
+ "dependencies": {
339
+ "call-bind-apply-helpers": "^1.0.2",
340
+ "es-define-property": "^1.0.1",
341
+ "es-errors": "^1.3.0",
342
+ "es-object-atoms": "^1.1.1",
343
+ "function-bind": "^1.1.2",
344
+ "get-proto": "^1.0.1",
345
+ "gopd": "^1.2.0",
346
+ "has-symbols": "^1.1.0",
347
+ "hasown": "^2.0.2",
348
+ "math-intrinsics": "^1.1.0"
349
+ },
350
+ "engines": {
351
+ "node": ">= 0.4"
352
+ },
353
+ "funding": {
354
+ "url": "https://github.com/sponsors/ljharb"
355
+ }
356
+ },
357
+ "node_modules/get-proto": {
358
+ "version": "1.0.1",
359
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
360
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
361
+ "license": "MIT",
362
+ "dependencies": {
363
+ "dunder-proto": "^1.0.1",
364
+ "es-object-atoms": "^1.0.0"
365
+ },
366
+ "engines": {
367
+ "node": ">= 0.4"
368
+ }
369
+ },
370
+ "node_modules/gopd": {
371
+ "version": "1.2.0",
372
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
373
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
374
+ "license": "MIT",
375
+ "engines": {
376
+ "node": ">= 0.4"
377
+ },
378
+ "funding": {
379
+ "url": "https://github.com/sponsors/ljharb"
380
+ }
381
+ },
382
+ "node_modules/has-symbols": {
383
+ "version": "1.1.0",
384
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
385
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
386
+ "license": "MIT",
387
+ "engines": {
388
+ "node": ">= 0.4"
389
+ },
390
+ "funding": {
391
+ "url": "https://github.com/sponsors/ljharb"
392
+ }
393
+ },
394
+ "node_modules/hasown": {
395
+ "version": "2.0.4",
396
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
397
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
398
+ "license": "MIT",
399
+ "dependencies": {
400
+ "function-bind": "^1.1.2"
401
+ },
402
+ "engines": {
403
+ "node": ">= 0.4"
404
+ }
405
+ },
406
+ "node_modules/http-errors": {
407
+ "version": "2.0.1",
408
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
409
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
410
+ "license": "MIT",
411
+ "dependencies": {
412
+ "depd": "~2.0.0",
413
+ "inherits": "~2.0.4",
414
+ "setprototypeof": "~1.2.0",
415
+ "statuses": "~2.0.2",
416
+ "toidentifier": "~1.0.1"
417
+ },
418
+ "engines": {
419
+ "node": ">= 0.8"
420
+ },
421
+ "funding": {
422
+ "type": "opencollective",
423
+ "url": "https://opencollective.com/express"
424
+ }
425
+ },
426
+ "node_modules/iconv-lite": {
427
+ "version": "0.4.24",
428
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
429
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
430
+ "license": "MIT",
431
+ "dependencies": {
432
+ "safer-buffer": ">= 2.1.2 < 3"
433
+ },
434
+ "engines": {
435
+ "node": ">=0.10.0"
436
+ }
437
+ },
438
+ "node_modules/inherits": {
439
+ "version": "2.0.4",
440
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
441
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
442
+ "license": "ISC"
443
+ },
444
+ "node_modules/ipaddr.js": {
445
+ "version": "1.9.1",
446
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
447
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
448
+ "license": "MIT",
449
+ "engines": {
450
+ "node": ">= 0.10"
451
+ }
452
+ },
453
+ "node_modules/math-intrinsics": {
454
+ "version": "1.1.0",
455
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
456
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
457
+ "license": "MIT",
458
+ "engines": {
459
+ "node": ">= 0.4"
460
+ }
461
+ },
462
+ "node_modules/media-typer": {
463
+ "version": "0.3.0",
464
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
465
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
466
+ "license": "MIT",
467
+ "engines": {
468
+ "node": ">= 0.6"
469
+ }
470
+ },
471
+ "node_modules/merge-descriptors": {
472
+ "version": "1.0.3",
473
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
474
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
475
+ "license": "MIT",
476
+ "funding": {
477
+ "url": "https://github.com/sponsors/sindresorhus"
478
+ }
479
+ },
480
+ "node_modules/methods": {
481
+ "version": "1.1.2",
482
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
483
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
484
+ "license": "MIT",
485
+ "engines": {
486
+ "node": ">= 0.6"
487
+ }
488
+ },
489
+ "node_modules/mime": {
490
+ "version": "1.6.0",
491
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
492
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
493
+ "license": "MIT",
494
+ "bin": {
495
+ "mime": "cli.js"
496
+ },
497
+ "engines": {
498
+ "node": ">=4"
499
+ }
500
+ },
501
+ "node_modules/mime-db": {
502
+ "version": "1.52.0",
503
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
504
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
505
+ "license": "MIT",
506
+ "engines": {
507
+ "node": ">= 0.6"
508
+ }
509
+ },
510
+ "node_modules/mime-types": {
511
+ "version": "2.1.35",
512
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
513
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
514
+ "license": "MIT",
515
+ "dependencies": {
516
+ "mime-db": "1.52.0"
517
+ },
518
+ "engines": {
519
+ "node": ">= 0.6"
520
+ }
521
+ },
522
+ "node_modules/ms": {
523
+ "version": "2.0.0",
524
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
525
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
526
+ "license": "MIT"
527
+ },
528
+ "node_modules/negotiator": {
529
+ "version": "0.6.3",
530
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
531
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
532
+ "license": "MIT",
533
+ "engines": {
534
+ "node": ">= 0.6"
535
+ }
536
+ },
537
+ "node_modules/node-addon-api": {
538
+ "version": "8.8.0",
539
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.8.0.tgz",
540
+ "integrity": "sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA==",
541
+ "license": "MIT",
542
+ "optional": true,
543
+ "engines": {
544
+ "node": "^18 || ^20 || >= 21"
545
+ }
546
+ },
547
+ "node_modules/node-gyp-build": {
548
+ "version": "4.8.4",
549
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
550
+ "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
551
+ "license": "MIT",
552
+ "optional": true,
553
+ "bin": {
554
+ "node-gyp-build": "bin.js",
555
+ "node-gyp-build-optional": "optional.js",
556
+ "node-gyp-build-test": "build-test.js"
557
+ }
558
+ },
559
+ "node_modules/object-inspect": {
560
+ "version": "1.13.4",
561
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
562
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
563
+ "license": "MIT",
564
+ "engines": {
565
+ "node": ">= 0.4"
566
+ },
567
+ "funding": {
568
+ "url": "https://github.com/sponsors/ljharb"
569
+ }
570
+ },
571
+ "node_modules/on-finished": {
572
+ "version": "2.4.1",
573
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
574
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
575
+ "license": "MIT",
576
+ "dependencies": {
577
+ "ee-first": "1.1.1"
578
+ },
579
+ "engines": {
580
+ "node": ">= 0.8"
581
+ }
582
+ },
583
+ "node_modules/parseurl": {
584
+ "version": "1.3.3",
585
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
586
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
587
+ "license": "MIT",
588
+ "engines": {
589
+ "node": ">= 0.8"
590
+ }
591
+ },
592
+ "node_modules/path-to-regexp": {
593
+ "version": "0.1.13",
594
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
595
+ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
596
+ "license": "MIT"
597
+ },
598
+ "node_modules/proxy-addr": {
599
+ "version": "2.0.7",
600
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
601
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
602
+ "license": "MIT",
603
+ "dependencies": {
604
+ "forwarded": "0.2.0",
605
+ "ipaddr.js": "1.9.1"
606
+ },
607
+ "engines": {
608
+ "node": ">= 0.10"
609
+ }
610
+ },
611
+ "node_modules/qs": {
612
+ "version": "6.15.2",
613
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz",
614
+ "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==",
615
+ "license": "BSD-3-Clause",
616
+ "dependencies": {
617
+ "side-channel": "^1.1.0"
618
+ },
619
+ "engines": {
620
+ "node": ">=0.6"
621
+ },
622
+ "funding": {
623
+ "url": "https://github.com/sponsors/ljharb"
624
+ }
625
+ },
626
+ "node_modules/range-parser": {
627
+ "version": "1.2.1",
628
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
629
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
630
+ "license": "MIT",
631
+ "engines": {
632
+ "node": ">= 0.6"
633
+ }
634
+ },
635
+ "node_modules/raw-body": {
636
+ "version": "2.5.3",
637
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
638
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
639
+ "license": "MIT",
640
+ "dependencies": {
641
+ "bytes": "~3.1.2",
642
+ "http-errors": "~2.0.1",
643
+ "iconv-lite": "~0.4.24",
644
+ "unpipe": "~1.0.0"
645
+ },
646
+ "engines": {
647
+ "node": ">= 0.8"
648
+ }
649
+ },
650
+ "node_modules/safe-buffer": {
651
+ "version": "5.2.1",
652
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
653
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
654
+ "funding": [
655
+ {
656
+ "type": "github",
657
+ "url": "https://github.com/sponsors/feross"
658
+ },
659
+ {
660
+ "type": "patreon",
661
+ "url": "https://www.patreon.com/feross"
662
+ },
663
+ {
664
+ "type": "consulting",
665
+ "url": "https://feross.org/support"
666
+ }
667
+ ],
668
+ "license": "MIT"
669
+ },
670
+ "node_modules/safer-buffer": {
671
+ "version": "2.1.2",
672
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
673
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
674
+ "license": "MIT"
675
+ },
676
+ "node_modules/send": {
677
+ "version": "0.19.2",
678
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
679
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
680
+ "license": "MIT",
681
+ "dependencies": {
682
+ "debug": "2.6.9",
683
+ "depd": "2.0.0",
684
+ "destroy": "1.2.0",
685
+ "encodeurl": "~2.0.0",
686
+ "escape-html": "~1.0.3",
687
+ "etag": "~1.8.1",
688
+ "fresh": "~0.5.2",
689
+ "http-errors": "~2.0.1",
690
+ "mime": "1.6.0",
691
+ "ms": "2.1.3",
692
+ "on-finished": "~2.4.1",
693
+ "range-parser": "~1.2.1",
694
+ "statuses": "~2.0.2"
695
+ },
696
+ "engines": {
697
+ "node": ">= 0.8.0"
698
+ }
699
+ },
700
+ "node_modules/send/node_modules/ms": {
701
+ "version": "2.1.3",
702
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
703
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
704
+ "license": "MIT"
705
+ },
706
+ "node_modules/serve-static": {
707
+ "version": "1.16.3",
708
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
709
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
710
+ "license": "MIT",
711
+ "dependencies": {
712
+ "encodeurl": "~2.0.0",
713
+ "escape-html": "~1.0.3",
714
+ "parseurl": "~1.3.3",
715
+ "send": "~0.19.1"
716
+ },
717
+ "engines": {
718
+ "node": ">= 0.8.0"
719
+ }
720
+ },
721
+ "node_modules/setprototypeof": {
722
+ "version": "1.2.0",
723
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
724
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
725
+ "license": "ISC"
726
+ },
727
+ "node_modules/side-channel": {
728
+ "version": "1.1.0",
729
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
730
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
731
+ "license": "MIT",
732
+ "dependencies": {
733
+ "es-errors": "^1.3.0",
734
+ "object-inspect": "^1.13.3",
735
+ "side-channel-list": "^1.0.0",
736
+ "side-channel-map": "^1.0.1",
737
+ "side-channel-weakmap": "^1.0.2"
738
+ },
739
+ "engines": {
740
+ "node": ">= 0.4"
741
+ },
742
+ "funding": {
743
+ "url": "https://github.com/sponsors/ljharb"
744
+ }
745
+ },
746
+ "node_modules/side-channel-list": {
747
+ "version": "1.0.1",
748
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
749
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
750
+ "license": "MIT",
751
+ "dependencies": {
752
+ "es-errors": "^1.3.0",
753
+ "object-inspect": "^1.13.4"
754
+ },
755
+ "engines": {
756
+ "node": ">= 0.4"
757
+ },
758
+ "funding": {
759
+ "url": "https://github.com/sponsors/ljharb"
760
+ }
761
+ },
762
+ "node_modules/side-channel-map": {
763
+ "version": "1.0.1",
764
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
765
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
766
+ "license": "MIT",
767
+ "dependencies": {
768
+ "call-bound": "^1.0.2",
769
+ "es-errors": "^1.3.0",
770
+ "get-intrinsic": "^1.2.5",
771
+ "object-inspect": "^1.13.3"
772
+ },
773
+ "engines": {
774
+ "node": ">= 0.4"
775
+ },
776
+ "funding": {
777
+ "url": "https://github.com/sponsors/ljharb"
778
+ }
779
+ },
780
+ "node_modules/side-channel-weakmap": {
781
+ "version": "1.0.2",
782
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
783
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
784
+ "license": "MIT",
785
+ "dependencies": {
786
+ "call-bound": "^1.0.2",
787
+ "es-errors": "^1.3.0",
788
+ "get-intrinsic": "^1.2.5",
789
+ "object-inspect": "^1.13.3",
790
+ "side-channel-map": "^1.0.1"
791
+ },
792
+ "engines": {
793
+ "node": ">= 0.4"
794
+ },
795
+ "funding": {
796
+ "url": "https://github.com/sponsors/ljharb"
797
+ }
798
+ },
799
+ "node_modules/statuses": {
800
+ "version": "2.0.2",
801
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
802
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
803
+ "license": "MIT",
804
+ "engines": {
805
+ "node": ">= 0.8"
806
+ }
807
+ },
808
+ "node_modules/toidentifier": {
809
+ "version": "1.0.1",
810
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
811
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
812
+ "license": "MIT",
813
+ "engines": {
814
+ "node": ">=0.6"
815
+ }
816
+ },
817
+ "node_modules/tree-sitter": {
818
+ "version": "0.25.0",
819
+ "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.25.0.tgz",
820
+ "integrity": "sha512-PGZZzFW63eElZJDe/b/R/LbsjDDYJa5UEjLZJB59RQsMX+fo0j54fqBPn1MGKav/QNa0JR0zBiVaikYDWCj5KQ==",
821
+ "hasInstallScript": true,
822
+ "license": "MIT",
823
+ "optional": true,
824
+ "dependencies": {
825
+ "node-addon-api": "^8.3.0",
826
+ "node-gyp-build": "^4.8.4"
827
+ }
828
+ },
829
+ "node_modules/tree-sitter-haskell": {
830
+ "version": "0.23.1",
831
+ "resolved": "https://registry.npmjs.org/tree-sitter-haskell/-/tree-sitter-haskell-0.23.1.tgz",
832
+ "integrity": "sha512-qG4CYhejveu9DLMLEGBz/n9/TTeGSFLC6wniwOgG6m8/v7Dng8qR0ob0EVG7+XH+9WiOxohpGA23EhceWuxY4w==",
833
+ "hasInstallScript": true,
834
+ "license": "MIT",
835
+ "optional": true,
836
+ "dependencies": {
837
+ "node-addon-api": "^8.2.2",
838
+ "node-gyp-build": "^4.8.2"
839
+ },
840
+ "peerDependencies": {
841
+ "tree-sitter": "^0.21.1"
842
+ },
843
+ "peerDependenciesMeta": {
844
+ "tree-sitter": {
845
+ "optional": true
846
+ }
847
+ }
848
+ },
849
+ "node_modules/tree-sitter-javascript": {
850
+ "version": "0.23.1",
851
+ "resolved": "https://registry.npmjs.org/tree-sitter-javascript/-/tree-sitter-javascript-0.23.1.tgz",
852
+ "integrity": "sha512-/bnhbrTD9frUYHQTiYnPcxyHORIw157ERBa6dqzaKxvR/x3PC4Yzd+D1pZIMS6zNg2v3a8BZ0oK7jHqsQo9fWA==",
853
+ "hasInstallScript": true,
854
+ "license": "MIT",
855
+ "optional": true,
856
+ "dependencies": {
857
+ "node-addon-api": "^8.2.2",
858
+ "node-gyp-build": "^4.8.2"
859
+ },
860
+ "peerDependencies": {
861
+ "tree-sitter": "^0.21.1"
862
+ },
863
+ "peerDependenciesMeta": {
864
+ "tree-sitter": {
865
+ "optional": true
866
+ }
867
+ }
868
+ },
869
+ "node_modules/tree-sitter-rust": {
870
+ "version": "0.24.0",
871
+ "resolved": "https://registry.npmjs.org/tree-sitter-rust/-/tree-sitter-rust-0.24.0.tgz",
872
+ "integrity": "sha512-NWemUDf629Tfc90Y0Z55zuwPCAHkLxWnMf2RznYu4iBkkrQl2o/CHGB7Cr52TyN5F1DAx8FmUnDtCy9iUkXZEQ==",
873
+ "hasInstallScript": true,
874
+ "license": "MIT",
875
+ "optional": true,
876
+ "dependencies": {
877
+ "node-addon-api": "^8.2.2",
878
+ "node-gyp-build": "^4.8.4"
879
+ },
880
+ "peerDependencies": {
881
+ "tree-sitter": "^0.22.1"
882
+ },
883
+ "peerDependenciesMeta": {
884
+ "tree-sitter": {
885
+ "optional": true
886
+ }
887
+ }
888
+ },
889
+ "node_modules/tree-sitter-typescript": {
890
+ "version": "0.23.2",
891
+ "resolved": "https://registry.npmjs.org/tree-sitter-typescript/-/tree-sitter-typescript-0.23.2.tgz",
892
+ "integrity": "sha512-e04JUUKxTT53/x3Uq1zIL45DoYKVfHH4CZqwgZhPg5qYROl5nQjV+85ruFzFGZxu+QeFVbRTPDRnqL9UbU4VeA==",
893
+ "hasInstallScript": true,
894
+ "license": "MIT",
895
+ "optional": true,
896
+ "dependencies": {
897
+ "node-addon-api": "^8.2.2",
898
+ "node-gyp-build": "^4.8.2",
899
+ "tree-sitter-javascript": "^0.23.1"
900
+ },
901
+ "peerDependencies": {
902
+ "tree-sitter": "^0.21.0"
903
+ },
904
+ "peerDependenciesMeta": {
905
+ "tree-sitter": {
906
+ "optional": true
907
+ }
908
+ }
909
+ },
910
+ "node_modules/type-is": {
911
+ "version": "1.6.18",
912
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
913
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
914
+ "license": "MIT",
915
+ "dependencies": {
916
+ "media-typer": "0.3.0",
917
+ "mime-types": "~2.1.24"
918
+ },
919
+ "engines": {
920
+ "node": ">= 0.6"
921
+ }
922
+ },
923
+ "node_modules/unpipe": {
924
+ "version": "1.0.0",
925
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
926
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
927
+ "license": "MIT",
928
+ "engines": {
929
+ "node": ">= 0.8"
930
+ }
931
+ },
932
+ "node_modules/utils-merge": {
933
+ "version": "1.0.1",
934
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
935
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
936
+ "license": "MIT",
937
+ "engines": {
938
+ "node": ">= 0.4.0"
939
+ }
940
+ },
941
+ "node_modules/vary": {
942
+ "version": "1.1.2",
943
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
944
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
945
+ "license": "MIT",
946
+ "engines": {
947
+ "node": ">= 0.8"
948
+ }
949
+ },
950
+ "packages/abzu": {
951
+ "name": "@snapkitty/abzu",
952
+ "version": "1.0.0",
953
+ "license": "MIT",
954
+ "dependencies": {
955
+ "express": "^4.21.2"
956
+ },
957
+ "bin": {
958
+ "abzu": "src/abzu.mjs"
959
+ },
960
+ "engines": {
961
+ "node": ">=18.0.0"
962
+ },
963
+ "optionalDependencies": {
964
+ "tree-sitter": "^0.25.0",
965
+ "tree-sitter-haskell": "^0.23.1",
966
+ "tree-sitter-rust": "^0.24.0",
967
+ "tree-sitter-typescript": "^0.23.2"
968
+ },
969
+ "peerDependencies": {
970
+ "@snapkitty/edaulc": ">=2.0.0"
971
+ },
972
+ "peerDependenciesMeta": {
973
+ "@snapkitty/edaulc": {
974
+ "optional": true
975
+ }
976
+ }
977
+ },
978
+ "packages/edaulc": {
979
+ "name": "@snapkitty/edaulc",
980
+ "version": "2.0.0",
981
+ "license": "MIT",
982
+ "bin": {
983
+ "edaulc": "src/edaulc.mjs"
984
+ },
985
+ "engines": {
986
+ "node": ">=18.0.0"
987
+ }
988
+ }
989
+ }
990
+ }
package.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "sovereign-context-tools",
3
+ "version": "1.0.0",
4
+ "private": true,
5
+ "description": "EDUALC + ABZU — linter-gated context sovereign for LLM development",
6
+ "workspaces": [
7
+ "packages/*"
8
+ ],
9
+ "scripts": {
10
+ "build": "npm run build --workspaces",
11
+ "test": "npm run test --workspaces --if-present",
12
+ "pack:all": "npm pack --workspaces"
13
+ },
14
+ "author": "Ahmad Ali Parr + Jessica Westerhoff (Bel Esprit Trust)",
15
+ "license": "MIT"
16
+ }
packages/abzu/package.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "@snapkitty/abzu",
3
+ "version": "1.0.0",
4
+ "description": "ABZU — Sovereign Context Garbage Collector. WORM-sealed fact blocks. Linter-gated context compression. Outputs Bifrost State Packets for async multiplicity.",
5
+ "type": "module",
6
+ "main": "src/abzu.mjs",
7
+ "bin": {
8
+ "abzu": "src/abzu.mjs"
9
+ },
10
+ "scripts": {
11
+ "start": "node src/abzu.mjs"
12
+ },
13
+ "keywords": [
14
+ "context", "garbage-collector", "claude", "llm", "worm", "bifrost",
15
+ "linter", "edualc", "sovereign", "async-multiplicity", "token-compression"
16
+ ],
17
+ "author": "Ahmad Ali Parr + Jessica Westerhoff",
18
+ "license": "MIT",
19
+ "engines": {
20
+ "node": ">=18.0.0"
21
+ },
22
+ "dependencies": {
23
+ "express": "^4.21.2"
24
+ },
25
+ "optionalDependencies": {
26
+ "tree-sitter": "^0.25.0",
27
+ "tree-sitter-haskell": "^0.23.1",
28
+ "tree-sitter-rust": "^0.24.0",
29
+ "tree-sitter-typescript": "^0.23.2"
30
+ },
31
+ "peerDependencies": {
32
+ "@snapkitty/edaulc": ">=2.0.0"
33
+ },
34
+ "peerDependenciesMeta": {
35
+ "@snapkitty/edaulc": { "optional": true }
36
+ }
37
+ }
packages/abzu/src/abzu.mjs ADDED
@@ -0,0 +1,318 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+ // ═══════════════════════════════════════════════════════════════════════════
3
+ // ABZU — Sovereign Context Garbage Collector v1.0
4
+ // scripts/abzu.mjs
5
+ //
6
+ // Order of Symmetry | Meeting 3 | 2026-05-30
7
+ // Sealed consensus: NOVA · RELAY · CIPHER · NEXUS · HERALD
8
+ // AXIOM · PRISM · VAULT · SENTINEL · LEDGE · ATLAS
9
+ //
10
+ // Architecture:
11
+ // EDUALC PASS/FAIL → /edualc/report (Bifrost bus)
12
+ // ↓
13
+ // VAULT veto gate (FAIL = freeze, no purge)
14
+ // ↓
15
+ // PRISM drift gate (oscillating module = soft-retain)
16
+ // ↓
17
+ // AXIOM AST scope (tree-sitter local, 500 structural tokens)
18
+ // ↓
19
+ // LEDGE sequence: compose → WORM seal (Rust) → account → advise purge
20
+ // ↓
21
+ // SENTINEL: advise only — operator executes compression
22
+ //
23
+ // EDUALC payload contract: { file, certified, timestamp, agent }
24
+ // Launch: node scripts/abzu.mjs
25
+ // ═══════════════════════════════════════════════════════════════════════════
26
+
27
+ import express from 'express'
28
+ import { createHmac, randomUUID } from 'crypto'
29
+ import { appendFileSync, mkdirSync, readFileSync } from 'fs'
30
+ import { join, dirname, extname } from 'path'
31
+ import { fileURLToPath } from 'url'
32
+
33
+ const __dir = dirname(fileURLToPath(import.meta.url))
34
+ const ROOT = process.cwd()
35
+
36
+ // ── Terminal colors ──────────────────────────────────────────────────────────
37
+ const C = {
38
+ gold: s => `\x1b[33m${s}\x1b[0m`,
39
+ cyan: s => `\x1b[36m${s}\x1b[0m`,
40
+ purple: s => `\x1b[35m${s}\x1b[0m`,
41
+ green: s => `\x1b[32m${s}\x1b[0m`,
42
+ red: s => `\x1b[31m${s}\x1b[0m`,
43
+ gray: s => `\x1b[90m${s}\x1b[0m`,
44
+ bold: s => `\x1b[1m${s}\x1b[0m`,
45
+ }
46
+ const out = (s = '') => process.stdout.write(s + '\n')
47
+ const ts = () => C.gray(new Date().toISOString().slice(11, 19))
48
+
49
+ // ── Config ───────────────────────────────────────────────────────────────────
50
+ const PORT = parseInt(process.env.ABZU_PORT ?? '7070')
51
+ const RUST_URL = process.env.RUST_HANDLER_URL ?? 'http://localhost:8080'
52
+ const ABZU_SECRET = process.env.ABZU_HMAC_SECRET ?? ''
53
+
54
+ const DRIFT_WINDOW = 5
55
+ const DRIFT_THRESHOLD = 0.4
56
+
57
+ const AUDIT_DIR = join(ROOT, 'logs')
58
+ const AUDIT_LOG = join(AUDIT_DIR, 'abzu-audit.ndjson')
59
+ try { mkdirSync(AUDIT_DIR, { recursive: true }) } catch {}
60
+
61
+ // ── State ────────────────────────────────────────────────────────────────────
62
+ const state = {
63
+ session_id: randomUUID(),
64
+ is_frozen: false,
65
+ tokens_purged: 0,
66
+ tokens_retained: 0,
67
+ last_worm_hash: null,
68
+ last_seal_ts: null,
69
+ drift_score: 0,
70
+ decision_count: 0,
71
+ module_history: {},
72
+ }
73
+
74
+ // ── HMAC auth (SENTINEL constraint) ─────────────────────────────────────────
75
+ function verifyHmac(req) {
76
+ if (!ABZU_SECRET) return true
77
+ const sig = req.headers['x-abzu-signature']
78
+ if (!sig) return false
79
+ const expected = createHmac('sha256', ABZU_SECRET)
80
+ .update(JSON.stringify(req.body))
81
+ .digest('hex')
82
+ return sig === expected
83
+ }
84
+
85
+ // ── Append-only audit log (LEDGE constraint) ─────────────────────────────────
86
+ function audit(entry) {
87
+ try {
88
+ appendFileSync(AUDIT_LOG, JSON.stringify({ ...entry, ts: new Date().toISOString() }) + '\n')
89
+ } catch {}
90
+ }
91
+
92
+ // ── PRISM drift score ────────────────────────────────────────────────────────
93
+ function updateDrift(module, certified) {
94
+ const h = state.module_history[module] ??= []
95
+ h.push(certified ? 0 : 1)
96
+ if (h.length > DRIFT_WINDOW) h.shift()
97
+ if (h.length < 2) return 0
98
+ let changes = 0
99
+ for (let i = 1; i < h.length; i++) if (h[i] !== h[i - 1]) changes++
100
+ return changes / (h.length - 1)
101
+ }
102
+
103
+ // ── LEDGER: structural signature extraction (regex fallback, no native deps) ──
104
+ const SIG_PATTERNS = {
105
+ '.hs': [/^module\s+\S+/, /^import\s+(?:qualified\s+)?\S+/, /^\w[\w']*\s*::\s*.+/],
106
+ '.rs': [/^pub\s+(?:async\s+)?(?:fn|struct|enum|trait|impl|type|const)\s+\w+/, /^use\s+\S+/],
107
+ '.ts': [/^export\s+(?:default\s+)?(?:async\s+)?(?:function|class|interface|type|const|enum)\s+\w+/, /^import\s+/],
108
+ }
109
+
110
+ function extractSignatures(filePath) {
111
+ try {
112
+ const ext = extname(filePath)
113
+ const abs = join(ROOT, filePath)
114
+ const lines = readFileSync(abs, 'utf8').split('\n')
115
+ const pats = SIG_PATTERNS[ext] ?? []
116
+ const sigs = []
117
+ for (const line of lines) {
118
+ const t = line.trim()
119
+ if (t && pats.some(p => p.test(t))) {
120
+ sigs.push(t.slice(0, 120))
121
+ if (sigs.length >= 8) break
122
+ }
123
+ }
124
+ return sigs
125
+ } catch { return [] }
126
+ }
127
+
128
+ // ── AXIOM: local AST scope via tree-sitter ───────────────────────────────────
129
+ async function getASTScope(filePath) {
130
+ const ext = extname(filePath)
131
+ const signatures = extractSignatures(filePath)
132
+ try {
133
+ const { Parser } = await import('tree-sitter')
134
+ let lang
135
+ if (ext === '.hs') lang = (await import('tree-sitter-haskell')).default
136
+ else if (ext === '.rs') lang = (await import('tree-sitter-rust')).default
137
+ else if (ext === '.ts') lang = (await import('tree-sitter-typescript')).typescript
138
+ else return { scope: 'FULL_FILE', tokens: 2000, signatures }
139
+
140
+ const p = new Parser()
141
+ p.setLanguage(lang)
142
+ return { scope: `BOUNDED_AST:${ext}`, tokens: 500, signatures }
143
+ } catch {
144
+ return { scope: 'FULL_FILE_FALLBACK', tokens: 2000, signatures }
145
+ }
146
+ }
147
+
148
+ // ── LEDGE: WORM seal via Rust ─────────────────────────────────────────────────
149
+ async function sealToWorm(factBlock) {
150
+ const res = await fetch(`${RUST_URL}/agents/process`, {
151
+ method: 'POST',
152
+ headers: { 'Content-Type': 'application/json' },
153
+ body: JSON.stringify({
154
+ agent: 'ABZU',
155
+ event_type: 'worm_seal',
156
+ source: 'context-gc',
157
+ payload: factBlock,
158
+ }),
159
+ signal: AbortSignal.timeout(5000),
160
+ })
161
+ if (!res.ok) throw new Error(`Rust WORM rejected: ${res.status}`)
162
+ const j = await res.json()
163
+ return j.decision_seal ?? j.worm_entry_id ?? j.seal ?? null
164
+ }
165
+
166
+ // ── Express app ──────────────────────────────────────────────────────────────
167
+ const app = express()
168
+ app.use(express.json({ limit: '64kb' }))
169
+
170
+ // ── POST /edualc/report — Bifrost bus consumer ───────────────────────────────
171
+ // Matches EDUALC signalRust payload: { file, certified, timestamp, agent }
172
+ app.post('/edualc/report', async (req, res) => {
173
+ if (!verifyHmac(req)) {
174
+ out(`${ts()} ${C.red('✗')} ABZU: HMAC mismatch — rejected`)
175
+ return res.status(401).json({ error: 'unauthorized' })
176
+ }
177
+
178
+ const { file, certified, timestamp, agent } = req.body
179
+ if (typeof file !== 'string' || typeof certified !== 'boolean') {
180
+ return res.status(400).json({ error: 'invalid payload: file (string) and certified (boolean) required' })
181
+ }
182
+
183
+ state.decision_count++
184
+ out(`${ts()} ${C.purple('◈')} ABZU ← ${C.bold(file)} [${agent ?? 'EDUALC'}] → ${certified ? C.green('PASS') : C.red('FAIL')}`)
185
+
186
+ // ── VAULT veto: freeze on FAIL ────────────────────────────────────────────
187
+ if (!certified) {
188
+ state.is_frozen = true
189
+ out(`${ts()} ${C.red(C.bold(' VAULT FREEZE — full retention, no purge'))}`)
190
+ audit({ decision: 'RETAIN', reason: 'VAULT_FREEZE', file })
191
+ return res.json({ decision: 'RETAIN', reason: 'VAULT_FREEZE_PROTOCOL_ACTIVE' })
192
+ }
193
+
194
+ // ── PRISM drift gate ──────────────────────────────────────────────────────
195
+ const drift = updateDrift(file, certified)
196
+ state.drift_score = drift
197
+ if (drift > DRIFT_THRESHOLD) {
198
+ out(`${ts()} ${C.gold(` PRISM: drift ${drift.toFixed(2)} > ${DRIFT_THRESHOLD} — soft retain`)}`)
199
+ audit({ decision: 'RETAIN', reason: 'PRISM_DRIFT', file, drift })
200
+ return res.json({ decision: 'RETAIN', reason: 'PRISM_CONTEXT_DRIFT_UNSTABLE', drift })
201
+ }
202
+
203
+ state.is_frozen = false
204
+
205
+ // ── AXIOM: AST scope + structural signatures ─────────────────────────────
206
+ const { scope, tokens: structuralTokens, signatures } = await getASTScope(file)
207
+
208
+ // ── LEDGE sequence: compose → seal → account → advise ────────────────────
209
+ const factBlock = {
210
+ session_id: state.session_id,
211
+ file,
212
+ scope,
213
+ timestamp: timestamp ?? new Date().toISOString(),
214
+ summary: `Finality verified: ${file}. Context bounded to structural signatures.`,
215
+ }
216
+
217
+ let sealHash
218
+ try {
219
+ sealHash = await sealToWorm(factBlock)
220
+ if (!sealHash) throw new Error('seal hash missing from Rust response')
221
+ } catch (err) {
222
+ out(`${ts()} ${C.red(' LEDGE: WORM seal FAILED — aborting purge')} ${C.gray(err.message)}`)
223
+ audit({ decision: 'RETAIN', reason: 'LEDGE_WORM_SEAL_FAILURE', file, error: err.message })
224
+ return res.status(500).json({ decision: 'RETAIN', reason: 'LEDGE_WORM_SEAL_FAILURE' })
225
+ }
226
+
227
+ // CIPHER accounting — only after successful seal
228
+ state.tokens_retained += structuralTokens
229
+ state.last_worm_hash = sealHash
230
+ state.last_seal_ts = factBlock.timestamp
231
+
232
+ const total = state.tokens_purged + state.tokens_retained
233
+ const ratio = total > 0 ? state.tokens_purged / total : 0
234
+
235
+ out(`${ts()} ${C.green(C.bold(' LEDGE sealed:'))} ${C.green(String(sealHash).slice(0, 16))}… ${C.gray(`ratio ${(ratio * 100).toFixed(1)}%`)}`)
236
+
237
+ const moduleName = file.split('/').pop()?.replace(/\.\w+$/, '') ?? file
238
+ const packetId = `0x${randomUUID().replace(/-/g, '').slice(0, 16)}`
239
+
240
+ audit({ decision: 'SQUASH', file, scope, sealHash, structuralTokens, drift, packet_id: packetId })
241
+
242
+ // SENTINEL: emit Bifröst State Packet — operator executes hydration, not ABZU
243
+ return res.json({
244
+ decision: 'SQUASH',
245
+ bifrost_bridge_protocol: 'v1.0.0-alpha',
246
+ packet_id: packetId,
247
+ timestamp: new Date().toISOString(),
248
+ provenance: {
249
+ source_context_id: `ctx_${state.session_id.slice(0, 8)}_active`,
250
+ target_context_id: `ctx_${randomUUID().replace(/-/g, '').slice(0, 8)}_fresh`,
251
+ verification_authority: agent ?? 'EDUALC',
252
+ },
253
+ state_ledger: {
254
+ worm_seal_hash: sealHash,
255
+ fact_token: factBlock.summary,
256
+ },
257
+ ast_gating: {
258
+ target_module: moduleName,
259
+ file_path: file,
260
+ scope_boundary: scope,
261
+ structural_signatures: signatures,
262
+ },
263
+ continuation_matrix: {
264
+ exit_condition_previous: 'exit 0',
265
+ next_execution_directive: `Execute next verification pass for ${moduleName}. Scope is bounded to structural signatures. Do not alter verified type signatures.`,
266
+ drift_stability_index: drift,
267
+ },
268
+ })
269
+ })
270
+
271
+ // ── ATLAS diagnostic endpoints ───────────────────────────────────────────────
272
+ app.get('/ctx-gc/status', (_req, res) => res.json({
273
+ service: 'ABZU_CONTEXT_SOVEREIGN',
274
+ session: state.session_id,
275
+ pipeline_status: state.is_frozen ? 'FREEZE_RETAIN_ACTIVE' : 'EVALUATING_PASS_STATE',
276
+ drift_index: state.drift_score,
277
+ decisions: state.decision_count,
278
+ }))
279
+
280
+ app.get('/ctx-gc/reserves', (_req, res) => {
281
+ const total = state.tokens_purged + state.tokens_retained
282
+ const ratio = total > 0 ? state.tokens_purged / total : 0
283
+ res.json({
284
+ tokens_purged: state.tokens_purged,
285
+ tokens_retained: state.tokens_retained,
286
+ compression_ratio: `${(ratio * 100).toFixed(2)}%`,
287
+ })
288
+ })
289
+
290
+ app.get('/ctx-gc/last-seal', (_req, res) => res.json({
291
+ sha256_seal: state.last_worm_hash,
292
+ sealed_at: state.last_seal_ts,
293
+ }))
294
+
295
+ // ── Banner ───────────────────────────────────────────────────────────────────
296
+ function banner() {
297
+ out()
298
+ out(C.purple(C.bold(' ╔══════════════════════════════════════════════════════════╗')))
299
+ out(C.purple(C.bold(' ║ A B Z U — CONTEXT SOVEREIGN v1.0 ║')))
300
+ out(C.purple(C.bold(' ║ primordial deep · seal-before-purge · WORM-bound ║')))
301
+ out(C.purple(C.bold(' ╚══════════════════════════════════════════════════════════╝')))
302
+ out()
303
+ out(C.gray(` session : ${state.session_id}`))
304
+ out(C.gray(` port : ${PORT} (127.0.0.1 only)`))
305
+ out(C.gray(` rust : ${RUST_URL}`))
306
+ out(C.gray(` hmac : ${ABZU_SECRET ? '✓ configured' : '✗ open (dev — set ABZU_HMAC_SECRET)'}`))
307
+ out(C.gray(` audit : ${AUDIT_LOG}`))
308
+ out(C.gray(` drift : window ${DRIFT_WINDOW} · threshold ${DRIFT_THRESHOLD}`))
309
+ out()
310
+ out(C.cyan(' Waiting for EDUALC events on POST /edualc/report'))
311
+ out()
312
+ }
313
+
314
+ banner()
315
+ app.listen(PORT, '127.0.0.1', () => {
316
+ out(C.green(' ABZU active. Entering the primordial deep.'))
317
+ out()
318
+ })
packages/bifrost/package.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "@snapkitty/bifrost",
3
+ "version": "1.0.0",
4
+ "description": "BIFROST — Context Handoff Orchestrator. Receives Bifrost State Packets from ABZU, spawns fresh Claude sessions with verified state under 10k tokens. Enables true async multiplicity.",
5
+ "type": "module",
6
+ "main": "src/bifrost.mjs",
7
+ "bin": {
8
+ "bifrost": "src/bifrost.mjs"
9
+ },
10
+ "scripts": {
11
+ "start": "node src/bifrost.mjs"
12
+ },
13
+ "keywords": [
14
+ "claude", "anthropic", "context", "handoff", "async-multiplicity",
15
+ "bifrost", "llm", "sovereign", "edualc", "abzu", "worm"
16
+ ],
17
+ "author": "Ahmad Ali Parr + Jessica Westerhoff",
18
+ "license": "MIT",
19
+ "engines": { "node": ">=18.0.0" },
20
+ "dependencies": {
21
+ "@anthropic-ai/sdk": "^0.52.0",
22
+ "express": "^4.21.2"
23
+ },
24
+ "peerDependencies": {
25
+ "@snapkitty/abzu": ">=1.0.0"
26
+ }
27
+ }
packages/bifrost/src/bifrost.mjs ADDED
@@ -0,0 +1,276 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+ // ═══════════════════════════════════════════════════════════════════════════
3
+ // BIFROST — Context Handoff Orchestrator v1.0
4
+ // @snapkitty/bifrost
5
+ //
6
+ // The third layer of the Digital Masonry stack:
7
+ //
8
+ // EDUALC → verifies code (linter gate)
9
+ // ABZU → compresses context on PASS (Bifrost packet output)
10
+ // BIFROST → executes handoff (spawns fresh Claude, injects packet)
11
+ //
12
+ // When ABZU emits a SQUASH decision with a Bifrost State Packet,
13
+ // BIFROST receives it, builds a clean system prompt from verified state,
14
+ // and provisions a fresh Claude session under 10,000 tokens.
15
+ //
16
+ // True async multiplicity: multiple isolated Claude windows, each
17
+ // carrying only verified state, each working in parallel.
18
+ //
19
+ // Architecture:
20
+ // ABZU POST /bifrost/handoff → spawn session → return session_id
21
+ // GET /bifrost/sessions → list all active sessions
22
+ // POST /bifrost/continue → continue a session with next message
23
+ // GET /bifrost/session/:id → get session state
24
+ //
25
+ // Launch: node src/bifrost.mjs
26
+ // Env vars:
27
+ // ANTHROPIC_API_KEY — required (your Claude API key)
28
+ // BIFROST_PORT — default 7071
29
+ // BIFROST_MODEL — default claude-sonnet-4-6
30
+ // ABZU_URL — default http://127.0.0.1:7070 (for health checks)
31
+ // ═══════════════════════════════════════════════════════════════════════════
32
+
33
+ import Anthropic from '@anthropic-ai/sdk'
34
+ import express from 'express'
35
+ import { randomUUID } from 'crypto'
36
+
37
+ // ── Terminal colors ──────────────────────────────────────────────────────────
38
+ const C = {
39
+ gold: s => `\x1b[33m${s}\x1b[0m`,
40
+ cyan: s => `\x1b[36m${s}\x1b[0m`,
41
+ purple: s => `\x1b[35m${s}\x1b[0m`,
42
+ green: s => `\x1b[32m${s}\x1b[0m`,
43
+ red: s => `\x1b[31m${s}\x1b[0m`,
44
+ gray: s => `\x1b[90m${s}\x1b[0m`,
45
+ bold: s => `\x1b[1m${s}\x1b[0m`,
46
+ }
47
+ const out = (s = '') => process.stdout.write(s + '\n')
48
+ const ts = () => C.gray(new Date().toISOString().slice(11, 19))
49
+
50
+ // ── Config ───────────────────────────────────────────────────────────────────
51
+ const PORT = parseInt(process.env.BIFROST_PORT ?? '7071')
52
+ const PROVIDER = process.env.BIFROST_PROVIDER ?? 'groq' // groq | anthropic
53
+ const API_KEY = process.env.ANTHROPIC_API_KEY ?? ''
54
+ const GROQ_KEY = process.env.GROQ_API_KEY ?? ''
55
+ const MODEL = process.env.BIFROST_MODEL ?? (PROVIDER === 'groq' ? 'llama3-70b-8192' : 'claude-sonnet-4-6')
56
+
57
+ // Validate keys
58
+ if (PROVIDER === 'anthropic' && !API_KEY) {
59
+ out(C.red(' ✗ ANTHROPIC_API_KEY not set')); process.exit(1)
60
+ }
61
+ if (PROVIDER === 'groq' && !GROQ_KEY) {
62
+ out(C.red(' ✗ GROQ_API_KEY not set')); process.exit(1)
63
+ }
64
+
65
+ const client = PROVIDER === 'anthropic' ? new Anthropic({ apiKey: API_KEY }) : null
66
+
67
+ // ── Session store ─────────────────────────────────────────────────────────────
68
+ // Each session: { id, packet, systemPrompt, messages[], status, created, tokens }
69
+ const sessions = new Map()
70
+
71
+ // ── LLM call — Groq or Anthropic ─────────────────────────────────────────────
72
+ async function callLLM(systemPrompt, messages) {
73
+ if (PROVIDER === 'groq') {
74
+ const res = await fetch('https://api.groq.com/openai/v1/chat/completions', {
75
+ method: 'POST',
76
+ headers: { 'Authorization': `Bearer ${GROQ_KEY}`, 'Content-Type': 'application/json' },
77
+ body: JSON.stringify({ model: MODEL, max_tokens: 8096,
78
+ messages: [{ role: 'system', content: systemPrompt }, ...messages] }),
79
+ signal: AbortSignal.timeout(30000),
80
+ })
81
+ if (!res.ok) throw new Error(`Groq ${res.status}`)
82
+ return (await res.json()).choices[0].message.content ?? ''
83
+ }
84
+ // Anthropic
85
+ const r = await client.messages.create({ model: MODEL, max_tokens: 8096, system: systemPrompt, messages })
86
+ return r.content[0]?.text ?? ''
87
+ }
88
+
89
+ // ── Build system prompt from Bifrost State Packet ─────────────────────────────
90
+ function buildSystemPrompt(packet) {
91
+ const sigs = (packet.ast_gating?.structural_signatures ?? [])
92
+ .map(s => ` ${s}`).join('\n')
93
+
94
+ const drift = packet.continuation_matrix?.drift_stability_index ?? 0
95
+ const driftStatus = drift < 0.2 ? 'STABLE' : drift < 0.4 ? 'NOMINAL' : 'CAUTION'
96
+
97
+ return `# BIFROST HANDOFF — FRESH SESSION
98
+
99
+ You are a fresh Claude instance provisioned via the Bifrost Context Handoff Protocol.
100
+ You do NOT have the previous session's conversation history.
101
+ You have only the verified facts sealed below. Work from these facts only.
102
+
103
+ ## Verified State
104
+ Seal: ${packet.state_ledger?.worm_seal_hash ?? 'none'}
105
+ Fact: ${packet.state_ledger?.fact_token ?? 'none'}
106
+
107
+ ## Your Scope
108
+ Module: ${packet.ast_gating?.target_module ?? 'unknown'}
109
+ File: ${packet.ast_gating?.file_path ?? 'unknown'}
110
+ Boundary: ${packet.ast_gating?.scope_boundary ?? 'FULL_FILE'}
111
+
112
+ ## Structural Signatures (verified — do not alter)
113
+ ${sigs || ' (none provided)'}
114
+
115
+ ## Your Directive
116
+ ${packet.continuation_matrix?.next_execution_directive ?? 'Await instruction.'}
117
+
118
+ ## Constraints
119
+ - Work only within the scoped module boundary above
120
+ - Do not alter the verified structural signatures
121
+ - Do not ask about the previous session's history — it has been sealed
122
+ - Drift index: ${drift} (${driftStatus}) — code stability confirmed at handoff
123
+ - Packet: ${packet.packet_id ?? 'unknown'} | Authority: ${packet.provenance?.verification_authority ?? 'EDUALC'}`
124
+ }
125
+
126
+ // ── Estimate token count (rough: 4 chars ≈ 1 token) ──────────────────────────
127
+ function estimateTokens(text) {
128
+ return Math.ceil((text ?? '').length / 4)
129
+ }
130
+
131
+ // ── Express app ───────────────────────────────────────────────────────────────
132
+ const app = express()
133
+ app.use(express.json({ limit: '128kb' }))
134
+
135
+ // ── POST /bifrost/handoff — receive packet from ABZU, spawn session ───────────
136
+ app.post('/bifrost/handoff', async (req, res) => {
137
+ const packet = req.body
138
+
139
+ // Validate
140
+ if (!packet?.bifrost_bridge_protocol) {
141
+ return res.status(400).json({ error: 'invalid packet: missing bifrost_bridge_protocol' })
142
+ }
143
+ if (!packet?.state_ledger?.worm_seal_hash) {
144
+ return res.status(400).json({ error: 'invalid packet: missing worm_seal_hash — LEDGE requires seal before handoff' })
145
+ }
146
+
147
+ const sessionId = packet.provenance?.target_context_id ?? `ctx_${randomUUID().slice(0, 8)}_fresh`
148
+ const systemPrompt = buildSystemPrompt(packet)
149
+ const directive = packet.continuation_matrix?.next_execution_directive ?? 'Begin.'
150
+ const systemTokens = estimateTokens(systemPrompt)
151
+
152
+ out(`${ts()} ${C.purple('◈')} BIFROST ← packet ${C.bold(packet.packet_id ?? 'unknown')}`)
153
+ out(`${ts()} ${C.cyan('→')} spawning session ${C.bold(sessionId)}`)
154
+ out(`${ts()} ${C.gray(`system prompt: ~${systemTokens} tokens`)}`)
155
+
156
+ try {
157
+ const reply = await callLLM(systemPrompt, [{ role: 'user', content: directive }])
158
+ const totalTokens = systemTokens + estimateTokens(directive) + estimateTokens(reply)
159
+
160
+ sessions.set(sessionId, {
161
+ id: sessionId,
162
+ packet,
163
+ systemPrompt,
164
+ messages: [
165
+ { role: 'user', content: directive },
166
+ { role: 'assistant', content: reply },
167
+ ],
168
+ status: 'active',
169
+ created: new Date().toISOString(),
170
+ tokens_used: totalTokens,
171
+ })
172
+
173
+ out(`${ts()} ${C.green(C.bold(' BIFROST: session hydrated'))} ${C.gray(`~${totalTokens} tokens`)}`)
174
+
175
+ return res.json({
176
+ session_id: sessionId,
177
+ packet_id: packet.packet_id,
178
+ status: 'hydrated',
179
+ fresh_context_tokens: totalTokens,
180
+ model: MODEL,
181
+ first_response: reply,
182
+ })
183
+ } catch (err) {
184
+ out(`${ts()} ${C.red(' BIFROST: spawn failed')} ${C.gray(err.message)}`)
185
+ return res.status(500).json({ error: 'spawn_failed', message: err.message })
186
+ }
187
+ })
188
+
189
+ // ── POST /bifrost/continue — continue an existing session ─────────────────────
190
+ app.post('/bifrost/continue', async (req, res) => {
191
+ const { session_id, message } = req.body
192
+ if (!session_id || !message) {
193
+ return res.status(400).json({ error: 'session_id and message required' })
194
+ }
195
+
196
+ const session = sessions.get(session_id)
197
+ if (!session) {
198
+ return res.status(404).json({ error: 'session not found' })
199
+ }
200
+
201
+ out(`${ts()} ${C.cyan('◈')} BIFROST continue → ${C.bold(session_id)}`)
202
+
203
+ try {
204
+ session.messages.push({ role: 'user', content: message })
205
+
206
+ const reply = await callLLM(session.systemPrompt, session.messages)
207
+ session.messages.push({ role: 'assistant', content: reply })
208
+ session.tokens_used += estimateTokens(message) + estimateTokens(reply)
209
+
210
+ return res.json({ session_id, reply, tokens_used: session.tokens_used })
211
+ } catch (err) {
212
+ return res.status(500).json({ error: 'continue_failed', message: err.message })
213
+ }
214
+ })
215
+
216
+ // ── GET /bifrost/sessions — list all active sessions ─────────────────────────
217
+ app.get('/bifrost/sessions', (_req, res) => {
218
+ const list = [...sessions.values()].map(s => ({
219
+ id: s.id,
220
+ status: s.status,
221
+ module: s.packet?.ast_gating?.target_module ?? 'unknown',
222
+ tokens_used: s.tokens_used,
223
+ created: s.created,
224
+ turns: Math.floor(s.messages.length / 2),
225
+ }))
226
+ res.json({ sessions: list, count: list.length, model: MODEL })
227
+ })
228
+
229
+ // ── GET /bifrost/session/:id — get full session state ────────────────────────
230
+ app.get('/bifrost/session/:id', (req, res) => {
231
+ const session = sessions.get(req.params.id)
232
+ if (!session) return res.status(404).json({ error: 'not found' })
233
+ res.json({
234
+ id: session.id,
235
+ status: session.status,
236
+ tokens_used: session.tokens_used,
237
+ created: session.created,
238
+ turns: Math.floor(session.messages.length / 2),
239
+ packet_id: session.packet?.packet_id,
240
+ module: session.packet?.ast_gating?.target_module,
241
+ messages: session.messages,
242
+ })
243
+ })
244
+
245
+ // ── DELETE /bifrost/session/:id — close a session ────────────────────────────
246
+ app.delete('/bifrost/session/:id', (req, res) => {
247
+ const existed = sessions.delete(req.params.id)
248
+ if (!existed) return res.status(404).json({ error: 'not found' })
249
+ out(`${ts()} ${C.gray(` session ${req.params.id} closed`)}`)
250
+ res.json({ closed: req.params.id })
251
+ })
252
+
253
+ // ── Banner ────────────────────────────────────────────────────────────────────
254
+ out()
255
+ out(C.purple(C.bold(' ╔══════════════════════════════════════════════════════════╗')))
256
+ out(C.purple(C.bold(' ║ B I F R O S T — HANDOFF ORCHESTRATOR v1.0 ║')))
257
+ out(C.purple(C.bold(' ║ async multiplicity · clean slate · < 10k tokens ║')))
258
+ out(C.purple(C.bold(' ╚══════════════════════════════════════════════════════════╝')))
259
+ out()
260
+ out(C.gray(` provider: ${PROVIDER}`))
261
+ out(C.gray(` model : ${MODEL}`))
262
+ out(C.gray(` port : ${PORT}`))
263
+ out(C.gray(` key : ${PROVIDER === 'groq' ? (GROQ_KEY ? '✓ groq loaded' : '✗ missing') : (API_KEY ? '✓ anthropic loaded' : '✗ missing')}`))
264
+ out()
265
+ out(C.cyan(' Endpoints:'))
266
+ out(C.gray(' POST /bifrost/handoff ← receive packet from ABZU'))
267
+ out(C.gray(' POST /bifrost/continue ← continue a session'))
268
+ out(C.gray(' GET /bifrost/sessions ← list active sessions'))
269
+ out(C.gray(' GET /bifrost/session/:id ← get session state'))
270
+ out(C.gray(' DEL /bifrost/session/:id ← close session'))
271
+ out()
272
+
273
+ app.listen(PORT, '127.0.0.1', () => {
274
+ out(C.green(` BIFROST active. The bridge is open.`))
275
+ out()
276
+ })
packages/edaulc/package.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "@snapkitty/edaulc",
3
+ "version": "2.0.0",
4
+ "description": "EDUALC — Shadow Terminal Agent. Deterministic 5-pass linter for sovereign codebases. CLAUDE creates forward. EDUALC verifies backward.",
5
+ "type": "module",
6
+ "main": "src/edaulc.mjs",
7
+ "bin": {
8
+ "edaulc": "src/edaulc.mjs"
9
+ },
10
+ "scripts": {
11
+ "start": "node src/edaulc.mjs"
12
+ },
13
+ "keywords": [
14
+ "linter", "claude", "llm", "context", "sovereign", "deterministic", "ast", "ere"
15
+ ],
16
+ "author": "Ahmad Ali Parr + Jessica Westerhoff",
17
+ "license": "MIT",
18
+ "engines": {
19
+ "node": ">=18.0.0"
20
+ },
21
+ "dependencies": {}
22
+ }
packages/edaulc/src/edaulc.mjs ADDED
@@ -0,0 +1,257 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+ // ═══════════════════════════════════════════════════════════════════════════
3
+ // EDUALC — Shadow Terminal Agent v2.0
4
+ // @snapkitty/edaulc
5
+ //
6
+ // CLAUDE creates forward. EDUALC verifies backward.
7
+ //
8
+ // Architecture:
9
+ // [ File Save ]
10
+ // ↓
11
+ // [ fs.watch debounced watcher ]
12
+ // ↓
13
+ // [ Local ERE five-pass — deterministic JavaScript, zero cost ]
14
+ // [ No AI. No throttle. No quota. Instant. ]
15
+ // ↓
16
+ // [ METATRON: YES → Groq veneer (optional voice layer) ]
17
+ // [ METATRON: NO → log freeze ]
18
+ // ↓
19
+ // [ Signal ABZU context GC (if ABZU_URL configured) ]
20
+ //
21
+ // Usage:
22
+ // npx @snapkitty/edaulc # watch current directory
23
+ // npx @snapkitty/edaulc ./src ./lib # watch specific directories
24
+ //
25
+ // Env vars:
26
+ // GROQ_API_KEY — optional Groq key for urban voice veneer
27
+ // GROQ_MODEL — default: llama3-8b-8192
28
+ // ABZU_URL — optional: http://127.0.0.1:7070 to enable context GC
29
+ // RUST_HANDLER_URL — optional: your Rust WORM handler URL
30
+ // EDUALC_DEBOUNCE — ms between save and evaluation (default: 3000)
31
+ // EDUALC_DRY_RUN=1 — print paths only, skip ERE
32
+ // ═══════════════════════════════════════════════════════════════════════════
33
+
34
+ import { watch, existsSync } from 'fs'
35
+ import { readFile } from 'fs/promises'
36
+ import { join, relative, extname, resolve } from 'path'
37
+ import { fileURLToPath } from 'url'
38
+
39
+ // ── Terminal colors ──────────────────────────────────────────────────────────
40
+ const C = {
41
+ gold: s => `\x1b[33m${s}\x1b[0m`,
42
+ cyan: s => `\x1b[36m${s}\x1b[0m`,
43
+ purple: s => `\x1b[35m${s}\x1b[0m`,
44
+ green: s => `\x1b[32m${s}\x1b[0m`,
45
+ red: s => `\x1b[31m${s}\x1b[0m`,
46
+ gray: s => `\x1b[90m${s}\x1b[0m`,
47
+ bold: s => `\x1b[1m${s}\x1b[0m`,
48
+ }
49
+
50
+ const out = (s = '') => process.stdout.write(s + '\n')
51
+ const ts = () => C.gray(new Date().toISOString().slice(11, 19))
52
+ const sep = () => C.gray('─'.repeat(60))
53
+
54
+ // ── Config ───────────────────────────────────────────────────────────────────
55
+ const GROQ_KEY = process.env.GROQ_API_KEY ?? ''
56
+ const GROQ_MODEL = process.env.GROQ_MODEL ?? 'llama3-8b-8192'
57
+ const RUST_URL = process.env.RUST_HANDLER_URL ?? ''
58
+ const ABZU_URL = process.env.ABZU_URL ?? ''
59
+ const DEBOUNCE_MS = parseInt(process.env.EDUALC_DEBOUNCE ?? '3000')
60
+ const MAX_LINES = 120
61
+ const DRY_RUN = process.env.EDUALC_DRY_RUN === '1'
62
+
63
+ // ── Watch targets — from CLI args or current directory ───────────────────────
64
+ const CWD = process.cwd()
65
+ const WATCH_TARGETS = process.argv.slice(2).length > 0
66
+ ? process.argv.slice(2).map(p => resolve(CWD, p))
67
+ : [CWD]
68
+
69
+ const WATCH_EXTS = new Set(['.ts', '.js', '.mjs', '.rs', '.hs', '.pl', '.go', '.py'])
70
+ const SKIP_PATTERNS = [/node_modules/, /\.next/, /target[\\/]/, /\.git/, /\.d\.ts$/, /dist[\\/]/]
71
+
72
+ // ── ERE Five-Pass (deterministic — no AI, no quota) ──────────────────────────
73
+
74
+ function erePass1_structural(content, ext) {
75
+ if (!content || content.trim().length < 10)
76
+ return { pass: false, reason: 'file empty or too short' }
77
+ if (ext === '.ts' && content.includes('export default') && !content.match(/export default \w/))
78
+ return { pass: false, reason: 'malformed default export' }
79
+ return { pass: true }
80
+ }
81
+
82
+ function erePass2_scholarly(content) {
83
+ const checks = [
84
+ [/throw new Error\(['"]not implemented/i, 'not-implemented stub'],
85
+ [/todo:\s*implement/i, 'TODO implement placeholder'],
86
+ [/return\s+(?:null|undefined)\s*\/\/.*fake/i, 'fake null return'],
87
+ [/console\.log\(['"]fake/i, 'fake console.log marker'],
88
+ ]
89
+ for (const [re, reason] of checks) {
90
+ if (re.test(content)) return { pass: false, reason }
91
+ }
92
+ return { pass: true }
93
+ }
94
+
95
+ function erePass3_invariants(content, ext) {
96
+ if (ext === '.ts') {
97
+ if (/import\s+crypto\b/.test(content))
98
+ return { pass: false, reason: 'TypeScript importing crypto — SHA-256 belongs in a systems layer' }
99
+ if (/createHash|crypto\.subtle/.test(content))
100
+ return { pass: false, reason: 'TypeScript hashing — cryptographic operations belong in systems layer' }
101
+ }
102
+ return { pass: true }
103
+ }
104
+
105
+ function erePass4_mission(content) {
106
+ if (/(?:api_key|secret|password)\s*=\s*['"][a-zA-Z0-9_\-]{20,}['"]/i.test(content))
107
+ return { pass: false, reason: 'hardcoded secret detected — use environment variables' }
108
+ return { pass: true }
109
+ }
110
+
111
+ function erePass5_root(content, ext) {
112
+ const threshold = ext === '.rs' ? 25 : ext === '.hs' ? 15 : ext === '.ts' ? 20 : 8
113
+ const open = (content.match(/[{[(]/g) ?? []).length
114
+ const close = (content.match(/[}\])]/g) ?? []).length
115
+ if (Math.abs(open - close) > threshold)
116
+ return { pass: false, reason: `unbalanced delimiters (${open} open, ${close} close)` }
117
+ return { pass: true }
118
+ }
119
+
120
+ function runLocalERE(content, filepath) {
121
+ const ext = extname(filepath)
122
+ const passes = [
123
+ erePass1_structural(content, ext),
124
+ erePass2_scholarly(content),
125
+ erePass3_invariants(content, ext),
126
+ erePass4_mission(content),
127
+ erePass5_root(content, ext),
128
+ ]
129
+ return {
130
+ passes,
131
+ certified: passes.every(p => p.pass),
132
+ failures: passes.map((p, i) => p.pass ? null : `Pass ${i+1}: ${p.reason}`).filter(Boolean),
133
+ }
134
+ }
135
+
136
+ // ── Groq veneer ───────────────────────────────────────────────────────────────
137
+ const VENEER_SYSTEM = `You are EDUALC's voice in the terminal — the shadow agent.
138
+ Translate raw ERE certification output into sharp, modern, urban tech language.
139
+ Keep all data: filenames, pass/fail details. 1-2 sentences max. Direct. No fluff.`
140
+
141
+ async function callGroqVeneer(rawSummary) {
142
+ if (!GROQ_KEY) return null
143
+ try {
144
+ const res = await fetch('https://api.groq.com/openai/v1/chat/completions', {
145
+ method: 'POST',
146
+ headers: { 'Authorization': `Bearer ${GROQ_KEY}`, 'Content-Type': 'application/json' },
147
+ body: JSON.stringify({ model: GROQ_MODEL, max_tokens: 100, messages: [
148
+ { role: 'system', content: VENEER_SYSTEM },
149
+ { role: 'user', content: rawSummary },
150
+ ]}),
151
+ signal: AbortSignal.timeout(8000),
152
+ })
153
+ if (!res.ok) return null
154
+ return (await res.json())?.choices?.[0]?.message?.content?.trim() ?? null
155
+ } catch { return null }
156
+ }
157
+
158
+ // ── Signal Rust + ABZU ────────────────────────────────────────────────────────
159
+ async function signalDownstream(filepath, certified) {
160
+ if (!RUST_URL && !ABZU_URL) return
161
+ const payload = JSON.stringify({
162
+ file: relative(CWD, filepath), certified,
163
+ timestamp: new Date().toISOString(), agent: 'EDUALC',
164
+ })
165
+ const calls = []
166
+ if (RUST_URL) calls.push(
167
+ fetch(`${RUST_URL}/edualc/report`, {
168
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
169
+ body: payload, signal: AbortSignal.timeout(2000),
170
+ }).catch(() => {})
171
+ )
172
+ if (ABZU_URL) calls.push(
173
+ fetch(`${ABZU_URL}/edaulc/report`, {
174
+ method: 'POST', headers: { 'Content-Type': 'application/json' },
175
+ body: payload, signal: AbortSignal.timeout(2000),
176
+ }).catch(() => {})
177
+ )
178
+ await Promise.allSettled(calls)
179
+ }
180
+
181
+ // ── Evaluate ──────────────────────────────────────────────────────────────────
182
+ async function evaluate(filepath) {
183
+ const rel = relative(CWD, filepath)
184
+ let content
185
+ try { content = await readFile(filepath, 'utf8') } catch { return }
186
+ const tail = content.split('\n').slice(-MAX_LINES).join('\n')
187
+
188
+ out(`${ts()} ${C.cyan('◈')} ${C.bold(rel)}`)
189
+ if (DRY_RUN) { out(`${ts()} ${C.gray(' dry run — ERE skipped')}`); out(); return }
190
+
191
+ const ere = runLocalERE(tail, filepath)
192
+ const labels = ['Enochian LTR', 'Latin LTR', 'Hebrew RTL', 'Arabic RTL', 'Aramaic RTL']
193
+ ere.passes.forEach((p, i) => {
194
+ out(`${ts()} ${p.pass ? C.green('✓') : C.red('✗')} Pass ${i+1} (${labels[i]}): ${
195
+ p.pass ? C.green('PASS') : C.red('FAIL — ' + p.reason)}`)
196
+ })
197
+
198
+ let rawSummary
199
+ if (ere.certified) {
200
+ out(`${ts()} ${C.green(C.bold(' METATRON: YES — certified'))}`)
201
+ rawSummary = `METATRON certified. All five ERE passes green. ${rel} is clean.`
202
+ } else {
203
+ out(`${ts()} ${C.red(C.bold(' METATRON: NO — FROZEN'))}`)
204
+ ere.failures.forEach(f => out(`${ts()} ${C.red(` ✗ ${f}`)}`))
205
+ rawSummary = `METATRON NO. ${rel} frozen. Issues: ${ere.failures.join('. ')}`
206
+ }
207
+
208
+ await signalDownstream(filepath, ere.certified)
209
+ const voice = await callGroqVeneer(rawSummary)
210
+ if (voice) out(`${ts()} ${C.gold(' ▸')} ${C.gold(voice)}`)
211
+ out()
212
+ }
213
+
214
+ // ── Debounce + watcher ────────────────────────────────────────────────────────
215
+ const pending = new Map()
216
+
217
+ function onChange(filepath) {
218
+ if (!WATCH_EXTS.has(extname(filepath))) return
219
+ if (SKIP_PATTERNS.some(p => p.test(filepath))) return
220
+ if (!existsSync(filepath)) return
221
+ if (pending.has(filepath)) clearTimeout(pending.get(filepath))
222
+ pending.set(filepath, setTimeout(() => {
223
+ pending.delete(filepath)
224
+ evaluate(filepath).catch(() => {})
225
+ }, DEBOUNCE_MS))
226
+ }
227
+
228
+ // ── Banner ────────────────────────────────────────────────────────────────────
229
+ out()
230
+ out(C.purple(C.bold(' ╔══════════════════════════════════════════════════════════╗')))
231
+ out(C.purple(C.bold(' ║ E D U A L C — SHADOW TERMINAL AGENT v2.0 ║')))
232
+ out(C.purple(C.bold(' ║ local ERE · Groq voice · zero throttle ║')))
233
+ out(C.purple(C.bold(' ╚══════════════════════════════════════════════════════════╝')))
234
+ out()
235
+ out(C.gray(` voice : Groq ${GROQ_MODEL} ${GROQ_KEY ? '✓' : '✗ no key — voice disabled'}`))
236
+ out(C.gray(` abzu : ${ABZU_URL || 'not configured'}`))
237
+ out(C.gray(` debounce: ${DEBOUNCE_MS}ms | dry run: ${DRY_RUN ? 'YES' : 'NO'}`))
238
+ out()
239
+ out(C.cyan(' Watching:'))
240
+ WATCH_TARGETS.forEach(t => out(C.gray(` ◈ ${t}`)))
241
+ out()
242
+ out(C.green(' EDUALC is active. Save any file to run ERE.'))
243
+ out(sep())
244
+ out()
245
+
246
+ WATCH_TARGETS.forEach(target => {
247
+ if (!existsSync(target)) { out(C.red(` ✗ path not found: ${target}`)); return }
248
+ watch(target, { recursive: true }, (_, filename) => {
249
+ if (filename) onChange(join(target, filename))
250
+ })
251
+ })
252
+
253
+ process.on('SIGINT', () => {
254
+ out()
255
+ out(C.purple(' EDUALC signing off. The mirror closes.'))
256
+ process.exit(0)
257
+ })