htaf commited on
Commit
82d44e9
·
0 Parent(s):

initial commit

Browse files
.gitignore ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ----------------------------
2
+ # Node / JavaScript
3
+ # ----------------------------
4
+ node_modules/
5
+ npm-debug.log*
6
+ yarn-debug.log*
7
+ yarn-error.log*
8
+ pnpm-debug.log*
9
+
10
+ # OS files
11
+ .DS_Store
12
+ Thumbs.db
13
+
14
+ # Environment / Secrets
15
+ .env
16
+ *.env
17
+ .env.*
18
+
19
+ # Logs
20
+ logs/
21
+ *.log
22
+ *.out
23
+ *.err
24
+ nohup.out
25
+
26
+ # Temp build artifacts
27
+ dist/
28
+ build/
29
+ tmp/
30
+ temp/
31
+ .cache/
32
+ .cache-loader/
33
+ coverage/
34
+
35
+ # ----------------------------
36
+ # Distillation Pipeline Outputs
37
+ # ----------------------------
38
+
39
+ # Intermediate gold sets (large, ephemeral)
40
+ gold.jsonl
41
+ gold_*.jsonl
42
+ gold/
43
+ goldsets/
44
+ data/gold/
45
+
46
+ # Raw generations / scratch
47
+ generations/
48
+ raw_generations/
49
+ raw/
50
+ scratch/
51
+ pipeline/tmp/
52
+ pipeline/output/
53
+ pipeline_logs/
54
+
55
+ # Reward model scoring dumps
56
+ reward_scores/
57
+ scores/
58
+ scoring_output/
59
+
60
+ # Verifier outputs
61
+ verifier_out/
62
+ verify_logs/
63
+
64
+ # ----------------------------
65
+ # Model Artifacts
66
+ # ----------------------------
67
+
68
+ # LoRA checkpoints
69
+ *.safetensors
70
+ *.bin
71
+ *.pt
72
+
73
+ # Full model weights (don’t commit them!)
74
+ checkpoints/
75
+ lora/
76
+ lora_output/
77
+ model/
78
+ models/
79
+ transformers_cache/
80
+ hf_cache/
81
+ .huggingface/
82
+
83
+ # vLLM / llama.cpp working dirs
84
+ llama.cpp/
85
+ llm-cache/
86
+ .vllm/
87
+ .vllama/
88
+ .vcache/
89
+
90
+ # Ollama downloads
91
+ ~/.ollama/
92
+ ollama_models/
93
+
94
+ # ----------------------------
95
+ # Elasticsearch utilities
96
+ # ----------------------------
97
+
98
+ # ES snapshot dirs / local nodes
99
+ es_data/
100
+ es_snapshots/
101
+ es_logs/
102
+
103
+ # ----------------------------
104
+ # Python (if used for training scripts)
105
+ # ----------------------------
106
+ __pycache__/
107
+ *.pyc
108
+ *.pyo
109
+ *.pyd
110
+ *.egg-info/
111
+ .venv/
112
+ venv/
113
+ ENV/
114
+ env/
115
+
116
+ # ----------------------------
117
+ # Editor junk files
118
+ # ----------------------------
119
+ *.swp
120
+ *.swo
121
+ *.bak
122
+ *.tmp
123
+ *.old
124
+ *.orig
125
+
126
+ # VS Code
127
+ .vscode/
128
+
129
+ #
130
+
131
+ node_modules/
132
+ .env
133
+ .DS_Store
134
+ coverage/
135
+ dist/
136
+ .cache/
137
+ *.log
138
+ tests/data/*.log
139
+
README.md ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # distill_pipeline
2
+
3
+ Bootstrapped distillation loop for Q’uo-style LLM finetuning.
4
+
5
+ ## Steps
6
+
7
+ 1. **generator**
8
+ Small 7–8B model produces many candidate answers.
9
+
10
+ 2. **verifier**
11
+ Cheap 3B model filters out 70–80% of garbage.
12
+
13
+ 3. **reward**
14
+ A strong 70B reward model scores the remaining items.
15
+
16
+ 4. **build_gold**
17
+ Top-K samples become the next training batch.
18
+
19
+ 5. **train_lora**
20
+ Use gold.jsonl for LoRA finetuning.
21
+
22
+ ## Run one cycle
ROADMAP.md ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Here’s a clean, structured **ROADMAP.md** that:
2
+
3
+ * builds directly on your succession summary
4
+ * includes **all** the missing and under-emphasized elements you listed
5
+ * remains compact, actionable, and successor-friendly
6
+ * avoids tone drift
7
+ * is easy to maintain inside the repo
8
+
9
+ I kept it in a practical engineering style, with Canadian English and grounded clarity, as always.
10
+
11
+ ---
12
+
13
+ # **ROADMAP.md**
14
+
15
+ *distill-rag + distill-pipeline — Project Roadmap*
16
+
17
+ This roadmap outlines the current state of the system, upcoming milestones, hardware strategy, and domain-specific notes (Q’uo/Confederation alignment).
18
+ It assumes familiarity with the **distill-rag** and **distill-pipeline** repositories.
19
+
20
+ ---
21
+
22
+ # 1. **Project Overview**
23
+
24
+ The system consists of:
25
+
26
+ ## **A. distill-rag**
27
+
28
+ A complete pipeline for extraction → cleaning → session grouping → chunking → embedding → Elasticsearch hybrid search.
29
+
30
+ **Status:** Stable and public.
31
+
32
+ ## **B. distill-pipeline**
33
+
34
+ A multi-stage distillation ecosystem:
35
+
36
+ ```
37
+ retrieval (NEW)
38
+ → generator
39
+ → verifier
40
+ → reward
41
+ → gold builder
42
+ → training (LoRA/SFT)
43
+ → repeat cycles
44
+ ```
45
+
46
+ **Status:** Under active development.
47
+
48
+ ---
49
+
50
+ # 2. **Immediate Priorities (0–7 days)**
51
+
52
+ ## **2.1 Add retrieval stage to distill-pipeline**
53
+
54
+ Implement `src/retrieval.js`:
55
+
56
+ * Connect to distill-rag’s HTTP hybrid search endpoint.
57
+ * Support BM25, dense KNN, and RRF hybrid scores.
58
+ * Optional HyDE generation for query expansion.
59
+ * Optional multi-vector chunking for transcripts with heavy topic shifts.
60
+
61
+ ## **2.2 Refactor generator/verifier/reward into testable functions**
62
+
63
+ Current scripts are CLI-oriented.
64
+ Introduce pure functions:
65
+
66
+ ```js
67
+ export async function runGenerator(query, context, provider) { ... }
68
+ export async function runVerifier(sample, provider) { ... }
69
+ export async function runReward(sample, provider) { ... }
70
+ ```
71
+
72
+ CLI wrappers remain in place.
73
+
74
+ ## **2.3 Introduce Vitest test suite**
75
+
76
+ Tests should cover:
77
+
78
+ * retrieval (mock ES)
79
+ * generator (mock LLM)
80
+ * verifier (structural + Q’uo-tone)
81
+ * reward (correct scoring, JSON validity)
82
+ * gold-builder (top-k filter, dedup, JSONL append)
83
+ * integration test with mocked providers
84
+
85
+ Avoid real GPU calls in CI; mock HTTP endpoints.
86
+
87
+ ---
88
+
89
+ # 3. **Short-Term (1–3 weeks)**
90
+
91
+ ## **3.1 Pluggable model provider system**
92
+
93
+ Implement one interface:
94
+
95
+ ```js
96
+ provider.generate(prompt, options)
97
+ ```
98
+
99
+ Then adapters:
100
+
101
+ * OllamaProvider
102
+ * OpenAIProvider
103
+ * vLLMProvider ([http://localhost:8000/generate](http://localhost:8000/generate))
104
+ * DeepSeek local provider (if applicable)
105
+
106
+ This design makes the generator/verifier/reward easy to swap.
107
+
108
+ ## **3.2 Q’uo prompt trio integration**
109
+
110
+ These domain-specific prompts govern tone, accuracy, and philosophical alignment:
111
+
112
+ ### **Generator Prompt**
113
+
114
+ * Confederation tone (“We are those of Q’uo…”)
115
+ * Humble, gentle, non-authoritarian
116
+ * No prediction, no medical or legal claims
117
+ * Cite session date when known
118
+ * Ground in existing Ra/Q’uo material
119
+
120
+ ### **Verifier Prompt**
121
+
122
+ * Enforce canonical alignment
123
+ * Reject speculation, distortions, or unreferenced claims
124
+ * Flag tone mismatch (e.g., assertiveness, ego, “command” language)
125
+ * Output strict JSON verdict: pass/fail + reason
126
+
127
+ ### **Reward Prompt**
128
+
129
+ Score 0–10 on:
130
+
131
+ * metaphysical clarity
132
+ * faithfulness to Confederation teaching
133
+ * lack of hallucination
134
+ * gentle and precise tone
135
+ * internal coherence
136
+
137
+ These scores help filter gold data (top 5–10%).
138
+
139
+ ---
140
+
141
+ # 4. **Hardware Strategy**
142
+
143
+ You run two GPUs:
144
+
145
+ * **RTX 3060 (12 GB)** → generator + verifier
146
+ ~25–35 tok/s for 7–8B models
147
+ Ideal for overnight sample generation (1k–1.5k samples)
148
+
149
+ * **RTX 3090 (24 GB)** → reward model + training
150
+ ~2 tok/s for 70B reward models
151
+ ~4 tok/s for 13B–20B base models
152
+ Perfect for Nemotron 70B reward scoring + LoRA training
153
+
154
+ **Heuristic:**
155
+ A single cycle overnight can generate **1,000–2,000 candidate samples** → filtered to **150–250 gold samples**, enough for a strong **2–4 hour QLoRA session**.
156
+
157
+ ---
158
+
159
+ # 5. **Medium-Term (1–2 months)**
160
+
161
+ ## **5.1 Bootstrapped distillation loops**
162
+
163
+ Automate multiple cycles:
164
+
165
+ ```
166
+ seed questions → generator → verifier → reward
167
+ → top-K → gold dataset → train student
168
+ → use student as new generator → repeat
169
+ ```
170
+
171
+ Between cycles:
172
+
173
+ * generator/verifier weights updated
174
+ * high-score samples fed back as new training data
175
+ * prompts updated (meta-learning via examples)
176
+
177
+ ## **5.2 Enhanced filtering**
178
+
179
+ Add:
180
+
181
+ * Min perplexity threshold (e.g., ppl < 15)
182
+ * LSH (Locality Sensitive Hashing) dedup
183
+ * RAG cross-check with distill-rag search:
184
+ verify that generated claims appear in authoritative transcripts.
185
+ * Hallucination scan via Qwen2.5-72B or Mixtral-Large
186
+
187
+ ---
188
+
189
+ # 6. **Long-Term Goals (2–6 months)**
190
+
191
+ ## **6.1 Confed-aligned distilled model**
192
+
193
+ A small, accurate, gentle 7B–12B model aligned with Ra and Q’uo material.
194
+
195
+ Tasks:
196
+
197
+ * Expand dataset to all Q’uo transcripts
198
+ * Include commentary from L/L Research books
199
+ * Add metadata: session dates, question themes, speaker (Q’uo/Latwii)
200
+ * Release on HuggingFace with full attribution
201
+
202
+ ## **6.2 Real-time contextual distillation**
203
+
204
+ Use distill-rag to perform:
205
+
206
+ * live hybrid search
207
+ * contextual distillation based on retrieved chunks
208
+ * reflective improvement (teacher critiques student output)
209
+ * safety alignment without censorship
210
+
211
+ ---
212
+
213
+ # 7. **Dependencies and Setup**
214
+
215
+ ### **Node.js**
216
+
217
+ * axios
218
+ * jsonlines
219
+ * dotenv
220
+ * vitest
221
+ * huggingface-hub (optional)
222
+
223
+ ### **Python**
224
+
225
+ (for training)
226
+
227
+ * transformers
228
+ * datasets
229
+ * accelerate
230
+ * bitsandbytes
231
+ * peft
232
+ * wandb (optional)
233
+ * sentencepiece
234
+
235
+ ---
236
+
237
+ # 8. **Common Issues + Fixes**
238
+
239
+ * **OOM in generator**
240
+ Switch quantization: `Q4_K_M → Q3_K_S`
241
+ * **Verifier rejecting correct samples**
242
+ Tone prompt too strict → tune thresholds
243
+ * **Reward model too slow**
244
+ Try smaller reward model except for final scoring pass
245
+ * **Bad JSON from generator**
246
+ Wrap output with streaming JSON repair (fastjsonrepair)
247
+
248
+ ---
249
+
250
+ # 9. **Appendix: Example Cycle (Pseudo-Code)**
251
+
252
+ ```js
253
+ const ctx = await retrieval.hybridSearch(query);
254
+
255
+ const candidates = await runGenerator(query, ctx, generatorProvider);
256
+
257
+ const verified = await Promise.all(
258
+ candidates.map(c => runVerifier(c, verifierProvider))
259
+ );
260
+
261
+ const scored = await Promise.all(
262
+ verified.filter(v => v.pass).map(v => runReward(v.sample, rewardProvider))
263
+ );
264
+
265
+ const gold = topK(scored, k = 50); // 5–10% of total
266
+
267
+ await appendSamplesToJsonl('./gold/dataset.jsonl', gold);
268
+ ```
269
+
270
+ Training afterward:
271
+
272
+ ```bash
273
+ python training/train_lora.py --data gold/dataset.jsonl --base qwen2.5-7b
274
+ ```
275
+
276
+ ---
277
+
278
+ # 10. **High-Level Vision**
279
+
280
+ The purpose is to build a **truth-aligned**, spiritually coherent distilled model rooted in Confederation teachings, free from institutional censorship and able to respond gently and helpfully.
281
+
282
+ The system enables:
283
+
284
+ * transparent lineage
285
+ * easy updates when new transcripts appear
286
+ * clear tone alignment
287
+ * practical local training on accessible GPUs
288
+ * RAG-augmented accuracy using authoritative sources
289
+
290
+ ---
291
+
292
+ If you want, I can also generate:
293
+
294
+ **✓ an `architecture.md`**
295
+ **✓ a Mermaid diagram**
296
+ **✓ a cleaned-up successor prompt**
297
+
298
+ Just tell me.
configs/pipeline.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "generator_model": "qwen2.5-7b-instruct",
3
+ "verifier_model": "qwen2.5-3b-instruct",
4
+ "reward_model": "nemotron-4-70b-reward-q4km",
5
+ "generated_num": 20,
6
+ "gold_top": 200
7
+ }
generator/generator.js ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // generator/generator.js
2
+ // Produces candidate samples from the small 7–8B model
3
+
4
+ require("dotenv").config();
5
+ const fs = require("fs");
6
+ const fetch = require("node-fetch");
7
+ const path = require("path");
8
+
9
+ const PROMPT = fs.readFileSync(
10
+ path.join(__dirname, "../prompts/generator_prompt.txt"),
11
+ "utf8"
12
+ );
13
+
14
+ const MODEL = process.env.GENERATOR_MODEL || "qwen2.5-7b-instruct";
15
+ const OUT = process.env.GENERATED_OUT || "cycle/generated.jsonl";
16
+ const NUM = Number(process.env.GENERATED_NUM || 50);
17
+
18
+ async function generateOne(q) {
19
+ const body = {
20
+ model: MODEL,
21
+ prompt: PROMPT.replace("{{QUESTION}}", q),
22
+ stream: false,
23
+ };
24
+
25
+ const res = await fetch("http://localhost:11434/api/generate", {
26
+ method: "POST",
27
+ headers: { "Content-Type": "application/json" },
28
+ body: JSON.stringify(body),
29
+ });
30
+
31
+ const data = await res.json();
32
+
33
+ return {
34
+ question: q,
35
+ output: data.response || "",
36
+ };
37
+ }
38
+
39
+ async function main() {
40
+ console.log("[generator] Loading seed questions…");
41
+ const seeds = JSON.parse(
42
+ fs.readFileSync("test_samples/seed_questions.jsonl", "utf8")
43
+ );
44
+
45
+ const out = fs.createWriteStream(OUT);
46
+
47
+ console.log(`[generator] Generating ${NUM} samples…`);
48
+ let count = 0;
49
+
50
+ for (let i = 0; i < NUM; i++) {
51
+ for (const q of seeds) {
52
+ const item = await generateOne(q.question);
53
+ out.write(JSON.stringify(item) + "\n");
54
+ count++;
55
+ console.log(`[generator] ${count} samples`);
56
+ }
57
+ }
58
+
59
+ out.end();
60
+ console.log(`[generator] Done. Wrote ${count} samples → ${OUT}`);
61
+ }
62
+
63
+ if (require.main === module) main();
64
+ module.exports = { generateOne, main };
package-lock.json ADDED
@@ -0,0 +1,1675 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "distill-pipeline",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "distill-pipeline",
9
+ "version": "1.0.0",
10
+ "devDependencies": {
11
+ "vitest": "^1.6.0"
12
+ }
13
+ },
14
+ "node_modules/@esbuild/aix-ppc64": {
15
+ "version": "0.21.5",
16
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
17
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
18
+ "cpu": [
19
+ "ppc64"
20
+ ],
21
+ "dev": true,
22
+ "optional": true,
23
+ "os": [
24
+ "aix"
25
+ ],
26
+ "engines": {
27
+ "node": ">=12"
28
+ }
29
+ },
30
+ "node_modules/@esbuild/android-arm": {
31
+ "version": "0.21.5",
32
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
33
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
34
+ "cpu": [
35
+ "arm"
36
+ ],
37
+ "dev": true,
38
+ "optional": true,
39
+ "os": [
40
+ "android"
41
+ ],
42
+ "engines": {
43
+ "node": ">=12"
44
+ }
45
+ },
46
+ "node_modules/@esbuild/android-arm64": {
47
+ "version": "0.21.5",
48
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
49
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
50
+ "cpu": [
51
+ "arm64"
52
+ ],
53
+ "dev": true,
54
+ "optional": true,
55
+ "os": [
56
+ "android"
57
+ ],
58
+ "engines": {
59
+ "node": ">=12"
60
+ }
61
+ },
62
+ "node_modules/@esbuild/android-x64": {
63
+ "version": "0.21.5",
64
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
65
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
66
+ "cpu": [
67
+ "x64"
68
+ ],
69
+ "dev": true,
70
+ "optional": true,
71
+ "os": [
72
+ "android"
73
+ ],
74
+ "engines": {
75
+ "node": ">=12"
76
+ }
77
+ },
78
+ "node_modules/@esbuild/darwin-arm64": {
79
+ "version": "0.21.5",
80
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
81
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
82
+ "cpu": [
83
+ "arm64"
84
+ ],
85
+ "dev": true,
86
+ "optional": true,
87
+ "os": [
88
+ "darwin"
89
+ ],
90
+ "engines": {
91
+ "node": ">=12"
92
+ }
93
+ },
94
+ "node_modules/@esbuild/darwin-x64": {
95
+ "version": "0.21.5",
96
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
97
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
98
+ "cpu": [
99
+ "x64"
100
+ ],
101
+ "dev": true,
102
+ "optional": true,
103
+ "os": [
104
+ "darwin"
105
+ ],
106
+ "engines": {
107
+ "node": ">=12"
108
+ }
109
+ },
110
+ "node_modules/@esbuild/freebsd-arm64": {
111
+ "version": "0.21.5",
112
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
113
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
114
+ "cpu": [
115
+ "arm64"
116
+ ],
117
+ "dev": true,
118
+ "optional": true,
119
+ "os": [
120
+ "freebsd"
121
+ ],
122
+ "engines": {
123
+ "node": ">=12"
124
+ }
125
+ },
126
+ "node_modules/@esbuild/freebsd-x64": {
127
+ "version": "0.21.5",
128
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
129
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
130
+ "cpu": [
131
+ "x64"
132
+ ],
133
+ "dev": true,
134
+ "optional": true,
135
+ "os": [
136
+ "freebsd"
137
+ ],
138
+ "engines": {
139
+ "node": ">=12"
140
+ }
141
+ },
142
+ "node_modules/@esbuild/linux-arm": {
143
+ "version": "0.21.5",
144
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
145
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
146
+ "cpu": [
147
+ "arm"
148
+ ],
149
+ "dev": true,
150
+ "optional": true,
151
+ "os": [
152
+ "linux"
153
+ ],
154
+ "engines": {
155
+ "node": ">=12"
156
+ }
157
+ },
158
+ "node_modules/@esbuild/linux-arm64": {
159
+ "version": "0.21.5",
160
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
161
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
162
+ "cpu": [
163
+ "arm64"
164
+ ],
165
+ "dev": true,
166
+ "optional": true,
167
+ "os": [
168
+ "linux"
169
+ ],
170
+ "engines": {
171
+ "node": ">=12"
172
+ }
173
+ },
174
+ "node_modules/@esbuild/linux-ia32": {
175
+ "version": "0.21.5",
176
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
177
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
178
+ "cpu": [
179
+ "ia32"
180
+ ],
181
+ "dev": true,
182
+ "optional": true,
183
+ "os": [
184
+ "linux"
185
+ ],
186
+ "engines": {
187
+ "node": ">=12"
188
+ }
189
+ },
190
+ "node_modules/@esbuild/linux-loong64": {
191
+ "version": "0.21.5",
192
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
193
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
194
+ "cpu": [
195
+ "loong64"
196
+ ],
197
+ "dev": true,
198
+ "optional": true,
199
+ "os": [
200
+ "linux"
201
+ ],
202
+ "engines": {
203
+ "node": ">=12"
204
+ }
205
+ },
206
+ "node_modules/@esbuild/linux-mips64el": {
207
+ "version": "0.21.5",
208
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
209
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
210
+ "cpu": [
211
+ "mips64el"
212
+ ],
213
+ "dev": true,
214
+ "optional": true,
215
+ "os": [
216
+ "linux"
217
+ ],
218
+ "engines": {
219
+ "node": ">=12"
220
+ }
221
+ },
222
+ "node_modules/@esbuild/linux-ppc64": {
223
+ "version": "0.21.5",
224
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
225
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
226
+ "cpu": [
227
+ "ppc64"
228
+ ],
229
+ "dev": true,
230
+ "optional": true,
231
+ "os": [
232
+ "linux"
233
+ ],
234
+ "engines": {
235
+ "node": ">=12"
236
+ }
237
+ },
238
+ "node_modules/@esbuild/linux-riscv64": {
239
+ "version": "0.21.5",
240
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
241
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
242
+ "cpu": [
243
+ "riscv64"
244
+ ],
245
+ "dev": true,
246
+ "optional": true,
247
+ "os": [
248
+ "linux"
249
+ ],
250
+ "engines": {
251
+ "node": ">=12"
252
+ }
253
+ },
254
+ "node_modules/@esbuild/linux-s390x": {
255
+ "version": "0.21.5",
256
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
257
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
258
+ "cpu": [
259
+ "s390x"
260
+ ],
261
+ "dev": true,
262
+ "optional": true,
263
+ "os": [
264
+ "linux"
265
+ ],
266
+ "engines": {
267
+ "node": ">=12"
268
+ }
269
+ },
270
+ "node_modules/@esbuild/linux-x64": {
271
+ "version": "0.21.5",
272
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
273
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
274
+ "cpu": [
275
+ "x64"
276
+ ],
277
+ "dev": true,
278
+ "optional": true,
279
+ "os": [
280
+ "linux"
281
+ ],
282
+ "engines": {
283
+ "node": ">=12"
284
+ }
285
+ },
286
+ "node_modules/@esbuild/netbsd-x64": {
287
+ "version": "0.21.5",
288
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
289
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
290
+ "cpu": [
291
+ "x64"
292
+ ],
293
+ "dev": true,
294
+ "optional": true,
295
+ "os": [
296
+ "netbsd"
297
+ ],
298
+ "engines": {
299
+ "node": ">=12"
300
+ }
301
+ },
302
+ "node_modules/@esbuild/openbsd-x64": {
303
+ "version": "0.21.5",
304
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
305
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
306
+ "cpu": [
307
+ "x64"
308
+ ],
309
+ "dev": true,
310
+ "optional": true,
311
+ "os": [
312
+ "openbsd"
313
+ ],
314
+ "engines": {
315
+ "node": ">=12"
316
+ }
317
+ },
318
+ "node_modules/@esbuild/sunos-x64": {
319
+ "version": "0.21.5",
320
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
321
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
322
+ "cpu": [
323
+ "x64"
324
+ ],
325
+ "dev": true,
326
+ "optional": true,
327
+ "os": [
328
+ "sunos"
329
+ ],
330
+ "engines": {
331
+ "node": ">=12"
332
+ }
333
+ },
334
+ "node_modules/@esbuild/win32-arm64": {
335
+ "version": "0.21.5",
336
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
337
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
338
+ "cpu": [
339
+ "arm64"
340
+ ],
341
+ "dev": true,
342
+ "optional": true,
343
+ "os": [
344
+ "win32"
345
+ ],
346
+ "engines": {
347
+ "node": ">=12"
348
+ }
349
+ },
350
+ "node_modules/@esbuild/win32-ia32": {
351
+ "version": "0.21.5",
352
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
353
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
354
+ "cpu": [
355
+ "ia32"
356
+ ],
357
+ "dev": true,
358
+ "optional": true,
359
+ "os": [
360
+ "win32"
361
+ ],
362
+ "engines": {
363
+ "node": ">=12"
364
+ }
365
+ },
366
+ "node_modules/@esbuild/win32-x64": {
367
+ "version": "0.21.5",
368
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
369
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
370
+ "cpu": [
371
+ "x64"
372
+ ],
373
+ "dev": true,
374
+ "optional": true,
375
+ "os": [
376
+ "win32"
377
+ ],
378
+ "engines": {
379
+ "node": ">=12"
380
+ }
381
+ },
382
+ "node_modules/@jest/schemas": {
383
+ "version": "29.6.3",
384
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
385
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
386
+ "dev": true,
387
+ "dependencies": {
388
+ "@sinclair/typebox": "^0.27.8"
389
+ },
390
+ "engines": {
391
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
392
+ }
393
+ },
394
+ "node_modules/@jridgewell/sourcemap-codec": {
395
+ "version": "1.5.5",
396
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
397
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
398
+ "dev": true
399
+ },
400
+ "node_modules/@rollup/rollup-android-arm-eabi": {
401
+ "version": "4.53.3",
402
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz",
403
+ "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==",
404
+ "cpu": [
405
+ "arm"
406
+ ],
407
+ "dev": true,
408
+ "optional": true,
409
+ "os": [
410
+ "android"
411
+ ]
412
+ },
413
+ "node_modules/@rollup/rollup-android-arm64": {
414
+ "version": "4.53.3",
415
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz",
416
+ "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==",
417
+ "cpu": [
418
+ "arm64"
419
+ ],
420
+ "dev": true,
421
+ "optional": true,
422
+ "os": [
423
+ "android"
424
+ ]
425
+ },
426
+ "node_modules/@rollup/rollup-darwin-arm64": {
427
+ "version": "4.53.3",
428
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz",
429
+ "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==",
430
+ "cpu": [
431
+ "arm64"
432
+ ],
433
+ "dev": true,
434
+ "optional": true,
435
+ "os": [
436
+ "darwin"
437
+ ]
438
+ },
439
+ "node_modules/@rollup/rollup-darwin-x64": {
440
+ "version": "4.53.3",
441
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz",
442
+ "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==",
443
+ "cpu": [
444
+ "x64"
445
+ ],
446
+ "dev": true,
447
+ "optional": true,
448
+ "os": [
449
+ "darwin"
450
+ ]
451
+ },
452
+ "node_modules/@rollup/rollup-freebsd-arm64": {
453
+ "version": "4.53.3",
454
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz",
455
+ "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==",
456
+ "cpu": [
457
+ "arm64"
458
+ ],
459
+ "dev": true,
460
+ "optional": true,
461
+ "os": [
462
+ "freebsd"
463
+ ]
464
+ },
465
+ "node_modules/@rollup/rollup-freebsd-x64": {
466
+ "version": "4.53.3",
467
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz",
468
+ "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==",
469
+ "cpu": [
470
+ "x64"
471
+ ],
472
+ "dev": true,
473
+ "optional": true,
474
+ "os": [
475
+ "freebsd"
476
+ ]
477
+ },
478
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
479
+ "version": "4.53.3",
480
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz",
481
+ "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==",
482
+ "cpu": [
483
+ "arm"
484
+ ],
485
+ "dev": true,
486
+ "optional": true,
487
+ "os": [
488
+ "linux"
489
+ ]
490
+ },
491
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
492
+ "version": "4.53.3",
493
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz",
494
+ "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==",
495
+ "cpu": [
496
+ "arm"
497
+ ],
498
+ "dev": true,
499
+ "optional": true,
500
+ "os": [
501
+ "linux"
502
+ ]
503
+ },
504
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
505
+ "version": "4.53.3",
506
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz",
507
+ "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==",
508
+ "cpu": [
509
+ "arm64"
510
+ ],
511
+ "dev": true,
512
+ "optional": true,
513
+ "os": [
514
+ "linux"
515
+ ]
516
+ },
517
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
518
+ "version": "4.53.3",
519
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz",
520
+ "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==",
521
+ "cpu": [
522
+ "arm64"
523
+ ],
524
+ "dev": true,
525
+ "optional": true,
526
+ "os": [
527
+ "linux"
528
+ ]
529
+ },
530
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
531
+ "version": "4.53.3",
532
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz",
533
+ "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==",
534
+ "cpu": [
535
+ "loong64"
536
+ ],
537
+ "dev": true,
538
+ "optional": true,
539
+ "os": [
540
+ "linux"
541
+ ]
542
+ },
543
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
544
+ "version": "4.53.3",
545
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz",
546
+ "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==",
547
+ "cpu": [
548
+ "ppc64"
549
+ ],
550
+ "dev": true,
551
+ "optional": true,
552
+ "os": [
553
+ "linux"
554
+ ]
555
+ },
556
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
557
+ "version": "4.53.3",
558
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz",
559
+ "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==",
560
+ "cpu": [
561
+ "riscv64"
562
+ ],
563
+ "dev": true,
564
+ "optional": true,
565
+ "os": [
566
+ "linux"
567
+ ]
568
+ },
569
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
570
+ "version": "4.53.3",
571
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz",
572
+ "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==",
573
+ "cpu": [
574
+ "riscv64"
575
+ ],
576
+ "dev": true,
577
+ "optional": true,
578
+ "os": [
579
+ "linux"
580
+ ]
581
+ },
582
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
583
+ "version": "4.53.3",
584
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz",
585
+ "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==",
586
+ "cpu": [
587
+ "s390x"
588
+ ],
589
+ "dev": true,
590
+ "optional": true,
591
+ "os": [
592
+ "linux"
593
+ ]
594
+ },
595
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
596
+ "version": "4.53.3",
597
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz",
598
+ "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==",
599
+ "cpu": [
600
+ "x64"
601
+ ],
602
+ "dev": true,
603
+ "optional": true,
604
+ "os": [
605
+ "linux"
606
+ ]
607
+ },
608
+ "node_modules/@rollup/rollup-linux-x64-musl": {
609
+ "version": "4.53.3",
610
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz",
611
+ "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==",
612
+ "cpu": [
613
+ "x64"
614
+ ],
615
+ "dev": true,
616
+ "optional": true,
617
+ "os": [
618
+ "linux"
619
+ ]
620
+ },
621
+ "node_modules/@rollup/rollup-openharmony-arm64": {
622
+ "version": "4.53.3",
623
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz",
624
+ "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==",
625
+ "cpu": [
626
+ "arm64"
627
+ ],
628
+ "dev": true,
629
+ "optional": true,
630
+ "os": [
631
+ "openharmony"
632
+ ]
633
+ },
634
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
635
+ "version": "4.53.3",
636
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz",
637
+ "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==",
638
+ "cpu": [
639
+ "arm64"
640
+ ],
641
+ "dev": true,
642
+ "optional": true,
643
+ "os": [
644
+ "win32"
645
+ ]
646
+ },
647
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
648
+ "version": "4.53.3",
649
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz",
650
+ "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==",
651
+ "cpu": [
652
+ "ia32"
653
+ ],
654
+ "dev": true,
655
+ "optional": true,
656
+ "os": [
657
+ "win32"
658
+ ]
659
+ },
660
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
661
+ "version": "4.53.3",
662
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz",
663
+ "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==",
664
+ "cpu": [
665
+ "x64"
666
+ ],
667
+ "dev": true,
668
+ "optional": true,
669
+ "os": [
670
+ "win32"
671
+ ]
672
+ },
673
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
674
+ "version": "4.53.3",
675
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz",
676
+ "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==",
677
+ "cpu": [
678
+ "x64"
679
+ ],
680
+ "dev": true,
681
+ "optional": true,
682
+ "os": [
683
+ "win32"
684
+ ]
685
+ },
686
+ "node_modules/@sinclair/typebox": {
687
+ "version": "0.27.8",
688
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
689
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
690
+ "dev": true
691
+ },
692
+ "node_modules/@types/estree": {
693
+ "version": "1.0.8",
694
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
695
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
696
+ "dev": true
697
+ },
698
+ "node_modules/@types/node": {
699
+ "version": "24.10.1",
700
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz",
701
+ "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==",
702
+ "dev": true,
703
+ "optional": true,
704
+ "peer": true,
705
+ "dependencies": {
706
+ "undici-types": "~7.16.0"
707
+ }
708
+ },
709
+ "node_modules/@vitest/expect": {
710
+ "version": "1.6.1",
711
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.1.tgz",
712
+ "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==",
713
+ "dev": true,
714
+ "dependencies": {
715
+ "@vitest/spy": "1.6.1",
716
+ "@vitest/utils": "1.6.1",
717
+ "chai": "^4.3.10"
718
+ },
719
+ "funding": {
720
+ "url": "https://opencollective.com/vitest"
721
+ }
722
+ },
723
+ "node_modules/@vitest/runner": {
724
+ "version": "1.6.1",
725
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.1.tgz",
726
+ "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==",
727
+ "dev": true,
728
+ "dependencies": {
729
+ "@vitest/utils": "1.6.1",
730
+ "p-limit": "^5.0.0",
731
+ "pathe": "^1.1.1"
732
+ },
733
+ "funding": {
734
+ "url": "https://opencollective.com/vitest"
735
+ }
736
+ },
737
+ "node_modules/@vitest/runner/node_modules/p-limit": {
738
+ "version": "5.0.0",
739
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz",
740
+ "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==",
741
+ "dev": true,
742
+ "dependencies": {
743
+ "yocto-queue": "^1.0.0"
744
+ },
745
+ "engines": {
746
+ "node": ">=18"
747
+ },
748
+ "funding": {
749
+ "url": "https://github.com/sponsors/sindresorhus"
750
+ }
751
+ },
752
+ "node_modules/@vitest/runner/node_modules/yocto-queue": {
753
+ "version": "1.2.2",
754
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
755
+ "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
756
+ "dev": true,
757
+ "engines": {
758
+ "node": ">=12.20"
759
+ },
760
+ "funding": {
761
+ "url": "https://github.com/sponsors/sindresorhus"
762
+ }
763
+ },
764
+ "node_modules/@vitest/snapshot": {
765
+ "version": "1.6.1",
766
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.1.tgz",
767
+ "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==",
768
+ "dev": true,
769
+ "dependencies": {
770
+ "magic-string": "^0.30.5",
771
+ "pathe": "^1.1.1",
772
+ "pretty-format": "^29.7.0"
773
+ },
774
+ "funding": {
775
+ "url": "https://opencollective.com/vitest"
776
+ }
777
+ },
778
+ "node_modules/@vitest/spy": {
779
+ "version": "1.6.1",
780
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.1.tgz",
781
+ "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==",
782
+ "dev": true,
783
+ "dependencies": {
784
+ "tinyspy": "^2.2.0"
785
+ },
786
+ "funding": {
787
+ "url": "https://opencollective.com/vitest"
788
+ }
789
+ },
790
+ "node_modules/@vitest/utils": {
791
+ "version": "1.6.1",
792
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.1.tgz",
793
+ "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==",
794
+ "dev": true,
795
+ "dependencies": {
796
+ "diff-sequences": "^29.6.3",
797
+ "estree-walker": "^3.0.3",
798
+ "loupe": "^2.3.7",
799
+ "pretty-format": "^29.7.0"
800
+ },
801
+ "funding": {
802
+ "url": "https://opencollective.com/vitest"
803
+ }
804
+ },
805
+ "node_modules/acorn": {
806
+ "version": "8.15.0",
807
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
808
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
809
+ "dev": true,
810
+ "bin": {
811
+ "acorn": "bin/acorn"
812
+ },
813
+ "engines": {
814
+ "node": ">=0.4.0"
815
+ }
816
+ },
817
+ "node_modules/acorn-walk": {
818
+ "version": "8.3.4",
819
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
820
+ "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
821
+ "dev": true,
822
+ "dependencies": {
823
+ "acorn": "^8.11.0"
824
+ },
825
+ "engines": {
826
+ "node": ">=0.4.0"
827
+ }
828
+ },
829
+ "node_modules/assertion-error": {
830
+ "version": "1.1.0",
831
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
832
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
833
+ "dev": true,
834
+ "engines": {
835
+ "node": "*"
836
+ }
837
+ },
838
+ "node_modules/cac": {
839
+ "version": "6.7.14",
840
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
841
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
842
+ "dev": true,
843
+ "engines": {
844
+ "node": ">=8"
845
+ }
846
+ },
847
+ "node_modules/chai": {
848
+ "version": "4.5.0",
849
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
850
+ "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
851
+ "dev": true,
852
+ "dependencies": {
853
+ "assertion-error": "^1.1.0",
854
+ "check-error": "^1.0.3",
855
+ "deep-eql": "^4.1.3",
856
+ "get-func-name": "^2.0.2",
857
+ "loupe": "^2.3.6",
858
+ "pathval": "^1.1.1",
859
+ "type-detect": "^4.1.0"
860
+ },
861
+ "engines": {
862
+ "node": ">=4"
863
+ }
864
+ },
865
+ "node_modules/chai/node_modules/type-detect": {
866
+ "version": "4.1.0",
867
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
868
+ "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
869
+ "dev": true,
870
+ "engines": {
871
+ "node": ">=4"
872
+ }
873
+ },
874
+ "node_modules/check-error": {
875
+ "version": "1.0.3",
876
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
877
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
878
+ "dev": true,
879
+ "dependencies": {
880
+ "get-func-name": "^2.0.2"
881
+ },
882
+ "engines": {
883
+ "node": "*"
884
+ }
885
+ },
886
+ "node_modules/confbox": {
887
+ "version": "0.1.8",
888
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
889
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
890
+ "dev": true
891
+ },
892
+ "node_modules/cross-spawn": {
893
+ "version": "7.0.6",
894
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
895
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
896
+ "dev": true,
897
+ "dependencies": {
898
+ "path-key": "^3.1.0",
899
+ "shebang-command": "^2.0.0",
900
+ "which": "^2.0.1"
901
+ },
902
+ "engines": {
903
+ "node": ">= 8"
904
+ }
905
+ },
906
+ "node_modules/debug": {
907
+ "version": "4.4.3",
908
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
909
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
910
+ "dev": true,
911
+ "dependencies": {
912
+ "ms": "^2.1.3"
913
+ },
914
+ "engines": {
915
+ "node": ">=6.0"
916
+ },
917
+ "peerDependenciesMeta": {
918
+ "supports-color": {
919
+ "optional": true
920
+ }
921
+ }
922
+ },
923
+ "node_modules/deep-eql": {
924
+ "version": "4.1.4",
925
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
926
+ "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
927
+ "dev": true,
928
+ "dependencies": {
929
+ "type-detect": "^4.0.0"
930
+ },
931
+ "engines": {
932
+ "node": ">=6"
933
+ }
934
+ },
935
+ "node_modules/diff-sequences": {
936
+ "version": "29.6.3",
937
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
938
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
939
+ "dev": true,
940
+ "engines": {
941
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
942
+ }
943
+ },
944
+ "node_modules/esbuild": {
945
+ "version": "0.21.5",
946
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
947
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
948
+ "dev": true,
949
+ "hasInstallScript": true,
950
+ "bin": {
951
+ "esbuild": "bin/esbuild"
952
+ },
953
+ "engines": {
954
+ "node": ">=12"
955
+ },
956
+ "optionalDependencies": {
957
+ "@esbuild/aix-ppc64": "0.21.5",
958
+ "@esbuild/android-arm": "0.21.5",
959
+ "@esbuild/android-arm64": "0.21.5",
960
+ "@esbuild/android-x64": "0.21.5",
961
+ "@esbuild/darwin-arm64": "0.21.5",
962
+ "@esbuild/darwin-x64": "0.21.5",
963
+ "@esbuild/freebsd-arm64": "0.21.5",
964
+ "@esbuild/freebsd-x64": "0.21.5",
965
+ "@esbuild/linux-arm": "0.21.5",
966
+ "@esbuild/linux-arm64": "0.21.5",
967
+ "@esbuild/linux-ia32": "0.21.5",
968
+ "@esbuild/linux-loong64": "0.21.5",
969
+ "@esbuild/linux-mips64el": "0.21.5",
970
+ "@esbuild/linux-ppc64": "0.21.5",
971
+ "@esbuild/linux-riscv64": "0.21.5",
972
+ "@esbuild/linux-s390x": "0.21.5",
973
+ "@esbuild/linux-x64": "0.21.5",
974
+ "@esbuild/netbsd-x64": "0.21.5",
975
+ "@esbuild/openbsd-x64": "0.21.5",
976
+ "@esbuild/sunos-x64": "0.21.5",
977
+ "@esbuild/win32-arm64": "0.21.5",
978
+ "@esbuild/win32-ia32": "0.21.5",
979
+ "@esbuild/win32-x64": "0.21.5"
980
+ }
981
+ },
982
+ "node_modules/estree-walker": {
983
+ "version": "3.0.3",
984
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
985
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
986
+ "dev": true,
987
+ "dependencies": {
988
+ "@types/estree": "^1.0.0"
989
+ }
990
+ },
991
+ "node_modules/fsevents": {
992
+ "version": "2.3.3",
993
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
994
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
995
+ "dev": true,
996
+ "hasInstallScript": true,
997
+ "optional": true,
998
+ "os": [
999
+ "darwin"
1000
+ ],
1001
+ "engines": {
1002
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1003
+ }
1004
+ },
1005
+ "node_modules/get-func-name": {
1006
+ "version": "2.0.2",
1007
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
1008
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
1009
+ "dev": true,
1010
+ "engines": {
1011
+ "node": "*"
1012
+ }
1013
+ },
1014
+ "node_modules/isexe": {
1015
+ "version": "2.0.0",
1016
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1017
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1018
+ "dev": true
1019
+ },
1020
+ "node_modules/local-pkg": {
1021
+ "version": "0.5.1",
1022
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz",
1023
+ "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==",
1024
+ "dev": true,
1025
+ "dependencies": {
1026
+ "mlly": "^1.7.3",
1027
+ "pkg-types": "^1.2.1"
1028
+ },
1029
+ "engines": {
1030
+ "node": ">=14"
1031
+ },
1032
+ "funding": {
1033
+ "url": "https://github.com/sponsors/antfu"
1034
+ }
1035
+ },
1036
+ "node_modules/loupe": {
1037
+ "version": "2.3.7",
1038
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
1039
+ "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
1040
+ "dev": true,
1041
+ "dependencies": {
1042
+ "get-func-name": "^2.0.1"
1043
+ }
1044
+ },
1045
+ "node_modules/magic-string": {
1046
+ "version": "0.30.21",
1047
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
1048
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
1049
+ "dev": true,
1050
+ "dependencies": {
1051
+ "@jridgewell/sourcemap-codec": "^1.5.5"
1052
+ }
1053
+ },
1054
+ "node_modules/merge-stream": {
1055
+ "version": "2.0.0",
1056
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
1057
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
1058
+ "dev": true
1059
+ },
1060
+ "node_modules/mlly": {
1061
+ "version": "1.8.0",
1062
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz",
1063
+ "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==",
1064
+ "dev": true,
1065
+ "dependencies": {
1066
+ "acorn": "^8.15.0",
1067
+ "pathe": "^2.0.3",
1068
+ "pkg-types": "^1.3.1",
1069
+ "ufo": "^1.6.1"
1070
+ }
1071
+ },
1072
+ "node_modules/mlly/node_modules/pathe": {
1073
+ "version": "2.0.3",
1074
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
1075
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
1076
+ "dev": true
1077
+ },
1078
+ "node_modules/ms": {
1079
+ "version": "2.1.3",
1080
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1081
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1082
+ "dev": true
1083
+ },
1084
+ "node_modules/nanoid": {
1085
+ "version": "3.3.11",
1086
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
1087
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
1088
+ "dev": true,
1089
+ "funding": [
1090
+ {
1091
+ "type": "github",
1092
+ "url": "https://github.com/sponsors/ai"
1093
+ }
1094
+ ],
1095
+ "bin": {
1096
+ "nanoid": "bin/nanoid.cjs"
1097
+ },
1098
+ "engines": {
1099
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1100
+ }
1101
+ },
1102
+ "node_modules/path-key": {
1103
+ "version": "3.1.1",
1104
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1105
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1106
+ "dev": true,
1107
+ "engines": {
1108
+ "node": ">=8"
1109
+ }
1110
+ },
1111
+ "node_modules/pathe": {
1112
+ "version": "1.1.2",
1113
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
1114
+ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
1115
+ "dev": true
1116
+ },
1117
+ "node_modules/pathval": {
1118
+ "version": "1.1.1",
1119
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
1120
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
1121
+ "dev": true,
1122
+ "engines": {
1123
+ "node": "*"
1124
+ }
1125
+ },
1126
+ "node_modules/picocolors": {
1127
+ "version": "1.1.1",
1128
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1129
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1130
+ "dev": true
1131
+ },
1132
+ "node_modules/pkg-types": {
1133
+ "version": "1.3.1",
1134
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
1135
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
1136
+ "dev": true,
1137
+ "dependencies": {
1138
+ "confbox": "^0.1.8",
1139
+ "mlly": "^1.7.4",
1140
+ "pathe": "^2.0.1"
1141
+ }
1142
+ },
1143
+ "node_modules/pkg-types/node_modules/pathe": {
1144
+ "version": "2.0.3",
1145
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
1146
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
1147
+ "dev": true
1148
+ },
1149
+ "node_modules/postcss": {
1150
+ "version": "8.5.6",
1151
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
1152
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
1153
+ "dev": true,
1154
+ "funding": [
1155
+ {
1156
+ "type": "opencollective",
1157
+ "url": "https://opencollective.com/postcss/"
1158
+ },
1159
+ {
1160
+ "type": "tidelift",
1161
+ "url": "https://tidelift.com/funding/github/npm/postcss"
1162
+ },
1163
+ {
1164
+ "type": "github",
1165
+ "url": "https://github.com/sponsors/ai"
1166
+ }
1167
+ ],
1168
+ "dependencies": {
1169
+ "nanoid": "^3.3.11",
1170
+ "picocolors": "^1.1.1",
1171
+ "source-map-js": "^1.2.1"
1172
+ },
1173
+ "engines": {
1174
+ "node": "^10 || ^12 || >=14"
1175
+ }
1176
+ },
1177
+ "node_modules/pretty-format": {
1178
+ "version": "29.7.0",
1179
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
1180
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
1181
+ "dev": true,
1182
+ "dependencies": {
1183
+ "@jest/schemas": "^29.6.3",
1184
+ "ansi-styles": "^5.0.0",
1185
+ "react-is": "^18.0.0"
1186
+ },
1187
+ "engines": {
1188
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
1189
+ }
1190
+ },
1191
+ "node_modules/pretty-format/node_modules/ansi-styles": {
1192
+ "version": "5.2.0",
1193
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
1194
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
1195
+ "dev": true,
1196
+ "engines": {
1197
+ "node": ">=10"
1198
+ },
1199
+ "funding": {
1200
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1201
+ }
1202
+ },
1203
+ "node_modules/react-is": {
1204
+ "version": "18.3.1",
1205
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
1206
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
1207
+ "dev": true
1208
+ },
1209
+ "node_modules/rollup": {
1210
+ "version": "4.53.3",
1211
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz",
1212
+ "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==",
1213
+ "dev": true,
1214
+ "dependencies": {
1215
+ "@types/estree": "1.0.8"
1216
+ },
1217
+ "bin": {
1218
+ "rollup": "dist/bin/rollup"
1219
+ },
1220
+ "engines": {
1221
+ "node": ">=18.0.0",
1222
+ "npm": ">=8.0.0"
1223
+ },
1224
+ "optionalDependencies": {
1225
+ "@rollup/rollup-android-arm-eabi": "4.53.3",
1226
+ "@rollup/rollup-android-arm64": "4.53.3",
1227
+ "@rollup/rollup-darwin-arm64": "4.53.3",
1228
+ "@rollup/rollup-darwin-x64": "4.53.3",
1229
+ "@rollup/rollup-freebsd-arm64": "4.53.3",
1230
+ "@rollup/rollup-freebsd-x64": "4.53.3",
1231
+ "@rollup/rollup-linux-arm-gnueabihf": "4.53.3",
1232
+ "@rollup/rollup-linux-arm-musleabihf": "4.53.3",
1233
+ "@rollup/rollup-linux-arm64-gnu": "4.53.3",
1234
+ "@rollup/rollup-linux-arm64-musl": "4.53.3",
1235
+ "@rollup/rollup-linux-loong64-gnu": "4.53.3",
1236
+ "@rollup/rollup-linux-ppc64-gnu": "4.53.3",
1237
+ "@rollup/rollup-linux-riscv64-gnu": "4.53.3",
1238
+ "@rollup/rollup-linux-riscv64-musl": "4.53.3",
1239
+ "@rollup/rollup-linux-s390x-gnu": "4.53.3",
1240
+ "@rollup/rollup-linux-x64-gnu": "4.53.3",
1241
+ "@rollup/rollup-linux-x64-musl": "4.53.3",
1242
+ "@rollup/rollup-openharmony-arm64": "4.53.3",
1243
+ "@rollup/rollup-win32-arm64-msvc": "4.53.3",
1244
+ "@rollup/rollup-win32-ia32-msvc": "4.53.3",
1245
+ "@rollup/rollup-win32-x64-gnu": "4.53.3",
1246
+ "@rollup/rollup-win32-x64-msvc": "4.53.3",
1247
+ "fsevents": "~2.3.2"
1248
+ }
1249
+ },
1250
+ "node_modules/shebang-command": {
1251
+ "version": "2.0.0",
1252
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1253
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1254
+ "dev": true,
1255
+ "dependencies": {
1256
+ "shebang-regex": "^3.0.0"
1257
+ },
1258
+ "engines": {
1259
+ "node": ">=8"
1260
+ }
1261
+ },
1262
+ "node_modules/shebang-regex": {
1263
+ "version": "3.0.0",
1264
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1265
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1266
+ "dev": true,
1267
+ "engines": {
1268
+ "node": ">=8"
1269
+ }
1270
+ },
1271
+ "node_modules/siginfo": {
1272
+ "version": "2.0.0",
1273
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
1274
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
1275
+ "dev": true
1276
+ },
1277
+ "node_modules/source-map-js": {
1278
+ "version": "1.2.1",
1279
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1280
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1281
+ "dev": true,
1282
+ "engines": {
1283
+ "node": ">=0.10.0"
1284
+ }
1285
+ },
1286
+ "node_modules/stackback": {
1287
+ "version": "0.0.2",
1288
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
1289
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
1290
+ "dev": true
1291
+ },
1292
+ "node_modules/std-env": {
1293
+ "version": "3.10.0",
1294
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz",
1295
+ "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==",
1296
+ "dev": true
1297
+ },
1298
+ "node_modules/strip-literal": {
1299
+ "version": "2.1.1",
1300
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz",
1301
+ "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==",
1302
+ "dev": true,
1303
+ "dependencies": {
1304
+ "js-tokens": "^9.0.1"
1305
+ },
1306
+ "funding": {
1307
+ "url": "https://github.com/sponsors/antfu"
1308
+ }
1309
+ },
1310
+ "node_modules/strip-literal/node_modules/js-tokens": {
1311
+ "version": "9.0.1",
1312
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
1313
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
1314
+ "dev": true
1315
+ },
1316
+ "node_modules/tinybench": {
1317
+ "version": "2.9.0",
1318
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
1319
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
1320
+ "dev": true
1321
+ },
1322
+ "node_modules/tinypool": {
1323
+ "version": "0.8.4",
1324
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz",
1325
+ "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==",
1326
+ "dev": true,
1327
+ "engines": {
1328
+ "node": ">=14.0.0"
1329
+ }
1330
+ },
1331
+ "node_modules/tinyspy": {
1332
+ "version": "2.2.1",
1333
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz",
1334
+ "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==",
1335
+ "dev": true,
1336
+ "engines": {
1337
+ "node": ">=14.0.0"
1338
+ }
1339
+ },
1340
+ "node_modules/type-detect": {
1341
+ "version": "4.0.8",
1342
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
1343
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
1344
+ "dev": true,
1345
+ "engines": {
1346
+ "node": ">=4"
1347
+ }
1348
+ },
1349
+ "node_modules/ufo": {
1350
+ "version": "1.6.1",
1351
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz",
1352
+ "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==",
1353
+ "dev": true
1354
+ },
1355
+ "node_modules/undici-types": {
1356
+ "version": "7.16.0",
1357
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
1358
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
1359
+ "dev": true,
1360
+ "optional": true,
1361
+ "peer": true
1362
+ },
1363
+ "node_modules/vite": {
1364
+ "version": "5.4.21",
1365
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
1366
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
1367
+ "dev": true,
1368
+ "dependencies": {
1369
+ "esbuild": "^0.21.3",
1370
+ "postcss": "^8.4.43",
1371
+ "rollup": "^4.20.0"
1372
+ },
1373
+ "bin": {
1374
+ "vite": "bin/vite.js"
1375
+ },
1376
+ "engines": {
1377
+ "node": "^18.0.0 || >=20.0.0"
1378
+ },
1379
+ "funding": {
1380
+ "url": "https://github.com/vitejs/vite?sponsor=1"
1381
+ },
1382
+ "optionalDependencies": {
1383
+ "fsevents": "~2.3.3"
1384
+ },
1385
+ "peerDependencies": {
1386
+ "@types/node": "^18.0.0 || >=20.0.0",
1387
+ "less": "*",
1388
+ "lightningcss": "^1.21.0",
1389
+ "sass": "*",
1390
+ "sass-embedded": "*",
1391
+ "stylus": "*",
1392
+ "sugarss": "*",
1393
+ "terser": "^5.4.0"
1394
+ },
1395
+ "peerDependenciesMeta": {
1396
+ "@types/node": {
1397
+ "optional": true
1398
+ },
1399
+ "less": {
1400
+ "optional": true
1401
+ },
1402
+ "lightningcss": {
1403
+ "optional": true
1404
+ },
1405
+ "sass": {
1406
+ "optional": true
1407
+ },
1408
+ "sass-embedded": {
1409
+ "optional": true
1410
+ },
1411
+ "stylus": {
1412
+ "optional": true
1413
+ },
1414
+ "sugarss": {
1415
+ "optional": true
1416
+ },
1417
+ "terser": {
1418
+ "optional": true
1419
+ }
1420
+ }
1421
+ },
1422
+ "node_modules/vite-node": {
1423
+ "version": "1.6.1",
1424
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.1.tgz",
1425
+ "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==",
1426
+ "dev": true,
1427
+ "dependencies": {
1428
+ "cac": "^6.7.14",
1429
+ "debug": "^4.3.4",
1430
+ "pathe": "^1.1.1",
1431
+ "picocolors": "^1.0.0",
1432
+ "vite": "^5.0.0"
1433
+ },
1434
+ "bin": {
1435
+ "vite-node": "vite-node.mjs"
1436
+ },
1437
+ "engines": {
1438
+ "node": "^18.0.0 || >=20.0.0"
1439
+ },
1440
+ "funding": {
1441
+ "url": "https://opencollective.com/vitest"
1442
+ }
1443
+ },
1444
+ "node_modules/vitest": {
1445
+ "version": "1.6.1",
1446
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.1.tgz",
1447
+ "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==",
1448
+ "dev": true,
1449
+ "dependencies": {
1450
+ "@vitest/expect": "1.6.1",
1451
+ "@vitest/runner": "1.6.1",
1452
+ "@vitest/snapshot": "1.6.1",
1453
+ "@vitest/spy": "1.6.1",
1454
+ "@vitest/utils": "1.6.1",
1455
+ "acorn-walk": "^8.3.2",
1456
+ "chai": "^4.3.10",
1457
+ "debug": "^4.3.4",
1458
+ "execa": "^8.0.1",
1459
+ "local-pkg": "^0.5.0",
1460
+ "magic-string": "^0.30.5",
1461
+ "pathe": "^1.1.1",
1462
+ "picocolors": "^1.0.0",
1463
+ "std-env": "^3.5.0",
1464
+ "strip-literal": "^2.0.0",
1465
+ "tinybench": "^2.5.1",
1466
+ "tinypool": "^0.8.3",
1467
+ "vite": "^5.0.0",
1468
+ "vite-node": "1.6.1",
1469
+ "why-is-node-running": "^2.2.2"
1470
+ },
1471
+ "bin": {
1472
+ "vitest": "vitest.mjs"
1473
+ },
1474
+ "engines": {
1475
+ "node": "^18.0.0 || >=20.0.0"
1476
+ },
1477
+ "funding": {
1478
+ "url": "https://opencollective.com/vitest"
1479
+ },
1480
+ "peerDependencies": {
1481
+ "@edge-runtime/vm": "*",
1482
+ "@types/node": "^18.0.0 || >=20.0.0",
1483
+ "@vitest/browser": "1.6.1",
1484
+ "@vitest/ui": "1.6.1",
1485
+ "happy-dom": "*",
1486
+ "jsdom": "*"
1487
+ },
1488
+ "peerDependenciesMeta": {
1489
+ "@edge-runtime/vm": {
1490
+ "optional": true
1491
+ },
1492
+ "@types/node": {
1493
+ "optional": true
1494
+ },
1495
+ "@vitest/browser": {
1496
+ "optional": true
1497
+ },
1498
+ "@vitest/ui": {
1499
+ "optional": true
1500
+ },
1501
+ "happy-dom": {
1502
+ "optional": true
1503
+ },
1504
+ "jsdom": {
1505
+ "optional": true
1506
+ }
1507
+ }
1508
+ },
1509
+ "node_modules/vitest/node_modules/execa": {
1510
+ "version": "8.0.1",
1511
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
1512
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
1513
+ "dev": true,
1514
+ "dependencies": {
1515
+ "cross-spawn": "^7.0.3",
1516
+ "get-stream": "^8.0.1",
1517
+ "human-signals": "^5.0.0",
1518
+ "is-stream": "^3.0.0",
1519
+ "merge-stream": "^2.0.0",
1520
+ "npm-run-path": "^5.1.0",
1521
+ "onetime": "^6.0.0",
1522
+ "signal-exit": "^4.1.0",
1523
+ "strip-final-newline": "^3.0.0"
1524
+ },
1525
+ "engines": {
1526
+ "node": ">=16.17"
1527
+ },
1528
+ "funding": {
1529
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
1530
+ }
1531
+ },
1532
+ "node_modules/vitest/node_modules/get-stream": {
1533
+ "version": "8.0.1",
1534
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
1535
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
1536
+ "dev": true,
1537
+ "engines": {
1538
+ "node": ">=16"
1539
+ },
1540
+ "funding": {
1541
+ "url": "https://github.com/sponsors/sindresorhus"
1542
+ }
1543
+ },
1544
+ "node_modules/vitest/node_modules/human-signals": {
1545
+ "version": "5.0.0",
1546
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
1547
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
1548
+ "dev": true,
1549
+ "engines": {
1550
+ "node": ">=16.17.0"
1551
+ }
1552
+ },
1553
+ "node_modules/vitest/node_modules/is-stream": {
1554
+ "version": "3.0.0",
1555
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
1556
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
1557
+ "dev": true,
1558
+ "engines": {
1559
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1560
+ },
1561
+ "funding": {
1562
+ "url": "https://github.com/sponsors/sindresorhus"
1563
+ }
1564
+ },
1565
+ "node_modules/vitest/node_modules/mimic-fn": {
1566
+ "version": "4.0.0",
1567
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
1568
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
1569
+ "dev": true,
1570
+ "engines": {
1571
+ "node": ">=12"
1572
+ },
1573
+ "funding": {
1574
+ "url": "https://github.com/sponsors/sindresorhus"
1575
+ }
1576
+ },
1577
+ "node_modules/vitest/node_modules/npm-run-path": {
1578
+ "version": "5.3.0",
1579
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
1580
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
1581
+ "dev": true,
1582
+ "dependencies": {
1583
+ "path-key": "^4.0.0"
1584
+ },
1585
+ "engines": {
1586
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1587
+ },
1588
+ "funding": {
1589
+ "url": "https://github.com/sponsors/sindresorhus"
1590
+ }
1591
+ },
1592
+ "node_modules/vitest/node_modules/onetime": {
1593
+ "version": "6.0.0",
1594
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
1595
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
1596
+ "dev": true,
1597
+ "dependencies": {
1598
+ "mimic-fn": "^4.0.0"
1599
+ },
1600
+ "engines": {
1601
+ "node": ">=12"
1602
+ },
1603
+ "funding": {
1604
+ "url": "https://github.com/sponsors/sindresorhus"
1605
+ }
1606
+ },
1607
+ "node_modules/vitest/node_modules/path-key": {
1608
+ "version": "4.0.0",
1609
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
1610
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
1611
+ "dev": true,
1612
+ "engines": {
1613
+ "node": ">=12"
1614
+ },
1615
+ "funding": {
1616
+ "url": "https://github.com/sponsors/sindresorhus"
1617
+ }
1618
+ },
1619
+ "node_modules/vitest/node_modules/signal-exit": {
1620
+ "version": "4.1.0",
1621
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
1622
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
1623
+ "dev": true,
1624
+ "engines": {
1625
+ "node": ">=14"
1626
+ },
1627
+ "funding": {
1628
+ "url": "https://github.com/sponsors/isaacs"
1629
+ }
1630
+ },
1631
+ "node_modules/vitest/node_modules/strip-final-newline": {
1632
+ "version": "3.0.0",
1633
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
1634
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
1635
+ "dev": true,
1636
+ "engines": {
1637
+ "node": ">=12"
1638
+ },
1639
+ "funding": {
1640
+ "url": "https://github.com/sponsors/sindresorhus"
1641
+ }
1642
+ },
1643
+ "node_modules/which": {
1644
+ "version": "2.0.2",
1645
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1646
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1647
+ "dev": true,
1648
+ "dependencies": {
1649
+ "isexe": "^2.0.0"
1650
+ },
1651
+ "bin": {
1652
+ "node-which": "bin/node-which"
1653
+ },
1654
+ "engines": {
1655
+ "node": ">= 8"
1656
+ }
1657
+ },
1658
+ "node_modules/why-is-node-running": {
1659
+ "version": "2.3.0",
1660
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
1661
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
1662
+ "dev": true,
1663
+ "dependencies": {
1664
+ "siginfo": "^2.0.0",
1665
+ "stackback": "0.0.2"
1666
+ },
1667
+ "bin": {
1668
+ "why-is-node-running": "cli.js"
1669
+ },
1670
+ "engines": {
1671
+ "node": ">=8"
1672
+ }
1673
+ }
1674
+ }
1675
+ }
package.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "distill-pipeline",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "test": "vitest --run"
7
+ },
8
+ "devDependencies": {
9
+ "vitest": "^1.6.0"
10
+ }
11
+ }
prompts/generator_prompt.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ You are generating clean, spiritually grounded Q’uo-style answers.
2
+
3
+ Question:
4
+ {{QUESTION}}
5
+
6
+ Respond in the tone of the Confederation, clear, humble, and service-oriented.
prompts/reward_prompt.txt ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ You are a strict reward model. Score from 0 to 1.
2
+
3
+ Score the following answer for:
4
+ • spiritual accuracy
5
+ • coherence
6
+ • Confederation tone
7
+ • lack of hallucination
8
+ • helpful service-to-others orientation
9
+
10
+ Return only a number.
11
+
12
+ Answer:
13
+ {{OUTPUT}}
prompts/verifier_prompt.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ Evaluate the following answer for clarity, coherence, alignment with Confederation principles, lack of hallucinations, and loving tone.
2
+
3
+ Return ONLY a number between 0 and 1.
4
+
5
+ Answer:
6
+ {{OUTPUT}}
reward/reward.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // reward/reward.js
2
+ // Uses 70B reward model to produce final scores
3
+
4
+ require("dotenv").config();
5
+ const fs = require("fs");
6
+ const fetch = require("node-fetch");
7
+
8
+ const MODEL = process.env.REWARD_MODEL || "qwen2.5-72b-reward-q4km";
9
+ const PROMPT = fs.readFileSync("prompts/reward_prompt.txt", "utf8");
10
+ const IN = process.env.REWARD_IN || "cycle/verified.jsonl";
11
+ const OUT = process.env.REWARD_OUT || "cycle/scored.jsonl";
12
+
13
+ async function reward(item) {
14
+ const prompt = PROMPT.replace("{{OUTPUT}}", item.output);
15
+
16
+ const res = await fetch("http://localhost:11434/api/generate", {
17
+ method: "POST",
18
+ headers: { "Content-Type": "application/json" },
19
+ body: JSON.stringify({ model: MODEL, prompt, stream: false }),
20
+ });
21
+
22
+ const data = await res.json();
23
+ return Number(data.response.trim());
24
+ }
25
+
26
+ async function main() {
27
+ const lines = fs.readFileSync(IN, "utf8").trim().split("\n");
28
+ const out = fs.createWriteStream(OUT);
29
+
30
+ console.log(`[reward] Scoring ${lines.length} items…`);
31
+ let count = 0;
32
+
33
+ for (const line of lines) {
34
+ const item = JSON.parse(line);
35
+ item.reward = await reward(item);
36
+ out.write(JSON.stringify(item) + "\n");
37
+ count++;
38
+ console.log(`[reward] Scored ${count}`);
39
+ }
40
+
41
+ out.end();
42
+ console.log(`[reward] Done.`);
43
+ }
44
+
45
+ if (require.main === module) main();
46
+ module.exports = { reward, main };
scripts/clean_cycle.sh ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ #!/bin/bash
2
+ rm -rf cycle
3
+ mkdir -p cycle
4
+ echo "[clean] Reset cycle/ directory."
scripts/run_cycle.sh ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ set -e
3
+ source scripts/vars.sh
4
+
5
+ echo "[cycle] Running generator…"
6
+ node generator/generator.js
7
+
8
+ echo "[cycle] Running verifier…"
9
+ node verifier/verifier.js
10
+
11
+ echo "[cycle] Running reward model…"
12
+ node reward/reward.js
13
+
14
+ echo "[cycle] Selecting gold samples…"
15
+ node gold/build_gold.js
16
+
17
+ echo "[cycle] Done."
scripts/vars.sh ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ export GENERATOR_MODEL="qwen2.5-7b-instruct"
2
+ export VERIFIER_MODEL="qwen2.5-3b-instruct"
3
+ export REWARD_MODEL="nemotron-4-70b-reward-q4km"
4
+
5
+ export GENERATED_NUM=5
6
+ export GOLD_TOP=100
7
+
8
+ mkdir -p cycle
src/retrieval.mjs ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // src/retrieval.mjs
2
+ import dotenv from 'dotenv';
3
+ import { Client } from '@elastic/elasticsearch';
4
+ import fetch from 'node-fetch';
5
+
6
+ dotenv.config();
7
+
8
+ // ----------------------------------------
9
+ // Config
10
+ // ----------------------------------------
11
+ const ES_NODE = process.env.ES_NODE || 'http://localhost:9200';
12
+ const ES_INDEX = process.env.ES_INDEX || 'quo_distill_index';
13
+
14
+ const EMBED_URL = process.env.EMBED_URL || 'http://localhost:11434/api/embeddings';
15
+ const EMBED_MODEL = process.env.EMBED_MODEL || 'mxbai-embed-large';
16
+
17
+ // ES client
18
+ const client = new Client({ node: ES_NODE });
19
+
20
+ // ----------------------------------------
21
+ // Embed helper
22
+ // ----------------------------------------
23
+ export async function embed(text) {
24
+ const resp = await fetch(EMBED_URL, {
25
+ method: 'POST',
26
+ headers: { 'Content-Type': 'application/json' },
27
+ body: JSON.stringify({
28
+ model: EMBED_MODEL,
29
+ prompt: text,
30
+ })
31
+ });
32
+
33
+ if (!resp.ok) throw new Error(`Embedding failed: HTTP ${resp.status}`);
34
+
35
+ const json = await resp.json();
36
+ return json.embedding;
37
+ }
38
+
39
+ // ----------------------------------------
40
+ // BM25
41
+ // ----------------------------------------
42
+ export async function bm25Search(query, k = 5) {
43
+ const res = await client.search({
44
+ index: ES_INDEX,
45
+ size: k,
46
+ query: {
47
+ match: { content: query }
48
+ }
49
+ });
50
+
51
+ const hits = res.hits?.hits || [];
52
+ return hits.map(h => ({
53
+ id: h._id,
54
+ score: h._score,
55
+ ...h._source,
56
+ }));
57
+ }
58
+
59
+ // ----------------------------------------
60
+ // Dense vector (KNN)
61
+ // ----------------------------------------
62
+ export async function vectorSearch(query, k = 5) {
63
+ const vector = await embed(query);
64
+
65
+ const res = await client.search({
66
+ index: ES_INDEX,
67
+ knn: {
68
+ field: 'embedding',
69
+ query_vector: vector,
70
+ k,
71
+ num_candidates: 50,
72
+ }
73
+ });
74
+
75
+ const hits = res.hits?.hits || [];
76
+ return hits.map(h => ({
77
+ id: h._id,
78
+ score: h._score,
79
+ ...h._source
80
+ }));
81
+ }
82
+
83
+ // ----------------------------------------
84
+ // RRF Fusion (same as distill-rag)
85
+ // ----------------------------------------
86
+ function fuseRRF(dense, sparse, k = 60) {
87
+ const scores = new Map();
88
+
89
+ const add = (arr) => {
90
+ arr.forEach((item, i) => {
91
+ const id = item.id;
92
+ const rank = i + 1;
93
+ const score = 1 / (k + rank);
94
+ scores.set(id, (scores.get(id) || 0) + score);
95
+ });
96
+ };
97
+
98
+ add(dense);
99
+ add(sparse);
100
+
101
+ return [...scores.entries()]
102
+ .sort((a, b) => b[1] - a[1])
103
+ .map(([id]) => dense.find(d => d.id === id) || sparse.find(s => s.id === id));
104
+ }
105
+
106
+ // ----------------------------------------
107
+ // Hybrid (dense + BM25)
108
+ // ----------------------------------------
109
+ export async function hybridSearch(query, k = 5) {
110
+ const [dense, sparse] = await Promise.all([
111
+ vectorSearch(query, k),
112
+ bm25Search(query, k),
113
+ ]);
114
+
115
+ return fuseRRF(dense, sparse).slice(0, k);
116
+ }
117
+
118
+ // ----------------------------------------
119
+ // HYDE: Hypothetical Document Embeddings
120
+ // ----------------------------------------
121
+ export async function hydeHybrid(query, k = 5, provider) {
122
+ // provider.generate(prompt) is the LLM hook
123
+ const hydePrompt = `
124
+ You are assisting retrieval.
125
+ Write a hypothetical answer to the following question.
126
+
127
+ Question: "${query}"
128
+
129
+ Write 3–6 paragraphs of what an answer *might* contain, high-level and conceptual.
130
+ Do NOT include JSON or formatting.
131
+ `.trim();
132
+
133
+ const hypo = await provider.generate(hydePrompt);
134
+
135
+ const [dense, sparse] = await Promise.all([
136
+ vectorSearch(hypo, k),
137
+ bm25Search(query, k),
138
+ ]);
139
+
140
+ return fuseRRF(dense, sparse).slice(0, k);
141
+ }
142
+
143
+ export default {
144
+ embed,
145
+ bm25Search,
146
+ vectorSearch,
147
+ hybridSearch,
148
+ hydeHybrid
149
+ };
test_samples/seed_questions.jsonl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ {"question":"What is the nature of love?"}
2
+ {"question":"How do I serve others in daily life?"}
3
+ {"question":"What is the role of meditation?"}
tests/retrieval.mock.test.mjs ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+
3
+ // --- We mock both ES client and node-fetch ----
4
+ vi.mock('@elastic/elasticsearch', () => {
5
+ return {
6
+ Client: vi.fn().mockImplementation(() => {
7
+ return {
8
+ search: vi.fn(async (opts) => {
9
+ // Interpret the request type:
10
+ if (opts.query?.match) {
11
+ // --- BM25 mock output ----
12
+ return {
13
+ hits: {
14
+ hits: [
15
+ { _id: 'bm25-1', _score: 2.0, _source: { content: 'A' } },
16
+ { _id: 'bm25-2', _score: 1.0, _source: { content: 'B' } },
17
+ ]
18
+ }
19
+ };
20
+ }
21
+
22
+ if (opts.knn) {
23
+ // --- Dense vector mock output ----
24
+ return {
25
+ hits: {
26
+ hits: [
27
+ { _id: 'vec-1', _score: 0.9, _source: { content: 'X' } },
28
+ { _id: 'vec-2', _score: 0.8, _source: { content: 'Y' } },
29
+ ]
30
+ }
31
+ };
32
+ }
33
+
34
+ return { hits: { hits: [] } };
35
+ })
36
+ };
37
+ })
38
+ };
39
+ });
40
+
41
+ vi.mock('node-fetch', () => {
42
+ return {
43
+ default: vi.fn(async () => {
44
+ return {
45
+ ok: true,
46
+ json: async () => ({
47
+ embedding: [0.1, 0.2, 0.3] // Dummy vector
48
+ })
49
+ };
50
+ })
51
+ };
52
+ });
53
+
54
+ // After mocks, import retrieval module:
55
+ import {
56
+ embed,
57
+ bm25Search,
58
+ vectorSearch,
59
+ hybridSearch
60
+ } from '../src/retrieval.mjs';
61
+
62
+ describe('retrieval.mjs', () => {
63
+ beforeEach(() => {
64
+ vi.clearAllMocks();
65
+ });
66
+
67
+ // ------------------------------
68
+ // EMBEDDING
69
+ // ------------------------------
70
+ it('embed() returns an embedding array', async () => {
71
+ const emb = await embed('test');
72
+ expect(Array.isArray(emb)).toBe(true);
73
+ expect(emb).toEqual([0.1, 0.2, 0.3]);
74
+ });
75
+
76
+ // ------------------------------
77
+ // BM25
78
+ // ------------------------------
79
+ it('bm25Search() returns valid results', async () => {
80
+ const res = await bm25Search('love', 2);
81
+ expect(res.length).toBe(2);
82
+
83
+ expect(res[0]).toMatchObject({
84
+ id: 'bm25-1',
85
+ score: 2.0,
86
+ content: 'A'
87
+ });
88
+ });
89
+
90
+ // ------------------------------
91
+ // Dense Vector
92
+ // ------------------------------
93
+ it('vectorSearch() returns vector-based results', async () => {
94
+ const res = await vectorSearch('unity', 2);
95
+ expect(res.length).toBe(2);
96
+
97
+ expect(res[0]).toMatchObject({
98
+ id: 'vec-1',
99
+ score: 0.9,
100
+ content: 'X'
101
+ });
102
+ });
103
+
104
+ // ------------------------------
105
+ // Hybrid (RRF)
106
+ // ------------------------------
107
+ it('hybridSearch() fuses BM25 and vector results via RRF', async () => {
108
+ const res = await hybridSearch('seeking', 3);
109
+
110
+ // Should merge vec + bm25 in some order.
111
+ // Score fusion means 'vec-1' or 'bm25-1' will come first, but we just check the structure.
112
+ expect(res.length).toBeGreaterThan(0);
113
+
114
+ const ids = res.map(r => r.id);
115
+
116
+ // Confirm that hybrid includes items from BOTH sources
117
+ expect(ids).toContain('vec-1');
118
+ expect(ids).toContain('bm25-1');
119
+ });
120
+ });
tests/retrieval.real.test.mjs ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+
3
+ const USE_REAL = process.env.REAL_ES === "1";
4
+
5
+ if (!USE_REAL) {
6
+ // ------------------------------
7
+ // MOCK MODE (default)
8
+ // ------------------------------
9
+ vi.mock('@elastic/elasticsearch', () => {
10
+ return {
11
+ Client: vi.fn().mockImplementation(() => {
12
+ return {
13
+ search: vi.fn(async (opts) => {
14
+ if (opts.query?.match) {
15
+ return {
16
+ hits: {
17
+ hits: [
18
+ { _id: 'bm25-1', _score: 2.0, _source: { content: 'A' } },
19
+ { _id: 'bm25-2', _score: 1.0, _source: { content: 'B' } },
20
+ ]
21
+ }
22
+ };
23
+ }
24
+
25
+ if (opts.knn) {
26
+ return {
27
+ hits: {
28
+ hits: [
29
+ { _id: 'vec-1', _score: 0.9, _source: { content: 'X' } },
30
+ { _id: 'vec-2', _score: 0.8, _source: { content: 'Y' } },
31
+ ]
32
+ }
33
+ };
34
+ }
35
+
36
+ return { hits: { hits: [] } };
37
+ })
38
+ };
39
+ })
40
+ };
41
+ });
42
+
43
+ vi.mock('node-fetch', () => {
44
+ return {
45
+ default: vi.fn(async () => {
46
+ return {
47
+ ok: true,
48
+ json: async () => ({
49
+ embedding: [0.1, 0.2, 0.3]
50
+ })
51
+ };
52
+ })
53
+ };
54
+ });
55
+ } else {
56
+ console.log("🔵 REAL_ES=1 → Using live Elasticsearch + real fetch");
57
+ }
58
+
59
+ // Import AFTER mock decisions
60
+ import {
61
+ embed,
62
+ bm25Search,
63
+ vectorSearch,
64
+ hybridSearch
65
+ } from '../src/retrieval.mjs';
66
+
67
+ describe('retrieval.mjs', () => {
68
+
69
+ if (USE_REAL) {
70
+ it('real ES hybridSearch returns results', async () => {
71
+ const res = await hybridSearch('love and unity', 3);
72
+ expect(res.length).toBeGreaterThan(0);
73
+ });
74
+ return; // Only run this block in REAL mode
75
+ }
76
+
77
+ // ------------------------------
78
+ // MOCK MODE TESTS
79
+ // ------------------------------
80
+
81
+ beforeEach(() => {
82
+ vi.clearAllMocks();
83
+ });
84
+
85
+ it('embed() returns an embedding array', async () => {
86
+ const emb = await embed('test');
87
+ expect(emb).toEqual([0.1, 0.2, 0.3]);
88
+ });
89
+
90
+ it('bm25Search() returns valid results', async () => {
91
+ const res = await bm25Search('love', 2);
92
+ expect(res[0].id).toBe('bm25-1');
93
+ });
94
+
95
+ it('vectorSearch() returns vector-based results', async () => {
96
+ const res = await vectorSearch('unity', 2);
97
+ expect(res[0].id).toBe('vec-1');
98
+ });
99
+
100
+ it('hybridSearch() fuses BM25 and vector results', async () => {
101
+ const res = await hybridSearch('seeking', 3);
102
+ const ids = res.map(r => r.id);
103
+ expect(ids).toContain('vec-1');
104
+ expect(ids).toContain('bm25-1');
105
+ });
106
+ });
training/train_lora.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # training/train_lora.py
2
+ import json
3
+ from pathlib import Path
4
+
5
+ data_path = Path("cycle/gold.jsonl")
6
+
7
+ print("[train] Loading gold dataset…")
8
+ lines = [json.loads(l) for l in data_path.read_text().splitlines()]
9
+
10
+ print(f"[train] {len(lines)} items loaded.")
11
+ print("[train] 🚧 TODO: integrate with your LoRA trainer (Llama-Factory, Axolotl, or custom).")
verifier/verifier.js ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // verifier/verifier.js
2
+ // Quick filter using 3B–7B verifier model
3
+
4
+ require("dotenv").config();
5
+ const fs = require("fs");
6
+ const fetch = require("node-fetch");
7
+
8
+ const MODEL = process.env.VERIFIER_MODEL || "qwen2.5-3b-instruct";
9
+ const PROMPT = fs.readFileSync("prompts/verifier_prompt.txt", "utf8");
10
+ const IN = process.env.VERIFIER_IN || "cycle/generated.jsonl";
11
+ const OUT = process.env.VERIFIER_OUT || "cycle/verified.jsonl";
12
+
13
+ async function score(item) {
14
+ const prompt = PROMPT.replace("{{OUTPUT}}", item.output);
15
+
16
+ const res = await fetch("http://localhost:11434/api/generate", {
17
+ method: "POST",
18
+ headers: { "Content-Type": "application/json" },
19
+ body: JSON.stringify({ model: MODEL, prompt, stream: false }),
20
+ });
21
+
22
+ const data = await res.json();
23
+ return Number(data.response.trim());
24
+ }
25
+
26
+ async function main() {
27
+ const input = fs.readFileSync(IN, "utf8").trim().split("\n");
28
+ const out = fs.createWriteStream(OUT);
29
+
30
+ let kept = 0;
31
+ console.log(`[verifier] Filtering ${input.length} items…`);
32
+
33
+ for (const line of input) {
34
+ const item = JSON.parse(line);
35
+ const rating = await score(item);
36
+
37
+ if (rating >= 0.5) {
38
+ out.write(JSON.stringify(item) + "\n");
39
+ kept++;
40
+ }
41
+ }
42
+
43
+ out.end();
44
+ console.log(`[verifier] Kept ${kept} of ${input.length}`);
45
+ }
46
+
47
+ if (require.main === module) main();
48
+ module.exports = { score, main };