pi-blackhole 0.4.10 → 0.5.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/CHANGELOG.md CHANGED
@@ -2,6 +2,26 @@
2
2
 
3
3
  ---
4
4
 
5
+ ## [0.5.0] - 2026-09-06
6
+
7
+ ### Added
8
+
9
+ - **Newest-first retained tool-output budgeting.** At each Blackhole compaction boundary, retained historical tool and shell output text is projected through a dedicated budget (default 20000 tokens) and the resulting omission decisions are persisted with that compaction. Set `retainedToolOutputMaxTokens` to `0` to disable. When enabled, the provider-visible representation remains fixed until the next compaction, while raw session history and compaction inputs remain full fidelity. Pending results and non-text content remain visible, and omitted text points to `recall #N` when a stable transcript index is available. ([#66](https://github.com/k0valik/pi-blackhole/pull/66))
10
+ - **`max` thinking level support.** Configured memory models now accept and forward Pi's highest reasoning level where supported by the provider ([upstream OM `e6c0fd9`](https://github.com/elpapi42/pi-observational-memory/commit/e6c0fd9d8e43ffb5d3c1a271bf1ec4a4640bde02)). ([#67](https://github.com/k0valik/pi-blackhole/pull/67))
11
+
12
+ ### Changed
13
+
14
+ - **Lazy loading of optional command modules and memory workers.** The settings overlay, changelog viewer, cleanup handler, export pipeline, and OM worker imports now load on demand instead of at extension startup, cutting per-session startup cost. ([#71](https://github.com/k0valik/pi-blackhole/pull/71))
15
+ - **Recall search now indexes bounded generic tool arguments, filters multi-term BM25 noise, caps results at 50, and reports pagination/truncation accurately — including in `/blackhole-recall`** ([upstream VCC `f7b80bb`, `4bb7115`](https://github.com/sting8k/pi-vcc/commit/f7b80bbbe22315acf9f7925c0c3be2d4ae9feee5)). ([#67](https://github.com/k0valik/pi-blackhole/pull/67))
16
+
17
+ ### Fixed
18
+
19
+ - **Custom provider streams are now keyed by provider + API, not API alone.** Several extensions can register different providers sharing one wire API (e.g. `anthropic` and a Databricks-hosted Claude both speak `anthropic-messages`); keying by API alone let the first-registered provider hijack every model speaking that protocol, routing requests through the wrong transport/URL/auth. Streams also overwrite on re-registration instead of first-wins. ([#70](https://github.com/k0valik/pi-blackhole/pull/70))
20
+ - **OM workers now receive provider environment substitutions, and stale ambient-credential availability snapshots are rechecked before rejecting request-time-signed providers** ([upstream OM `ce9fc98`, `699ccc7`](https://github.com/elpapi42/pi-observational-memory/commit/ce9fc982b3a219a7839f07c9f4a3e054e81a2b21)). ([#67](https://github.com/k0valik/pi-blackhole/pull/67))
21
+ - **Empty Blackhole compaction output now delegates to Pi's native summarizer instead of replacing context with an empty summary** ([upstream OM PR #39](https://github.com/elpapi42/pi-observational-memory/pull/39)). ([#67](https://github.com/k0valik/pi-blackhole/pull/67))
22
+
23
+ ---
24
+
5
25
  ## [0.4.10] - 2026-08-29
6
26
 
7
27
  ### Changed
@@ -322,6 +342,7 @@ Audit surfaced 7 correctness/performance edge cases in the cursor pipeline.
322
342
  Four were fixed; three were deferred as harmless or cosmetic.
323
343
 
324
344
  **Fixed:**
345
+
325
346
  - **Session fork cursor bleed (#2).** `cursorsLoaded` was a one-shot boolean
326
347
  — on session fork, stale cursors bled into the new branch because
327
348
  `validateCursors` was never re-invoked. Now keyed by `cursorsLoadedSessionId`
@@ -342,6 +363,7 @@ Four were fixed; three were deferred as harmless or cosmetic.
342
363
  last source entry (`findLast(isSourceEntry)`).
343
364
 
344
365
  **Deferred:**
366
+
345
367
  - **"unknown" magic entry ID (#4).** Functional but cosmetic — the sentinel
346
368
  triggers fallback on next load. 9 call sites; zero behavioral change.
347
369
  - **Observer re-checks tokens (#5).** Harmless — only reached when pipeline
@@ -356,8 +378,6 @@ Four were fixed; three were deferred as harmless or cosmetic.
356
378
  - 3 new tests for manual-mode pending awareness (reflector, dropper, post-first-run)
357
379
  - `dropperPressureThreshold` added to config validation tests
358
380
 
359
-
360
-
361
381
  # Changelog
362
382
 
363
383
  ## [0.3.7] - 2026-06-10
@@ -406,7 +426,7 @@ Four were fixed; three were deferred as harmless or cosmetic.
406
426
  - **Section headers in summaries use line-boundary regex.** `sectionOf` and `stripOMContent` now match `## Reflections` / `## Observations` at the start of a line instead of using bare `indexOf`. Prevents false positives when those phrases appear inside file paths or conversation text. ([#20](https://github.com/k0valik/pi-blackhole/pull/20))
407
427
  - **Read+same-path-Modified dedup in file summaries.** `mergeFileLines` now removes a path from `Read` if it also appears in `Modified` — a file that was read then edited shouldn't show twice. ([#20](https://github.com/k0valik/pi-blackhole/pull/20))
408
428
  - **`reverse-recall` outputs related reflections.** The `_reflections` dead parameter is now used — related reflections are shown alongside observations when expanding session entries. ([#20](https://github.com/k0valik/pi-blackhole/pull/20))
409
- - **Cooldown reason in UI notification.** The `getCooldownEntry` function now returns the actual entry (with reason), so the status notification shows *why* a model was cooled down, not just "cooldown active". ([#20](https://github.com/k0valik/pi-blackhole/pull/20))
429
+ - **Cooldown reason in UI notification.** The `getCooldownEntry` function now returns the actual entry (with reason), so the status notification shows _why_ a model was cooled down, not just "cooldown active". ([#20](https://github.com/k0valik/pi-blackhole/pull/20))
410
430
  - **Env override validation.** Invalid `PI_BLACKHOLE_COMPACTION` / `PI_BLACKHOLE_COMPACTION_ENGINE` values now print a warning instead of being silently ignored. ([#20](https://github.com/k0valik/pi-blackhole/pull/20))
411
431
  - **`observerPreambleMaxTokens` accepts 0.** Now uses `nonNegativeInt` validator instead of `positiveInt` — 0 means "auto-compute", which was the intended semantics. ([#20](https://github.com/k0valik/pi-blackhole/pull/20))
412
432
 
package/README.md CHANGED
@@ -31,7 +31,7 @@ Then `/reload` or restart Pi. The config file at `~/.pi/agent/pi-blackhole/pi-bl
31
31
 
32
32
  ## ✨ What's new
33
33
 
34
- > **Latest release: [0.4.10](docs/CHANGELOG.md#0410---2026-08-29)**
34
+ > **Latest release: [0.5.0](CHANGELOG.md#050---2026-09-06)**
35
35
  >
36
36
  > - **Recall & export ranking upgrade** — BM25+, SimHash64, c-TF-IDF, technical density scoring, and surface-form-preserving topic labels for sharper dedup and more readable exports; export preamble now carries a best-effort heuristic warning.
37
37
  > - **`/blackhole-export` — distilled project-memory export** — Export for long-term agent memory tools - scans all project sessions + pending buffers, fuzzy-dedupes, and writes one import-ready Markdown (`Reflections → Critical → High → Medium → Low`) with topic badges and orphan-gated pending. `out:<path>.md` supported.
@@ -39,7 +39,7 @@ Then `/reload` or restart Pi. The config file at `~/.pi/agent/pi-blackhole/pi-bl
39
39
  > - **Mid-run auto-compaction** (`midRunCompaction: "resume"` | `"pause"`) — **good for goal/task** opt into transparent compaction during long tool loops without interrupting the agent. Default is `"off"`.
40
40
  > - **Robust compaction-failure handling** — unified `session_compact_failed` (pi >=0.84.3) with correct attribution, overflow-retry visibility, and noise filtering; plus bundled-CLI `AgentSession` resolution so inline compaction works from `dist/bundle/cli.js` ([#62](https://github.com/k0valik/pi-blackhole/pull/62)).
41
41
 
42
- See [`docs/CHANGELOG.md`](docs/CHANGELOG.md) for the full history.
42
+ See [`CHANGELOG.md`](CHANGELOG.md) for the full history.
43
43
 
44
44
  ### ⚠️ Upcoming change
45
45
 
@@ -62,38 +62,38 @@ Both halves share a single hook and a single output. Together they keep the agen
62
62
 
63
63
  ## Commands
64
64
 
65
- | Command | Description & Options |
66
- | --- | --- |
67
- | `/blackhole` | Manual compact — deterministic structural summary |
68
- | `/blackhole settings` | Open the configuration overlay *(Alias: `/blackhole configure`)* |
69
- | `/blackhole changelog` | Open the in-app changelog viewer |
70
- | `/blackhole cleanup` | Remove orphaned pending files |
71
- | `/blackhole om-off` | Disable observational memory |
72
- | `/blackhole om-on` | Enable observational memory |
73
- | `/blackhole-memory` | Memory pipeline status & token counters *(Same as `/blackhole-memory status`)* |
74
- | `/blackhole-memory view` | Show visible observations and reflections (after compaction trimming), copied to clipboard |
75
- | `/blackhole-memory full` | Show **all** recorded memory (including dropped observations), copied to clipboard |
76
- | `/blackhole-recall <query>` | Search session history. Supports `page:N`, `scope:all`, `mode:file|touched`, regex *(Also available to agent as `recall` tool)* |
77
- | `/blackhole-export` | Export distilled project memory (observations/reflections across past sessions + pending buffers) to import-ready markdown *(Options: `out:<path>.md`)* |
78
-
79
- All commands work regardless of `compaction` mode — only *when* auto-compaction fires changes. See [Compaction modes](#compaction-modes) below.
65
+ | Command | Description & Options |
66
+ | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
67
+ | `/blackhole` | Manual compact — deterministic structural summary |
68
+ | `/blackhole settings` | Open the configuration overlay _(Alias: `/blackhole configure`)_ |
69
+ | `/blackhole changelog` | Open the in-app changelog viewer |
70
+ | `/blackhole cleanup` | Remove orphaned pending files |
71
+ | `/blackhole om-off` | Disable observational memory |
72
+ | `/blackhole om-on` | Enable observational memory |
73
+ | `/blackhole-memory` | Memory pipeline status & token counters _(Same as `/blackhole-memory status`)_ |
74
+ | `/blackhole-memory view` | Show visible observations and reflections (after compaction trimming), copied to clipboard |
75
+ | `/blackhole-memory full` | Show **all** recorded memory (including dropped observations), copied to clipboard |
76
+ | `/blackhole-recall <query>` | Search session history. Supports `page:N`, `scope:all`, `mode:file | touched`, regex *(Also available to agent as `recall` tool)* |
77
+ | `/blackhole-export` | Export distilled project memory (observations/reflections across past sessions + pending buffers) to import-ready markdown _(Options: `out:<path>.md`)_ |
78
+
79
+ All commands work regardless of `compaction` mode — only _when_ auto-compaction fires changes. See [Compaction modes](#compaction-modes) below.
80
80
 
81
81
  ### The `recall` tool (agent-facing)
82
82
 
83
83
  The agent gets one unified `recall` tool that handles every form of historical lookup. Searches read the raw session file directly, bypassing compaction.
84
84
 
85
- | Input | What it does |
86
- |---|---|
87
- | `[12-char hex]` | Recover source evidence for a specific observation or reflection ID from the session ledger. |
88
- | `#N` | Expand a session entry by index (show full content, not truncated). |
89
- | `#N:path` | Drill-down into file content from a tool call (e.g. `#42:auth.ts` shows first 30 lines; `#42:auth.ts:30` shows the next 30; `#42:auth.ts:full` shows everything). |
90
- | Free text | BM25-ranked search across transcript and/or file content. Rare terms weighted higher. |
91
- | `mode:file` | Search only write/edit file content. |
92
- | `mode:touched` | Aggregate all files written/edited across the session, grouped by path. |
93
- | Regex | Pattern search (e.g. `fork.*pi-vcc`, `hook\|inject`). |
94
- | `scope:all` | Search across all session lineages (default: active lineage only). |
85
+ | Input | What it does |
86
+ | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
87
+ | `[12-char hex]` | Recover source evidence for a specific observation or reflection ID from the session ledger. |
88
+ | `#N` | Expand a session entry by index (show full content, not truncated). |
89
+ | `#N:path` | Drill-down into file content from a tool call (e.g. `#42:auth.ts` shows first 30 lines; `#42:auth.ts:30` shows the next 30; `#42:auth.ts:full` shows everything). |
90
+ | Free text | BM25-ranked search across transcript and/or file content. Rare terms weighted higher. |
91
+ | `mode:file` | Search only write/edit file content. |
92
+ | `mode:touched` | Aggregate all files written/edited across the session, grouped by path. |
93
+ | Regex | Pattern search (e.g. `fork.*pi-vcc`, `hook\|inject`). |
94
+ | `scope:all` | Search across all session lineages (default: active lineage only). |
95
95
 
96
- When the agent expands a session entry (`#N`), related observations and reflections from the session ledger are automatically shown alongside the expanded content — so the agent gets the raw transcript *and* the durable fact layer in one call.
96
+ When the agent expands a session entry (`#N`), related observations and reflections from the session ledger are automatically shown alongside the expanded content — so the agent gets the raw transcript _and_ the durable fact layer in one call.
97
97
 
98
98
  The `/blackhole-recall` command exposes the same engine to the user. Results are shown as a collapsible message and auto-fed to the agent as context.
99
99
 
@@ -103,19 +103,23 @@ The `/blackhole-recall` command exposes the same engine to the user. Results are
103
103
 
104
104
  Two modes, one shared goal: keep your agent's context sharp without manual housekeeping. (`compaction: "off"` is a third escape hatch that hands everything back to Pi.)
105
105
 
106
- | | Auto (default) | Manual (`compaction: "manual"`) | Off (`compaction: "off"`) |
107
- |---|---|---|---|
108
- | Workers run? | Yes | Yes | Yes (unless `memory: false`) |
109
- | Observations go to | Conversation markers (invisible in TUI) | Per-session disk buffers | Conversation markers |
110
- | Auto-compact on `agent_end` | Yes — blackhole fires at `compactAfterTokens` | No | No (Pi handles it) |
111
- | `/compact` (Pi built-in) | Replaced by blackhole | Pi handles | Pi handles |
112
- | `/blackhole` | Optional | **Required** to flush + compact | Optional, but works |
113
- | Use case | "Install and forget" | "I want to control when context gets compressed" | "Let Pi handle it, but I want `/blackhole` when I need it" |
106
+ | | Auto (default) | Manual (`compaction: "manual"`) | Off (`compaction: "off"`) |
107
+ | --------------------------- | --------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------- |
108
+ | Workers run? | Yes | Yes | Yes (unless `memory: false`) |
109
+ | Observations go to | Conversation markers (invisible in TUI) | Per-session disk buffers | Conversation markers |
110
+ | Auto-compact on `agent_end` | Yes — blackhole fires at `compactAfterTokens` | No | No (Pi handles it) |
111
+ | `/compact` (Pi built-in) | Replaced by blackhole | Pi handles | Pi handles |
112
+ | `/blackhole` | Optional | **Required** to flush + compact | Optional, but works |
113
+ | Use case | "Install and forget" | "I want to control when context gets compressed" | "Let Pi handle it, but I want `/blackhole` when I need it" |
114
114
 
115
115
  Manual mode is the maintainer's daily driver: workers still run, but observations accumulate in `<sessionId>-pending.json` files instead of cluttering the conversation. `/blackhole` flushes the buffer, runs algorithmic compaction, and injects durable reflections in one shot.
116
116
 
117
117
  `compaction: "off"` + `memory: false` (or `PI_BLACKHOLE_PASSIVE=true`) completely disables all background workers and blackhole's auto-compaction — useful for debugging or comparing against Pi's native path. Explicit `/blackhole` still works in this mode.
118
118
 
119
+ #### Who owns the compaction?
120
+
121
+ With the default `compactionEngine: "blackhole"`, blackhole's `session_before_compact` hook owns every compaction Pi initiates — threshold auto-compact, overflow recovery, and `/compact` — replacing Pi's LLM summarizer with the deterministic pipeline. The only exception is defensive: if both the VCC summary and the OM projection come up empty (a pathological all-noise transcript), blackhole declines and Pi's native summarizer runs, so you never get a context-free replacement. With `compactionEngine: "pi-default"`, `compaction: "manual"`, or `compaction: "off"`, Pi handles everything except explicit `/blackhole`. See [`docs/CONFIG.md` → `compactionEngine`](docs/CONFIG.md#compactionengine) for the full interaction matrix.
122
+
119
123
  ### How does `/blackhole` compare to `/compact`?
120
124
 
121
125
  - `/compact` calls an LLM to write a free-form summary — costly, lossy, no memory layer.
@@ -132,7 +136,7 @@ When `/blackhole` fires (manually or via the auto-trigger), two things happen in
132
136
  1. **The vcc pipeline** analyzes the transcript tail and produces a structured summary: session goal, file changes, commits, outstanding blockers, user preferences, and a rolling brief transcript. Deterministic — same input always produces the same output.
133
137
  2. **Observational memory injection** renders accumulated observations and reflections from the session ledger and appends them below the summary.
134
138
 
135
- The agent receives a deterministic recap of recent work *plus* durable facts from the full session history — in a single replacement block. No LLM was called for the compaction itself.
139
+ The agent receives a deterministic recap of recent work _plus_ durable facts from the full session history — in a single replacement block. No LLM was called for the compaction itself.
136
140
 
137
141
  ---
138
142
 
@@ -142,9 +146,9 @@ Defaults target ~128k context models and work out of the box — no tuning requi
142
146
 
143
147
  ```json
144
148
  {
145
- "observerModel": { "provider": "openrouter", "id": "qwen/qwen3-next-80b-a3b-instruct:free" },
146
- "reflectorModel": { "provider": "cerebras", "id": "gpt-oss-120b" },
147
- "dropperModel": { "provider": "cerebras", "id": "gpt-oss-120b" }
149
+ "observerModel": { "provider": "openrouter", "id": "qwen/qwen3-next-80b-a3b-instruct:free" },
150
+ "reflectorModel": { "provider": "cerebras", "id": "gpt-oss-120b" },
151
+ "dropperModel": { "provider": "cerebras", "id": "gpt-oss-120b" }
148
152
  }
149
153
  ```
150
154
 
@@ -250,21 +254,21 @@ Use `recall` with an id to retrieve original context.
250
254
 
251
255
  ## Feature comparison
252
256
 
253
- | | pi-blackhole | pi-vcc | pi-obs-memory | Pi default |
254
- |---|---|---|---|---|
255
- | Algorithmic compaction (no LLM cost) | ✓ | ✓ | — | — |
256
- | Deterministic output | ✓ | ✓ | — | — |
257
- | Structured summary sections | ✓ | ✓ | — | — |
258
- | Observations + reflections | ✓ | — | ✓ | — |
259
- | Context survives across compactions | ✓ | — | ✓ | — |
260
- | Background memory workers | ✓ | — | ✓ | — |
261
- | Searchable history after compaction | ✓ | ✓ | partial | — |
262
- | Per-worker model config | ✓ | — | — | — |
263
- | Fallback model chains + persisted cooldowns | ✓ | — | — | — |
264
- | Manual flush mode (`compaction: "manual"`) | ✓ | — | — | — |
265
- | Memory toggle (`/blackhole om-off`) | ✓ | — | — | — |
266
- | Unified single-file config | ✓ | — | — | — |
267
- | Per-session pending state | ✓ | — | — | — |
257
+ | | pi-blackhole | pi-vcc | pi-obs-memory | Pi default |
258
+ | ------------------------------------------- | ------------ | ------ | ------------- | ---------- |
259
+ | Algorithmic compaction (no LLM cost) | ✓ | ✓ | — | — |
260
+ | Deterministic output | ✓ | ✓ | — | — |
261
+ | Structured summary sections | ✓ | ✓ | — | — |
262
+ | Observations + reflections | ✓ | — | ✓ | — |
263
+ | Context survives across compactions | ✓ | — | ✓ | — |
264
+ | Background memory workers | ✓ | — | ✓ | — |
265
+ | Searchable history after compaction | ✓ | ✓ | partial | — |
266
+ | Per-worker model config | ✓ | — | — | — |
267
+ | Fallback model chains + persisted cooldowns | ✓ | — | — | — |
268
+ | Manual flush mode (`compaction: "manual"`) | ✓ | — | — | — |
269
+ | Memory toggle (`/blackhole om-off`) | ✓ | — | — | — |
270
+ | Unified single-file config | ✓ | — | — | — |
271
+ | Per-session pending state | ✓ | — | — | — |
268
272
 
269
273
  ---
270
274
 
@@ -279,18 +283,18 @@ rm -rf ~/.pi/agent/pi-blackhole
279
283
 
280
284
  ## Documentation map
281
285
 
282
- | Doc | Audience | What's in it |
283
- |---|---|---|
284
- | **[`README.md`](README.md)** | You, now | Install, commands, the pitch, the value, the demo. |
285
- | **[`docs/CHANGELOG.md`](docs/CHANGELOG.md)** | You | Every release, what changed, who contributed. |
286
- | **[`docs/CONFIG.md`](docs/CONFIG.md)** | You, when tuning | Every config key with type, default, behavior, and env-var overrides. |
287
- | **[`llms.txt`](llms.txt)** | Your agent | Step-by-step guided setup interview, anti-patterns, exact file paths, internal constants. |
288
- | **[`docs/MIGRATION-GUIDE.md`](docs/MIGRATION-GUIDE.md)** | You, if upgrading | Old → new config key mapping, semantic changes, automatic migration behavior. |
289
- | **[`docs/OLD_CONFIG.md`](docs/OLD_CONFIG.md)** | Reference only | The legacy pi-vcc / pi-observational-memory config surface. Kept for historical context. |
290
- | **[`example-config.json`](example-config.json)** | You | Annotated example config with comments. |
291
- | **[`docs/APPEND_COMPACTION.md`](docs/APPEND_COMPACTION.md)** | You, if curious | Rules for `compactionSummaryMode: "append"`. |
286
+ | Doc | Audience | What's in it |
287
+ | ------------------------------------------------------------ | ----------------- | ----------------------------------------------------------------------------------------- |
288
+ | **[`README.md`](README.md)** | You, now | Install, commands, the pitch, the value, the demo. |
289
+ | **[`CHANGELOG.md`](CHANGELOG.md)** | You | Every release, what changed, who contributed. |
290
+ | **[`docs/CONFIG.md`](docs/CONFIG.md)** | You, when tuning | Every config key with type, default, behavior, and env-var overrides. |
291
+ | **[`llms.txt`](llms.txt)** | Your agent | Step-by-step guided setup interview, anti-patterns, exact file paths, internal constants. |
292
+ | **[`docs/MIGRATION-GUIDE.md`](docs/MIGRATION-GUIDE.md)** | You, if upgrading | Old → new config key mapping, semantic changes, automatic migration behavior. |
293
+ | **[`docs/OLD_CONFIG.md`](docs/OLD_CONFIG.md)** | Reference only | The legacy pi-vcc / pi-observational-memory config surface. Kept for historical context. |
294
+ | **[`example-config.json`](example-config.json)** | You | Annotated example config with comments. |
295
+ | **[`docs/APPEND_COMPACTION.md`](docs/APPEND_COMPACTION.md)** | You, if curious | Rules for `compactionSummaryMode: "append"`. |
292
296
 
293
- > **Note:** All docs except `README.md` and `llms.txt` live under `docs/` — product docs (`architecture.md`, `CONFIG.md`, `CHANGELOG.md`, etc.) and `archived_docs/` is local-only (gitignored).
297
+ > **Note:** All docs except `README.md`, `CHANGELOG.md` (package root, read by `/blackhole changelog`), and `llms.txt` live under `docs/` — product docs (`architecture.md`, `CONFIG.md`, etc.); `archived_docs/` is local-only (gitignored).
294
298
 
295
299
  ---
296
300
 
@@ -323,7 +327,7 @@ What blackhole adds and reworks on top:
323
327
  - **Retryable error detection with per-model cooldowns** — models that fail get cooled down, fallbacks tried automatically, 30-second retry gate prevents spam.
324
328
  - **Improved observer/reflector/dropper prompts** — each heavily customized with detailed extraction rules, relevance guidance, and error handling.
325
329
  - **OM-recall coupling** — when expanding session entries via `recall`, related observations and reflections are automatically shown.
326
- - **Thinking level support** — per-model `thinking` field for reasoning effort control.
330
+ - **Thinking level support** — per-model `thinking` field for reasoning effort control, including `max` where supported by the provider.
327
331
 
328
332
  ## License
329
333