bikky 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +323 -0
- package/bin/bikky.js +6 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +51 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +59 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +141 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +8 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +449 -0
- package/dist/config.test.js.map +1 -0
- package/dist/daemon/consolidation.d.ts +60 -0
- package/dist/daemon/consolidation.d.ts.map +1 -0
- package/dist/daemon/consolidation.js +448 -0
- package/dist/daemon/consolidation.js.map +1 -0
- package/dist/daemon/extraction.d.ts +17 -0
- package/dist/daemon/extraction.d.ts.map +1 -0
- package/dist/daemon/extraction.js +465 -0
- package/dist/daemon/extraction.js.map +1 -0
- package/dist/daemon/index.d.ts +3 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +3 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/loop.d.ts +3 -0
- package/dist/daemon/loop.d.ts.map +1 -0
- package/dist/daemon/loop.js +93 -0
- package/dist/daemon/loop.js.map +1 -0
- package/dist/daemon/qdrant.d.ts +103 -0
- package/dist/daemon/qdrant.d.ts.map +1 -0
- package/dist/daemon/qdrant.js +273 -0
- package/dist/daemon/qdrant.js.map +1 -0
- package/dist/daemon/qdrant.test.d.ts +8 -0
- package/dist/daemon/qdrant.test.d.ts.map +1 -0
- package/dist/daemon/qdrant.test.js +209 -0
- package/dist/daemon/qdrant.test.js.map +1 -0
- package/dist/daemon/relations.d.ts +54 -0
- package/dist/daemon/relations.d.ts.map +1 -0
- package/dist/daemon/relations.js +290 -0
- package/dist/daemon/relations.js.map +1 -0
- package/dist/daemon/staleness.d.ts +24 -0
- package/dist/daemon/staleness.d.ts.map +1 -0
- package/dist/daemon/staleness.js +63 -0
- package/dist/daemon/staleness.js.map +1 -0
- package/dist/daemon/watcher.d.ts +11 -0
- package/dist/daemon/watcher.d.ts.map +1 -0
- package/dist/daemon/watcher.js +38 -0
- package/dist/daemon/watcher.js.map +1 -0
- package/dist/daemon/watcher.test.d.ts +8 -0
- package/dist/daemon/watcher.test.d.ts.map +1 -0
- package/dist/daemon/watcher.test.js +214 -0
- package/dist/daemon/watcher.test.js.map +1 -0
- package/dist/install.d.ts +5 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +49 -0
- package/dist/install.js.map +1 -0
- package/dist/install.test.d.ts +9 -0
- package/dist/install.test.d.ts.map +1 -0
- package/dist/install.test.js +126 -0
- package/dist/install.test.js.map +1 -0
- package/dist/llm/embedding.d.ts +13 -0
- package/dist/llm/embedding.d.ts.map +1 -0
- package/dist/llm/embedding.js +127 -0
- package/dist/llm/embedding.js.map +1 -0
- package/dist/llm/embedding.test.d.ts +8 -0
- package/dist/llm/embedding.test.d.ts.map +1 -0
- package/dist/llm/embedding.test.js +117 -0
- package/dist/llm/embedding.test.js.map +1 -0
- package/dist/llm/index.d.ts +4 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +3 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/inference.d.ts +12 -0
- package/dist/llm/inference.d.ts.map +1 -0
- package/dist/llm/inference.js +146 -0
- package/dist/llm/inference.js.map +1 -0
- package/dist/llm/inference.test.d.ts +8 -0
- package/dist/llm/inference.test.d.ts.map +1 -0
- package/dist/llm/inference.test.js +117 -0
- package/dist/llm/inference.test.js.map +1 -0
- package/dist/llm/types.d.ts +41 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +5 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/logger.d.ts +13 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +41 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp/api.d.ts +30 -0
- package/dist/mcp/api.d.ts.map +1 -0
- package/dist/mcp/api.js +150 -0
- package/dist/mcp/api.js.map +1 -0
- package/dist/mcp/helpers.d.ts +35 -0
- package/dist/mcp/helpers.d.ts.map +1 -0
- package/dist/mcp/helpers.js +152 -0
- package/dist/mcp/helpers.js.map +1 -0
- package/dist/mcp/helpers.test.d.ts +5 -0
- package/dist/mcp/helpers.test.d.ts.map +1 -0
- package/dist/mcp/helpers.test.js +487 -0
- package/dist/mcp/helpers.test.js.map +1 -0
- package/dist/mcp/index.d.ts +9 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +67 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/taxonomy.d.ts +38 -0
- package/dist/mcp/taxonomy.d.ts.map +1 -0
- package/dist/mcp/taxonomy.js +223 -0
- package/dist/mcp/taxonomy.js.map +1 -0
- package/dist/mcp/taxonomy.test.d.ts +5 -0
- package/dist/mcp/taxonomy.test.d.ts.map +1 -0
- package/dist/mcp/taxonomy.test.js +341 -0
- package/dist/mcp/taxonomy.test.js.map +1 -0
- package/dist/mcp/tools.d.ts +6 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +958 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +118 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +5 -0
- package/dist/mcp/types.js.map +1 -0
- package/package.json +56 -0
package/README.md
ADDED
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
# bikky
|
|
2
|
+
|
|
3
|
+
**Shared persistent memory for AI coding sessions.**
|
|
4
|
+
|
|
5
|
+
bikky gives your AI coding assistants (GitHub Copilot, Claude Code) long-term memory that persists across sessions. Facts, decisions, architecture knowledge, and entity relationships are stored in a vector database and recalled automatically.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Why bikky exists
|
|
10
|
+
|
|
11
|
+
Every engineering team builds institutional knowledge — the kind that doesn't live in documentation. Why that config value is what it is. Which deploy steps to run in which order. What broke last quarter and how it was fixed. Who owns what.
|
|
12
|
+
|
|
13
|
+
This knowledge lives in people's heads, scattered across chat threads, and buried in closed PRs. When someone switches projects or leaves, it's gone. It's the most valuable and least durable asset a technical organisation has.
|
|
14
|
+
|
|
15
|
+
### AI agents amplify the problem
|
|
16
|
+
|
|
17
|
+
AI coding agents are a force multiplier — teams ship more, explore more solutions, and touch more of the codebase than ever before. But that also means more decisions, more discoveries, and more institutional knowledge generated per day than any team can track manually. Some teams maintain hand-written knowledge bases to give agents context, but these drift quickly and become another thing to keep up to date. The knowledge that matters most — the things learned *during* sessions — still vanishes when the session closes.
|
|
18
|
+
|
|
19
|
+
### Knowledge that compounds
|
|
20
|
+
|
|
21
|
+
bikky captures what agents learn during coding sessions and makes it available to every future session — for every team member — automatically. No manual documentation. No wikis to maintain.
|
|
22
|
+
|
|
23
|
+
When one engineer's agent figures out a workaround for a tricky edge case, every agent on the team knows it from their next session onward. Each team member is amplified with the experience gathered by every other member. The 50th session on a codebase is dramatically more effective than the 1st — not because of better prompts, but because of accumulated institutional memory.
|
|
24
|
+
|
|
25
|
+
### Self-curating
|
|
26
|
+
|
|
27
|
+
Raw accumulation creates noise. bikky curates knowledge automatically:
|
|
28
|
+
|
|
29
|
+
- **Deduplication** — identical or near-identical facts are merged, not duplicated
|
|
30
|
+
- **Confidence decay** — old facts gradually lose weight and surface for review instead of being treated as gospel
|
|
31
|
+
- **Contradiction detection** — new facts that conflict with existing ones replace them, not silently coexist
|
|
32
|
+
- **Distillation** — recurring patterns across sessions are consolidated into higher-level insights
|
|
33
|
+
- **Entity graph** — relationships between concepts are inferred automatically for richer recall
|
|
34
|
+
|
|
35
|
+
### Zero maintenance
|
|
36
|
+
|
|
37
|
+
bikky is not a wiki you have to write. Facts are captured as a natural byproduct of engineering work. The curation pipeline runs autonomously. Install once, and every session gets smarter.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## How it works
|
|
42
|
+
|
|
43
|
+
```mermaid
|
|
44
|
+
graph TD
|
|
45
|
+
A["🤖 Copilot / Claude Code"] <-->|MCP stdio| B["bikky MCP Server"]
|
|
46
|
+
C["📁 Session logs<br/>~/.copilot/"] -->|events.jsonl| D["bikky Daemon<br/>(background)"]
|
|
47
|
+
B -->|store / recall| E[("🔮 Qdrant Cloud<br/>vector DB")]
|
|
48
|
+
D -->|embed + store| E
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**MCP Server** — 12 memory tools your AI assistant can call directly:
|
|
52
|
+
- `memory_store` / `memory_recall` — store and search facts
|
|
53
|
+
- `memory_entity` / `memory_relations` — entity knowledge graph
|
|
54
|
+
- `memory_forget` / `memory_verify` — lifecycle management
|
|
55
|
+
- `memory_session_summary` / `memory_distill` — session consolidation
|
|
56
|
+
- `memory_heartbeat` — periodic reflection nudges
|
|
57
|
+
|
|
58
|
+
**Daemon** — background process that passively reads session logs:
|
|
59
|
+
- Watches `~/.copilot/session-state/` for new events
|
|
60
|
+
- Extracts facts via LLM from conversation transcripts
|
|
61
|
+
- Runs consolidation (distillation, contradiction detection)
|
|
62
|
+
- Infers entity relationships from co-occurring facts
|
|
63
|
+
- Scans for stale facts that need verification
|
|
64
|
+
|
|
65
|
+
## Quick start
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Install globally
|
|
69
|
+
npm install -g bikky
|
|
70
|
+
|
|
71
|
+
# Add to your editor's MCP config
|
|
72
|
+
bikky install
|
|
73
|
+
|
|
74
|
+
# That's it — restart your editor and the memory tools appear
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Prerequisites
|
|
78
|
+
|
|
79
|
+
1. **Qdrant Cloud** (free tier: 1GB, no credit card)
|
|
80
|
+
- Sign up at [cloud.qdrant.io](https://cloud.qdrant.io)
|
|
81
|
+
- Create a cluster → copy the REST URL and API key
|
|
82
|
+
|
|
83
|
+
2. **Embedding provider** (one of):
|
|
84
|
+
- **Ollama** (default, runs locally, free) — `brew install ollama && ollama pull qwen3-embedding:0.6b`
|
|
85
|
+
- **OpenAI** — set `OPENAI_API_KEY` env var
|
|
86
|
+
- **AWS Bedrock** — configure AWS credentials
|
|
87
|
+
|
|
88
|
+
### Setup
|
|
89
|
+
|
|
90
|
+
After installing, configure your Qdrant credentials. You can either:
|
|
91
|
+
|
|
92
|
+
**Option A** — Let your AI assistant do it:
|
|
93
|
+
```
|
|
94
|
+
> Call configure_credentials with my Qdrant URL and API key
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Option B** — Edit config directly:
|
|
98
|
+
```bash
|
|
99
|
+
cat > ~/.bikky/config.json << 'EOF'
|
|
100
|
+
{
|
|
101
|
+
"qdrant_url": "https://your-cluster.cloud.qdrant.io:6333",
|
|
102
|
+
"qdrant_api_key": "your-api-key-here"
|
|
103
|
+
}
|
|
104
|
+
EOF
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Option C** — Environment variables:
|
|
108
|
+
```bash
|
|
109
|
+
export QDRANT_URL="https://your-cluster.cloud.qdrant.io:6333"
|
|
110
|
+
export QDRANT_API_KEY="your-api-key-here"
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Configuration
|
|
114
|
+
|
|
115
|
+
Config lives at `~/.bikky/config.json`. Resolution order: **defaults → config file → env vars** (highest wins).
|
|
116
|
+
|
|
117
|
+
### Qdrant (required)
|
|
118
|
+
|
|
119
|
+
| Setting | Env var | Default | Description |
|
|
120
|
+
|---------|---------|---------|-------------|
|
|
121
|
+
| `qdrant_url` | `QDRANT_URL` | *none — must be set* | Qdrant REST URL, e.g. `https://abc123.cloud.qdrant.io:6333` |
|
|
122
|
+
| `qdrant_api_key` | `QDRANT_API_KEY` | *none — must be set* | Qdrant API key from cluster dashboard |
|
|
123
|
+
| `collection` | `BIKKY_COLLECTION` | `bikky` | Collection name. Change only if running multiple instances |
|
|
124
|
+
|
|
125
|
+
### Embedding & LLM providers
|
|
126
|
+
|
|
127
|
+
Both `embedding.provider` and `llm.provider` accept exactly one of three values:
|
|
128
|
+
|
|
129
|
+
| Value | What it is | Auth needed | `base_url` used? |
|
|
130
|
+
|-------|-----------|-------------|-----------------|
|
|
131
|
+
| `ollama` | Local Ollama server | None | ✅ default `http://localhost:11434` |
|
|
132
|
+
| `openai` | OpenAI-compatible API | `api_key` or `OPENAI_API_KEY` | ✅ default `https://api.openai.com/v1` |
|
|
133
|
+
| `bedrock` | AWS Bedrock | AWS credentials (env or IAM role) | ❌ uses AWS SDK |
|
|
134
|
+
|
|
135
|
+
> **⚠️ Only these three values are valid.** Any other value will cause a silent fallback to Ollama.
|
|
136
|
+
|
|
137
|
+
### Embedding config
|
|
138
|
+
|
|
139
|
+
| Setting | Env var | Default |
|
|
140
|
+
|---------|---------|---------|
|
|
141
|
+
| `embedding.provider` | `EMBEDDING_PROVIDER` | `ollama` |
|
|
142
|
+
| `embedding.model` | `EMBEDDING_MODEL` | `qwen3-embedding:0.6b` |
|
|
143
|
+
| `embedding.dimensions` | `EMBEDDING_DIMENSIONS` | `1024` |
|
|
144
|
+
| `embedding.base_url` | `EMBEDDING_BASE_URL` | `http://localhost:11434` |
|
|
145
|
+
| `embedding.api_key` | `OPENAI_API_KEY` | — |
|
|
146
|
+
|
|
147
|
+
**Models by provider:**
|
|
148
|
+
|
|
149
|
+
| Provider | Recommended models | Dimensions |
|
|
150
|
+
|----------|-------------------|------------|
|
|
151
|
+
| `ollama` | `qwen3-embedding:0.6b`, `nomic-embed-text` | `1024`, `768` |
|
|
152
|
+
| `openai` | `text-embedding-3-small`, `text-embedding-3-large` | `1536`, `3072` |
|
|
153
|
+
| `bedrock` | `amazon.titan-embed-text-v2:0` | `1024` |
|
|
154
|
+
|
|
155
|
+
> **⚠️ `dimensions` must match your model's output.** Mismatched dimensions will cause Qdrant insert errors. If you change the model, update dimensions too.
|
|
156
|
+
|
|
157
|
+
### LLM config (used by daemon for extraction & consolidation)
|
|
158
|
+
|
|
159
|
+
| Setting | Env var | Default |
|
|
160
|
+
|---------|---------|---------|
|
|
161
|
+
| `llm.provider` | `LLM_PROVIDER` | `ollama` |
|
|
162
|
+
| `llm.model` | `LLM_MODEL` | `qwen2.5:7b` |
|
|
163
|
+
| `llm.base_url` | `LLM_BASE_URL` | `http://localhost:11434` |
|
|
164
|
+
| `llm.api_key` | `OPENAI_API_KEY` | — |
|
|
165
|
+
| `llm.bedrock_region` | `AWS_BEDROCK_REGION` | `us-east-1` |
|
|
166
|
+
|
|
167
|
+
**Models by provider:**
|
|
168
|
+
|
|
169
|
+
| Provider | Recommended models |
|
|
170
|
+
|----------|-------------------|
|
|
171
|
+
| `ollama` | `qwen2.5:7b`, `llama3.1:8b`, or any local model |
|
|
172
|
+
| `openai` | `gpt-4.1-mini`, `gpt-4.1` |
|
|
173
|
+
| `bedrock` | `anthropic.claude-3-5-haiku-20241022-v1:0` |
|
|
174
|
+
|
|
175
|
+
> `llm.bedrock_region` falls back to `AWS_REGION` if `AWS_BEDROCK_REGION` is not set.
|
|
176
|
+
|
|
177
|
+
### Provider auth quick-reference
|
|
178
|
+
|
|
179
|
+
| Provider | What to set |
|
|
180
|
+
|----------|------------|
|
|
181
|
+
| `ollama` | Nothing — just have Ollama running locally (`ollama serve`) |
|
|
182
|
+
| `openai` | `OPENAI_API_KEY` env var **or** `"api_key": "sk-..."` in the embedding/llm config block |
|
|
183
|
+
| `bedrock` | `AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY` env vars, or an IAM instance role |
|
|
184
|
+
|
|
185
|
+
### Copy-paste examples
|
|
186
|
+
|
|
187
|
+
**Ollama (default — zero config):**
|
|
188
|
+
```json
|
|
189
|
+
{
|
|
190
|
+
"qdrant_url": "https://your-cluster.cloud.qdrant.io:6333",
|
|
191
|
+
"qdrant_api_key": "your-key"
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**OpenAI embeddings + LLM:**
|
|
196
|
+
```json
|
|
197
|
+
{
|
|
198
|
+
"qdrant_url": "https://your-cluster.cloud.qdrant.io:6333",
|
|
199
|
+
"qdrant_api_key": "your-key",
|
|
200
|
+
"embedding": {
|
|
201
|
+
"provider": "openai",
|
|
202
|
+
"model": "text-embedding-3-small",
|
|
203
|
+
"dimensions": 1536,
|
|
204
|
+
"api_key": "sk-..."
|
|
205
|
+
},
|
|
206
|
+
"llm": {
|
|
207
|
+
"provider": "openai",
|
|
208
|
+
"model": "gpt-4.1-mini",
|
|
209
|
+
"api_key": "sk-..."
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**AWS Bedrock:**
|
|
215
|
+
```json
|
|
216
|
+
{
|
|
217
|
+
"qdrant_url": "https://your-cluster.cloud.qdrant.io:6333",
|
|
218
|
+
"qdrant_api_key": "your-key",
|
|
219
|
+
"embedding": {
|
|
220
|
+
"provider": "bedrock",
|
|
221
|
+
"model": "amazon.titan-embed-text-v2:0",
|
|
222
|
+
"dimensions": 1024
|
|
223
|
+
},
|
|
224
|
+
"llm": {
|
|
225
|
+
"provider": "bedrock",
|
|
226
|
+
"model": "anthropic.claude-3-5-haiku-20241022-v1:0",
|
|
227
|
+
"bedrock_region": "us-east-1"
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Daemon settings
|
|
233
|
+
|
|
234
|
+
| Setting | Default | Description |
|
|
235
|
+
|---------|---------|-------------|
|
|
236
|
+
| `daemon.tick_interval_sec` | `5` | Seconds between daemon loop ticks |
|
|
237
|
+
| `daemon.extract_every_sec` | `300` | Seconds between extraction runs |
|
|
238
|
+
| `daemon.extract_min_events` | `5` | Minimum session events before triggering extraction |
|
|
239
|
+
| `daemon.consolidation_enabled` | `true` | Auto-distill session summaries into patterns |
|
|
240
|
+
| `daemon.relation_inference_enabled` | `true` | Infer entity relationships via LLM |
|
|
241
|
+
| `daemon.staleness_threshold_days` | `30` | Days before a fact is flagged as stale |
|
|
242
|
+
|
|
243
|
+
### Watcher settings
|
|
244
|
+
|
|
245
|
+
| Setting | Default | Description |
|
|
246
|
+
|---------|---------|-------------|
|
|
247
|
+
| `watchers.copilot.enabled` | `true` | Watch GitHub Copilot session logs |
|
|
248
|
+
| `watchers.copilot.path` | `~/.copilot/session-state` | Path to Copilot session directory |
|
|
249
|
+
| `watchers.claude.enabled` | `false` | Watch Claude Code project logs |
|
|
250
|
+
| `watchers.claude.path` | `~/.claude/projects` | Path to Claude Code projects directory |
|
|
251
|
+
|
|
252
|
+
## CLI Commands
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
bikky mcp # Start MCP server (stdio) — used by editors
|
|
256
|
+
bikky setup # Interactive setup wizard
|
|
257
|
+
bikky status # Check memory system status
|
|
258
|
+
bikky install # Write MCP config for Copilot + Claude Code
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Memory architecture
|
|
262
|
+
|
|
263
|
+
### Deduplication
|
|
264
|
+
|
|
265
|
+
Two-layer dedup prevents bloat:
|
|
266
|
+
|
|
267
|
+
```mermaid
|
|
268
|
+
flowchart TD
|
|
269
|
+
A[New fact] --> B{SHA-256<br/>content hash}
|
|
270
|
+
B -->|exact match| C[Skip — duplicate]
|
|
271
|
+
B -->|no match| D{Vector<br/>similarity}
|
|
272
|
+
D -->|"> 0.92"| E["Reinforce existing<br/>(bump count)"]
|
|
273
|
+
D -->|"> 0.80"| F[Store + flag<br/>as related]
|
|
274
|
+
D -->|"< 0.80"| G[Store as new]
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Ranking formula
|
|
278
|
+
Facts are ranked using a combined score:
|
|
279
|
+
```
|
|
280
|
+
(vectorScore × 0.55 + freshness × 0.15 + reinforcement × 0.1 + importance × 0.1)
|
|
281
|
+
× (0.7 + 0.3 × confidenceDecay)
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Entity knowledge graph
|
|
285
|
+
|
|
286
|
+
Facts mentioning multiple entities build an implicit graph:
|
|
287
|
+
|
|
288
|
+
```mermaid
|
|
289
|
+
graph LR
|
|
290
|
+
subgraph "Entity Graph"
|
|
291
|
+
U(user) -->|owns| P(project-x)
|
|
292
|
+
U -->|uses| Q(qdrant)
|
|
293
|
+
P -->|depends-on| Q
|
|
294
|
+
U -->|prefers| D(dark mode)
|
|
295
|
+
end
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
The daemon periodically:
|
|
299
|
+
1. Scrolls all facts → builds entity co-occurrence map
|
|
300
|
+
2. For top pairs by shared-fact count → LLM infers relationship type
|
|
301
|
+
3. Stores typed edges (e.g., `user --[owns]--> project-x`)
|
|
302
|
+
|
|
303
|
+
### Consolidation pipeline
|
|
304
|
+
|
|
305
|
+
```mermaid
|
|
306
|
+
flowchart LR
|
|
307
|
+
A[Session<br/>summaries] --> B{5+ summaries?}
|
|
308
|
+
B -->|yes| C[Auto-distill]
|
|
309
|
+
C --> D[Distilled<br/>patterns]
|
|
310
|
+
E[All facts] --> F[Contradiction<br/>detection]
|
|
311
|
+
F --> G[Flagged for<br/>review]
|
|
312
|
+
E --> H[Staleness<br/>scan]
|
|
313
|
+
H --> I["Stale facts<br/>(30+ days)"]
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
- **Auto-distill** — merges 5+ session summaries into distilled patterns
|
|
317
|
+
- **Contradiction detection** — flags conflicting facts for review
|
|
318
|
+
- **Category rebalancing** — consolidates oversized categories
|
|
319
|
+
- **Staleness scanning** — surfaces facts that haven't been verified in 30+ days
|
|
320
|
+
|
|
321
|
+
## License
|
|
322
|
+
|
|
323
|
+
AGPL-3.0 — see [LICENSE](LICENSE).
|
package/bin/bikky.js
ADDED
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bikky CLI — setup, start MCP server, manage daemon.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* bikky mcp — start MCP server (stdio, for editor integration)
|
|
6
|
+
* bikky daemon — start background daemon (extraction, consolidation, etc.)
|
|
7
|
+
* bikky setup — interactive setup wizard
|
|
8
|
+
* bikky status — check memory system status
|
|
9
|
+
* bikky install — write MCP config for Copilot / Claude Code
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bikky CLI — setup, start MCP server, manage daemon.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* bikky mcp — start MCP server (stdio, for editor integration)
|
|
6
|
+
* bikky daemon — start background daemon (extraction, consolidation, etc.)
|
|
7
|
+
* bikky setup — interactive setup wizard
|
|
8
|
+
* bikky status — check memory system status
|
|
9
|
+
* bikky install — write MCP config for Copilot / Claude Code
|
|
10
|
+
*/
|
|
11
|
+
import { startMcpServer } from "./mcp/index.js";
|
|
12
|
+
const command = process.argv[2] ?? "mcp";
|
|
13
|
+
async function main() {
|
|
14
|
+
switch (command) {
|
|
15
|
+
case "mcp":
|
|
16
|
+
await startMcpServer();
|
|
17
|
+
break;
|
|
18
|
+
case "daemon": {
|
|
19
|
+
const daemon = await import("./daemon/index.js");
|
|
20
|
+
console.log("🧠 bikky daemon starting…");
|
|
21
|
+
await daemon.startDaemon();
|
|
22
|
+
process.on("SIGINT", () => {
|
|
23
|
+
daemon.stopDaemon();
|
|
24
|
+
process.exit(0);
|
|
25
|
+
});
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
case "setup":
|
|
29
|
+
console.log("🧠 bikky setup");
|
|
30
|
+
console.log("Run `bikky install` to add to your editor's MCP config.");
|
|
31
|
+
console.log("Then call configure_credentials from your editor to set up Qdrant.");
|
|
32
|
+
break;
|
|
33
|
+
case "status":
|
|
34
|
+
console.log("🧠 bikky status — use get_setup_status via MCP for full details.");
|
|
35
|
+
break;
|
|
36
|
+
case "install": {
|
|
37
|
+
const { writeInstallConfig } = await import("./install.js");
|
|
38
|
+
await writeInstallConfig();
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
default:
|
|
42
|
+
console.error(`Unknown command: ${command}`);
|
|
43
|
+
console.error("Usage: bikky [mcp|daemon|setup|status|install]");
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
main().catch((e) => {
|
|
48
|
+
console.error("Fatal:", e instanceof Error ? e.message : String(e));
|
|
49
|
+
process.exit(1);
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;AAEzC,KAAK,UAAU,IAAI;IACjB,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,KAAK;YACR,MAAM,cAAc,EAAE,CAAC;YACvB,MAAM;QAER,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACxB,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YACH,MAAM;QACR,CAAC;QAED,KAAK,OAAO;YACV,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;YAClF,MAAM;QAER,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;YAChF,MAAM;QAER,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YAC5D,MAAM,kBAAkB,EAAE,CAAC;YAC3B,MAAM;QACR,CAAC;QAED;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;IAC1B,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for bikky.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order: defaults → ~/.bikky/config.json → env vars.
|
|
5
|
+
* Config directory: ~/.bikky/
|
|
6
|
+
*/
|
|
7
|
+
export declare const BIKKY_DIR: string;
|
|
8
|
+
export declare const CONFIG_PATH: string;
|
|
9
|
+
export declare const LOG_DIR: string;
|
|
10
|
+
export declare const STATE_DIR: string;
|
|
11
|
+
export interface EmbeddingConfig {
|
|
12
|
+
provider: "ollama" | "openai" | "bedrock";
|
|
13
|
+
model: string;
|
|
14
|
+
dimensions: number;
|
|
15
|
+
base_url: string;
|
|
16
|
+
api_key: string | null;
|
|
17
|
+
}
|
|
18
|
+
export interface LLMConfig {
|
|
19
|
+
provider: "ollama" | "openai" | "bedrock";
|
|
20
|
+
model: string;
|
|
21
|
+
base_url: string;
|
|
22
|
+
api_key: string | null;
|
|
23
|
+
bedrock_region: string;
|
|
24
|
+
}
|
|
25
|
+
export interface DaemonConfig {
|
|
26
|
+
tick_interval_sec: number;
|
|
27
|
+
extract_every_sec: number;
|
|
28
|
+
extract_min_events: number;
|
|
29
|
+
consolidation_enabled: boolean;
|
|
30
|
+
relation_inference_enabled: boolean;
|
|
31
|
+
staleness_threshold_days: number;
|
|
32
|
+
}
|
|
33
|
+
export interface WatcherConfig {
|
|
34
|
+
copilot: {
|
|
35
|
+
enabled: boolean;
|
|
36
|
+
path: string;
|
|
37
|
+
};
|
|
38
|
+
claude: {
|
|
39
|
+
enabled: boolean;
|
|
40
|
+
path: string;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export interface BikkyConfig {
|
|
44
|
+
qdrant_url: string | null;
|
|
45
|
+
qdrant_api_key: string | null;
|
|
46
|
+
collection: string;
|
|
47
|
+
embedding: EmbeddingConfig;
|
|
48
|
+
llm: LLMConfig;
|
|
49
|
+
daemon: DaemonConfig;
|
|
50
|
+
watchers: WatcherConfig;
|
|
51
|
+
}
|
|
52
|
+
declare const DEFAULTS: BikkyConfig;
|
|
53
|
+
export declare function loadConfig(): BikkyConfig;
|
|
54
|
+
/** Save config to disk (used by setup command). */
|
|
55
|
+
export declare function saveConfig(config: BikkyConfig): void;
|
|
56
|
+
/** Reset cached config (for testing). */
|
|
57
|
+
export declare function resetConfig(): void;
|
|
58
|
+
export { DEFAULTS as CONFIG_DEFAULTS };
|
|
59
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,eAAO,MAAM,SAAS,QAAoC,CAAC;AAC3D,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,OAAO,QAA+B,CAAC;AACpD,eAAO,MAAM,SAAS,QAAgC,CAAC;AAMvD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,0BAA0B,EAAE,OAAO,CAAC;IACpC,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,eAAe,CAAC;IAC3B,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAMD,QAAA,MAAM,QAAQ,EAAE,WA8Bf,CAAC;AA0BF,wBAAgB,UAAU,IAAI,WAAW,CAgDxC;AAED,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAIpD;AAED,yCAAyC;AACzC,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,CAAC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for bikky.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order: defaults → ~/.bikky/config.json → env vars.
|
|
5
|
+
* Config directory: ~/.bikky/
|
|
6
|
+
*/
|
|
7
|
+
import fs from "node:fs";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import os from "node:os";
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Paths
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
export const BIKKY_DIR = path.join(os.homedir(), ".bikky");
|
|
14
|
+
export const CONFIG_PATH = path.join(BIKKY_DIR, "config.json");
|
|
15
|
+
export const LOG_DIR = path.join(BIKKY_DIR, "logs");
|
|
16
|
+
export const STATE_DIR = path.join(BIKKY_DIR, "state");
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Defaults
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
const DEFAULTS = {
|
|
21
|
+
qdrant_url: null,
|
|
22
|
+
qdrant_api_key: null,
|
|
23
|
+
collection: "bikky",
|
|
24
|
+
embedding: {
|
|
25
|
+
provider: "ollama",
|
|
26
|
+
model: "qwen3-embedding:0.6b",
|
|
27
|
+
dimensions: 1024,
|
|
28
|
+
base_url: "http://localhost:11434",
|
|
29
|
+
api_key: null,
|
|
30
|
+
},
|
|
31
|
+
llm: {
|
|
32
|
+
provider: "ollama",
|
|
33
|
+
model: "qwen2.5:7b",
|
|
34
|
+
base_url: "http://localhost:11434",
|
|
35
|
+
api_key: null,
|
|
36
|
+
bedrock_region: "us-east-1",
|
|
37
|
+
},
|
|
38
|
+
daemon: {
|
|
39
|
+
tick_interval_sec: 5,
|
|
40
|
+
extract_every_sec: 300,
|
|
41
|
+
extract_min_events: 5,
|
|
42
|
+
consolidation_enabled: true,
|
|
43
|
+
relation_inference_enabled: true,
|
|
44
|
+
staleness_threshold_days: 30,
|
|
45
|
+
},
|
|
46
|
+
watchers: {
|
|
47
|
+
copilot: { enabled: true, path: path.join(os.homedir(), ".copilot", "session-state") },
|
|
48
|
+
claude: { enabled: false, path: path.join(os.homedir(), ".claude", "projects") },
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
// Deep merge utility
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
function deepMerge(base, override) {
|
|
55
|
+
const result = { ...base };
|
|
56
|
+
for (const key of Object.keys(override)) {
|
|
57
|
+
const bVal = base[key];
|
|
58
|
+
const oVal = override[key];
|
|
59
|
+
if (bVal && typeof bVal === "object" && !Array.isArray(bVal) && oVal && typeof oVal === "object" && !Array.isArray(oVal)) {
|
|
60
|
+
result[key] = deepMerge(bVal, oVal);
|
|
61
|
+
}
|
|
62
|
+
else if (oVal !== undefined) {
|
|
63
|
+
result[key] = oVal;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Load config
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
let _config = null;
|
|
72
|
+
export function loadConfig() {
|
|
73
|
+
if (_config)
|
|
74
|
+
return _config;
|
|
75
|
+
// Ensure dirs exist
|
|
76
|
+
fs.mkdirSync(BIKKY_DIR, { recursive: true });
|
|
77
|
+
fs.mkdirSync(LOG_DIR, { recursive: true });
|
|
78
|
+
fs.mkdirSync(STATE_DIR, { recursive: true });
|
|
79
|
+
// Start from defaults
|
|
80
|
+
let config = structuredClone(DEFAULTS);
|
|
81
|
+
// Merge config file
|
|
82
|
+
if (fs.existsSync(CONFIG_PATH)) {
|
|
83
|
+
try {
|
|
84
|
+
const fileConfig = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8"));
|
|
85
|
+
config = deepMerge(config, fileConfig);
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
console.error(`bikky: failed to parse ${CONFIG_PATH}: ${e instanceof Error ? e.message : String(e)}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Env var overrides (highest priority)
|
|
92
|
+
if (process.env.QDRANT_URL)
|
|
93
|
+
config.qdrant_url = process.env.QDRANT_URL;
|
|
94
|
+
if (process.env.QDRANT_API_KEY)
|
|
95
|
+
config.qdrant_api_key = process.env.QDRANT_API_KEY;
|
|
96
|
+
if (process.env.BIKKY_COLLECTION)
|
|
97
|
+
config.collection = process.env.BIKKY_COLLECTION;
|
|
98
|
+
// Embedding env overrides
|
|
99
|
+
if (process.env.EMBEDDING_PROVIDER)
|
|
100
|
+
config.embedding.provider = process.env.EMBEDDING_PROVIDER;
|
|
101
|
+
if (process.env.EMBEDDING_MODEL)
|
|
102
|
+
config.embedding.model = process.env.EMBEDDING_MODEL;
|
|
103
|
+
if (process.env.EMBEDDING_BASE_URL)
|
|
104
|
+
config.embedding.base_url = process.env.EMBEDDING_BASE_URL;
|
|
105
|
+
if (process.env.EMBEDDING_DIMENSIONS)
|
|
106
|
+
config.embedding.dimensions = parseInt(process.env.EMBEDDING_DIMENSIONS, 10);
|
|
107
|
+
if (process.env.OPENAI_API_KEY)
|
|
108
|
+
config.embedding.api_key = process.env.OPENAI_API_KEY;
|
|
109
|
+
// LLM env overrides
|
|
110
|
+
if (process.env.LLM_PROVIDER)
|
|
111
|
+
config.llm.provider = process.env.LLM_PROVIDER;
|
|
112
|
+
if (process.env.LLM_MODEL)
|
|
113
|
+
config.llm.model = process.env.LLM_MODEL;
|
|
114
|
+
if (process.env.LLM_BASE_URL)
|
|
115
|
+
config.llm.base_url = process.env.LLM_BASE_URL;
|
|
116
|
+
if (process.env.OPENAI_API_KEY && !config.llm.api_key)
|
|
117
|
+
config.llm.api_key = process.env.OPENAI_API_KEY;
|
|
118
|
+
if (process.env.AWS_BEDROCK_REGION)
|
|
119
|
+
config.llm.bedrock_region = process.env.AWS_BEDROCK_REGION;
|
|
120
|
+
if (process.env.AWS_REGION && !process.env.AWS_BEDROCK_REGION)
|
|
121
|
+
config.llm.bedrock_region = process.env.AWS_REGION;
|
|
122
|
+
// Strip trailing slashes from URLs
|
|
123
|
+
if (config.qdrant_url)
|
|
124
|
+
config.qdrant_url = config.qdrant_url.replace(/\/+$/, "");
|
|
125
|
+
config.embedding.base_url = config.embedding.base_url.replace(/\/+$/, "");
|
|
126
|
+
config.llm.base_url = config.llm.base_url.replace(/\/+$/, "");
|
|
127
|
+
_config = config;
|
|
128
|
+
return config;
|
|
129
|
+
}
|
|
130
|
+
/** Save config to disk (used by setup command). */
|
|
131
|
+
export function saveConfig(config) {
|
|
132
|
+
fs.mkdirSync(BIKKY_DIR, { recursive: true });
|
|
133
|
+
fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + "\n");
|
|
134
|
+
_config = config;
|
|
135
|
+
}
|
|
136
|
+
/** Reset cached config (for testing). */
|
|
137
|
+
export function resetConfig() {
|
|
138
|
+
_config = null;
|
|
139
|
+
}
|
|
140
|
+
export { DEFAULTS as CONFIG_DEFAULTS };
|
|
141
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|