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.
Files changed (124) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +323 -0
  3. package/bin/bikky.js +6 -0
  4. package/dist/cli.d.ts +12 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +51 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/config.d.ts +59 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +141 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/config.test.d.ts +8 -0
  13. package/dist/config.test.d.ts.map +1 -0
  14. package/dist/config.test.js +449 -0
  15. package/dist/config.test.js.map +1 -0
  16. package/dist/daemon/consolidation.d.ts +60 -0
  17. package/dist/daemon/consolidation.d.ts.map +1 -0
  18. package/dist/daemon/consolidation.js +448 -0
  19. package/dist/daemon/consolidation.js.map +1 -0
  20. package/dist/daemon/extraction.d.ts +17 -0
  21. package/dist/daemon/extraction.d.ts.map +1 -0
  22. package/dist/daemon/extraction.js +465 -0
  23. package/dist/daemon/extraction.js.map +1 -0
  24. package/dist/daemon/index.d.ts +3 -0
  25. package/dist/daemon/index.d.ts.map +1 -0
  26. package/dist/daemon/index.js +3 -0
  27. package/dist/daemon/index.js.map +1 -0
  28. package/dist/daemon/loop.d.ts +3 -0
  29. package/dist/daemon/loop.d.ts.map +1 -0
  30. package/dist/daemon/loop.js +93 -0
  31. package/dist/daemon/loop.js.map +1 -0
  32. package/dist/daemon/qdrant.d.ts +103 -0
  33. package/dist/daemon/qdrant.d.ts.map +1 -0
  34. package/dist/daemon/qdrant.js +273 -0
  35. package/dist/daemon/qdrant.js.map +1 -0
  36. package/dist/daemon/qdrant.test.d.ts +8 -0
  37. package/dist/daemon/qdrant.test.d.ts.map +1 -0
  38. package/dist/daemon/qdrant.test.js +209 -0
  39. package/dist/daemon/qdrant.test.js.map +1 -0
  40. package/dist/daemon/relations.d.ts +54 -0
  41. package/dist/daemon/relations.d.ts.map +1 -0
  42. package/dist/daemon/relations.js +290 -0
  43. package/dist/daemon/relations.js.map +1 -0
  44. package/dist/daemon/staleness.d.ts +24 -0
  45. package/dist/daemon/staleness.d.ts.map +1 -0
  46. package/dist/daemon/staleness.js +63 -0
  47. package/dist/daemon/staleness.js.map +1 -0
  48. package/dist/daemon/watcher.d.ts +11 -0
  49. package/dist/daemon/watcher.d.ts.map +1 -0
  50. package/dist/daemon/watcher.js +38 -0
  51. package/dist/daemon/watcher.js.map +1 -0
  52. package/dist/daemon/watcher.test.d.ts +8 -0
  53. package/dist/daemon/watcher.test.d.ts.map +1 -0
  54. package/dist/daemon/watcher.test.js +214 -0
  55. package/dist/daemon/watcher.test.js.map +1 -0
  56. package/dist/install.d.ts +5 -0
  57. package/dist/install.d.ts.map +1 -0
  58. package/dist/install.js +49 -0
  59. package/dist/install.js.map +1 -0
  60. package/dist/install.test.d.ts +9 -0
  61. package/dist/install.test.d.ts.map +1 -0
  62. package/dist/install.test.js +126 -0
  63. package/dist/install.test.js.map +1 -0
  64. package/dist/llm/embedding.d.ts +13 -0
  65. package/dist/llm/embedding.d.ts.map +1 -0
  66. package/dist/llm/embedding.js +127 -0
  67. package/dist/llm/embedding.js.map +1 -0
  68. package/dist/llm/embedding.test.d.ts +8 -0
  69. package/dist/llm/embedding.test.d.ts.map +1 -0
  70. package/dist/llm/embedding.test.js +117 -0
  71. package/dist/llm/embedding.test.js.map +1 -0
  72. package/dist/llm/index.d.ts +4 -0
  73. package/dist/llm/index.d.ts.map +1 -0
  74. package/dist/llm/index.js +3 -0
  75. package/dist/llm/index.js.map +1 -0
  76. package/dist/llm/inference.d.ts +12 -0
  77. package/dist/llm/inference.d.ts.map +1 -0
  78. package/dist/llm/inference.js +146 -0
  79. package/dist/llm/inference.js.map +1 -0
  80. package/dist/llm/inference.test.d.ts +8 -0
  81. package/dist/llm/inference.test.d.ts.map +1 -0
  82. package/dist/llm/inference.test.js +117 -0
  83. package/dist/llm/inference.test.js.map +1 -0
  84. package/dist/llm/types.d.ts +41 -0
  85. package/dist/llm/types.d.ts.map +1 -0
  86. package/dist/llm/types.js +5 -0
  87. package/dist/llm/types.js.map +1 -0
  88. package/dist/logger.d.ts +13 -0
  89. package/dist/logger.d.ts.map +1 -0
  90. package/dist/logger.js +41 -0
  91. package/dist/logger.js.map +1 -0
  92. package/dist/mcp/api.d.ts +30 -0
  93. package/dist/mcp/api.d.ts.map +1 -0
  94. package/dist/mcp/api.js +150 -0
  95. package/dist/mcp/api.js.map +1 -0
  96. package/dist/mcp/helpers.d.ts +35 -0
  97. package/dist/mcp/helpers.d.ts.map +1 -0
  98. package/dist/mcp/helpers.js +152 -0
  99. package/dist/mcp/helpers.js.map +1 -0
  100. package/dist/mcp/helpers.test.d.ts +5 -0
  101. package/dist/mcp/helpers.test.d.ts.map +1 -0
  102. package/dist/mcp/helpers.test.js +487 -0
  103. package/dist/mcp/helpers.test.js.map +1 -0
  104. package/dist/mcp/index.d.ts +9 -0
  105. package/dist/mcp/index.d.ts.map +1 -0
  106. package/dist/mcp/index.js +67 -0
  107. package/dist/mcp/index.js.map +1 -0
  108. package/dist/mcp/taxonomy.d.ts +38 -0
  109. package/dist/mcp/taxonomy.d.ts.map +1 -0
  110. package/dist/mcp/taxonomy.js +223 -0
  111. package/dist/mcp/taxonomy.js.map +1 -0
  112. package/dist/mcp/taxonomy.test.d.ts +5 -0
  113. package/dist/mcp/taxonomy.test.d.ts.map +1 -0
  114. package/dist/mcp/taxonomy.test.js +341 -0
  115. package/dist/mcp/taxonomy.test.js.map +1 -0
  116. package/dist/mcp/tools.d.ts +6 -0
  117. package/dist/mcp/tools.d.ts.map +1 -0
  118. package/dist/mcp/tools.js +958 -0
  119. package/dist/mcp/tools.js.map +1 -0
  120. package/dist/mcp/types.d.ts +118 -0
  121. package/dist/mcp/types.d.ts.map +1 -0
  122. package/dist/mcp/types.js +5 -0
  123. package/dist/mcp/types.js.map +1 -0
  124. 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
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import("../dist/cli.js").catch((e) => {
3
+ console.error("bikky: failed to load —", e.message);
4
+ console.error("Run `npm run build` first if developing locally.");
5
+ process.exit(1);
6
+ });
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
@@ -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"}
@@ -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,8 @@
1
+ /**
2
+ * Tests for the config system.
3
+ *
4
+ * Strategy: we backup/restore ~/.bikky/config.json around file-based tests
5
+ * and use env var overrides + resetConfig() for env-var tests.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}