bikky 0.4.2 → 0.4.4

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 (62) hide show
  1. package/README.md +64 -37
  2. package/dist/config.d.ts +15 -1
  3. package/dist/config.js +116 -20
  4. package/dist/daemon/capture-policy.d.ts +0 -1
  5. package/dist/daemon/capture-policy.js +0 -2
  6. package/dist/daemon/consolidation.d.ts +2 -1
  7. package/dist/daemon/consolidation.js +32 -15
  8. package/dist/daemon/entity-typing.js +10 -0
  9. package/dist/daemon/episode-summary.d.ts +4 -0
  10. package/dist/daemon/episode-summary.js +39 -8
  11. package/dist/daemon/extraction.d.ts +2 -2
  12. package/dist/daemon/extraction.js +65 -22
  13. package/dist/daemon/loop.js +8 -0
  14. package/dist/daemon/maintenance-state.d.ts +1 -1
  15. package/dist/daemon/maintenance-state.js +2 -0
  16. package/dist/daemon/qdrant.d.ts +32 -10
  17. package/dist/daemon/qdrant.js +199 -60
  18. package/dist/daemon/quality-rollups.d.ts +51 -0
  19. package/dist/daemon/quality-rollups.js +378 -0
  20. package/dist/daemon/relations.d.ts +3 -3
  21. package/dist/daemon/relations.js +28 -16
  22. package/dist/daemon/session-index.d.ts +5 -0
  23. package/dist/daemon/session-index.js +36 -9
  24. package/dist/daemon/session-summary.d.ts +3 -0
  25. package/dist/daemon/session-summary.js +48 -15
  26. package/dist/daemon/staleness.js +3 -3
  27. package/dist/daemon/transcript-sources.js +3 -2
  28. package/dist/daemon/watcher.js +2 -0
  29. package/dist/daemon/workstream-summary.d.ts +4 -0
  30. package/dist/daemon/workstream-summary.js +58 -16
  31. package/dist/install.d.ts +11 -0
  32. package/dist/install.js +38 -0
  33. package/dist/lifecycle.js +7 -5
  34. package/dist/llm/embedding/index.js +2 -1
  35. package/dist/llm/embedding/providers/openai.js +8 -2
  36. package/dist/llm/embedding/providers/portkey.js +9 -2
  37. package/dist/llm/inference/index.js +2 -1
  38. package/dist/llm/util.d.ts +12 -0
  39. package/dist/llm/util.js +18 -0
  40. package/dist/mcp/helpers.d.ts +8 -0
  41. package/dist/mcp/helpers.js +36 -3
  42. package/dist/mcp/taxonomy.d.ts +9 -13
  43. package/dist/mcp/taxonomy.js +59 -42
  44. package/dist/mcp/tools.js +351 -83
  45. package/dist/mcp/types.d.ts +35 -0
  46. package/dist/package-verifier.d.ts +19 -0
  47. package/dist/package-verifier.js +83 -0
  48. package/dist/prompts/brief.d.ts +2 -2
  49. package/dist/prompts/brief.js +0 -1
  50. package/dist/prompts/extraction.js +9 -11
  51. package/dist/provenance/origin.d.ts +57 -0
  52. package/dist/provenance/origin.js +254 -0
  53. package/dist/routing-context.d.ts +16 -0
  54. package/dist/routing-context.js +55 -0
  55. package/dist/status.d.ts +1 -0
  56. package/dist/status.js +7 -1
  57. package/docs/config/fully-hosted.md +33 -13
  58. package/docs/config/hosted-models.md +33 -13
  59. package/docs/config/hosted-qdrant-local-models.md +1 -0
  60. package/docs/config/local.md +1 -0
  61. package/docs/configuration.md +42 -17
  62. package/package.json +2 -2
package/dist/status.js CHANGED
@@ -235,13 +235,18 @@ function collectMaintenanceStatus() {
235
235
  last_summary: job.last_summary,
236
236
  };
237
237
  };
238
- const summaries = [state.jobs.relation_inference.last_summary, state.jobs.entity_typing.last_summary];
238
+ const summaries = [
239
+ state.jobs.relation_inference.last_summary,
240
+ state.jobs.entity_typing.last_summary,
241
+ state.jobs.memory_quality_rollups.last_summary,
242
+ ];
239
243
  const hasError = summaries.some((summary) => summary?.status === "error");
240
244
  return {
241
245
  status: hasError ? "warn" : "ok",
242
246
  state_path: MAINTENANCE_STATE_PATH,
243
247
  relation_inference: jobStatus("relation_inference"),
244
248
  entity_typing: jobStatus("entity_typing"),
249
+ memory_quality_rollups: jobStatus("memory_quality_rollups"),
245
250
  };
246
251
  }
247
252
  async function collectUiStatus(opts) {
@@ -368,6 +373,7 @@ export function formatStatusReport(report) {
368
373
  lines.push(`Daemon: ${icon(report.daemon.status)} ${report.daemon.running ? `running (PID ${report.daemon.pid})` : "stopped"}`);
369
374
  lines.push(`Maint: ${icon(report.maintenance.status)} ${maintenanceJobSummary("relations", report.maintenance.relation_inference)}`);
370
375
  lines.push(` ${maintenanceJobSummary("entity typing", report.maintenance.entity_typing)}`);
376
+ lines.push(` ${maintenanceJobSummary("quality rollups", report.maintenance.memory_quality_rollups)}`);
371
377
  lines.push(`UI: ${icon(report.ui.status)} ${report.ui.checked ? report.ui.url : "not checked"}${report.ui.error ? ` — ${report.ui.error}` : ""}`);
372
378
  lines.push(`MCP: ${icon(report.mcp.status)} ${report.mcp.message}`);
373
379
  return lines.join("\n");
@@ -1,16 +1,16 @@
1
1
  # Fully hosted config
2
2
 
3
- Best for performance and teams. This setup uses Qdrant Cloud for managed vector storage and OpenAI-compatible hosted models for extraction, curation, and recall.
3
+ Best for performance and teams. This setup uses Qdrant Cloud for managed vector storage and a hosted gateway/provider for extraction, curation, and recall.
4
4
 
5
5
  ## What you need
6
6
 
7
7
  - A Qdrant Cloud cluster URL.
8
8
  - A Qdrant API key.
9
- - An OpenAI API key, or another hosted provider configured in the full configuration guide.
9
+ - A Portkey API key (recommended) — one key, many upstream providers, with built-in routing, fallbacks, and observability. Get one at [portkey.ai](https://portkey.ai). Or use OpenAI / Bedrock directly.
10
10
 
11
- For both `embedding.provider` and `llm.provider`, possible values are `openai`, `bedrock`, or `portkey` for hosted models. `ollama` is also supported when you want local model calls.
11
+ For both `embedding.provider` and `llm.provider`, possible values are `portkey`, `openai`, or `bedrock` for hosted models. `ollama` is also supported when you want local model calls.
12
12
 
13
- ## Config
13
+ ## Config (recommended: Portkey)
14
14
 
15
15
  Save this as `~/.bikky/config.json`:
16
16
 
@@ -18,10 +18,36 @@ Save this as `~/.bikky/config.json`:
18
18
  {
19
19
  "qdrant_url": "https://your-cluster.cloud.qdrant.io:6333",
20
20
  "qdrant_api_key": "your-qdrant-api-key",
21
+ "embedding": {
22
+ "provider": "portkey",
23
+ "model": "@openai/text-embedding-3-small",
24
+ "dimensions": 1024
25
+ },
26
+ "llm": {
27
+ "provider": "portkey",
28
+ "model": "@anthropic/claude-sonnet-4"
29
+ }
30
+ }
31
+ ```
32
+
33
+ Then export the gateway key:
34
+
35
+ ```bash
36
+ export PORTKEY_API_KEY="pk-..."
37
+ ```
38
+
39
+ bikky uses **1024-dimensional embeddings** as the canonical default. This is portable across modern providers (OpenAI 3-small/3-large via Matryoshka truncation, Cohere v3, Voyage, Mistral, Bedrock Titan v2, BGE/E5) so you can switch providers later without re-embedding.
40
+
41
+ `qdrant_api_key` is optional only for unauthenticated self-hosted Qdrant. Qdrant Cloud usually requires it.
42
+
43
+ ## Alternative: OpenAI directly
44
+
45
+ ```json
46
+ {
21
47
  "embedding": {
22
48
  "provider": "openai",
23
49
  "model": "text-embedding-3-small",
24
- "dimensions": 1536,
50
+ "dimensions": 1024,
25
51
  "api_key": "sk-..."
26
52
  },
27
53
  "llm": {
@@ -32,13 +58,7 @@ Save this as `~/.bikky/config.json`:
32
58
  }
33
59
  ```
34
60
 
35
- `qdrant_api_key` is optional only for unauthenticated self-hosted Qdrant. Qdrant Cloud usually requires it.
36
-
37
- Prefer not to store hosted model keys in the config file? Omit `api_key` above and set:
38
-
39
- ```bash
40
- export OPENAI_API_KEY="sk-..."
41
- ```
61
+ Or set `OPENAI_API_KEY` in the environment instead of the config file.
42
62
 
43
63
  ## Check it
44
64
 
@@ -54,4 +74,4 @@ bikky stop && bikky start
54
74
 
55
75
  Then restart your editor so its MCP process reloads.
56
76
 
57
- For Bedrock, Portkey, custom base URLs, or model-specific dimensions, see the [full configuration guide](https://github.com/bikky-dev/bikky/blob/main/docs/configuration.md).
77
+ For Bedrock, custom base URLs, or model-specific dimensions, see the [full configuration guide](https://github.com/bikky-dev/bikky/blob/main/docs/configuration.md).
@@ -1,15 +1,15 @@
1
1
  # Local Qdrant + hosted models config
2
2
 
3
- This setup keeps Qdrant local while hosted embeddings and LLM calls handle extraction, curation, and recall.
3
+ This setup keeps Qdrant local while a hosted gateway/provider handles extraction, curation, and recall.
4
4
 
5
5
  ## What you need
6
6
 
7
7
  - Qdrant running locally, usually with Docker.
8
- - An OpenAI API key, or another hosted provider configured in the full configuration guide.
8
+ - A Portkey API key (recommended) — one key, many upstream providers, with built-in routing, fallbacks, and observability. Get one at [portkey.ai](https://portkey.ai). Or use OpenAI / Bedrock directly.
9
9
 
10
- For both `embedding.provider` and `llm.provider`, possible values are `openai`, `bedrock`, or `portkey` for hosted models. `ollama` is also supported when you want local model calls.
10
+ For both `embedding.provider` and `llm.provider`, possible values are `portkey`, `openai`, or `bedrock` for hosted models. `ollama` is also supported when you want local model calls.
11
11
 
12
- ## Config
12
+ ## Config (recommended: Portkey)
13
13
 
14
14
  Save this as `~/.bikky/config.json`:
15
15
 
@@ -17,10 +17,36 @@ Save this as `~/.bikky/config.json`:
17
17
  {
18
18
  "qdrant_url": "http://localhost:6333",
19
19
  "qdrant_api_key": "",
20
+ "embedding": {
21
+ "provider": "portkey",
22
+ "model": "@openai/text-embedding-3-small",
23
+ "dimensions": 1024
24
+ },
25
+ "llm": {
26
+ "provider": "portkey",
27
+ "model": "@anthropic/claude-sonnet-4"
28
+ }
29
+ }
30
+ ```
31
+
32
+ Then export the gateway key:
33
+
34
+ ```bash
35
+ export PORTKEY_API_KEY="pk-..."
36
+ ```
37
+
38
+ bikky uses **1024-dimensional embeddings** as the canonical default. This is portable across modern providers (OpenAI 3-small/3-large via Matryoshka truncation, Cohere v3, Voyage, Mistral, Bedrock Titan v2, BGE/E5) so you can switch providers later without re-embedding.
39
+
40
+ `qdrant_api_key` is optional. Leave it empty or omit it for local or unauthenticated self-hosted Qdrant.
41
+
42
+ ## Alternative: OpenAI directly
43
+
44
+ ```json
45
+ {
20
46
  "embedding": {
21
47
  "provider": "openai",
22
48
  "model": "text-embedding-3-small",
23
- "dimensions": 1536,
49
+ "dimensions": 1024,
24
50
  "api_key": "sk-..."
25
51
  },
26
52
  "llm": {
@@ -31,13 +57,7 @@ Save this as `~/.bikky/config.json`:
31
57
  }
32
58
  ```
33
59
 
34
- `qdrant_api_key` is optional. Leave it empty or omit it for local or unauthenticated self-hosted Qdrant.
35
-
36
- Prefer not to store hosted model keys in the config file? Omit `api_key` above and set:
37
-
38
- ```bash
39
- export OPENAI_API_KEY="sk-..."
40
- ```
60
+ Or set `OPENAI_API_KEY` in the environment instead of the config file.
41
61
 
42
62
  ## Check it
43
63
 
@@ -47,4 +67,4 @@ bikky status
47
67
 
48
68
  If you started from a fresh install, run `bikky setup` after writing the config, then restart your editor so its MCP process reloads.
49
69
 
50
- For Bedrock, Portkey, custom base URLs, or model-specific dimensions, see the [full configuration guide](https://github.com/bikky-dev/bikky/blob/main/docs/configuration.md).
70
+ For Bedrock, custom base URLs, or model-specific dimensions, see the [full configuration guide](https://github.com/bikky-dev/bikky/blob/main/docs/configuration.md).
@@ -8,6 +8,7 @@ Use this path when you want memory shared across machines, but you still want em
8
8
  - A Qdrant API key.
9
9
  - Ollama installed locally.
10
10
  - The default embedding model pulled with `ollama pull qwen3-embedding:0.6b`.
11
+ - The default LLM model pulled with `ollama pull qwen2.5:7b`.
11
12
 
12
13
  ## Config
13
14
 
@@ -9,6 +9,7 @@ This setup is best for private/free testing rather than long-term team use. Extr
9
9
  - Qdrant running locally, usually with Docker.
10
10
  - Ollama installed locally.
11
11
  - The default embedding model pulled with `ollama pull qwen3-embedding:0.6b`.
12
+ - The default LLM model pulled with `ollama pull qwen2.5:7b`.
12
13
 
13
14
  ## Config
14
15
 
@@ -11,7 +11,7 @@ cat > ~/.bikky/config.json <<'JSON'
11
11
  "embedding": {
12
12
  "provider": "openai",
13
13
  "model": "text-embedding-3-small",
14
- "dimensions": 1536,
14
+ "dimensions": 1024,
15
15
  "api_key": "sk-..."
16
16
  },
17
17
  "llm": {
@@ -24,7 +24,21 @@ JSON
24
24
  bikky status
25
25
  ```
26
26
 
27
- Config lives at `~/.bikky/config.json`, or at `BIKKY_HOME/config.json` when `BIKKY_HOME` is set. Environment variables override the config file.
27
+ Config lives at `~/.bikky/config.json`, or at `BIKKY_HOME/config.json` when `BIKKY_HOME` is set. Environment variables can supply or override most scalar settings. Provider API key env vars such as `OPENAI_API_KEY` and `PORTKEY_API_KEY` are fallback values when the matching `api_key` field is omitted from config; remove the config value when you want key rotation through the environment.
28
+
29
+ ## Origin identity
30
+
31
+ New memory writes store canonical `origin` metadata. `origin.user` is the configured human identity, `origin.agent` is the automated actor or local surface, `origin.interface` is the entry point (`mcp`, `daemon`, `ui`, `api`, `cli`, or `system`), and `origin.operation` records the create/update/delete/verify/forget/review/correct/reinforce/supersede/feedback action.
32
+
33
+ `bikky setup` provisions `identity.user_id` and `identity.user_name` if they are missing. It never overwrites an existing configured user. Runtime detection uses this order:
34
+
35
+ 1. `identity.user_id` / `identity.user_name` from config
36
+ 2. `BIKKY_USER_ID` / `BIKKY_USER_NAME`
37
+ 3. Git config (`user.name`, `user.email`; email-like identifiers are hashed)
38
+ 4. Shell/OS username
39
+ 5. Hostname fallback
40
+
41
+ MCP callers cannot pass `origin` or override the human user. Use `BIKKY_AGENT_ID` / `BIKKY_AGENT_NAME` only when you need to label the local automated agent process explicitly; otherwise bikky labels the daemon/UI/MCP surface from the hostname.
28
42
 
29
43
  ## Common setups
30
44
 
@@ -50,7 +64,7 @@ Best for performance and teams. Qdrant Cloud stores vectors, and hosted embeddin
50
64
  "embedding": {
51
65
  "provider": "openai",
52
66
  "model": "text-embedding-3-small",
53
- "dimensions": 1536,
67
+ "dimensions": 1024,
54
68
  "api_key": "sk-..."
55
69
  },
56
70
  "llm": {
@@ -74,7 +88,7 @@ Best for local vector storage with hosted extraction and embedding quality.
74
88
  "embedding": {
75
89
  "provider": "openai",
76
90
  "model": "text-embedding-3-small",
77
- "dimensions": 1536,
91
+ "dimensions": 1024,
78
92
  "api_key": "sk-..."
79
93
  },
80
94
  "llm": {
@@ -85,7 +99,7 @@ Best for local vector storage with hosted extraction and embedding quality.
85
99
  }
86
100
  ```
87
101
 
88
- `qdrant_api_key` is optional. Leave it empty or omit it for local or unauthenticated self-hosted Qdrant. Prefer env vars for hosted model auth? Omit `api_key` above and set `OPENAI_API_KEY` instead.
102
+ `qdrant_api_key` is optional. Leave it empty or omit it for local or unauthenticated self-hosted Qdrant. Prefer env vars for hosted model auth? Omit `api_key` above and set `OPENAI_API_KEY` or `PORTKEY_API_KEY` for the selected provider instead.
89
103
 
90
104
  ### Local and free
91
105
 
@@ -134,11 +148,17 @@ export QDRANT_API_KEY="..." # only needed for Qdrant Cloud or authenticated sel
134
148
 
135
149
  Useful basics:
136
150
 
137
- | Env var | Config field | Notes |
138
- | ---------------- | ---------------- | --------------------------------------------------------------------------- |
139
- | `QDRANT_URL` | `qdrant_url` | Required unless set in config |
140
- | `QDRANT_API_KEY` | `qdrant_api_key` | Optional for local/unauthenticated Qdrant; usually needed for Qdrant Cloud |
141
- | `BIKKY_HOME` | | Moves the config/log/state directory from `~/.bikky` |
151
+ | Env var | Config field | Notes |
152
+ | ------------------ | --------------------- | --------------------------------------------------------------------------------------- |
153
+ | `QDRANT_URL` | `qdrant_url` | Required unless set in config |
154
+ | `QDRANT_API_KEY` | `qdrant_api_key` | Optional for local/unauthenticated Qdrant; usually needed for Qdrant Cloud |
155
+ | `OPENAI_API_KEY` | `embedding.api_key` / `llm.api_key` | Fallback key for `openai` when `api_key` is omitted from config |
156
+ | `PORTKEY_API_KEY` | `embedding.api_key` / `llm.api_key` | Fallback key for `portkey` when `api_key` is omitted from config |
157
+ | `BIKKY_HOME` | — | Moves the config/log/state directory from `~/.bikky` |
158
+ | `BIKKY_USER_ID` | `identity.user_id` | Explicit human user id for origin provisioning |
159
+ | `BIKKY_USER_NAME` | `identity.user_name` | Human-readable human user name for origin provisioning |
160
+ | `BIKKY_AGENT_ID` | — | Optional local automated-agent id stored in `origin.agent` |
161
+ | `BIKKY_AGENT_NAME` | — | Optional local automated-agent label stored in `origin.agent` |
142
162
 
143
163
  ## Provider options
144
164
 
@@ -149,7 +169,7 @@ Use these exact values in `embedding.provider` and `llm.provider`. Both fields a
149
169
  | `ollama` | Yes | Yes | Local and free defaults | None |
150
170
  | `openai` | Yes | Yes | Simple hosted models | `OPENAI_API_KEY` or `api_key` |
151
171
  | `bedrock` | Yes | Yes | AWS-managed models | AWS credentials or IAM role |
152
- | `portkey` | Yes | Yes | Gateway/routing over other providers | Portkey API key |
172
+ | `portkey` | Yes | Yes | Gateway/routing over other providers | `PORTKEY_API_KEY` or `api_key` |
153
173
 
154
174
  ## Advanced configuration
155
175
 
@@ -175,7 +195,7 @@ These sections are optional references for custom providers, tuning, scoping, an
175
195
  | `embedding.model` | `EMBEDDING_MODEL` | `qwen3-embedding:0.6b` | Embedding model name |
176
196
  | `embedding.dimensions` | `EMBEDDING_DIMENSIONS` | `1024` | Must match the selected model output |
177
197
  | `embedding.base_url` | `EMBEDDING_BASE_URL` | `http://localhost:11434` | Used by local or OpenAI-compatible providers |
178
- | `embedding.api_key` | `OPENAI_API_KEY` | — | Provider API key; can also be set in config |
198
+ | `embedding.api_key` | `OPENAI_API_KEY` / `PORTKEY_API_KEY` | — | Provider API key; env vars are fallback when omitted from config |
179
199
 
180
200
  Common model dimensions:
181
201
 
@@ -187,7 +207,7 @@ Common model dimensions:
187
207
  | `openai` | `text-embedding-3-large` | `3072` |
188
208
  | `bedrock` | `amazon.titan-embed-text-v2:0` | `1024` |
189
209
 
190
- If you change the embedding model, make sure `embedding.dimensions` matches the model output.
210
+ bikky's examples use `1024` because that is the portable default across supported providers. OpenAI 3-series embedding models can return their larger native dimensions above, but they also support shorter outputs; if you change `embedding.dimensions`, make sure the selected model and every Qdrant collection use the same dimension.
191
211
 
192
212
  #### LLM
193
213
 
@@ -198,7 +218,7 @@ The LLM is used by background maintenance features. Ollama is the default.
198
218
  | `llm.provider` | `LLM_PROVIDER` | `ollama` | One of `ollama`, `openai`, `bedrock`, `portkey` |
199
219
  | `llm.model` | `LLM_MODEL` | `qwen2.5:7b` | LLM model name |
200
220
  | `llm.base_url` | `LLM_BASE_URL` | `http://localhost:11434` | Used by local or OpenAI-compatible providers |
201
- | `llm.api_key` | `OPENAI_API_KEY` | — | Provider API key; can also be set in config |
221
+ | `llm.api_key` | `OPENAI_API_KEY` / `PORTKEY_API_KEY` | — | Provider API key; env vars are fallback when omitted from config |
202
222
  | `llm.extra.region` | `AWS_BEDROCK_REGION` / `AWS_REGION` | `us-east-1` | AWS Bedrock region |
203
223
 
204
224
  #### Timeouts and retries
@@ -225,7 +245,7 @@ Retries use jittered exponential backoff for transient errors, rate limits, and
225
245
  "embedding": {
226
246
  "provider": "portkey",
227
247
  "model": "@openai/text-embedding-3-small",
228
- "dimensions": 1536,
248
+ "dimensions": 1024,
229
249
  "api_key": "pk-..."
230
250
  },
231
251
  "llm": {
@@ -264,7 +284,7 @@ Most users only need one Qdrant destination. Use `destinations[]` when you want
264
284
 
265
285
  Each destination has its own Qdrant credentials and collection. Add `description` when you have more than one destination; MCP tools expose those descriptions so LLM clients can pick the right search scope.
266
286
 
267
- Writes still target one destination. A destination can include a `match` block with JavaScript `RegExp` strings for `cwd`, `entity`, `content`, or `metadata`. Destinations are evaluated in array order; the first destination with any matching pattern wins. If no pattern matches, bikky uses the destination marked `default: true`, or the first destination.
287
+ Writes still target one destination. A destination can include a `match` block with JavaScript `RegExp` strings for `cwd`, `entity`, `content`, or `metadata`. For memory writes, `content` matching uses a flattened routing view of the full memory context: stored content, entities, repo, branch, task/workstream keys, metadata, origin, relation fields, and other stored payload fields. Destinations are evaluated in array order; the first destination with any matching pattern wins. If no pattern matches, bikky uses the destination marked `default: true`, or the first destination.
268
288
 
269
289
  Read tools (`memory_recall`, `memory_entity`, and `memory_relations`) can search one destination, the routed destination, or multiple destinations. Configure `default_search_scope` to control the default read behavior:
270
290
 
@@ -280,7 +300,7 @@ MCP clients can override this per call with `search_scope`. The value accepts `"
280
300
  "embedding": {
281
301
  "provider": "openai",
282
302
  "model": "text-embedding-3-small",
283
- "dimensions": 1536
303
+ "dimensions": 1024
284
304
  },
285
305
  "llm": {
286
306
  "provider": "openai",
@@ -333,6 +353,7 @@ MCP clients can override this per call with `search_scope`. The value accepts `"
333
353
  Matching details:
334
354
 
335
355
  - `match.cwd`, `match.entity`, and `match.content` are lists of JavaScript `RegExp` strings.
356
+ - On memory writes, `match.content` sees the full flattened memory context, so a pattern can match values such as `repo`, `branch`, `task_key`, origin fields, metadata values, or relation endpoints even when the visible memory text does not contain that term.
336
357
  - `match.metadata` maps metadata keys to lists of JavaScript `RegExp` strings matched against that key's value.
337
358
  - Matching uses OR logic across fields and within each list; any matching pattern selects the destination.
338
359
  - Put the most specific destinations first because first match wins.
@@ -361,6 +382,10 @@ You normally do not need to tune these. `bikky setup` starts the daemon and regi
361
382
  | `daemon.consolidation_enabled` | `true` | Consolidate summaries into durable patterns |
362
383
  | `daemon.relation_inference_enabled` | `true` | Infer entity relationships |
363
384
  | `daemon.entity_typing_enabled` | `true` | Classify entities for UI/graph filtering |
385
+ | `daemon.memory_quality_rollups_enabled` | `true` | Aggregate recall, feedback, stale, and confidence quality signals |
386
+ | `daemon.memory_quality_rollups_interval_sec` | `3600` | Seconds between memory quality rollup runs |
387
+ | `daemon.memory_quality_rollups_low_confidence_threshold` | `0.6` | Effective confidence below this value is counted as low-confidence |
388
+ | `daemon.memory_quality_rollups_max_scopes_per_run` | `100` | Maximum rollup scopes written per destination per run |
364
389
  | `daemon.staleness_threshold_days` | `30` | Days before a fact is flagged as stale |
365
390
 
366
391
  #### Watcher settings
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bikky",
3
- "version": "0.4.2",
3
+ "version": "0.4.4",
4
4
  "description": "Shared memory for AI coding sessions — MCP server + background daemon",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-or-later",
@@ -60,7 +60,7 @@
60
60
  "@aws-sdk/client-bedrock-runtime": "^3.1006.0",
61
61
  "@modelcontextprotocol/sdk": "^1.29.0",
62
62
  "pino": "^10.3.1",
63
- "zod": "^3.24.0"
63
+ "zod": "^4.4.1"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@types/node": "^25.6.0",